From edcad561a551ed7689bc2ae7fb39e1cde81aba2e Mon Sep 17 00:00:00 2001 From: Kurtis Holsapple Date: Tue, 20 May 2025 14:15:03 -0700 Subject: [PATCH] WIP --- .gitignore | 2 - acf-json/group_681154755e23d.json | 328 + acf-json/group_6824d74596f5f.json | 581 + acf-json/group_682777331a711.json | 101 + acf-json/group_68279f15907f1.json | 93 + acf-json/group_6827a1d4cc554.json | 237 + acf-json/group_682b909552599.json | 95 + archive-location.php | 22 + archive-testimonial.php | 3 + assets/cart-plus.svg | 4 + assets/chevron-down.svg | 3 + assets/chevron-left.svg | 3 + assets/chevron-right.svg | 3 + assets/facebook.svg | 3 + assets/instagram.svg | 3 + assets/lady-face.jpg | Bin 0 -> 4401 bytes assets/linkedin.svg | 3 + assets/list.svg | 3 + assets/main-logo.png | Bin 0 -> 172741 bytes assets/map-marker.png | Bin 0 -> 1683 bytes assets/person-circle.svg | 4 + assets/search.svg | 3 + assets/star.svg | 3 + assets/stars.svg | 7 + assets/telephone.svg | 3 + assets/twitter.svg | 3 + assets/x-lg.svg | 3 + assets/youtube.svg | 3 + composer.lock | 15 +- config.php | 86 +- dist/app.css | 12894 ++++++++++++++ dist/app.js | 14026 ++++++++++++++++ .../vendor/slick-carousel/slick/slick.eot | Bin 0 -> 2048 bytes .../vendor/slick-carousel/slick/slick.svg | 14 + .../vendor/slick-carousel/slick/slick.ttf | Bin 0 -> 1892 bytes .../vendor/slick-carousel/slick/slick.woff | Bin 0 -> 1380 bytes .../slick-carousel/slick/ajax-loader.gif | Bin 0 -> 4178 bytes dist/mix-manifest.json | 4 + footer.php | 15 +- functions.php | 9 +- header.php | 8 +- helpers/DateFormatter.php | 15 - helpers/McCansHelpers.php | 52 + index.php | 12 +- package-lock.json | 11635 ++++++++----- package.json | 9 +- page.php | 6 + single-location.php | 22 + single-product.php | 13 + single-testimonial.php | 3 + src/js/app.js | 93 + src/scss/app.scss | 22 +- src/scss/flex-background-image-cta.scss | 32 + src/scss/flex-logo-slider.scss | 9 + src/scss/flex-plain-text.scss | 16 + src/scss/flex-testimonials.scss | 133 + src/scss/footer.scss | 82 + src/scss/global.scss | 80 + src/scss/header.scss | 195 + src/scss/intro-slide.scss | 34 + src/scss/location.scss | 52 + src/scss/locations.scss | 41 + src/scss/shop.scss | 122 + src/scss/top-image.scss | 17 + src/scss/variables.scss | 20 + taxonomy-product-category.php | 3 + tpl-flex.php | 7 + tpl/flex.tpl | 1 + tpl/flex_background_image_cta.tpl | 17 + tpl/flex_logo_slider.tpl | 15 + tpl/flex_plain_text.tpl | 10 + tpl/flex_testimonials.tpl | 15 + tpl/footer.tpl | 69 +- tpl/header.tpl | 96 +- tpl/index.tpl | 44 +- tpl/location-tile.tpl | 21 + tpl/location.tpl | 44 + tpl/locations.tpl | 22 + tpl/page.tpl | 9 + tpl/product-tile.tpl | 26 + tpl/shop-top.tpl | 10 + tpl/testimonial-block.tpl | 18 + tpl/woocommerce-after-content.tpl | 5 + tpl/woocommerce-before-content.tpl | 4 + vendor/.htaccess | 6 + vendor/autoload.php | 25 + vendor/bin/getIcon | 119 + vendor/composer/ClassLoader.php | 579 + vendor/composer/InstalledVersions.php | 359 + vendor/composer/LICENSE | 21 + vendor/composer/autoload_classmap.php | 10 + vendor/composer/autoload_namespaces.php | 10 + vendor/composer/autoload_psr4.php | 12 + vendor/composer/autoload_real.php | 38 + vendor/composer/autoload_static.php | 63 + vendor/composer/installed.json | 168 + vendor/composer/installed.php | 50 + vendor/composer/platform_check.php | 26 + vendor/jjgrainger/posttypes/.gitattributes | 1 + vendor/jjgrainger/posttypes/.gitbook.yml | 3 + .../.github/ISSUE_TEMPLATE/bug-report.md | 11 + .../documentation-improvement.md | 10 + .../.github/ISSUE_TEMPLATE/feature-request.md | 11 + .../ISSUE_TEMPLATE/support-question.md | 9 + .../.github/PULL_REQUEST_TEMPLATE.md | 8 + .../posttypes/.github/workflows/tests.yml | 45 + vendor/jjgrainger/posttypes/.gitignore | 3 + vendor/jjgrainger/posttypes/CONTRIBUTING.md | 143 + vendor/jjgrainger/posttypes/Changelog.md | 49 + vendor/jjgrainger/posttypes/LICENSE | 21 + vendor/jjgrainger/posttypes/README.md | 89 + vendor/jjgrainger/posttypes/codecov.yml | 1 + vendor/jjgrainger/posttypes/composer.json | 37 + vendor/jjgrainger/posttypes/composer.lock | 1842 ++ .../posttypes/docs/Getting-started.md | 70 + vendor/jjgrainger/posttypes/docs/Notes.md | 28 + vendor/jjgrainger/posttypes/docs/SUMMARY.md | 18 + .../docs/post-types/Add-taxonomies.md | 21 + .../posttypes/docs/post-types/Columns.md | 76 + .../docs/post-types/Create-a-post-type.md | 119 + .../posttypes/docs/post-types/Filters.md | 21 + .../docs/post-types/Flush-rewrite-rules.md | 9 + .../posttypes/docs/post-types/Menu-icons.md | 10 + .../posttypes/docs/post-types/README.md | 10 + .../docs/taxonomies/Add-to-post-type.md | 16 + .../posttypes/docs/taxonomies/Columns.md | 89 + .../docs/taxonomies/Create-a-taxonomy.md | 113 + .../posttypes/docs/taxonomies/README.md | 7 + vendor/jjgrainger/posttypes/phpunit.xml | 17 + vendor/jjgrainger/posttypes/src/Columns.php | 240 + vendor/jjgrainger/posttypes/src/PostType.php | 543 + vendor/jjgrainger/posttypes/src/Taxonomy.php | 384 + .../posttypes/tests/ColumnsTest.php | 212 + .../posttypes/tests/PostTypeTest.php | 265 + .../posttypes/tests/TaxonomyTest.php | 167 + .../rad-theme-engine/.gitignore | 4 + .../rad-theme-engine/LICENSE | 21 + .../rad-theme-engine/README.md | 41 + .../rad-theme-engine/bin/getIcon | 37 + .../rad-theme-engine/composer.json | 30 + .../rad-theme-engine/config.example.php | 93 + .../rad-theme-engine/logo.png | Bin 0 -> 89459 bytes .../rad-theme-engine/phpunit.xml | 18 + .../rad-theme-engine/src/FieldHTML.php | 849 + .../rad-theme-engine/src/IconGetter.php | 2115 +++ .../rad-theme-engine/src/RadField.php | 84 + .../rad-theme-engine/src/RadThemeEngine.php | 109 + .../rad-theme-engine/src/Site.php | 1431 ++ .../rad-theme-engine/src/Util.php | 103 + .../rad-theme-engine/tests/UtilTest.php | 22 + vendor/salesforce/handlebars-php/.gitignore | 7 + .../handlebars-php/.scrutinizer.yml | 3 + vendor/salesforce/handlebars-php/.travis.yml | 4 + .../handlebars-php/CODE_OF_CONDUCT.md | 105 + .../salesforce/handlebars-php/Contributors.md | 1 + vendor/salesforce/handlebars-php/LICENSE | 8 + vendor/salesforce/handlebars-php/README.md | 769 + .../salesforce/handlebars-php/composer.json | 33 + .../handlebars-php/phpunit.xml.dist | 15 + .../src/Handlebars/Autoloader.php | 77 + .../handlebars-php/src/Handlebars/Cache.php | 49 + .../src/Handlebars/Cache/APC.php | 60 + .../src/Handlebars/Cache/Disk.php | 115 + .../src/Handlebars/Cache/Dummy.php | 62 + .../handlebars-php/src/Handlebars/Context.php | 382 + .../src/Handlebars/Handlebars.php | 533 + .../src/Handlebars/HandlebarsString.php | 65 + .../handlebars-php/src/Handlebars/Helpers.php | 733 + .../handlebars-php/src/Handlebars/Loader.php | 29 + .../Handlebars/Loader/FilesystemLoader.php | 144 + .../src/Handlebars/Loader/StringLoader.php | 36 + .../handlebars-php/src/Handlebars/Parser.php | 94 + .../src/Handlebars/Template.php | 386 + .../src/Handlebars/Tokenizer.php | 353 + .../tests/Handlebars/HandlebarsTest.php | 448 + .../handlebars-php/tests/bootstrap.php | 4 + .../tests/fixture/Handlebars/Example/Test.php | 10 + .../tests/fixture/Handlebars/Test.php | 11 + webpack.mix.js | 2 +- 179 files changed, 52733 insertions(+), 4704 deletions(-) create mode 100644 acf-json/group_681154755e23d.json create mode 100644 acf-json/group_6824d74596f5f.json create mode 100644 acf-json/group_682777331a711.json create mode 100644 acf-json/group_68279f15907f1.json create mode 100644 acf-json/group_6827a1d4cc554.json create mode 100644 acf-json/group_682b909552599.json create mode 100644 archive-location.php create mode 100644 archive-testimonial.php create mode 100644 assets/cart-plus.svg create mode 100644 assets/chevron-down.svg create mode 100644 assets/chevron-left.svg create mode 100644 assets/chevron-right.svg create mode 100644 assets/facebook.svg create mode 100644 assets/instagram.svg create mode 100644 assets/lady-face.jpg create mode 100644 assets/linkedin.svg create mode 100644 assets/list.svg create mode 100644 assets/main-logo.png create mode 100644 assets/map-marker.png create mode 100644 assets/person-circle.svg create mode 100644 assets/search.svg create mode 100644 assets/star.svg create mode 100644 assets/stars.svg create mode 100644 assets/telephone.svg create mode 100644 assets/twitter.svg create mode 100644 assets/x-lg.svg create mode 100644 assets/youtube.svg create mode 100644 dist/app.css create mode 100644 dist/app.js create mode 100644 dist/fonts/vendor/slick-carousel/slick/slick.eot create mode 100644 dist/fonts/vendor/slick-carousel/slick/slick.svg create mode 100644 dist/fonts/vendor/slick-carousel/slick/slick.ttf create mode 100644 dist/fonts/vendor/slick-carousel/slick/slick.woff create mode 100644 dist/images/vendor/slick-carousel/slick/ajax-loader.gif create mode 100644 dist/mix-manifest.json delete mode 100644 helpers/DateFormatter.php create mode 100644 helpers/McCansHelpers.php create mode 100644 page.php create mode 100644 single-location.php create mode 100644 single-product.php create mode 100644 single-testimonial.php create mode 100644 src/scss/flex-background-image-cta.scss create mode 100644 src/scss/flex-logo-slider.scss create mode 100644 src/scss/flex-plain-text.scss create mode 100644 src/scss/flex-testimonials.scss create mode 100644 src/scss/footer.scss create mode 100644 src/scss/global.scss create mode 100644 src/scss/header.scss create mode 100644 src/scss/intro-slide.scss create mode 100644 src/scss/location.scss create mode 100644 src/scss/locations.scss create mode 100644 src/scss/shop.scss create mode 100644 src/scss/top-image.scss create mode 100644 src/scss/variables.scss create mode 100644 taxonomy-product-category.php create mode 100644 tpl-flex.php create mode 100644 tpl/flex.tpl create mode 100644 tpl/flex_background_image_cta.tpl create mode 100644 tpl/flex_logo_slider.tpl create mode 100644 tpl/flex_plain_text.tpl create mode 100644 tpl/flex_testimonials.tpl create mode 100644 tpl/location-tile.tpl create mode 100644 tpl/location.tpl create mode 100644 tpl/locations.tpl create mode 100644 tpl/page.tpl create mode 100644 tpl/product-tile.tpl create mode 100644 tpl/shop-top.tpl create mode 100644 tpl/testimonial-block.tpl create mode 100644 tpl/woocommerce-after-content.tpl create mode 100644 tpl/woocommerce-before-content.tpl create mode 100644 vendor/.htaccess create mode 100644 vendor/autoload.php create mode 100755 vendor/bin/getIcon create mode 100644 vendor/composer/ClassLoader.php create mode 100644 vendor/composer/InstalledVersions.php create mode 100644 vendor/composer/LICENSE create mode 100644 vendor/composer/autoload_classmap.php create mode 100644 vendor/composer/autoload_namespaces.php create mode 100644 vendor/composer/autoload_psr4.php create mode 100644 vendor/composer/autoload_real.php create mode 100644 vendor/composer/autoload_static.php create mode 100644 vendor/composer/installed.json create mode 100644 vendor/composer/installed.php create mode 100644 vendor/composer/platform_check.php create mode 100644 vendor/jjgrainger/posttypes/.gitattributes create mode 100644 vendor/jjgrainger/posttypes/.gitbook.yml create mode 100644 vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/bug-report.md create mode 100644 vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/documentation-improvement.md create mode 100644 vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/feature-request.md create mode 100644 vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/support-question.md create mode 100644 vendor/jjgrainger/posttypes/.github/PULL_REQUEST_TEMPLATE.md create mode 100644 vendor/jjgrainger/posttypes/.github/workflows/tests.yml create mode 100644 vendor/jjgrainger/posttypes/.gitignore create mode 100644 vendor/jjgrainger/posttypes/CONTRIBUTING.md create mode 100644 vendor/jjgrainger/posttypes/Changelog.md create mode 100644 vendor/jjgrainger/posttypes/LICENSE create mode 100644 vendor/jjgrainger/posttypes/README.md create mode 100644 vendor/jjgrainger/posttypes/codecov.yml create mode 100644 vendor/jjgrainger/posttypes/composer.json create mode 100644 vendor/jjgrainger/posttypes/composer.lock create mode 100644 vendor/jjgrainger/posttypes/docs/Getting-started.md create mode 100644 vendor/jjgrainger/posttypes/docs/Notes.md create mode 100644 vendor/jjgrainger/posttypes/docs/SUMMARY.md create mode 100644 vendor/jjgrainger/posttypes/docs/post-types/Add-taxonomies.md create mode 100644 vendor/jjgrainger/posttypes/docs/post-types/Columns.md create mode 100644 vendor/jjgrainger/posttypes/docs/post-types/Create-a-post-type.md create mode 100644 vendor/jjgrainger/posttypes/docs/post-types/Filters.md create mode 100644 vendor/jjgrainger/posttypes/docs/post-types/Flush-rewrite-rules.md create mode 100644 vendor/jjgrainger/posttypes/docs/post-types/Menu-icons.md create mode 100644 vendor/jjgrainger/posttypes/docs/post-types/README.md create mode 100644 vendor/jjgrainger/posttypes/docs/taxonomies/Add-to-post-type.md create mode 100644 vendor/jjgrainger/posttypes/docs/taxonomies/Columns.md create mode 100644 vendor/jjgrainger/posttypes/docs/taxonomies/Create-a-taxonomy.md create mode 100644 vendor/jjgrainger/posttypes/docs/taxonomies/README.md create mode 100644 vendor/jjgrainger/posttypes/phpunit.xml create mode 100644 vendor/jjgrainger/posttypes/src/Columns.php create mode 100644 vendor/jjgrainger/posttypes/src/PostType.php create mode 100644 vendor/jjgrainger/posttypes/src/Taxonomy.php create mode 100644 vendor/jjgrainger/posttypes/tests/ColumnsTest.php create mode 100644 vendor/jjgrainger/posttypes/tests/PostTypeTest.php create mode 100644 vendor/jjgrainger/posttypes/tests/TaxonomyTest.php create mode 100644 vendor/open-function-computers-llc/rad-theme-engine/.gitignore create mode 100644 vendor/open-function-computers-llc/rad-theme-engine/LICENSE create mode 100644 vendor/open-function-computers-llc/rad-theme-engine/README.md create mode 100755 vendor/open-function-computers-llc/rad-theme-engine/bin/getIcon create mode 100644 vendor/open-function-computers-llc/rad-theme-engine/composer.json create mode 100644 vendor/open-function-computers-llc/rad-theme-engine/config.example.php create mode 100644 vendor/open-function-computers-llc/rad-theme-engine/logo.png create mode 100644 vendor/open-function-computers-llc/rad-theme-engine/phpunit.xml create mode 100644 vendor/open-function-computers-llc/rad-theme-engine/src/FieldHTML.php create mode 100644 vendor/open-function-computers-llc/rad-theme-engine/src/IconGetter.php create mode 100644 vendor/open-function-computers-llc/rad-theme-engine/src/RadField.php create mode 100644 vendor/open-function-computers-llc/rad-theme-engine/src/RadThemeEngine.php create mode 100644 vendor/open-function-computers-llc/rad-theme-engine/src/Site.php create mode 100644 vendor/open-function-computers-llc/rad-theme-engine/src/Util.php create mode 100644 vendor/open-function-computers-llc/rad-theme-engine/tests/UtilTest.php create mode 100644 vendor/salesforce/handlebars-php/.gitignore create mode 100644 vendor/salesforce/handlebars-php/.scrutinizer.yml create mode 100644 vendor/salesforce/handlebars-php/.travis.yml create mode 100644 vendor/salesforce/handlebars-php/CODE_OF_CONDUCT.md create mode 100644 vendor/salesforce/handlebars-php/Contributors.md create mode 100644 vendor/salesforce/handlebars-php/LICENSE create mode 100644 vendor/salesforce/handlebars-php/README.md create mode 100644 vendor/salesforce/handlebars-php/composer.json create mode 100644 vendor/salesforce/handlebars-php/phpunit.xml.dist create mode 100755 vendor/salesforce/handlebars-php/src/Handlebars/Autoloader.php create mode 100755 vendor/salesforce/handlebars-php/src/Handlebars/Cache.php create mode 100755 vendor/salesforce/handlebars-php/src/Handlebars/Cache/APC.php create mode 100644 vendor/salesforce/handlebars-php/src/Handlebars/Cache/Disk.php create mode 100755 vendor/salesforce/handlebars-php/src/Handlebars/Cache/Dummy.php create mode 100755 vendor/salesforce/handlebars-php/src/Handlebars/Context.php create mode 100755 vendor/salesforce/handlebars-php/src/Handlebars/Handlebars.php create mode 100644 vendor/salesforce/handlebars-php/src/Handlebars/HandlebarsString.php create mode 100755 vendor/salesforce/handlebars-php/src/Handlebars/Helpers.php create mode 100755 vendor/salesforce/handlebars-php/src/Handlebars/Loader.php create mode 100755 vendor/salesforce/handlebars-php/src/Handlebars/Loader/FilesystemLoader.php create mode 100755 vendor/salesforce/handlebars-php/src/Handlebars/Loader/StringLoader.php create mode 100755 vendor/salesforce/handlebars-php/src/Handlebars/Parser.php create mode 100755 vendor/salesforce/handlebars-php/src/Handlebars/Template.php create mode 100644 vendor/salesforce/handlebars-php/src/Handlebars/Tokenizer.php create mode 100644 vendor/salesforce/handlebars-php/tests/Handlebars/HandlebarsTest.php create mode 100644 vendor/salesforce/handlebars-php/tests/bootstrap.php create mode 100644 vendor/salesforce/handlebars-php/tests/fixture/Handlebars/Example/Test.php create mode 100644 vendor/salesforce/handlebars-php/tests/fixture/Handlebars/Test.php diff --git a/.gitignore b/.gitignore index 059642a..c2658d7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1 @@ node_modules/ -vendor/ -dist/ diff --git a/acf-json/group_681154755e23d.json b/acf-json/group_681154755e23d.json new file mode 100644 index 0000000..172a95a --- /dev/null +++ b/acf-json/group_681154755e23d.json @@ -0,0 +1,328 @@ +{ + "key": "group_681154755e23d", + "title": "Site Settings", + "fields": [ + { + "key": "field_681154d818817", + "label": "General", + "name": "", + "aria-label": "", + "type": "tab", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "placement": "top", + "endpoint": 0, + "selected": 0 + }, + { + "key": "field_68115475f02b7", + "label": "Tagline", + "name": "tagline", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_681154e618818", + "label": "Footer Address", + "name": "", + "aria-label": "", + "type": "tab", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "placement": "top", + "endpoint": 0, + "selected": 0 + }, + { + "key": "field_68115485f02b8", + "label": "Address", + "name": "address", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_68115496f02b9", + "label": "City", + "name": "city", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_6811549cf02ba", + "label": "State", + "name": "state", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_681154ef18819", + "label": "Contact", + "name": "", + "aria-label": "", + "type": "tab", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "placement": "top", + "endpoint": 0, + "selected": 0 + }, + { + "key": "field_681154a3f02bb", + "label": "Contact Email", + "name": "contact_email", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_681154adf02bc", + "label": "Contact Phone", + "name": "contact_phone", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_681154f41881a", + "label": "Social Media", + "name": "", + "aria-label": "", + "type": "tab", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "placement": "top", + "endpoint": 0, + "selected": 0 + }, + { + "key": "field_682519ed2e995", + "label": "Facebook URL", + "name": "facebook_url", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_682519f52e996", + "label": "Twitter URL", + "name": "twitter_url", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_682519ff2e997", + "label": "LinkedIn URL", + "name": "linkedin_url", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_68251a0e2e998", + "label": "YouTube URL", + "name": "youtube_url", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_68251a212e999", + "label": "Instagram URL", + "name": "instagram_url", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + } + ], + "location": [ + [ + { + "param": "options_page", + "operator": "==", + "value": "site_options" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": "", + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1747261994 +} diff --git a/acf-json/group_6824d74596f5f.json b/acf-json/group_6824d74596f5f.json new file mode 100644 index 0000000..07208a9 --- /dev/null +++ b/acf-json/group_6824d74596f5f.json @@ -0,0 +1,581 @@ +{ + "key": "group_6824d74596f5f", + "title": "Flex Content Items", + "fields": [ + { + "key": "field_6824d745f276f", + "label": "Content", + "name": "content", + "aria-label": "", + "type": "flexible_content", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "layouts": { + "layout_6824d7542753b": { + "key": "layout_6824d7542753b", + "name": "background_image_cta", + "label": "Background Image CTA", + "display": "block", + "sub_fields": [ + { + "key": "field_6824d79bf2775", + "label": "Content", + "name": "", + "aria-label": "", + "type": "tab", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "placement": "top", + "endpoint": 0, + "selected": 0 + }, + { + "key": "field_6824d76af2770", + "label": "Headline", + "name": "headline", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_6824d775f2771", + "label": "Description", + "name": "description", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_6824d780f2772", + "label": "Button Text", + "name": "button_text", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_6824d786f2773", + "label": "Button Target", + "name": "button_target", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_6824d78df2774", + "label": "Background Image", + "name": "background_image", + "aria-label": "", + "type": "image", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "return_format": "url", + "library": "all", + "min_width": "", + "min_height": "", + "min_size": "", + "max_width": "", + "max_height": "", + "max_size": "", + "mime_types": "", + "allow_in_bindings": 0, + "preview_size": "medium" + }, + { + "key": "field_6824d7a6f2776", + "label": "Configuration", + "name": "", + "aria-label": "", + "type": "tab", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "placement": "top", + "endpoint": 0, + "selected": 0 + }, + { + "key": "field_6824d7b2f2777", + "label": "Tag Type", + "name": "tag_type", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 1, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "h1": "H1", + "h2": "H2", + "h3": "H3" + }, + "default_value": "h1", + "return_format": "value", + "multiple": 0, + "allow_null": 0, + "allow_in_bindings": 0, + "ui": 0, + "ajax": 0, + "placeholder": "", + "create_options": 0, + "save_options": 0 + }, + { + "key": "field_6824d874f2778", + "label": "Overlay Color", + "name": "overlay_color", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "White": "White", + "Black": "Black" + }, + "default_value": false, + "return_format": "value", + "multiple": 0, + "allow_null": 0, + "allow_in_bindings": 0, + "ui": 0, + "ajax": 0, + "placeholder": "", + "create_options": 0, + "save_options": 0 + } + ], + "min": "", + "max": "" + }, + "layout_6824ded287362": { + "key": "layout_6824ded287362", + "name": "plain_text", + "label": "Plain Text", + "display": "block", + "sub_fields": [ + { + "key": "field_6824ded287363", + "label": "Content", + "name": "", + "aria-label": "", + "type": "tab", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "placement": "top", + "endpoint": 0, + "selected": 0 + }, + { + "key": "field_6824ded287364", + "label": "Headline", + "name": "headline", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_6824ded287365", + "label": "Description", + "name": "description", + "aria-label": "", + "type": "wysiwyg", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "allow_in_bindings": 1, + "tabs": "all", + "toolbar": "full", + "media_upload": 1, + "delay": 0 + }, + { + "key": "field_6824ded287369", + "label": "Configuration", + "name": "", + "aria-label": "", + "type": "tab", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "placement": "top", + "endpoint": 0, + "selected": 0 + }, + { + "key": "field_6824ded28736a", + "label": "Tag Type", + "name": "tag_type", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 1, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "h1": "H1", + "h2": "H2", + "h3": "H3" + }, + "default_value": "h1", + "return_format": "value", + "multiple": 0, + "allow_null": 0, + "allow_in_bindings": 0, + "ui": 0, + "ajax": 0, + "placeholder": "", + "create_options": 0, + "save_options": 0 + } + ], + "min": "", + "max": "" + }, + "layout_6824e05313d93": { + "key": "layout_6824e05313d93", + "name": "block_links", + "label": "Block Links", + "display": "block", + "sub_fields": [ + { + "key": "field_6824e06c13d95", + "label": "Block", + "name": "block", + "aria-label": "", + "type": "repeater", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "layout": "table", + "min": 0, + "max": 0, + "collapsed": "", + "button_label": "Add Row", + "rows_per_page": 20, + "sub_fields": [ + { + "key": "field_6824e07913d96", + "label": "Target", + "name": "target", + "aria-label": "", + "type": "post_object", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "post_type": "", + "post_status": "", + "taxonomy": "", + "return_format": "object", + "multiple": 0, + "allow_null": 0, + "allow_in_bindings": 0, + "bidirectional": 0, + "ui": 1, + "bidirectional_target": [], + "parent_repeater": "field_6824e06c13d95" + } + ] + } + ], + "min": "", + "max": "" + }, + "layout_6824f3d3eb907": { + "key": "layout_6824f3d3eb907", + "name": "logo_slider", + "label": "Logo Slider", + "display": "block", + "sub_fields": [ + { + "key": "field_6824f3dceb90d", + "label": "Logos", + "name": "logos", + "aria-label": "", + "type": "repeater", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "layout": "table", + "min": 0, + "max": 0, + "collapsed": "", + "button_label": "Add Logo", + "rows_per_page": 20, + "sub_fields": [ + { + "key": "field_6824f3e7eb90e", + "label": "Logo", + "name": "logo", + "aria-label": "", + "type": "image", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "return_format": "array", + "library": "all", + "min_width": "", + "min_height": "", + "min_size": "", + "max_width": "", + "max_height": "", + "max_size": "", + "mime_types": "", + "allow_in_bindings": 0, + "preview_size": "medium", + "parent_repeater": "field_6824f3dceb90d" + } + ] + } + ], + "min": "", + "max": "" + }, + "layout_68277c371ca0c": { + "key": "layout_68277c371ca0c", + "name": "testimonials", + "label": "Testimonials", + "display": "block", + "sub_fields": [ + { + "key": "field_68277c3e1ca0e", + "label": "Headline", + "name": "headline", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_68277c511ca0f", + "label": "Testimonials", + "name": "testimonials", + "aria-label": "", + "type": "repeater", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "layout": "table", + "min": 0, + "max": 0, + "collapsed": "", + "button_label": "Add Row", + "rows_per_page": 20, + "sub_fields": [ + { + "key": "field_68277c681ca10", + "label": "Testimonial", + "name": "testimonial", + "aria-label": "", + "type": "post_object", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "post_type": [ + "testimonial" + ], + "post_status": "", + "taxonomy": "", + "return_format": "object", + "multiple": 0, + "allow_null": 0, + "allow_in_bindings": 0, + "bidirectional": 0, + "ui": 1, + "bidirectional_target": [], + "parent_repeater": "field_68277c511ca0f" + } + ] + } + ], + "min": "", + "max": "" + } + }, + "min": "", + "max": "", + "button_label": "Add Row" + } + ], + "location": [ + [ + { + "param": "page_template", + "operator": "==", + "value": "tpl-flex.php" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": [ + "the_content" + ], + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1747418238 +} diff --git a/acf-json/group_682777331a711.json b/acf-json/group_682777331a711.json new file mode 100644 index 0000000..7d27553 --- /dev/null +++ b/acf-json/group_682777331a711.json @@ -0,0 +1,101 @@ +{ + "key": "group_682777331a711", + "title": "Testimonial Fields", + "fields": [ + { + "key": "field_6827773326bd6", + "label": "Position", + "name": "position", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_6827779b26bd7", + "label": "Quote", + "name": "quote", + "aria-label": "", + "type": "textarea", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "rows": "", + "placeholder": "", + "new_lines": "" + }, + { + "key": "field_682777b526bd8", + "label": "Rating", + "name": "rating", + "aria-label": "", + "type": "select", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "choices": { + "5": "5", + "4": "4", + "3": "3", + "2": "2", + "1": "1" + }, + "default_value": 5, + "return_format": "value", + "multiple": 0, + "allow_null": 0, + "allow_in_bindings": 0, + "ui": 0, + "ajax": 0, + "placeholder": "", + "create_options": 0, + "save_options": 0 + } + ], + "location": [ + [ + { + "param": "post_type", + "operator": "==", + "value": "testimonial" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": [ + "the_content" + ], + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1747417078 +} diff --git a/acf-json/group_68279f15907f1.json b/acf-json/group_68279f15907f1.json new file mode 100644 index 0000000..dfdf9ec --- /dev/null +++ b/acf-json/group_68279f15907f1.json @@ -0,0 +1,93 @@ +{ + "key": "group_68279f15907f1", + "title": "Locations Settings", + "fields": [ + { + "key": "field_68279f150b6ea", + "label": "Top Image", + "name": "locations_top_image", + "aria-label": "", + "type": "image", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "return_format": "url", + "library": "all", + "min_width": "", + "min_height": "", + "min_size": "", + "max_width": "", + "max_height": "", + "max_size": "", + "mime_types": "", + "allow_in_bindings": 0, + "preview_size": "medium" + }, + { + "key": "field_68279f3a0b6eb", + "label": "Headline", + "name": "locations_headline", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_68279f440b6ec", + "label": "Intro Text", + "name": "locations_intro_text", + "aria-label": "", + "type": "textarea", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "rows": "", + "placeholder": "", + "new_lines": "br" + } + ], + "location": [ + [ + { + "param": "options_page", + "operator": "==", + "value": "locations_landing_page" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": "", + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1747427158 +} diff --git a/acf-json/group_6827a1d4cc554.json b/acf-json/group_6827a1d4cc554.json new file mode 100644 index 0000000..c0a9f1f --- /dev/null +++ b/acf-json/group_6827a1d4cc554.json @@ -0,0 +1,237 @@ +{ + "key": "group_6827a1d4cc554", + "title": "Location Fields", + "fields": [ + { + "key": "field_6827a1d5e73bb", + "label": "Intro", + "name": "intro", + "aria-label": "", + "type": "textarea", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "rows": "", + "placeholder": "", + "new_lines": "br" + }, + { + "key": "field_6827a221e73bc", + "label": "Address 1", + "name": "address_1", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_6827a228e73bd", + "label": "Address 2", + "name": "address_2", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_6827a4199d542", + "label": "City", + "name": "city", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_6827a233e73bf", + "label": "State", + "name": "state", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_6827a23fe73c0", + "label": "Zip", + "name": "zip", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_6827a244e73c1", + "label": "Phone", + "name": "phone", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_6827a24ce73c2", + "label": "Hours", + "name": "hours", + "aria-label": "", + "type": "textarea", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "rows": "", + "placeholder": "", + "new_lines": "br" + }, + { + "key": "field_6827a25ae73c3", + "label": "Latitude", + "name": "latitude", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_6827a261e73c4", + "label": "Longitude", + "name": "longitude", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + } + ], + "location": [ + [ + { + "param": "post_type", + "operator": "==", + "value": "location" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": [ + "the_content" + ], + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1747434256 +} diff --git a/acf-json/group_682b909552599.json b/acf-json/group_682b909552599.json new file mode 100644 index 0000000..28860d2 --- /dev/null +++ b/acf-json/group_682b909552599.json @@ -0,0 +1,95 @@ +{ + "key": "group_682b909552599", + "title": "Shop Landing Page Fields", + "fields": [ + { + "key": "field_682b9095f94b9", + "label": "Headline", + "name": "headline", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_682b922499813", + "label": "Intro Text", + "name": "intro_text", + "aria-label": "", + "type": "text", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "default_value": "", + "maxlength": "", + "allow_in_bindings": 0, + "placeholder": "", + "prepend": "", + "append": "" + }, + { + "key": "field_682b923599814", + "label": "Background Image", + "name": "background_image", + "aria-label": "", + "type": "image", + "instructions": "", + "required": 0, + "conditional_logic": 0, + "wrapper": { + "width": "", + "class": "", + "id": "" + }, + "return_format": "url", + "library": "all", + "min_width": "", + "min_height": "", + "min_size": "", + "max_width": "", + "max_height": "", + "max_size": "", + "mime_types": "", + "allow_in_bindings": 0, + "preview_size": "medium" + } + ], + "location": [ + [ + { + "param": "page", + "operator": "==", + "value": "70" + } + ] + ], + "menu_order": 0, + "position": "normal", + "style": "default", + "label_placement": "top", + "instruction_placement": "label", + "hide_on_screen": [ + "the_content" + ], + "active": true, + "description": "", + "show_in_rest": 0, + "modified": 1747688097 +} diff --git a/archive-location.php b/archive-location.php new file mode 100644 index 0000000..3acac09 --- /dev/null +++ b/archive-location.php @@ -0,0 +1,22 @@ +render("locations", [ + "top_image" => get_field("locations_top_image", "options"), + "headline" => get_field("locations_headline", "options"), + "intro" => get_field("locations_intro_text", "options"), + "locations" => site()->getDefaultPosts([ + "title", + "latitude", + "longitude", + "address_1", + "city", + "state", + "zip", + "phone", + "url", + ]) +]); + +get_footer(); diff --git a/archive-testimonial.php b/archive-testimonial.php new file mode 100644 index 0000000..676c488 --- /dev/null +++ b/archive-testimonial.php @@ -0,0 +1,3 @@ + + + + \ No newline at end of file diff --git a/assets/chevron-down.svg b/assets/chevron-down.svg new file mode 100644 index 0000000..a281907 --- /dev/null +++ b/assets/chevron-down.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/chevron-left.svg b/assets/chevron-left.svg new file mode 100644 index 0000000..5bcc1bb --- /dev/null +++ b/assets/chevron-left.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/chevron-right.svg b/assets/chevron-right.svg new file mode 100644 index 0000000..ab39af8 --- /dev/null +++ b/assets/chevron-right.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/facebook.svg b/assets/facebook.svg new file mode 100644 index 0000000..5fc7cec --- /dev/null +++ b/assets/facebook.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/instagram.svg b/assets/instagram.svg new file mode 100644 index 0000000..855e653 --- /dev/null +++ b/assets/instagram.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/lady-face.jpg b/assets/lady-face.jpg new file mode 100644 index 0000000000000000000000000000000000000000..a66b807987b2b68cee74e8ccd415505c4a84bf2a GIT binary patch literal 4401 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 + + \ No newline at end of file diff --git a/assets/list.svg b/assets/list.svg new file mode 100644 index 0000000..de58858 --- /dev/null +++ b/assets/list.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/main-logo.png b/assets/main-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..f6d3d223ebaeae4cc3a491f583f4c4d6c12ac544 GIT binary patch literal 172741 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

-RjDx3Ig^u5R2ubF5)K=~Q#888^N1rUC@!O#}Z|tI_*4<&|?S8dYPJkHcEZ zsZ^Az0i*fk921Ub&zyKERtj8V8U2XawELmSdw=$)`<+Q=OuRqX-#r#>bau^!fhzc>F$jXf91L3N)DWI-^XMy046oNoTFUO=|t$sZNft|W$r)UK#eo}&b%Xh{M-VEJ zO6}I|x>>yRM<_Q31&&M%*~$v2xGkjB^E^Cx%zxCHW@QqkI#7sb3rw0`8rIHO4pN{r zLb1W5k|`|zYReey>3lw{7mFlk1C?}?3?xV$g;Hk|VrMdOGQrD)9K>H`=nxN=SC0Va z{Ok({)F$2JUFP3yjf;_%9|`&it1e-V0=4W9XFF8`CrYq0n@g%~O`<(*omL<$`7xU9 z9Z#=+#gH_Ls>{`*!7%Vw?@p2WaXnESB#1oEneV)w5yE=!oxGoQzpFjN`+qrbs=||1 zQ$#B9RaJ`26t$r!;SEhJBFCWSXoyYG`h59Sph}3b$&-zxq0viCfe@&ymnB1P5@Tc^ zI)Y+f<#_a*7Cq!CPfSr!L*J0St{Y7gnn4?q2~+&(IeH$c2!CyCcPNM_hPGs0>SBJo z4r?*t8F?bvdP7eD%4xwRY^U}>W(O{NyF*HjQ{;w!Q6t?>vz+QPT-q87c66#F43hjB z$}#hZ=RAUXAbThRTRq!ko58MZN+BH{YS=@ei>paA*C`7y zKzlT-7^oHL%CjQvUa}Dts2${lT3-W?HOh~#h&-<-ktwxT+%8f$I;I_@MJ_9@cKLgx zA$nQ5a@vShbJs0@9GS&K&0fN$RI*kw&n3##AapXH0sNH>f4*yiBqUL!hcm<>_6>pM z+W5%0ue7daap@T)JurG`1xkd74P__m=}m9BOOhpZonIV-%dNRjJ~o5u!be-TvQ5;| z1D^&S!K+!8jlOUMxGKYDRAoG1Y4-ESsqP@zHQ+qkjLq4I$ZQFwVLZtgGKfoVQ&P{$ z+AMPF74qQZ7DdJ`SR;f?f4;^l84s$5s`S(F#02pXLqj4zw;DYtBy(L$&Qyjy5cg`B z`!&>Sa2WEM(TV)q_@7t1!mOc*UvRC~WHeuX<;O@u*V|h&4v@wRcVJSs25}K>Yozw< zaf$L^aZSk-4`8pnpGnP@_zZ3X8D%Ui8DYOVztZ`!QRv9e(|>}oWftSlr>IR(`>rJ( zsG%bX`wih+&S|W&Q%TWG=G2J?zpN&F=N95#H3uzmwMi+Su$#nI!>~Qq;wWpniM~+j@D*s_%c!)LcY3rsT7= zxDeck!`b7_!-SXJ4z^Y&gKxDNTX~Tq+*RZSsvloE(d7Ju8)-}IH9`bk= zErw*f;JycKu3^8^C)DrZ{E%ia`Z8Lp4tS^%z8m{!0&cxJ=H`OiFi^HVs>A}Ezwerzn+oKLfr zE808aEw$9zDzj8R>nz~-u(#1pJEM`;kWBl$sXu%W zz>dBKHxoYdiI+_)sGh`;SeuK>+qQ_KMbNB*Xj(eRI=>pT!d^>xh)vssFP|FJ!koz; zl+P@w*hKHN8A5_3P}PE^9mffpC4bxGo2;p@RyMi`^)?FY?sBs31oTzN6;>+u_l~j9O7JHuxU4=7x*j zxujwRp}h$`wmnN={^TQ{#3j>O;zkaF`d2)RlIsWSLgKSCNP~?r5)L^_RRyn&d)6E= zliqSMQ`}!yHW%!LN%T$?F#H#k6ge)!&%`F%U+qdNY_)BL_$%0($3R+FuqC(AYmui6 zM4!71-oNP8AiJI6+2&W4^&XE*AtmzE!FSG>rZFV*@9*j6HDod5}o_XlPr%9DOF`0Nlo?;^ry(h zh-os-2#F#U!jqCJe~|^cLf+|&l=bVDXp2KgxD=bo1zvI3AU(Z029ths0C(UG{T6#O z@Ac}PBNtAJFrf-13ql5B25;flYQ`$=^l{T_S{^oQ-9)^qv6V!e#ErCf@WE_+uDz&Gc@&*AY9H0Kn4~F{F>l+3HK&9z zUbXn1|7aShSD%aJYeKv|B+&lO`DCU^lbtn>tUpqT9O3p{3J<%s)^1mgd_g!wrxDA( zswctYtimZ}xVcZYROZaZ!e)i$rw=Ifv{2tb0G;&Q8N zK(z~NqV;Q}&Su{w4OHi5Vz||u$st7vPTYjNBnoaLJ#zvU3O;HXHObU4GF~gXrm$aV zjKHVHyVUmWVH#w))t;~3ZlZX*>-t#5+BZLHPji;m3xII7GOhXw@XUQIzt+7XaSaAz z%0B-ROzV0j&V3wgSr+!l-ANmgX$US?W9NwBhV0>wn-Vf-#*)3HDnw9FER>dI2NsDr zI9^#n#Z!7|yn|w9Oj1L+zhW(JEJgr#9#qFR4!RGQQ&QLb_khHaD#6 z!}?vVPf?%Z=={=;kh+*ED_ti%1fjU$K4akViaGqi2Jfqx6h+b7$eL5M+9uxa7GlRy za*^xIOXd-41Y7fGbN+sax|~LJRn3K+I`yob(8nyt`IT3jako9~KD(m$8G`LA5rlUN z0u4gOl=4ZrNen{5ajzH4m-pvwSd%g@V}X65!bIfZuHh>*$OS3sO$N=((EV}Q)uJr3 z(*DP6r%Jw>C3yQml5O!=q9m;Rj9I-+6X!F*_B58?&856(KeE<>GJ-=B>anB-`=z4s zxag{4Kmt68 zWa`Jyt|@iR3i=jJ&6H5lys1(L`8JMor?&)Mhp>cDI!ho$c6CK}FIqOOBKQul0a=jPu&CAI@3r^sRmgZ z2jn!7>YCL}HC$Fmev)pzioQ&%Zt(&i45my*()?~obK7q;xA>i1Jv6y^)C5!;I4r%I zM)Or}MtO|wFTmaSkB0G_?ko0K-y2G^Z)L_mplngCj0h?=ZqZO8d^nSfIfXe(c@T)U zHhv?8ex=iK2 zKZxWxmP%P1v5h|O<5epY1rAZz$TBEI7d7Wv5m|gIM48#C!#d`H2*4qSFw&XHQrZg{IX8PS{8Gqwx>i_Q<^x2E}-I|w{1ItxlwQi7@ zIw#ob9B5l}Yp?O4fDho09A)E)N4f7aKZiYj1b6B*VY0(9v(!6ceNDBU3EFi|P0wM=A z{{=67?u(3{KgVb%QW%3%MTa+cq<7iov<8|yXL#3X9{5MUihJY%+~yHzl*v^t*1l*j zfNQSrU+6ZmQEZl@#^O>#rU`fcWv+blTg3nLeco40k5f z+~lchWk$O*C9@eObA$j@qpY00hqwI0&oX}B2j`&oYC*z|w7CBMNFm>Qomt5A>p|~e zJZAmn7kK%f|8t)HUw((>-7!sQF_|N4=NeQ$eEm#o0u{uB71yVVcImpYuDf6Y%+rv2 zN^0&`**;l7wM)mJ*P?e%c9AzR80m$cG-8t=lHsiD=KZyRo*rOZjYxnhL@IHNGf!RS z$X)lacKa#LJa8XJ&)k7uT7xo&r4cMIQJVts4wL0r=NTxNw1@81rB@)NxzL;ln*odi za)_%5lV^wXSw;T*@Gy})Ga3TbPHGDe2R zb;Lz#Nma!8H#dGdXc)j5i;9x8^V5wnT^0+lHnqGoy+j-p92t$|>u-594*sKm@;hh# z?%(;99|nG}1$yP{zwu9=s{fDQzjMVp$x?-=p#>|FvAx?8Qe<;um5Zr)Q%_1$ zD=Tk%81wkMfMsY6+a79ajx1a9_MoEP#XG<7bpN>8+(d3Wj<>)wFERbWOSIJ%E1Aa* zmT2l*JCdM<5Zad5v`kaZq$pW?*E_iFZ+wFCqfeq{G*>n>rcXuH-e@Jj98}aBaAG>~ z15AIe1Xjy+vT~K@79{o;Q<@Kzo8Kfx)fgO*snDdrjuCc-Iqi{6(&{SZuY8>R=qAPK z+ZY@>#$dS8IS4Tkn@A{2LcbIpdzv5J(o0C9b7leS<{pu>`u zM9YvsqQH>>%kA;bak)RilZovM=XvqFPxJiKPjmUD^YEpw5MI1Qc;+Rtof>??mN}XC zcrjFZYuoRr0gXyiWZeFN$H+hU0V;ADELWCRI2rPePMERz{k_f>>}&#pMw%EpAf|*QMY2&>58RstpAs+lF(=A(`|Mk~!>E@ncDKlhi(nZtTK#Un`3W}4r!H1tII37-oyFAgK+3>5!6dNGVe+gKf5JnNa7Gs*oU(6O z+Qnz31AqxdQx}X8(?!~>2nOwIZ4;)mnzVgfSY9LQ6%-ReQ&+>=6eaP*G4gxv#GgLF z(i87x`S=k=r%#baD>Qv9I$&rqbM0|iJez0VD6|I%@nvT3HCB~IyVPlQz!2J{JF#@) zU5>vu+4DX;#Wn9b;d9oa{Ggiaq97HUVLtg?JxZW+tW+LLh#($lIL6P4og{y zB_~>o+gRh&JKjO@$OF9W9YZ<=%cz~Oj5k8w3Hc!kQLfKr+rEY+nZ4u3W5EU{Cc|3$ zL)9)1BfWq9hqetV32ll5Ysoj(SbgLnjz0N5)*gC*-Oc+bh67|MG$@ml$P74ZkV3JY zU@K}NMnzNX{0P^nS9Yi4-pRYzo}#P4yMFpx9u;C&T_q+V&QRjXqJbK;%xEHnXb_aa z%1Q2dV1v6(-%l7%nLP0r=}X_H`janEedC)j9gTl+HYmGkU`2_tUpNbgvcp)ueLZC)Tg?@5_XQz0D?N{qddmoEHU92Y6LZE2bO ztq*hbsb{(LwQq8<8B-7_hYoIXPNuft^Bge_6C9)x-*nFQzzVgmFzj_?xO)ACgUX)} z+D=E00Mw?FoN^*;$F5x(rYC3@m9gg$jv*&!kQ}y#*+A ziC!jW7=Q}4GbM~RIrh;HP`q@R=fC?R?xmX>^p3-n%m{_`SOM>HoEBVYT2?M!V6d{b zFjsmNU=xG`(%0?&{gJNXL}HtR$yqHn7}dhM$*EFJ&_o?-^6dH(qylwnnT87A)CBKH zM#)V_^jT)<&2hde)50gPDS&is-J%MSt{lYR5Fj-T+BT39)_@m>wVn7~8{%vBPQCU* za0+BOqZ7v{-~Be0KKgz}Z+if>oA}X)lo^tObh?yeJ(+2Imla6rYL253f`JMppln35 z=VocBd%%kHuD;rC!Y$VQYoZ{rx4rgAxfPCw_ zZ2kFPaOKN?Mf>9OOm}PWw|ITg8%=7rVXjUeXW5s1d03kQyG6#h2^0jpBy5|gq#{@+ z_5c3c?|%ND{?GB<-}%@G3_3>|i^k;wXNake6z@&jyyH4Xvfkt*nz>km^nK7~DOIy{uIn28 z6tKn-W5U`F7+7tA25lx?yQI*m47y%iC?>^POVo&w!)WhK4SH;ZRuOd+wiBfYp+Q9v zC&XZgPDunbHFz-yma!&wQed?iVNYz5-FG*uk37hccfB3^;8|E%fv60NNRw)6723X; zO;UrCjgv*|Vj!|h4l5sdS*nV9LiKH1;I^Zox z54a1=Qh^7`<}}>#PI&TXNKbu-AN6Eot(+aG6e*L_S=VwgK{k+B9cwXd+hi&-2} zm<59D6=4P>#m>=DC51pz$gIQIPSlKOy41Hx&B_4s#~_GB}HC-3G znF6JCNJxaXMg7fP(`ed;PTeE$Fmq7XII|$NqjYMpL6oMae%9h8rgnfF z%_%Zv79BQRfBp5Ht%|Ahc4pMrmlXyaQ=qgpRy4u7w~C9TW!&{ zJK!w?U{?|uMPIm(_PWCKty2{6scXG5%Q%>s1kvtFKxSfpetC>`PCf0El(tDxkXFfX z7~`l31fzIym=H+j`s-^rwM=qhWm1ESj6#DI2RT#{D0d7F8}&JMnt%B)6krIPL707ekKi-n&V-JZH}LFZM6r7j1U4d~1w=6^HZyT@aGXNJNt9 z)>;!RS#)HXLEVsAG%6|>?VN$*`4Su-p~sIPZ@rt*2j9!7Z-0+VfA*KW_?2(6^1bJ{IK9BQy2t>_ zh841<*LjS_su?$AMXW7F#jENT?hNS&I#Z)H~((TH#=TjAo) znD+PvCqMoXPJQ5U%<)qoIn)rWITV>X96#J?GoDHUbsGqAg7pq{kWzq@$V^UKPjN;V zl}j`+aX}(_+etRxa)u+H{18V^pT?g)4TB-A7+T{IAF}%nLjTpfUdhm0+i;}RIignzL36|C$T5n0*EsX;yE*gSk8tiU|B7e7{&ni7 zo+CVSp0r)FW(GJL7^g(kgj2_jPR@-eYRw#YhNj(@nUTAau(Zq_?|2wiM;#%ieSKUn z>T@;ea5eD#QHJzUkG%=%P>9Vlmb_4IZlI4p%1i&-cNm6j9;Hy(Yk{WPDX>~~1a3W2 z?Z>ghv%0{9qNb0S3#fH?O}J#>_$K9t-pMK5A){gX#V<2h9x!fdl2OEXnznOXt+nJP z0}e^an_(>OrG4t$tr8^ms>9%{MFu71ZKo)gmq|bSA-?-BKgXHT?VNw+2NY`~;>bgY zWWk|tq9cEnN&EV~sdP}US8F!22R29P@IOmuY zIlF5)+1noB*y+=peEUNzJ@POd*`#tAG0$<5Vf!A+Jtl=7jK8W|^CNtW#VG#b*50Z56Phn|DOc7${C`KEUcdWDi!G~Di-r?C7o-uZT;Doq%1N9&LOd7nj*<6-h0}aqYz5VMTxB5;LlY= zORJHD(h%laJu#(D-ESu`DTfR{@EAvb`R6eYJxmneb2cr;xL4HL9*)B?8||b)jKvp@ zU@YpSOS8g}LcoQV!a14{xiqd|bCcDF&N6!Mqm*awB75Y1(#k50WW6h3$oe`WLZGpV z7>nsaZb}hSS38H81C>PdH9F-%ln5lGXa5u0w~jE@>DvU>@izbX! z$W~YJ?|2)>Z@(RVVuT{lkjquP?r@td_!=$*zGh~jXPaLHnqmN@>?@8jt| z{5>{zC!`*H8~VCpRidVD?KpFw`sz&qa2HzX{dj}k|@g2v> zKJk8*e{hcRUwjWq0jHMC7hr@*JHh#!GB0VGhL8?x;%-*J+nJ><3a2P3CRziT5y(Ak ztg`mmU*fKfqx|5X{w_z?R@rH`ka9q~+py_JO!@0Qzw_w-)z809Zg&*AbYp8s{TUHZ zoG1Zab@vZlC=*xd0p9CCIJvx_lA0iajWT06R$ktjQlGq&Qy+Q^_ft=>a^g5kCy$dx zL+ZYQRdy|xPZsd*Jr$|346K1kWb6}ZeUst?k8$Grmw4g- z{vDd8VHhj}gqUh@7O@tc)F3xDzgc7K8i^CI1_svSag0NQah~U6%jO53;MAvoiTt5Q zm`X|0)OZshhf??V&%HWD{161cxknO%%{<}^ZK#+|8ZuQf1c!8Ot@4a!R1%II=h)ld z!Kn{ELH_6iOxKne=@Lu=(@+rw^1@@X3^Y5~r(eLt34_cNQ#`06*c*RnEmV++2-cW+!}^pG6H{>NZI8m~V^mq!l8g{h-@i&j z=Y;qFUg=%FO0c_NYgE{yANsaOs)}z7Q4H?w_ffw4A>@xfkDAcyz{tEeb4rOoUl)9n z@2_jA^Uj6-ex!}s*VUnW!Z1l_jL=F~V>l+Vjj(#`I2#{)KXSg|2Y>i~b&A=s6UvFH z#o~xDQtwW&19xZyZ>0U5)oCwotxn^p+iwW2ydeMD1A1_>mKbjf*ONZL!7^VcQ&-l+CEOKE@{GH=! ziuYjK00zdzknzSUqxZg(Gk^2baQ|Du2z6|kR1vYtz+1Ep)Z-dA8uV*Pk*J91yb;12 zsLLyf8RjYJ@~R1)YZ8K*=07(Fy$ca>sVa=?$}p%q(q+2pKDHy`Ryq4QZMST=@J~;Ri3^y+`wc%0@hJEO;7! zV@ZoBU5cV;*BWM^mRLo?G?A~B*eBk>-M{n;*!R4L=u4yp6AZh)0X&15qj?p;Jycdc z8~`zQBvDeRF>Pd^mO?CradkcXhpy}On(Sh zMIsOo93i))Y>1IwzGP*I!8pQu@8IOS9;W^J*LY#P!=*2L9yJNg3b?_Mv>D(`nz~v? z(|ypSiI#-B<4#U|%Sk$NPKdB`VtA&jiVW;HZ7<1qqdb zMoJlC-}@ep9y?7Nw|U{KUuWyN=U8$|S(YRtgcxzo9a8c)+JCtkOf3E%v+OLeMi5+I zqLI2j!emHP;_at+Q*0+kWPnNImL zN!My=Nn%=G%&A&eQIJys5B`+8!<&JjduLW_n->2pTq2+az%6wbAg_RO6e`^ZN)``OR1{K=1@XYQb0UZPQhiSQzc z^CZTA8iT{(RVY*#XqUpQ-N}iN@B*f1$h-Au4!B+;=<7o$Rt1M4GZt?xR?I?_SLXti zXje;Q5Udy?j+(?ym@;V^#*+!Vb=MtJ4B&D!b38v7;@|Zs8xNkvWfnpt#T&oJoO4}m zRML4WTN7Gp5@e30$KM5yJjhrKqFt@^L?ROnc->2{oL`IoeniA13u(UE+wNe%gdPI> zF15bFvi{gR;Ng3_9i2xN}>{xh8VyT8Wj`yZ!XS)o=T%R6D0Cf1b0!ycD6v$NT$uJ+&eTO=jzGF31n zgj@_^X^1?0Kkxkye}ne++qjsZRi%k=%EI6QB8Iinl%h*0H56mqNvs1}4A+!?uN;%+loLK6@ld_v&l= z?4E@FQ2)B?$9w%tRetE%E@BbsqRYmxcR9g0K`acglyq$|s}$JLmdmtUv@I80VmBoc z5Y;llFu}w68s+9H!{PAIki5pR(g@i!;H!qBg|Y>gIl+p>Vn|g>>eJ_}vqbM89CE2Y zaYtj}mInjNQsP2GWfNkBysD{5ObgG_BM)-wlRKE5imiY1WkPiY*Vj;uZvuJknZUrT zcVMH!&Y(mdyoXbt`dJ2#zYm55RohY#K`cfLBjd5^QQfZyxya5P0^h^YH7Zv;f+XQe zTd}1HR@W$xtaIlt{tZsN>k)Y5eqvUz8zasrxiiEjv1Wxxz{Es`A-4vSAyo}c(;zD& zQtZ?qO%D`Bq*J(j6)B#t)iF@hJCHrp5^K7{m<3@V)qPj5 ztJ=;%C>^^Ej7Cd1XB zIgD+>VsW+Z>lk$nujfYse~Thkvq&!pMNm?vGy-`5YYcI7g_RG!oA%3Jpq*5mU<-=v z5wlg<7d^R^K=0z(J~%y)d3v|7C!&++9Mr4<%^XweuIATR2!UxE8D|Fb&{>XcZ4+L2 zi7TJ`Q+9WEi6~8-FzOC!6MHz`XuNiHboVNP+8WT5&@@{Eov39n5w(VaSZcs7by@?D z{RjUZfAnAe*PIR!dGUED-WOeNii7`-BHDVpsWfaEs-GKMj-%Mv=rWw!y z^=n(FMgRKM5CGST2+zMyd#%Fs8hazFTM%%@f%W7DvY1G{Mu8b^7*gHhe3LrHIR+#s&RC@MG^S-YR1C-u@7xD?41ew;#L)^(3`o{Ba=Fl4rZfc`ZU`+zyZ;b91iFV~-~OpvOkX1y zG*F9D-hPVvKl&k7Kl~xM|13C5)ki{ea#9;Z!24K!@dDre?su5H^en?+ zL6#>t)Udko>jQZOcvu9!Q4^{ON7q`$7$GG?&`3&farXj)?K@3lS#SvvDf@_rNso zG8%f>MPd`sx}}heEYEl;Q&u&RPrKSvBM#>rL*rTZgF_*!*ElXyQAvyU8D&<07@XR? zJ3AbG12~1)Ady4B`>KqAqMAr4U{V5Wx?+0mJn@6-P}^DWF!t)5&^!KgrSMb)NaH-{#`yKF6BwvXV8ZluYWT>mBHGXhNrg>Y)|I zzedXLG7W34q(}m7L>)v;gb=U^qRq)yXu^pA03ZNKL_t(Tqy)y=Fgd!yU7z}SPW;NJ z*jhfua^Lr|4H1uLO_uR$h#_H(nLCBEbi{o|e8DJP%h-26J2QEUO~_|)nnQzfvyUpY zEEfYztJHN3xyNT&FId#VK*%Q%+hlC7t`gpMmX%L_l={O@uyf=%OFc{NQlbrsNK3Mv z=#z+$OR=!Nx@hr&U~P|Ug_JBog#d^(h>@--{Q-ynEFH|s-a6h_CnS5~7iqpm_ZWDm z0>;jJWG1>4!7lP>sU*%F7}2hOou*#wDk)j*$c*%dvg<-Gsf#i?$+;XImkmf%rumrZ z+A>SKIqh;wuv^^dP_GXaxgT*+BbrB+t1+i2_*Q_^fA8-hYbROG9W`*J44|+o9v2c- zsL9nJ&UQ-4rjN|eY{;u{+*E|P*n1S_;w2WaDbQrydlx8ep^y?q8lrbTfc~Ao&-6F{ z2L|XKzjQUcA%Y%ZpO%!;ND+ou9l6~Y!?%A2}jow zE!NyvA9YqTaV(f|Q=T!S}`qA{Q_&bv&ErD{U-1H{O@4mb%&6091GKr5EK5~9y>ZNP>^>kUO6 zsS3k-m3ZDMt$2>L4i_uNLr`lec9j?1Chz{lFHnB!<5b5tki09;X&R8+QJR$=Tz2cv zDa>=26@1;VGwI4pk`XZNoS2+mrH^d^r>WD*(AfgN9_C#D_%mX8A^Q-G^Z7~(gu?7k zjAHs7nn;?6R!N0tyZ1wL3>snF3-S%8kz^dZn@iNm&@uXllXN|ge&K;s0;3>g)S)0ljavo)zXXDn+Ue4LX%^Cb4@I$paj zl}YvvTq|8qPJ1;tI2>=vG0F;38>mB#W(M`bPBUh^ose?Jq^@Yy@KW1SojJwBzy7y) z;FmwaXfR}Ht08GG-oc)Nt~CZH21^&UHO5>;PR;tqyQuedRJ3RR|HgqHnG=?a&uPEbj@*4G!=p#>CZoMFVKf-B zHQDW=_Wbo#9$t)!T<@AkW`4;3rwA_3kmXf|?|6ixAAOSDqw8F{xXo!s$RKBuYIfQQ z(J9G8)l7+1Luvh?0lmTVKeMf~uZxe3G2~*&v;zsMN)!i2H`sjdJ30I5pXa*-j2qyS zaKTkv9JZvUCYuJ9mRApN^g*Pt7ffdHk}x(gG6_wAX>%D&%dYH_OoP(U+J>=qG;M~U zncF)H7T~)qWNoM>B5|*7c41$uDzzkX>FQb=ZIR63159=*CYj^pCqGQ_$bGOjqIQ1X z_1?~FYWG^6UDJ7XUF$dLg}PAfi0cRv!D)B(oiaO(2kHB`o4pbfT_EN5U5jUYFGRR_ zNq;T+2aB&U{qL5Z!1iKr){-VUgIRfbX?VGly%<^v6o;tziC!QcQSNOqni^((3Q4Vui zKpoA@@397(lv&c~p)BX&0B})AA_Qv)HX$aVorgp;iFG&P1(fU~@8F?-^!FJ(@fZ^v zuHFSNdy%SM*uuzO>zeKi+Yfg40n}M7y6t}67`rc34E@n)L%l|ugoFAtnydb{t6yi5 z&VSDI)skK2i0xbzyT_i1>5Pi97wOE^?tw<#vq!2oN7`-jhPJ6Gt?gL-tYpXM9DDFA z#gUD^wi#492V)-f?w#sa@`rmley`>eS~*zVboNyiL{yBms8LqVzJ>OY2f6U{w-^S+ zm5%6Z+P1+a1Gl(Vz-C?aE(t*m z6^fdi;{JQsTwdnFcfQ8fpZo>GCXlUVoZr60N)V0?Hn_Y~-R#u?H-3bGUf$-#fAz09 zHCV+RJ&G$bie`+Sdxp_q8LAqL(yS~aOPhGLD9Sd05&3mVLnZdw5|L!IBN=Dec?l*a zQKqhy+gJmo%WW&mm{;Vs~l8t|~*i;AWDvASA^?wgLOdGPQf!0-{|F zv!p%oQ$OopZ`jKk6zO{Cip<-jFPgE%$EthlcQMOiwwP10`|aG-gtzKmxlw=iJ8a*- zoxXd7l1SZ|Z3Ud|+m4#UWW+inyPh9OktL#M*W_|Fa->fsIp%K^Z z=mgOT_V(i(|HY4yE?(rB-~9v1YL_Ak);d&#MiMO%5!a`ny|z;$R$Y;}Epv>s*t$j< z$g-}Nrb!hSW8&n8-ot(W&ac744{{lUXOBUoXW_(1C-jo~lkqUp`=%e$>6Bt+*wunn z6Y>BfSI`isCk<*#&ivBPaP%MiTgW|cWj6?;2n+`7hB1cn|7Y*Lf-SqwJHOwz*4p93 z8~Szx(2dy0AaWu&6h#tZ5GhKOM2Q+nC42NRF56YE@{=EDs$AtaKiCgb_N3QxG-j+-D0#hAnWuf4=ix& z8lFML$aN+t}1Jzj~%MNZLhRXSnOPe~WJn9L1Nu#@x7M!AgX$8^vg?q|@2&=3i;dkszyM&i%n(GyK+b z^p725{_sJp8}ox7JWFe!u;-Ss^Ih7X_$iJ({bAC>#|gP%tXmUZgs>$}ox*pM5LMSJ z@wgCTb8?2l;IyEs05~k3N&>19@&iXW@!=1UKX5Nqr^677wH~W1RS-fgPPv_P>xIdl z9?$1E*CYf~&^5I%BA@UfGB)ev)%*DU%~=pVrqzz5c1zMbTbtV+B?Ry@e(N$L+Sec# zOqf9eHFk$0(_>ktRJ<^gR0jd)_cPx8r1zb)@n2=Uxcx}p!PAgwTrew8*K9f_X-%T! zQ3wPyz2iqY_VfoCo>}GMpZ+O}d53fo z1+-L-QVAuV*OoUq@PYSn!!Ldk?mWrZ8hScb&o;^tN!FTlclAsW%?q#FQe=PpImu=_ zgr2D`#)Jao*~xR;BPp5{cTtz)fHjG4UGMR7HT%cZI!WPc!HwGKQOVW~X7*s6{Lm=% zp(b{}a+#9cTlD;`N9Ts%O2k>#9n9bV9@_Wb0liN2?3F3kUn!ZW#fws)B5X`1HH0v| zC2zvz)q1pB?pvq>7YBHiklcAI=H{Czo;}UD9FooFWXfROPhL>78;`M(RgkbV@tu-d zr)Q@MQ_9Q8RkTfuxg?Ebmm zN?pe5bV|IKe%)?jlmVf#6{!-mRdRA9QIn*GfDg5%hNy`JlI*@v;>!jQhbRpSv}W=>GV?>c_t@YkN&EiTPkP^el}&y$ zW#K&&JGFHU?)K%@I*iujTCqk&NlJRxNpAebkKxxZvHaarTsn7w1D%|1r_ZJ<8H`8d zDtW{3iBLC`smAOZ?p6Rh@Mdh+T|c_)^Aiw zl}V*riQ18X1a^@#u9IF=E#{@dw#4_X9j@}^{e<;Pm*}lADx7!RB}bc|v~w-Sn~qzVjT*-#<-x z?gIT*N~U3BJVr#*&NG}X_czfWQ~a~_@9JkSeutjHtniZxk!e{4kFg5z(K-%^x(Wq` z{-Y0Z;=(E`t0n8-JIy);lBh`9+#gpQ%ejyRN1hvcY09uHu*D`G%duXMQ^VId*wvKY zGCqBZ?Ag}w zvfE|xo|AC&NG!CvKrRZ5uJ>t&5*<0XN=@gFOgpJzaz1;!C_=5H5G2x}ypK3WC86%b zZavqeb_I}K=nrAbJ{B3dvqkIK7cL?cBd0e8>k+Nrpup-vbO_*lt%2wXAqq-r9rZMP zBdF!0ph$2&Hn#SY-Zy>h=M-=Cq0#(z86l5a!-^(6@^zpv?E-luiMxRb&>_JGN9g64 z_ddY&|K%@Xp1hyU19KD&K^_RDMXEP`XjD~Icb@}VYjmEn>MiHHn&kdlIr-oIS0qn8 z33CgWEJu>4K0B_)v{Zuj5%M9vQRs`;=@i)gGS|C)B%+`;o%cW?it+p$oyYIz#IOGX z$-VdC4jhCugR)|MeFG&C0&UlZQN$ulyQh;GrDUS6dL`fISxt+Gml`0os<~TNpWg=gSf&!H zs=ynMOQ3z-Fi4w2P!`=$*ufXGcQiXTJ7o3l&#-ZI6^>LfZ&fJV^=F z;R76a>S0hDC6?JJ1X9DC330o;>%obzo*ZBN0eti>NI&`h8FuRs>FW6Kwl#0wp zU)uJG>pA+=qm24pN{M2HqN!0iv2&Us-_#TzD461@l zsv^7f1owUBqqINt&lp!FnIxpZ%4kHMCUmnlVO&C*PBu_Nh(T<+jx2ldVOk?Q1yfu&808 zvKZ<)8lldzr@6gsOQ4#?do^9(7{Bihqi(*}s2Y|f3ToxeKDhAlK`cr$TGUO z9Ou{_w{d3WWqLX=Tp3aIx@13rdD+%3@3gzuK=yZ7^VAT)E=y2Z!Z>kwVd-pBm8a}1t)k>Lw3ky=NVrYI-)(Fn5r5a;bO7k0JuDdW~9nI+tf6r1ROnSMwgDwc$vuB3Ft_s~e0nA)V`jwWvxs zQEBv`WN>LnKlC{iG9)n!fm|%Uwyg6tl166sRzjdy-M|iqq&5mqd66xNT?@@-su_>Q zh^OhAe2ERvNi-@5-UW1;M$bzT zf{Of}rhC@h3P0m>x@%&x>ob{2S|-q{okr#Fgg#5!$tX95NKw&J2}zPrs=!!0l@Y{8 z@3C1GaQ8a8S=wb=5-A@9N5Ix8L9cWKqX=3dN!+l5t?-p4Scghm*Yx^(zQxOSh)y+! zT*^ubN1l9w!@u+^Y&b)if+o;wb;*2`r;t>WB^|IJ#?34*wd2YA#=>A?!ysELP61F3 zCjs%U0Xt!p!J^RR7||K%=oMQ6!CU$kGBh?#YyMH#0o|;X>Shk$ndj1|vr}XKt;1Co z}mKUDX zxPo>IRU~*aZvL%b<5IWHqK)PLVJe8y6BdY?=_ocF>4-85HN`oKnl9-CC3y*QBi*ljk13I^!jAG_xn!(K5>@aF{@l(CqE%v zCMvIq+`dM$1PK%GRKk?`XmY?Sl=Y-aKnz}D_bvBO=@G3Y!;L|=kI?({r}_HwGHd_m zf8sr>B~B-t(gRp%F<%Dsprq<$I1jC%rFz?=#e|&!;B*e@pr=JNBEo3GtG$}_D-N5$ z5D)DRZGg?Vp5xRP&ijH^Cu7-HEFSHVDNiQ^&>CG?HpeAJuZ^;B*n=}rC`bFkI_*FF zeTsR zEsz)_c=V`*q5_?fq>3t2le4QzA;~h@A>p-}bG$$HlivL?8b#jS~+RA!`OS) z#|6PT647+T;EQxi6|zxGofb{5{QL&8fkscBjZu(EguaRhPA7N*m3O!@K1-u?JPdNp zxEx*6>)-4^Rs^!ba5i{u`NfZO@Hc)DTaIXT=NX6SH*126aHpCsFv)oKDq7WWsb=2! z#?GgnjFlZD#Hy>3BOf6(0HR-{9H*>;K`* z4}Qpj#W^-@L5@O;1{EzpLaQy^WZj&~S~k}=nVVmtD#!b`{z~zi_qCvsCP`vZ zUC*HZL@UsBnYMm}zOgYV#;jjj!Iu?AM?1d>g+$`nYR3ghl2AE|GK!F8%pX03WSt1< z3sWWUrZ5{q*kY5rN7rfBhKE+Mv)fMFm;iod12guRwM*!;FEV)L4CkIXMRocGs;a^k zCAO?;pWkT=aM2aytrnfRIeLqW^cEJGTRKQ~UI#7sX zQ9vrej-ue2N(>><*d)g1b6Qgp3-`_m-dkK5Kg+(5>wePv6MCp$oe$*YhGs?t3N?X2 z+u(5lyjU`wU~jpRg=0(jpvjg;_~o+{8O&`uL<^O5gv21Jrf?O?2XbX7{gv@U=gU=Y z?;mILrB#Y{&aFT9F%EwAXW^FX3DTvk$_VFB3XMY53U{iuC2BZdvp(R|3by;vZK zs{pu&-wi}S3!3G@hGdFPfF!2?-x-Qzp25_b; zvxN$prjh*`6ceFyt!OKa3663+=5U@PSw@|W!mt8LLhy)01c;S&#;{tf&}(&3^_<|(R=AE zYvYQ+`Z78NJyrw{MKwl@!59;@>zt=88N+>i>@`nyV_Xs@h`23{}OR^-Rm$ld^ihUp7J#)r7Nz@us zuMe$tRK@q6pyHorZ(}Sj2kgcME9Wi{DoavR+|)$Ik14a?kIM$ zUrrU@C#w5|J)13)&*F$@tcrVikcg5}qA|eQdSEUSI5&W={sR}j_yt~i_FE(y>-5*g z_&h^7kFu7maR3O@Gv$sXC9JICUU`keIxcv}ITSicF~+d@@B`d<|9$lCxE(os7<2S6 zVWEfb3L-6*{g7^wk|k{fD9Vxoa7i**3m%7{NHmD(C~o6C8eu>0-A{V=$M!=d>@-0X zbPSXoxUys|RiHa0-4+Kv^wS&|2fp&Z{ae~rVN9F?RaH<1k7?&fmLR1?UB$-JQ3>|a zfDH`!2Oj6(uYL+{zLC+$G3W{^IJ8$2uT5V_7<)?X#mnht%Bp|`EL;8HT zfO>{=)^vFtGyd4rUbrGRfV9Gs)h$8Sp^>03ZNKL_t&vtZ(H=l;Er|IYt%&6;T&JOiplt%0X!5q<7uH++BAwyzpgAc>9<2W}*LADjxjE zL3gdLy|vIg6+sGKF|qSiQ+4ykrmFHKLky0bxp~9UPke+!{Vw19o!{Yrb10Kzyk}gD zsJug^2Avxi2Po}+0P$l=d*fWvyDv^PC2NKdYQ|IS?k8xR52$(z-mso_JA-@g;xBMlK2tN}AG@akDE{oNOM^^gCIweNi!U2f1p!MI|qvuNc*1qM z(EjdMN&fRQ3{^o(C$zO;>@9`$pcGmq1RM5DI&ZaoUPfVl<}q&k&0nTEdW^&;v^qTo z)=xH4-KfDf0-Kjncbq6e*IeoFE?@M^bD#@N*CljAh96lr2b)wzk@b3P3`)Ebf>s2b zfL3)^J>K`qUpcTlILx9_wt`A~tVDQb1t1<<4AJ#LV6?{6_5&pr7fP;mE3l*6tfY#E zKJ_%|6A!YP_gMhO<1sGRWR*h1qZJ@-A~Y2{e|~GAwO8WnUl z_SY8=X%63Vf*bC>o$j$C_*O=m;zPWH1{4Y* z!j>bP7DAFzgvbdG81&L1Zuse+;`{&fEbjbk69w^iV$%EL7|#0%^i|jVUrPgr4OD3g z&Y{G!83O%B--EO@M^66}qc44xQh9Q%>EtacEEX4wubK#FO!q^eYr1}C^x$U`-Y|>E z2#uaZV*?W=Ue`tir1E&NnA9-ej`R+dq~v$q&He3P=I_4!3d>*nJ_|{T@hRiM5Xls+ zP6x_;%c?!scfHqp?{Use8Yv=z#UmaVV6bv3SXcxLrq6iIMVAZp_r7ryX$&V253Y(D!v zaw@w0IizxINCiHkv6Pw?M7Nw7NfP5Jtx=5&f^#@$5nmEEmgz{rg3+vBJj>~4PjM=5 zF@N(7-0|@Jgp)UuUv~&|;t1J755y1<#QNxan8wCcAX0S#0aqi!ocEahq<25*-5s26>V_KaKBjvEi4{+~qeU>wY;rn0xTiQj%lFrGMVN{OrMv*5O zstQaoox6|XwM|;T{!!Y${%Pj#eF&6cl*QuPeCa6bphDLLIsBCK;Z+S~2_YsL%|;xi zZZ7ZkTKwF4pcq?*UNLOv6pM2VPaGp0ULZTT$St4wOca^Q5_F!Tvy?1JqS%orTJ!xY zzW>?sEOui^d48Gj!fS-nufTI>@vmGYtPNRP8X-lA85NjfOlqrIBQX%fqgDIbCjIM{ zlRx)y(hofWhZji!Kk!)ZAKNhBqU3~H9{BcEd)_p*+;8|CeaI1IAx;KiIn&l zs1yj69u+bi;4WRlzjTh#SH8oAFMW-bQ$HYV4r!Z|zBZiIE0dr?&4zw8d_OT){)Bff zLwNQq%YXh=UUt!bL8lqr{yg1omm?qiIGx*XLLRykef$UxLvW66l^`fw=66qecMBXs z40^6sS^CE@N?Q^R9O3#WAA`9?44Q!*Vbcs%K`kyCyS;u(T#ZxHoK~3n6kij*@-`6y zEefTD%ELymcrCQi6sAr4(Fe#se+#46UW)VU9S{^>)AQ>Jon9{r)xZvG>DVR__X1-q zi3c|tlJ&ccH0T?axb3$-%Rj9TdF8v`p;KB8=!CXOSt$m1Ep$wR*!_s|n$Mr0cFdz$ zVJz3|HT8ZwYv&R|z*L?r%dp;K%b55Alqk|}AMUu1d;j@oc{TY%&OY;x zvd%s{^mQh^v-dw1A{-{vIw2C6!F*tuQ($$oTmOS1QbhL~MKB_s32m@C!CkjbY zIwx%jWi1pIzWxlC{_HO>-~1kjgJlpZ zHZF`n4DI+NZ@3QIpU1R%WO;`)nI}`pWZ$ctLupW{K~hzV2=0&lr1vLq z)7iUHdbu}X!W)#Cz)Sgn4hkoltgO&lQz^#?N0R06$b+;u3l5cMx%AD`Y_1KNZ+9^+ z`kZO4u|>IOr}x~6!`%7lpT$1)I91su5kXAJx*KpX%Lv-UP0&Td?LgEoXuQnKOr=i6 z$a}i+?GLiDhd$6{cw~{$@uSGCH*)ag&2)}kk8XG9bq^5|jpQlPO3`V8)&og@VIW}H?g>J9&Aj`TT0O}I`V^8F0#C`%;tam-Kea2`_0Th@(>5_e-FJIjwAgZq&Y#< z?nUz%L9OPuO@%qUjfkdY5@_9cg!v~QrRes+E2=~>B(UgfPS`FV*UPs3Gt6A`EN$bB z=5$IXoOose_{scou&F&tE81nilTaRBV(F3lIQPXbzU{ZU9g6u|P&wDWFd|wJe28e1 zS_i^3pFzP0AJ@NjwKH-B{Wd&yKL>x~7x4eyv;3{^Gu|9C*UnJRMifh$W7R&q`K_zg zH!9t}M!hu9+Nc{b-Jdlm@JdnI3R^jJ0MQ8!(9)szGaupvp5dkQ$Pb?*O;bwo*l`h2 z7yIK1wYsont?%ZLk;sgSfAFzUQCY^zm+;pZN?fK1g~YgXz7MSy z5&?yiIS@pUPzx^lnoFdFy;_}0=?Djo+SX`vRJN%+6a|bd!z3Ovhc#Z0acS%*<0Ar0XDK>Q@mlIVZ-4A3z58QJ)zstT z=H67tYK?bAKxHYZ4VZSqbK?ul=WTjq*zthy;YYaV)gSQ93+q%XFJXeBm1JPz+l+=I zlJ1o|5xviRi0&;nQP81C<36BAmQKsCPM}BRDtHNa-}r(Cd{eDwYG}R#dKmUIU-#q# zT>sdEbRT~Y8^@Lywfl722WbZdLm(Z-gCW&~MAs0Xy2I%MdJiQJ?-Ni7D#>Z*bF>yL zQdOv;0_#}6U(*?tB(GhB@1A1gEC0ZyZ-0x;mtSOUWdoJx*Yx@y`^;zH`a`%*hjBGR zNk;p?JOk&LFEmm$=cC|t1EHUq)$f`1*VZ;NTU4&Qy@*f%X#kZF3p!ZVUwDbv{`9Xo z`xk%9O)s7ysR}YzLIPFlSz~~=0cC_VqW2H8aw%$p1ogw%oYfl!9X zkrD?IsQg*w7wDDOM}ZD+QgD6}v*;B;;96F&eY*@%MA! z(hA?bxJLQ?AEJE}fvZ%&5va<7G|%>fh_@nWsfP`oButYnrDUs-SSpMvOO=2&2?pwT zK`5;y)rK-pX+L-m?|JG;UO0D=wasOGX2_M=4B?(QHWBmhTAry z`s^i4nZUv0ii%fO)>-p`!@WMEq~yYQgQcubo@mxa15^^Po%($A-bZ>=eIHcm>f%e| z!|P)_8yvwq#$}3A29suZZyDPHNfkcT3_`)c4>4)rFe(1j%e-*IaongXN%k#F_LJVX-|&+Yc*@0#i!N;6;dkA1)VB9(7W0&r zf2Elr3)0+vKj)WHAhPfXMgqAm_K$q7ypmn=Y=nQg}LD9 zC5mymf$ju?6;wwtEMs?XF6r^&@&9SlgVj(-FU zCFGP;bsBm-`g*Mq9Vm%`?$3o6{bA$C(LA#q%tQKtc527BpANMmKBy@8uDUt|MdHR)S z0R`e2F2w^$`^HmMN5Ls-kqC)a3OY>TuUnKT2`rnyx)O2}hbzH^5|V;7shAtKA+d1r z4DQQcVdc+0&**F4qjzzGz9`0t0|idi>$HS)+krfpsxwIDtJVKf-r|Ar7Hl*KiWE>J z1QiHwgj#ut#g&)Pr@uw|2Y<+gG-c`i57T}4QF!QK#@AiXxZfuOS~gl5x!mG>!kWOr zp+^@3UQidwXknyHd5sAMR$IDd1}5d4A22uH#$Q-Ng_NS*ubUocX_NFd2H z2M3;mEyX~fO;ux?)yz(-Fn|dVeB{=8@mMOHcPJ;MDvw+2Y~Tt1D^zv zEJZ>-@%(KPYv0rtRXjjN1ZKFovp^NAN{%~)_nJ~FJi-B!QJy#n|I@!_;lKV@yqaz> zDAqXYGt!WA5l5P7I-`Q(E#~|N>m~&etqjh3jMfC_QF`xrtmMk;Uj@D6h?JSN)0`EU zC|MS^Wln7|SisOCGf~OD44|?(e1J>8{Bzuv9^{4p`QLKp;`7LX7H)M&vf=3J9vgnV zgG>Lqijty8eIR6p!D7zld`4G+DnRLg_W_TO0l74sLyZp}g4$DEIMg(aDdd+%_~K0} zPWhd&$ILp~d+2EeqIuS#*{mdX?Pfl&S2YTw7DWm{V`YliPz|+Y2B48ELsswUj#{Z- z0ZKEZBux{BH{U||Z+@FYx72EN+vB#kcjv@pK6$l|hZ<8dUGQy@E(cL4y zx>6Cap@B4C)BJh1z!>&&5Rh5nNk4OJ_LqhN)gEv2$J z(_&Z!QZt8lDYmwWb7(GVOBYR22m=CAjY*$l7S6Qn@96NlB;a~+76am2p8!ZVNe_ZEqYIa`_TYeSMh$-SK zu~q!rBu3;?1-gx#mVyF+g82aRXJ3Thdy$uZ??2&M8R?C;z|&82=u=O_bxV||f57-V z&$1*bW!P7j-%on?$B$4}-Rc86yNHkEinqBzZ=u(!7EJAa%uLl#v+ z%fmofhJAxhQ|3lOZ_QG=F2%t)%DZl+^VowNee_|D-gX=9xjrbNGZZ9=KFTo&j8I%v ziPI3Bs9F_oS25Ae% zgFU9FW8IBN`Z z{D>^cS?~cruIMF!BCKJ*`9s$K{BOAM|NSl13onr?A#^gv-jcbuc7A#9x2Qfh!I!m` z5CY%+z0cA5>M1%8ew(HD{WBJxcmRKNkyRN}CYEHRa5`ZlO_|R%V_T8ytkwj$_Ci)J z2q>YdDq8InUlt?+?QWM5f%_hRjO6%nLXu8`{tz4@$yMnqHJW5zB462C2SMRgTtl1Q z(M~f$+GfKRpaMP@L@ON7ZA8)Ptu(w&T_=q}X;srYqICMf^vgtvREEKD6>ClJN@nR%d}_enqe1Sbb;eC>bzH>fk`IWXVl z{AiT}{Y9jDb0+v~QAAyFKFG`&`0k2Cc2k6xUDoTB=6oYy)_kuC3gcqTp%)h5@w>6- zKY;t=5gR}F0h>mmBSir39D*<|OR&PBxdn!Ujko`e3sKx?yZzvsu{IM6sTNWci72p9 zHCPi7gqsA0e#|H++9m~KXpvG}IM4E6o&KI1puz`FV)TUi5tWi-!N&eR+LnypX2=Cj~PAx0__t=s4kpi_?_=lEic1jpZ&3)^uDXc8?Ez) zN#CJXQ5F@e&Y`YCmLNxu(*4L2^foWC`Rosq3K4rAWp^+#@A%QAY zxH6E1giRZ0-E$kQCm(@MhSyNmtQ{S;bB<(Z(8Sdt1aVY z7=QN}F8uKq8T`TD(0S!NVm!l^q6&(3yM@~rzU4{pthaA-U#hC2sw!^iAK?7+FZ1$q zFS7pKQyl%LC&(VT3w`fR%-?W5Y1W}oDQkdDU^FafCq1067>!1l&b1X>olBsy?Z z1y!2Y0tj!n#AOB+`IgIjPm^8+_y(p}A0#blacQog`%@2c{WqWB!teh%#u*lmEHN$$ zOvM{2nl<-gBA6DYCZB<+=jV>|FTACq*gwVzvvt311j&4T4|H>*WSa0w69m*6XS?>G z>-(Bu@V=%nBnkHR8&RKplHR2Y@PiAit5sSGY*k^MC26%tM6ja@hQ&LhZQ&f&TCBBr z<9DpVH}rT)hc=)jkVq^-H}GbSCdK1O&|2X!BtR!D5?%DWPY}6?1wdnR+=>=TUEa&D&Ju`kF-PzUo$L%4K7+AX+gDex;Gx@pct~3U*&}tUf|rh zSLvIaq@9qJo?}&q%6eSzI28+%P9i1P5lFeVq*~`I)L?}A-Wr=PzQCnUf}&T9SFSx9D4F`6s$B!&q{#`YPh3ZB=`HE0hrskDj#yZd%+lmlgJzGeryT|G(p1rNA$g4Mo%xHWFI21;C zNHp^wc$AfAzEAeT88${^vV|VwjZIowQ-uoQt>v8hH>e(Z%?p<^Yu_}*x!V3_QiwGz zhD%Ev{k3044N6Y^)nBq8DN>9OonJA*-z%|b_FeH&%uE7P?tXokH37Z;aov-*SCwQ- z1+wYXs>vSZCrbHhvY$^|=CftZu$Apw3&?585YSo>4?_+1<{Oy*;8QGKuzdeZe}bzV z#)DCYU>!;u($p{<4x#n-4}m9K(^_-kO-;JQ;FY8F4yOVZi-?a!Mm%$+L4!s_|VZgPfJQh`VM!Xj)?`r?l zWJ@A8d*I71f#XkFKyW6B>NQ3TRvD@TZIY8GnE$|I9D4LUxc5BFDjw%7nH|!S6p_F{ zTQ+@3;@c=9d|YZMk0@}#BS0p51eZ2PZ8@w_C}0h6cOECZ zvro6X%F61Cv|qh)tygx-6fVAPHxOjU@9ccL{0gE$4wPXgQB zENDb#=2+Mnq&D23Jd9ar_0R}oSCA&4*VY+*^&fcYFTOzQb6=v}&lntNao&}rqk^tV zPQbctbMhyH&Mh$M4}&M2srP^jR6DW3l}-_t#5KEOStKtyU33ogLVtcR8@ZB1MC|+ zk1bT*T}NWF3CULk5@n*=s3@FC>E3@I^Y6Kb3(viRq$$3ND)(9^SgFu&@%|OwAsF0- z%F(cDe7(k3MwX>4gYFVMy1-%Wd1?6!8()2fM~s&~fI(voO+FY;7x~0n=~6qxW#M?WnGsWAKm9z^ND6IJ3-!>oc?q{ms)oCdK)q)4^=Wtc9?h01_@tcI@ml=tsf5Qome&mD9edPTN4lJVZw6X*rB-*6b z)=3g#)ZvMiL{cZ)vTKkMW!|qm^gH_bRarv5Q6Yl@d$>>UeNS-Y=bxtczv=-jlTqscth0y5_;ij3RNEz?^-fdU=fs2T|ZkFd}Fo&(YRFB_jM#k6EC@ zd|8o>V6_z(rU~lE68Yi+?2+`U#NaE-VyjO^!i(!GT=(%0KszHhiZWDnAPO3Vp1IQ5 zz;w45b&~kbytXI4^D6=7giU2Z3oQ}Wzxa1N`|p02?n@U)^8}kJlmat`Rtc$6j9Z#f zw@rKS*4m!T3aRXt^!7Fj(sqVzrHpOKI9RmxtG`b9X6&tSj{%`d2&93zTMg&{$7r_U75@6sUOW8;Y^nE9J;9vYEKOA~4o&F)F zt+ogez3!rN zxVqp#X|y+J524d%eBaF+`{YM?c{t|M_fC-%LG7yARGKwT}e!WBjL6T@F1~@-rl$Fe1MGBFc1Svem2K?%JjR36Yg9;Ox zQrKcu8K!d4vbE#i%omZZd$B^H!~lWd8(NsfDnZS4F!$ch@x?CbJ@>Hrg|G9<-~K(v z&b^ASEDBGSdV&&);3)9~@gyO+rq4FpuxJsgBn3QDg0`S4K{?I%tv&$ulivODb{l@T z1bAjo^eT1-gWno}Xuu&9et-@sDkL}&q|>4O=)+teEcU=6qi;RKxYy(GV^1*u(Wl|y z39Jj0J}{=Dqp~frpVSGO+9sGaoA%0#>WKV=6Pr3ikF&ti67x?y#G#LTkj?`SL*8e2 zaYS2da27ERj3ULv;CSpPgQb^cxX>h;VbW2bb}#+p|FfO+S@p{|ob=Xa^P%>ag@9JE zl6uT^xinsYk@@AiU9fF#&JPy{KE z5Su6|v{g)5iY>)aGO_+kW;BU2;&X-}m?XmR&x-FEXmK zW?xn?9*j|kmpJmlce2Tto(FBCv4lcJN;gb%R_OXE6Q*9;$fiuAFksn$1G$-4M=JpfCK zts6qr&NmaQSpVJJzU7FTyc7X31m|!BGMk{3MrZT%A9yQ=e(GU1KlV9HEhIK&Lzy^r zxD}SX9FBOe(D^sx1JUAvm=F-(^^P@M@tZ8A^C-y}gdv^xJjl_Dm-+f{{96vMUcLs9 zT@R$)%r%<056caj*Xl)f1bztCjR;4Rb846K|3>#<0)Q+mNk&yW26#GIjIk?gVKYf6 ze)2usE}lz&_z0WdeVWWB6vh(jin1Z$82L)vIi+tx|f2A>eh2*w~O~^vce9#|*GpMwaGy=Lo}+5Ij0f(A@;~ z%$xT>@7{XxjaD^NyUZBlp@2eb%CaQS5(0`r8CaN~XX(Lru%;dJuRF%pLXXZv55b|^ zV9nF>Ap0`Txrz?W1g6np#3;-rhj)gKv~4nSlR)>@Ewyfb6+yFg=K(rD@osMag`Yvc z{!LVL*r+w?V2=R~g+%v6Aaj5=)EdS>QG*F!B;bhSdSmn?v%PwS4ZoDu;3Dc)Aw-g? z(I^w6U?^dj&r#)$ZV*Neu6j?=nP=VRyMo@463WJ%a#)t!{?2#Pee>On_RXULjXPuG z_(%lbghmN&^h?%!Z=}Mg+T;)^eDgU@|BL^Z@b$+yw$NkQuM)yMb7?_=#)ZIEs-W9v z&c!b6Fn#q$1v`tvSq<1$uF)#N)(Kz!gaVmha zKV@jkxz2cP6f-ov?oBo<%0s4KgLo~>K0Nf}g=+uA%IZEr$1;J0)eR0}!hL(Nf@ z&?^?f4CsI4eZ13n&i?wpeAy`6+dj`;yyne=*c&`ka)W=PXFm3Ltb^1ES4_!>F8eg( zBctpyO@8jn0eY<{Qe{YdO+6m5 zadsL1>=|rti?rKg=ts{*BQ9S(vDGY&86g$*lrHj-Ldf(1nD$q>K?hw*_l?Z^E>*EsF5Z@GtsyAHum zKETGKPqOjVZ%}{dIkJnZq*vEThb5-;uQ<_gYcA3(t#_nBlO_ql2wT=OQ0pwR$8X*P zy+3H1e9+TOI(6fT9BijuPJYjMjI~Gz1aTM}Z&~m)+L*@uP(e^AiG`JD!K;ABk)lCn z4W$gaalQj6LxE1BTV0}HAq8BCWCgcB_#Upj;W7vEE}dQZFExP-1k3%QCjK zXKQ1XyACX|b>R}vzw1HX^fx}jk)QZ5>^}%~MykPD$0{WqpJ7d;I|@)6LHj@^np_Fu zTPuG>f(P^IF39yMuqZ;KPt>Ya3^(^G5UF~>Hx;FAs>&vI zplNcH87v{#N-<0WHZ?4c$6R5H{AQdFx1i`1FsyI~mZ(1Xez^V3q?;gpsJ&p6iG>b= z(+ZQS=;AC9h|fL`lSf2kqDKxAaN?TDu$iHW!(6G@kP7UG)BpDWV*KqtW2@^ZMRBA& z$cPFMMmExnY!Db%cwl%7oJTt~h_m`S}3;yac!t+m2xn=5HbL`v&)Ng!@jUT&*{ce%5wQO!xEZGzi7@9Gb zlys!=X?y*5KI;Y%Ast8hrYE3`#@d**9YSnkWx+tvW$W(a965X&bF0trWLRfO5|W@P zUuAViUnO7_P8+i3N34~gtik$ljXUo(=htpciAo_BoQ^51wgIl9V}5Hgqmd2mXKS{GI?HJb(*uD`E^Z8A=VW;fXL)NZ)-Z~ zCZBgZY*k?@WS&M1O*`))m?n$Zqcsx-g>Sqg5{VACsDRe->~qeeftJpX_EHavHVx%reUVUsztk5YV;9EiZEj8x*xFjj7N zc|mLD**udpC;3F5D!WaxZvgh2-?t9DHPl&xss#yw(rBE~^vbxey`-j52a>IdDtO2= z8=v|lg3ay%-TH+uP-+~*kdV&Jk*$r< zk9`|GzQkC~laCUrOd|>^4XFf@5Fmh8o?3|YYjZ7?mTR875L8qCP7!e4<~#=&sshPi zAT?UT%vqU|bPwRW1qbH$(|PmTs4lM{r_VEb>~U8A@*8YC{S1eEim6MI;L#@FY;4kt zCyK2`HFGv2aWPV{Of^Fjs0|z73m(}-2=UQ>*fpLK!{XS ztwDutfM&aXNl)_70yO!$3Nac{hJ6PQHK52ML7}uFQ3|xCZVC)h+ud}92slFXiQCTm zgo4IYhpL)MhBT9@8x1yYRYR4F>ucO`=qSrqS5R8xH-{Wc=D50Ek-hniJn*;v2K(Oe zHaNVWS{wYhLOD%PHO7Vs4SWZ_Z+_mXEAKXtzcb*t%~X;0jF#ARXyAcn8hf<;aBba2 z<9%hvmuQ6A4Hq~xtYX1O0z0joZ8kSi6A!8sO)k6BP!nURgW#0lJ2{I74RUslHkJWIfG)Owh4#RtB^nMl)Qw!o^R25qEWsPLUy6 zG2YnZ+{y29{N#D6+vlLaMBYm$)8dwHH#-HGb0QC^1J9n&5`O%o1>Y4(j9<#SHriI54}f`RsFa=Q>n#8Ozlgi>aZ;z4Yt!+Ac=eMv<6B zc1>?KN>((8C-~S{olG^=^qybS@NUm6rJ_4K(O)EpOzNE?#E;2)EWZ7I#((V`7yk59 zteii?Ql7IeB~A%O30fIQ+9(`_t-HJWLM3pP7}QMh!~W>l?%(C`TM4Mw`1#UYK*04;!S3=fORt^Pw8NbE`?o0Egr=lz5{jqPO3M)iShD9p8h|7 z7v&SEMyPR3ZWMFMka~@Ff#>%nY@!L{iVBZ0mP9A?M-IDQQg_YX9`_tuL#GfdOT z(y?pUzQbW+h#2B#uycd(0g(`=s@o3Z*duRk+Lh5wo?!gDp*e}f3KA@d)p!xgaft+n zNm6u@HWTKk!$6x!lUFH?3La590^M-!#CF?0)_i?W%vPLsk*|x>Zn>3ox-74+V+(_K zC5w57;V@v|bPvaW;Xh&i$3F=B7Z|F9K?s--NJX$l(bpD~o&>D3bL!vd#3ua;-7p4Z z`d1~)Tz7r#ltqP^YdM1#q-iJX)?It%&w|WMOpQWmL3wG6M;fh+ntt90xCIjwR)aXf z)B#)WZo;56Bmv4G=)?P2JaG&cz*;DU*kDo9Xo79pxSM%6L{K^&c%gy2@!*TJduKe^ zg>|0z-A}-&3n=I4g`6rV+-oXZX)3xXyZ_<7v|CWl~uQi1ap%or!d$?S&STHu5{I*mnEzG9yVr@rYCRfW zhDKy)nCDRjvwf-?uF2ru{&6%gl4+B!0lEZP|KOi;``F=zLpG#Bj3XTfYMtD~78Ae5#L=-a-%N3%X?7KjB%EA6kkmh zO*WZM@w5vuq^4ml$>hGPW^yW%_ey5Kutt$;MLqTL_$0&uQ1?o-raUeCUx-sh? z|0Lnc8Wb`5Pa6<%1QjsakO=4+ZZ&O6mf#nQ1=MbG>tY+iVMOa;j+dQQOCxQnwagvYMpadoH z9t4@Sh1*`+G*EV$iZx>r-n#Cqra;o|Q=$ajm>DXiz?qo+odOUo1_z$t)3}Il!S?~M`*weGk~@QbfRU(ZvHw$gfN{VUN?{QRX$S|dy71O?i6<( zIYhm(NtLIJ-+nKz`%iz7`44>n7Wz1qG6sAIB&kIQg;I`GCpb|Py1SNH{dK$-+ROw| zHrG&^!`~y=md32MU$-y=D%(5WMs8|71Au1^>KLUWvALq#4I*~WmG(_z-NZviGwH0h z06n5*1GPt$H8S4a``39-p$uEru<*v$!M^>30Nz3^4m)wDR@XKKxVf4#(o5qs$%&8< zsr(RF59`>!{1)S{KF-{@B6L%%F?b&s>AeH%72n^iA{%(-(}M4gOYZuy_rTGERM;3j z;T?u(@;FI*2eglW7GX4bJ!n(r($0tUhO=``Al z;6jM*&N}9uZwd78yp8w%qyL`A|L1>!dg?TG^$Oh-660YPhj2C9fYd5BIcRb3-sD%* zcH<#0kosSrdX#rAPh7|@0gs>lpdcG_fU{;h~mnwpFZ z6%;PB@P;>V?B_m$+1zCL2Uvu@<_!H05gNplOyTnI)|%2G5+PcmD%y00H0B zD(xHFm}jc(^{pt~40zPcB!x-ytu2py!#os;Llo08y4v?O%uIYk>s;MP?T8^JHqFsX z32I>hefv@D+uy*6_r8PqbLZH)u*~|Ivz+^@C%O34vplq15*Q8cc+CVUYfl;U; z?Ck-2pm%S*=uSK8TF~1TQ06)y0H8H$K@);+Ebk3Uw=bbW>v({ec7m*=X^uw|s;0+E zi9>6H%~GtGc(~|z5E(7hL7HxwnSw5%>88btTcqm6BjyT#3#?8r5+FzP*HbWYsYn(tkju2G|nFPc4hkmfAC z<9>$wAE915gZ9nl`D%iemKLI39yaqe`=^3h0y+eYwr$zlP!l6j@p^mytVCxvhg-Ft z0~)lbX$Md@(?DbK%}!W}r&k$l-iJ5e%kf|P75@C6{7dd0g4tN6T+}z^o+=I1UKt&M zZ=*TXdj;>d`!)fET4Pi^^An@dF%%3na|#OJ0|e8$ace|eWUwiX((!z9DmJtTzG=v| z2sG~dtBFEfAeZ>Qj!nkG+uusEzQ)ShD*n&DjT(*7II=YA$ZHkB&&}*Ht(>dfpC-@4 zjEnv)4FE#Ch8059&`OjFSS=W>SS?2c9qSH_!K2XHB3dzVw`h07o9z=OeeI`=$0VnUut7;E?k2SloFI`z|cf; zqp&(U)T$t$^+Zc!jU_R8qo0TwXkI*skVFKGCJ=&}O#E~^`Bl>?q@Qe4v74wwP&(?5 zBk&Wnj+934B{~+~;)h14#uP<|t*S;ZEpg8;{XG5mzl%*hM?Q)Nw~+{*0+9{mC2qh8 zdNR0>nSrjFak;K1x?Y*+S7w2&4}Jm)lSbRLtuhTS;F{h3SzACLxJe3X1A2pi_f6iZ z5R}1-Py;2g`4I>dN(e?bNIt=4DJI+9h#@3k#n3x?l*Rk+!>2haM8Inro!?~0Ju}p4 zkGowJGfjBCFfH13`&p_H{u@tl>096CxP@8=O7XZLBq~K48|is_>y_Kvs+gm@;%bgQ z_+Iq!W2m&l#&Cq~7N8U!Aqf(jZ8LFaH{0!xdNZ)bITJxONVT(_G) zO0#KdzXR-wL}Mutf=J^L5hp=OL#MS3NC_d3xJYqaQ-RT&@8u`{=|A9!zxU5j<1IG* zR(w`=yFRoes0ez4$YcQhT3-Ps6FQ}0q>O37MI7rPNaNxzC=+D_Ud2rKAR$Uzh$uLO z&`1W_3G1}suEbAI1l3OcEn{DkTSKB?%hyy%LHEH2xyuJGFJEPJ>O5g>gPt*DX@b|W zzA@_Nm?Uiz)-$DT-%LODR#>&K2-={nCNmv^5me&>B^q?8$+eBKfj&fEm*%-ogAjIM z|EJnwjK$R@Lq8@r32Wbek`s@Am*Q=2K_vxFfm885dNng7(U67+LPbq&!f2+_%ve%J zwqaBIGM)5Bus*GSl&A?6S|m2y5RVBO+e9X547zd4PNb=2vkoRL8pI^@4jv%8{dSJO z@tqWN0qc$njF6vGU_^QU$6;^4i zO`@Zrc!FkPz@r*B-Zt_gb{zw#Y0QgKD!M>x4a!7q2P*1?#Wd_5yS-zr)I=yMifHyT z@lo=zaVL6PcU~!|RRp~riCSavs37!=!B>v5tWe63r3Hk5xIj=2WA*l;>sHgqbTs4D z0USC=@!^L#{wsf*krbpTwvwm@EL4J)KyWoyB_z$gQGV(;ER*cnso9qYoC%Xny`?{! z#*{$`QS+$OjElE4?l>N48yMHSZj)gw;t)JRX@U>rLG4Auzrssv%UHu;uHda7crWamM}RcX*uarm zJ7Itj8eMri@x2Mnza~ytJuw2TZsZhPU1$B#Ct3UAqa4oi=w3c_j4Q`{r$^xw8_MB7 z`6X_D_+gUcCz||5L#QjPPU+snBu{3VR9fqa!}^4Yk@*P)CIiZ)ePkbc2l;m%Mb2G# z)#V$rpm*XFj(XYl;#MDQ5JK&dtuel=P(@BMpHeerc+BQcxAzwB;_o-psP-&sCq4Bf z+q~U7TLj%uk!}1fSnn7U&$#x&2Om92n)^G4 zCTPL8a#0Oq9O>Kwhu`}??3vS?`}CI?{l#CAmURT>B1njpPjwSNV%X6DY4yv7-KWK` z_9QqIk*=)8M&?Q-I6QTz@!~KlC8(I-AR(In>BOQ4XyyRe$WwIf(-7+0>VngH7+>-lZLDFQdG1VBi044sChUOF}h&oTG>zeU+ zjMf%w(n)dSoFg&GEq#9m)O2-%I(nGff9a=jOMQyE0I#^1MxSGYB5im!S~r0!L7*1M z)HQ+Y(6Apx;hLP|IJt-#TWRi-RtlY%<^l((YU<&L@#cWha7Z;S8D3q(IY(XBI2XA# z(X=ALT1&5+V$+1QQ;_yMWZfP~CxV^Y%tV<$D}lHn zC?T?1A~V5L5zrX8vd-nFp5tgpD7|MKDh`_hmq+LE!KD@aogLE48w^gJ&eD)xYHE zhd)GqYLA9H4N*}qUA^h zb1H&v>q`s7pVWoa5MS0E|F$zf0V4>R~p&@=c!n_~+ol znY}}P5A^9VR;yQ(L{gD{QXQ37vkfNgsOBlOE!*S&Gh5{BTSb4AsgeE0-@Z zcj73UN9IYzlZ$}>Yp$ZQmJS;01Ipyv`syt`cH(+yk_NDbnS)AA^q&(W6?Oe7N*x?V zfz}~nBk^$;5ev#tCZHXdv7iz~t>T8+wVF&D*wAF_1D-u~lK!DX7|EDhn8T`OHZ#%j z#ezmRnYJ{PZ@r6qpv>H-ok>48Q_5{JVm|8-Hp>XgJ2|7e!h27aBJ^3sv&!1tqy2}3NFCy*a*TpaHt-;%cq z;%&FF?{#-lA3cIznkPSafMjV2=tG|4k|ffzC7`6DP!*Vp6_)6hB`)ufm18oUfXzuq zmZ9y@-{tz|PH;ue#?k%ERZt|JQQt(@)u1LuR`I=RsZ3$Aaj6;I_w{m|#~CCgkV2t{ z=z+&|`()iYhM)Z;e(e&8ZrwLECNxE>g%R~$;rbF+f{qP31e+$%$QP7=F@`~TnZDk~ zfx92X9XQTvVmN?;K~1;YM>mZX)B2Z4+#Ahxz~=R)Dm4kB9VI2bk>a4vSjmJ1y~%;! z`wyHokwDzjI>skSENZHQ1xo{=QUg~0=;Pe`V-K=<!o>Gk?_?@8A9q#3uQ5TpCr z=50gCHnX<#U@Au^F*v2Ej3?8Yyyz3|y^lNp$A8GFzyCjw8qIifll{Fe)y5WCmSKB6 zF0HL#6HPaX8LF9sax|o4o2Dl1gi@M*;dKlfcXNoBTcN_)`OVDK3aWV%LyXA_treyU zcn#SgrRoNpf+8r4v8-1mZfnTZZ#)WHE9Cdz!{VK{v#1V&QdE>&bt4XT_feu5xquzl z!_Fq#;7G`Uh92PC_mA20mpm4%c* z>O9U0P6vvyr&5|hmXN$e&1lCr`V1}9+HIFp2-vc1B51V9&>@y(0O_vef2eXp8Z`CV zfRN?L!V;T<0SB*MCjXs(&)Qqw$U>>;baU2iMWr;0DrYb(p_8!@Q>4g*Z83t%1^D;Hhin9}6yqK@tI*Us?sqap%g$8nglsIj!L}GoPC`PU( zm6Z8I_dxF$=D^*&?ZtoH|KTZ;_-Lr@@nuBpJG_a40JA-~*P(x~meQ zN)&myXQsIadS7EJCxTfKA<-6wW3HSz&-v${BX>22lLC4jHf&(SDzr^WsL6*V=wf;h z?C3~youctZh2smYNR4jwGqcpQsO>cak8~{?27)-|bV7oqs)me>B6S0vJ^M7zKJ^5L z*9Yu->wZ)pBr#N?qtO#>6Rw4>-^WQ*n8Is#dhU;9~R2d{R5uhq^z}ug&(3aJ@VlFQ*1Xj0J8Pz5GZGw7so%)HBJn_H% zE5=(x{9u5oOVT=Eoa3+$Bnp=2;(bsv!r{Dba}2|`*t8ZY3hZ2;r6Wh! zckmFs_x=cScoDht7#uo)&x@D{f{?0&do5Ain+MjFr__NVBUTs_=62WgdhbbfO3~?o zHPezxDXe+v;q1zX=+dYlpwMY7LpCp7=FFo{vM0HDWmixjHrnci5D+gjj`E6L)+h8A zS$gR0uy27J8{MLeA%ljIa-A;Y4W^Pi_pb!au&T+^$Y@XsI-^a_efG~V!_D2yc}cCI zy12~6FMW*z_r8t_M<-9I5cC)%mx*2+rC#(tnj>i6$P+X;ZDDZ%^}0KmfA<3nAN@Lq z@|4lAq%23+%;Ls1iPflE!6c>a?!MUGkeW(6jM1bjL2A#XQ)f8y#7P#1HQoJ3;OJpg zs?P`^v@cYld5{`SA; zu6;|Ct1IYE!lm&h=~_kK7L>Z4>|-qhYj4d~m}=sw-D)W_qY0&BbmwetnHQ zy9>~nW5YX&PM_mhm(^;7Pcw{oG}6S-I8?BRQP(#%%Nb6mm8N?c;>Ok+5e?)z=LmLq@$`o4~o@tK+@^5RgUPT`NVm@ zWxT~nf7Bem)XRNSsf5>=HtVKN8HMOcgO28ECQ;bLlI0oMkpu8gewFlV-{SdCe1_F; zJ%-*`Cs9Ih730wwb0h=}CQZna45>ZUXiOafI@s@fy}Ji`_tq=EcGGld8ZoR=F}&1! zE}c8Wsc(IoVt6qn+R!&CSgt2_yp#dPMGzLZnKXxX4|;Sh9Fe60|Ht@C+}hi zP>tzTW8CH{?(8L2zwmXQ|Bqi`-^KHoy2iOk#4=W)QiUTBv_=mdMyW`LZmw5LG4~=2 ziWF}HsfzB|-Vdp+Y;g6;IX04nwNL&5y?gH9@Iyb!!FN4KdfT1I+&p!^kLmZC$}zxr zOsWj2(Krf%wS@d8rchqM8uIymGr(_-6VWXf`6azqMq>0r8Nh3eO*BTJym*x>-~1~M z-k|YwtGjOgpe#p-?(9ktoSy*RR^Li(s9%2=-ureaauU}}i>x7KyMfvFRMZ4bYBG{w zK`TlH-ODSS{M1+JhHBR%Fewt`>N;0H_vak``JZ7tpU^RuY%FL=aS~nEl+32ashfUw zlfXoPngAs!QYh4Y_pt9L-_Pl9e?1ziXvLr&kroTM(TGeZC?~f@kok_HP&bp+FjJ&X zyd>J})pojK;u&JZfD<;JKgY#yJ;vb52K}_)_y;~fa`a%#Ru)5Q4ZadaMyQRZqoR~% z(qPn6U~@A$xspZ(iv&S=g%|J!Ouv9$%G}@jDEFI`Q@`=M99vjqb?XYnd>_B%$W=zA z91;ZY!$fiv2$7zi!vK@$o&W&RgFL~`N? zN%QX5BxfArx#mn{{dlBdlC`>ceN8s~wp*@l3~)jatk#r9qwc$pBft2wjMqnOe&)+m zgAMxKlu$W@KsEA>wpdYCo_$3JvFSE*MXvv4Uxv=15L{%)Md#~VKmT_p=+#=|Tp&R) zpXY3pC0Ea$qxjvAlh0Y|cil(EJkANF@+cs)Hp=^i=o%e8o};`a1n|+cu8n?^8RPDo zRVArOB;xeOshuUKY;Tjb^?{~M$BNJ3NTQ@G(@=Cfm~LPTOZD*m96o-SrSCq^r9b}* zE`IgT>0i0Z-M#&+$Ov(c+E>)R!Wx6kQ&R8oRfzE(dutE$zNVG}>I#gF+R9Wh9By&` zn8F;^Znv| zWh!Op#)!4(CguhK=Y^0M4*bYF;oiG&ofIUAuC55$SklmHb7%HWb?w!QAU~R*)DB!- zqX{HhBf}9C1`H(2%d9-|8P>k^b;hU864uw)45N6j5)C$q)S2L^Tutpfi>hc`Gu2Gw zRf9E&IeOl?NX4}Azj^S{Ni)Av+%9Qx2hEIfEWTXTza zx(Uh}Qm;`pA#)CMxnOFQ0%SmvFMRN!qm_#F?Nz&>%C_{%KSUu3b*Y;w8oSbl?k{2nKl!H z5||b>YRCQFxu0$O*adXsjy!fl$bs*k#5{AFak~2+QYuH+!SLzR)Q^9M*rVmcMWUhGx)zm{q-K5ds^*+b-YPMDa7#nJFU&~aKuhc*p1Q()j#MlUl zHY|{`mF`2{u%CTzd4ThT4wZeA$q)A5U%e?|( z5A?qF*0>%Le4Hv4X@;Z*W1+l!iSrk)aK2lhhXZc=(8F}^yc<*?D37&<(M?XPzE`l@ z0^Ycxg(fZ{IuoM}L11J&VOX;-DJUDAq)LG0RaQUwc{YFVk5SK`rat{F?nmCmsvDAO z@RcJoiV=blJt>qM>(=IbeC0QMtD@N#cnDETDrm+gQ0!mebszj796UlvLe}UGGlAS_ z7=bCSEfTjCVa8BPpjJYSA{dWWhD2*pWvKlSe{O}*V~?}^$Y;6og|A>&uF_3n1Vb=M zV-O;UtI^7mYE7=Y5$pv=XyQ9$N5@-f#iH&~QQ>^dK-5}K?D~x{jGV(b=!Ae-S*2Rt zVD;P?HcmcD_tUqr|8M>sdP@i3&>|r(AVB2=zdoY7u{+hzUR9Y2IZ6A;q>yD zUgAl9`n}kL^9)GoWSaeY9vOOkswU=O*Wj<4xI9vOqzVuqO%kw*T6Cm4n?Of*;K(7~ z@L&BhqqP;rUwf2&%CNOQz|3_BVHn|!QW#@m%-$pv?T4Q&vXc=bGfXc~_z(~yBxr*2 z@!8Ok(%uV!dR(G1%joQBF8|gaaUdk9kA4Ju>z!w*p_eNwVIbE?ukLRY141jm8V6V);2EcbzMST6C|LOVts3w&X>Lp2agke;vw|w z?<6C|4~FQ4yoq&`>2sxO3+PF-~p2w`bElu7xc;o_Uqr~()ne&-m~=4E*v|;7@>n9trcQl_@H_z zfcJWzD^eHD#La7il0{>%fDHj{1pF8tf1Kxj^LLnk`gsmiBW@?5D~dGFBKXl3f=85& zIvK?_%9x1yzVtYQ3Jq`)Bt#4UQfUUAltXX54|CVukQOLlEZ{ab>2)%!0jE5+F}Dz= zdLKR05RbpFDaBDXreHl|$r~D1Vk$0t>a#5W_8${YK0{(_Og~4tK)PNsT8b27zk4Y8*m@^`kFM#2F4-K%Q86mH0QtiRgem8dNFMG1y&Xk z#+`(EYs~0NUxQ~)(|N-^sKPK9Iy!nf;nhq>5i;X+zVq3d{eK^o=6D_9qfwgRYcLtf z{2Yr9KTPuVZ&6)1k98jB9mWckID%2!iss_&B&G$#LNtntxVDK63DP_Z4sFtCmZdG# zcuXD~mKt$G^yw%0_HX@b?#Uece(|T-%1cIKSx79(8^-wPhTVMX*}QX+nFim?yFB|& z+a{ZwK-3#rjWO}8kr2ofR7FPm#(R1DfA?#A>mU6y)*pKc6xhsA4ySvK)*5T=wubO) zc}bI#tXdalWf%p>HR#mPF`8i&7@L~;UPgZI0?+)`|Ho3EviP@umV9wPRU_h$qMi7i$Q3f48~(FXgnIV3d<3SsU;4{=IA zAz-w^WLY#$GSj-JZL&-y?k{hB(oS^c2h0_`9f)YHF-bxQf!e!R&ly7yk2!mRv;Xc7 zS?EIlV1er`vN*p$=>v(;;G?msC&s-+tRLUc>z&skQ#Qv<)12knXD99(VaL85X0Cp~ z28WsJZ6KY%wqJBv8eH!#q`x<2x+CV4+)@n8s_@#Xue$P9p7J6tW=oD6i zCrN|_tv~{G$DsUn2k#dAw!l|4ATLomQaX)}QtaV~YITjZ&wi3CpZF~1nP=Ir67$JCmim~GrYP%YLl499HMs8Hjbgrd1`A2B3PvxhhietS)%rE-Znw*wa1rr44pTc zzDdDkq$Us&@QL8H#~8?zLXB#|V4W+Ue}t_^7Z^Nxn1d%DqJQswurJ3y_D%Zh7Z{qG z=(K8!E;1?tR%Wsb)QfAEUvKJADJU9%WSgv|x^k4|2=Ue42K0&_FbWrgIL629Fhu&kU49>d*fL_2~N=%?uUgu%sgod2UoNDdvM_t!p1p7-%ysGGf7jA;O` zdcg)|*wJ88t=pVTyD_SX!Wva24XIT<;>XGTDwT>o~ZASSI029gAaf4E6f-;&wz&4BsCxKpRsKS_yQ{SO} zq(jzENZ$1zoVXKXviRHxI3EaFa1Em(J_`!tXXHsUnqGC24eM#<`1GuqH6RV!+A3k& z?xBQ+rP4kC(imK+7~2^HQ}h^9!7$KGGDs9-qp1!aBsqAH*Zo~M^T{u;{ISondG0(# z4SAjs>VS+LBzs-=J<$6aTPY^Kn4x(i$2DqLG8cr~iaDxmlZ6oszVRI{U8l#)&3q{Zx=DK8WdISEz zK4jR$?i%QKdf+|f#yX?;g@p`pUsA^1}lA^&RWJ-be)K}NJdipFE{?+eMU%rA> zB^we5V`1LrU@|VdK-w#CMpKKYatgwg>91%Z6ME5OrGJ4!Uqqb;+$LOhWTaAJ@Fm>BK#Kj?%Tus zgZFXHRcM_NY@}`|rg{a0?KBd(M8X^QcZ(>EO@zut@xT;=NaT#xQj?oDCBjDDX8t1& z@l$o5Z~T-0orCQb8xoqXH4}=@k96{TF>6B?5FLv<4yf?7aM<8+6)dDJ*2@8##?fsh z_-BuD`q6KY+;=P4k-MOFgeKwKX8YtXp8Wb9NuxBy^0Bw`EX#Yb3ard8$Iz-AFfS=e zCD2=D<%18i|M9Q#?CBwcvH&;4*Osa-+3IgF$6IeFGxn6$T1Tvw!~qwz@r%rB#gAO+GoJ`me{U{nDZd zL9V^{Fk5U@J7(BK4O~S{@t`6nD=L&Lj8-ICL6Ihq_xl_=wNAe^BCB)OTY)SO3?BPa&d(VRFU%9}yoXY2Y=90i zmnlT(;E{m`FgIBX#ZF9*}pWbn?RK{mpfKBb`q9ZrXdu$q^y52h4VyGo! z1hlh+^qE)K`oBLx_31~L?~mAANTBSn0Bri2#kDh(olUx71?OS2(_t=554Zq$6;=Gk z*K;MPk6flBaW$KwP7Hda8A^)Igyk|&Xv>}tK1?`t3nS4~9ZPT(i&~SSaH7cCi)1x; zv;FstgJIho#Fw_(lcF6IsgD507*naRJgH^ za{xj~5~+%lQ$9tJ%4{Gk)Mh5~oS9#);SdTb-c494+vX`Wj;LX}Tf}<1gW%`{=#1JR z(96LN&cWau>G>!+csjeXe0ZUTEYJ0DBZnfV5C_JQIZfiG0v1jhmE5K_tHXAc<>-N} zK{c8{feA+#1@uTAkt83*TX%OF2VznIMj9lMdb;FtV`FqAm)o9guf>tgZ{E zw`!LD*T0QvuTllrau$q`h^Ccf6E0{l(@MN*d{=F={=GmRVlm45fJjvHY{-8E?@3J; zESv@8*vll3|A3`5dp6)dHCU>ZqONh{2s}Iw2GL+c4$xj^C(^iS<6%X_;&yVl+OpCQCX5f--nK;vB}g#wo#}v?kFhl_VG^xN?MPrwpW`^YDB4 zz(4-)dGvq$=PXq(QRxA~w2g;<52}=We9t(TPjIiL_T$Q>=s>lU# zz!i&(N~S`SZB!#BsT9_k*89AY@AxRriOD5~x1wVn#1_a$Cg8JGzHgSFqha1?0k}gav0b zRV$5hfL<6XD3#DDp?-%)@V@DWI~Nt1TPBZd%y}|N7^Q-6)g;}7v8dWKmY7WY z85+c_+wz#VEzN#6j^M|5`PxK{kTA2ctKcT+#6=Z-erpXri|4|CfK9;XnuFCL-23)o zRu{;ZHT?Exm_M-r3-he6^yn5oI&CxsAMZV4qkx$ag_T{-?_a8rv^(Cp!{JatO}LH0 zdun{ckrKQT27?iG@XXE4@$?tJ#&@io#o~+ z!l$C%?cRO< zBAt&NokZWf$Fi<5dBOr;Mx+IfdaLYm}+%HeBEDth{v zhnZ9InOv{;6ymA1#IuQjPcrCs;ikhJ{_sO|&l%chHQiy#0v%FkPy{OF zpsgld$=NROJ160N^M_nSP;C4;GgCtxcmJ%lDAN=LoX1-Swr2h8Ii7jyd;H)tpQ6{v z=q8$8t3y|}q4bDO8QF?$8-4SdqXY%&U;ht+sFQ2`Z;d=d%s9|$IZNu z2q*XSutyG&_7-*|x?C`)cE{yM<$Ub;6Hwlv$_o418BTxWTb%g#r)bq%td$$Q*70nt z7)HudZuF7Tq4O?VZ5Xs*n0rQv!zmwCmV*cH5G|7))P&RDcpk^17nga==tDGrhB4=6 zA{wtQ-3;5Y_X`2jD2pTrDZ(HHRRwx`4|Bs``3TvE9-!Q_NG$<}r>-izb%>2ZW?B?U zl0dU|cE=kZyPe*5z#%cShNcH|Q-_cZwv7Jeq~p5@o2d!4ZPOWhu3fNv{e~Ok}o` zyA6tcfei9n6tve>6I?sIuPKra<=zG6ZoeJcEp!Md>v1;rk(F+Aq&x%(Qvr%g9JpQy zDoCtCQzNgfvGpfk=HwUtlwq+!Cavpx0l2uayRw2tsA6)=C}EP9%z8gftl?)XtkLgy zc0Np@uFY%3=o6i0v{n{*O&fA{E2VE~;*%*K(g*YCmtFkrrajM3NsoRJ?P5@^-nLw)6-ED@xR zU5dJ$z;MX=m!2Rz@F95rUNQ?RQB)GWu`^=VBC&!NPe|2e*Z-`{u$E|<6J`Tw1!7t( zJaj*U+Yi%w_Bpy3*2)20)p^@P>lsYbMU_y)Ob2-9`xheRKsO?d@#p=vwXL)w*!Vp4 zfx+vq^YWL!icK?)^m^#qZlI$y18=d)HQEMIJSR&G!8Pz!nNm7~gqcJvo_k6~Jp}Oq z5jDBKS_SeZNvrS(3BE0;BR6s5FZ?{`pF6?1a~rG;N3?WC-#WzB1f7Bc6{bn=7@B)M zCA?SiG#|r?XOmD=q}&9N*a2*Kn$}tp5$5tXTjhwgQ>UmO{VeUQ;KpD6MHZG8sYew_ zn#cIaB-jZLTWu?vii^T&e%9km$qesudqO;`O(M^vxaCT(I{}EY!yPuJ${2Gqr6Kn@nwqLIHk91x;qx z!Hnp{WPA6%c_|fjEkbn7(9KVrm6{uq3}ha6=iTi8&;L`_MsVWuUm{IKO)6Xw(F^ZLa!3eTnr?{|Wxt=jp8EFu1udnZJGH>Pnl?tk;nOj-p+_|$X=S#T5 z2RQh1KLe{bkSG;-u@Vs@>oWc!k%3%>*-WgdZH|wMV|jfm@GYdV8?Ovk@$XcXWKloG22- zR9WRR>wj!LBE;kmrSX1htFlp97Lp8ZKFs02@w1%&XD_p=HK&X7khFNG)NC$L(r%E0 zYF1pPQI{GE2nB&e6ncU(^i#k05R*|iE?5OmA}}9>^^+%g^^r%JFG`mF>%Wg#Ss>Mc zjj~TGYm+4!F+V)giNW}6;^C(NvBQOQlkkrppB*kTD^?yJ@=9S zqkq8Qsi%46sqZ378QoCvuHb1m1wEz4U0zQJjVr+=wY>lToA}Nq2;=)aNib&1lrvt| zn5JvRcG!12NuW``?Z5a8FZ{+SmQi&7>d%lI+()TlP!-IjIi)KjQb6mtZ!|Fa@db@L zuCX3EO^P)aLd|88yiTvXEnQepa9f94f9kKYl`Zi4xeZ>Qo1?#FX*K4&GFFKW<6`SO z-c9HoF*1q5WEO`NhfblT6b!d0PYkGk@6$Z@r9b1g4}XZgKm7s1&HL%^T_Q<3)Rkku z$)_RfOg>s8)L4=*RdK$ku$3?4>I)2`i^TzODkp@vT72lJlTN|2SW7^$U(?obu z!*@*+Ct&=v#gzsND#2EPQEQ&1pLh`d<8{uxdJ1*)SVY1l2JJmX?Xa#!ODvozeZgt6 zJFc=&yF1>|RSAPaFpVdqm;{xlD3df&@IvZ6ORX*z;pEm?avj+B!U<0O<6q_6AAAON z?hKN8hM^!4NJC(=95P56qxNwHJV^5hu~{-!Wej7%_|SN+xk=D~fl>vW){KB57SWMc z(HV^3+2{E4-}zlOo_vZM(ws0F5Q1ZQ&kDoA0KB6TkHH}GU6e9d85inebzEN};r(GG zziA_|qz$z4ltK~?J@5ckw>t@0GHqxjDVa7XJkD7>E;g(#a=kP4#3=4zJqm^1*y7Y< zkKvwwj``Y>sq4QcB_WD=*|Li8AJr%`2H)_j#-DP7hzPTgqbqM;LWIB8!AE--5fF`9 zm}k`O?QSq{bn1~Kj&EkVUPW$dVz~qg6mSB`7l^D2cxMa{c=8VcrfO+u% zyy5bp@clloeC83%*)#YgB2n@rzbZcqOQ2;m+QX=>&;(YjGaqLDV?WKp zhu?>}^y`(O~Uz3 zhtb|;+7CUz^3VSa_Tl?@{avfP(n}_Z^K62@JKjK1w5*ZJA}1Jgt-nPnyQ(YYGOh^6Ew;XFX08yDyLKgf0pAFs%);3v#15dpM4&ZIkz?&u8BNTk1c6A+u(O8mGxCl@BX7kfVL){LQ}de%w=sLq|IJo*ZG zOOxjs)A!hxqIS`O>~bSfQKtawD2f831D#e*aqJj8^&H%A3#P5ew5ISHJr?r8VU;Hd za{2W?E5^nQH&CL`O0I-a72$Qyi5 zFigBeuV)_b&i!|%JA^_mI!BxU&Qn!&^f*ovd|08rZ6rI1ii;O<_Z3=B#YvabN1bhzM!v5G6=r2(2EA2M%*{ znv>@_i+fjM;_O3I8)vGjEYnH9dj?#tC>nfI5YYrB)B=@6b!72@Y^lXssIf*k|J?UD z`!8SP$VWcN;?I2$d($TF(2aNuPA61xIw7?ut7Df}rFx=CLo-L1(SJyNI!H$|a(H|gCSZ%ax$EGGvcmp5?;t$&)b1wqRu(mU!g^xKl_pmy zt=kUMx&0_oq|OIiaIqU0JU$WnrXqDEYhU~Zt#{u`mfyhK!UEc)nZVDM2ECd>dz5MHTCa#M8Tnz~z$Obd30rMztnjy^p#GqFJ{UWQx)bXoZC2 z%xS*+Tfam0#N*uavmd7O;Qg?&4Eqnj`~oATsgyJ?%Jw1T0G{)WQQOV%sY0C5K zY^nn1EQiw-&a-)a&u{0bZB)MY-Xm&zcpMsv*3Qtu%cX*>X+S-GeYC+7sJ)}(b>vzv zE^+hSck<%y7W0;lmP$EZ4|&(z0(Mxk@2+>jTpOd)CL!65W0si;Mz~CJH6Dr5jW7vF zm{T2 z*kDtdp^S?o4I+o_R(G>d#R3`JFe&yjsgoMMZ% z5!Cly;OSrgICrfa#@}-*sfsi&7p4+JLBLADOK4!E@|S*J=R2031#7{zTj*|1o~95y zr5}))_QXSWr%2f@-1%yfUQMVSSP&oMDjlNzVoPhh2<=fIvw|~$ep-W)ttnkWhM;e}89pp5edZIaoj${GeUr-B zh*D_&zt$S(cR9UpbnJq{uW^hyB(pG<&~SOKrp6}?9Lp0oX)j?SVj=`mG^l_#0k0q- zrL8-JszmFOGcBQ83*B=AOrqFo1xxtYM#oGhRGwM_duu~qLFNrXXLJLQLfTZcE_!&pNlFn>7|Db9 zZO`<4}Z# zSQ0!`N>fuo|1@h~`~uy&#`FWL**ve?>tAHan+%l)iWAS1sUfx=(yA4sEQ^r&2HUL0 zoq|T3SB35Kz=^|3NgWD2HKIJJf{rpxe>WkKj3R+tDQv&MJ@g**@*YYYWqF>tuA*`y zL@SJkq}sJKy4F$E18z2k{^nUWIvs9#@UP)|H_*qERV7VZbK65^IG?5|#i_9fjcN)Z z%|ly@AwY;|f#?&eP!@{y0sT|YGkp0NFLXUi(q^u5oZM5R)qpk5W3VWhK16MQbe+O! z%Z47JGEKKkP+PE-Xz~OxieiL5geYUI z;sp2Jg0E4*GW1aq9|iPU)QhVu{_-#J{Jsv$n+3Y6*~nodQ)HyHN}*H%+f|4kUHke} zGu811rB`oDU}T$M%d9H3Fs92)3snvA10R|W*~FG!{*MR{R!86i<^-S2(ir^Hjpvbl06NizC z6Hh$GH-F_^opjA9I(3it2scg*h-L(m#Z$ ziuE;w9D;|9EjHITkj9J6Ik(Lx?s^@uK;#*oJ&*V({otaLF3yj+bg~^A`Ua=QIAn9K zfx9V%Nm8O$E%ON&OYf-_6w3EVY4on%iHL3_fWakG4hs1~y?!`E9lRoke@&6$u_M z0kH;ELoNx6S&wdeo;ov>N=PJNp($>;MqT{sJ4zS-TAaBaP~PK3(5;MQbuS0+zLTwQ zf16}jlh%$J7rl*j6gr`VmZa3z`TROJ7_!`5X0X1&i7$SYe9toTUg7udgZZ4i5oz>R zQ7eZ@VtVaxv!JDk=QF%<8s^yUW_)moL>sy>FMFJ{%>MiY_PFckdWE8>B6vkmpd^sh zp5nE0y#Cd1G8_!J{qMABAJ_|XIfZ!gR+r$QstVF9pRv@EZAFwa_If{bKsskkeiN>uC78m`i?j! zEM}TH(TqY#yHpG%P-sOEPbmtFqYf4q9PO&~&;S4+07*naRP&O}itxwyHw27I&~HK~ zU#S>xM{D5-?Y07`2r4mj4z03y>k)=O7!a%@4T3h2w&A?rhP>PzyGifv07k=#`F5Ky z+@gJM$mo%;aPH7eEdTAlML#cDaIs5CX#5Z*Dz;Y|3h~UTWSpH4yvKV72tmajwRMmg zM^`-MpFGN||Ka!8^XxIQG$C9CXU<9>5rwFLw>Huqm|n+hFgnW{`(Z70Cou_AqNxZh ztgb?CCV|q<>l^bDFQsaF!2)#PB;e0)&|h083qqnb&U(bC3t*4e+t3kn#MaRhaApm) zau6GQlu%RAqk8B4zc8sCGYH2)hG*8Kuc=!!%Hshi3X`X#YL2;|c?fy_X~NNy=%PZk z3^uV8Dv)boHzvK-pcTARRGkj1A9+9QUz`X{mBEr-s}R#zg;NxGhjR|4BeyQgGSZbr z@;ildc9)0j=VmZnfib zrHQe}@XjBZ?R$!niAT5~6OMLh65mU~T>!Q~NxyfKp{pAuo*Lh%Eo-_)p~{NQr(a_I z)M-w)7di6tKLvNZ3#T=iP61EhMg$@ytEr1kv{S;&{kYP7n1w7~>|ScEC*RxIjr~y( zFMC^ug1Q=^Mk5wbbjuO-cZQsQ?gh@K8h`L64n1%``yP4#b?6|{=|Q`N)aYZ~Rw$LCkKDl0``*p^ zsh5%ACT*{y)`fFa!C`h&xZR|8cWfUS8CD#%9ddA?MgQzN$A0%ybe8wA=K~KAmX-;L zp$dwsF^X48;T4n;sBFL_3Ka}KR5%w1-XSVhUqyjFzX9L;bDsP6zlA*a95>8&S=-zq z@3g4G<$DdT2@IljO&MWIP1@omifO5fB);3#VBWf68|b-G3LAv(-aYsIjT;uEN|PE*RhFnchx+>N)##=pRvdd3fAm$<@;*?8lxRbsE}G;v z-twUlTb#JU&zQ!KIbMw#xoU)tV&^RSp^^#a$M5Fw2Oi?w3%|#_WR$h1(``{#MeIWF z3Xxn}Qj#TBeM7;dCH)L9Swh zx*#YP*;eREfZEq6D7{{DC4zV%JYS6(MYkt)qdN@|H5QeWAqet4Y|nC6lW zYsH8(*UX9I+;czR=%*5HT3)2};rGKW^B{_l8hq&p)}gd%kO4CB@4ZwJ^J?bY_WgY9 zaer|`wW~?AcE^s-3yt?RwRWV&&=W)A9mBPCPJj9jIk2}!wz@=XX-`yw7X@jC!{aK4 zRtlwJf-2(#m8-iCV_TR>$9|#%9ItKcnL1v}&be*gzq{kD9UGk#6(DtxdXEYLQxD@> z$Fu)z&FkNPo>xBqWft#$4=eA!m-dmvnAH`sm3i#G6#`IsOIAWo1|}kg&f6gv-Ow?b zzrAm$HoEETyDR0i+YgkT@$WcyZ>-XAK2i^fHhy|#h2Der!DC;=KeHa2Qz1a@wpnrQ zj@_hpcQj+Z-Qv{7YqaJw)~gYw5Y$Vr@a(Vu4)^&K`Pjoq7Cpr(1;)w*G2sam5)HVM z#&*zqAFE_z*m5W-{_NZQ;8*?)t)oZDTZ*Hbr%5|qw6#|xHit%hMtO%V1|%UwdtjMr zUQFDYE|&Pd)uWN5S3%)}M)f-QG>Mv3&0gj&5?f9k+O9BMjBFJOV{=%eWQunxM_heem7ayY9s)`3oki3od3SXAwz1B6qzHhjr zzJUQ-?-7Z`JEIMArcJj0Aj<3|X=jkOC>!ooz>*dEA`!~$`mC|O20TV95ChJ$Ro4{W zG1uxKoi;TJPqf+65-r*A?u{p%<8D#I4OBqwYLo`8lNclkn0MXE@&_Jb>uY~b#|GLa z+NqUdX(w&!qNe^45Ynk$-=w>z%UZQYsT}(c?cvmk<9z@3|Bwfl7x8-+QH%4D*O@0s z9l!@v)Bc-<7w^QRu7y?P_ExCp%- za^fo;kz!M@ybjlnE_TjE`%VdD%3yI20yUn1Q0X@5?MLXm>qZ98zJ!QiLqI%;-i=Lm zliuBN!Pwebr#C;xNJH0 zE(;i?NRnjQjd9$z<&2xdRf9*2J~Boj!|UR%{Ve%e5fX=QQl!kLyY%W7oojj z$C2Y_6W<@=XBf4V6hTD~VQa=-ZGkYU0AJYcy{epbB7Lu8rLXq*Mij(*&-K2oSqUf{ z?Lo!sfAIs_ANvqKZ<7)sKaIWaWDZK$9-vBtT^{#v<7cWSGe$)4A=+%|#v9TyRv!20 z);#+5+t~BL2RZSnPqSAN%Jp?t78fWbid*cCYe-6}5`FL{Rv&l(ddnCxXoNq^o4k<6 z-IWQ%Fa%iAq$_)yQilSk$SR^Ny9lHC*0%j+Hn9Qddcjx+-Zqg=RMPKZ=mqe~Qu%*`b4Y$&duZMsSFq>Rer5 zi5L0d7w+pjlU{aqZbK}xjXR3|B6D^dvs$(R*R+zH8pmUR4%41PJQ!9$|U2* zI!nlV6X^DEMj>8E(_}lmnVD|wRdn6Mjwoa&2RqDIBVCFAyF1?eu}~SDs}Ve@(WLnt zNMKkD=x=UOt#l{{BV=oh-l$-&O6k6;**f_uU;Esn99()Ay?5Wv;)fqV-+e1(E2Fm1 z_BmQ-cn_ilkBW-mIz%sE5v&kJ1}{H>rtykg_;uwSA$XM07&M}Y!e}0>3Q<&T|0*kY z+{WOKze3O&=Papcyix21D7#7T?$}ugtNZNBRw>Spn9mo{N>f&S=31JgPd-NRn>VoU zBM&k6(;uL{yq8)O!GTu+CqmH#gDHVb8&ci)3yli;8|%2={v@wI{!MP{^(Y4e24%(G z8xJtt+#*Sm$TPcKpc)h=2-*c0mEax0S+q$bH*F@VxyWAfmM6balmx_ilnDKzU_mPk z@oQe|ZJkKD*ammm6&OK~q9wu-y+=1ttRIE_%r)Jtxu7`x>`UzJZ;>tUZG4(9yx+4b zv0Gj?-XaWh_^k`ZN(i{j$6y)>M zi_lzXg|(>!ooI{?1RSCQBFPM;!9ZPOP#C3g-bL?ou3q47GLIW8n{m?XLx}briH`qv z7Nb+p85p5=~>p&T_Hdu)}C&OHPJWJ93Sgv-xW7gA3uJ zT36%3hnXp|jj3U~g*3X*mQ$pf}@sIpHhXp9re z%|QRVFLL@jUq?Uw74|&%04qOsFUf&@REzVdUWasL36O^6q_BAE#&27publK=VW{Bo zW6R4Va)wLRb6JjK559{fny zC^j*38T~L|eqWE{pL&#bugl!McVU)RKok{`YwNX8x(crhN)&C~co_v)KexuISB_DC z_7Rq~Vq?^&ou(`&%apHekclAal}Y~N;8FRh<%sf^UdrQc?+i!Ae=wQz1VW zE(_n5tJ#!HBfHcbm{Gx6BSxry1P)NI1W}5PNg13ui>)g<0yt1+`)4>?O9&yvO@BvF zGWNp@O>`q7cpnoW--u&HYpM7%HL#T@^xpep-0*|@dFsjUvbwmy*5*3CrI6i9>NSm! zYxdrIJM3M8G!}UJ)PzLnz8OU+ttOs}qE!SRx>(R~!PDz&=m3evS};0JqM>*kj@B%v zm+5jIcjzkT$s4$2aEi)S*x*T3f)<6TQV)8PR^iC4nM${?< zf6;_@a^H9J-^-s5iN?AbsUgt@m1yvB%}WSuQL}%3iM91DUirr3xF0*h{@ag`w&$R+ zD3Y17sYa$=?pL8xcrp6Swn7GSNn6ET{`Olx2BDAgQCub%O)v($-~x9^DM>lr+BvWMeJ=ivFES-BsYBYA*do5Du}`>g%1Je<9Vax z+T90?s8}d<9;M=BjfL1aZ&IK{Fw2YB;IU1|85bJoi`^p2ZqoY>8yBi`PI)0ej1AFk zS$e&BhE!l6?HcedZWJ}#ENeXTM<3_7^m*TZ^WUQO9VRnE3h0r?lpeL9DSiK{`64;eKR zoT{n1si;eT<}-)g<RHORa5k+uvfIWpLu;LY4=lkfD6-I~dp?lZ;)SZL^PvR6}4fC0X z+Ct-Hxie_Iw2ja9QIAE;njFz6y-j?~&ri1jrJH0nK#qctUGja6U!fO56c-tPUD64U z%Lb3~3T0H>-b0858yY@eVz#}nZ3@wo*PFRkqB6b`K}i&`ibxQR&?e8~y$CAmDtH8Y z&j+~W7mxDdZ~UJON3YV$7YGH+ca~VIifhiQN)25LX#!S=f?j}g5z2kl#Y3g0-nUGX z1}z$I9les~yG|#28%d&@~vN@#*$L#8k8>o;%*;G1+ZysFGOx@Qn+BYCfbfJ!k@l zzFu;npr$B=5T{O@@YdsEO+%JKjxeVS!g{L7ufS&aqM|$gT{JpH7;YShd+d zBsjEIO~F$d5yk|K!UHbxB;HW29H3hZT9u%?1Tna97EO!Y@y5n(nczo!xcMHp)-CpZ z_9>43lYfIc^(sSZ`c=tdFtiq0co#@QV3m~gcM`o>RH5tYN)(G|OF<>|twBGIo?8BHfB zlG@U}^H%QqhrdkwqYrZ4BrLivs+G|nY%+2Kj@QE(M|(iD*Dw1>mD}ed#oQh#O8bMq`d!b${Y9N zvxNPfxhwvD>lK2gu4~$9Mkq^go_4#<&{o{}!S}5$_K{DCi`wT?)$Moi0jbqx zA8$#4^bL%3VV>3d?xuD45NXmzDo<~Ij`jW)NqFaHRu|()zM13nXh1ToIrW9dc;?^! z7Uk35C&44mlLdvY9HtCpUSq^e;N&XPSm(Cgms$G6rMi1>#Xa5~mnr&{1wlvQxXftS z=<}V=ex75W_%sWrHu1J(R$HD@5c{dbiSlT#&SMKw-)9GmIGB3cS@8d)rLGt$&)nFNSvdr zs%ziho1&}tzER^A#09G1i2nKpPyY}9n#ce7zo!57ui;M|=XPncf2(F+C79$**#G2G zaqhHFCK3xPa_*RoU1b4ns1 zm(Pmd!et{=F_M`KRb}JMYh)V(&_rGDjG2<5FrDd9lH=TM#>Xl&5;1cf_TPI4C+B-` zdXxE1#z;p%{%gJegogcD$?2%L7?CHQr+Mrtvfn#KW0l5xA^|VZAQX~x>Wms1VuGGu zDZp%tDq}!^$heD_!tDxAZ+wsY20nZ@i`8eS2OF$?p1iG9p})!cXIHS z+fbKt?yvrq(|_{s$WNa~`pZ`?TB$)LBlt+y75KH(7L>A!b~2V8ybG54i7~qgI59X$ zRcx+7(r9-}B6h2X$gUgo%76Yk#vVH+Or?dpZf5C$dpP~vi_AxhWQJj^SdK+2t@duP z1D9%`UW)`VlwI~o&hVAf48Q&z)=wOxIC6+`-ysO8YczT30NN;03emzSS9&vSz1xdy zsc<$8US%80ykT$V?k%@}S%JwdqiTQ?$Aar{@!4N+@-M!`jZ6E;{>g8%lI2LJWFSx# zNvM$T`pvkfXEq3-igC9M~i+}Sq&i?RwWEW0h zL*$y2yJiA~OPdqACAz%cm2#(^4T*GY4x((HISpsd!cE7qSc<~7`hPMB-V`Nh3YB&> z%K@UxscjC+i^z$i$hnJ@IM#H7{MS6`jakH04dv1z!(qd|)e)y3{U$g4Cm(0z9M)zN z#8OlxNXnH|O=4he?|M{C0`jzM+aeRW5t)&{GVLeh=QRX^_gLc?0q2^A{qKK-<&oj3 z4W;?vW6;S6nK01A;+w0%4I|V;=oD}3{o5Q4k=&8xIl)8-fm|I9p-{(K*(7R=dPLKV zh+^pUmgyfm&ivATPW<6NCfs=pcjz!?`2YwkzIu*R^IsqfYrB%E2}NSYCTR!esejIf z!17&p&>TBRkqK1@bjYv{3X`>Huj>Icio3ppD<`#Yt-aYwzP7{HdTCO)CD^u5&lM~` z@-WZ;`J?P_V0ExT+3#UJ_;(YQYb@7v4J!%Gm5c@>=B!}Po#Und@K=ORmxI6k+vxlf zlG~K9w)F7TdW{JN+sklv4Bc%b(e2kYI|R<|+U(nX*LL}vcWKpfax3%=6pOCavKq;= zlHo|HLdC*dkAuAqo3Ebc%wK$wx#bl)AO9d~BCq=aJvWC@WqnZ5@0C;CRb!B-gcwnc zY-zQ<(L&VTnk=tzVu7O%SXos?KhDC3K2GJ=SvmDOn~(jN(~o|OwV(VHUyaD; za^~_J@rg)O+wNwRR)5eMT#-X~bEF$_#@?iH3p0r!f-1uUIh_!A?aP15*%x2owO{^{ z`~UergZU%qRlM}o+Ju&?KW(|0>4yn|u@8R9yJV zx7mE|9NE1;Vg1-aoQ;IRi1kyaSo`IxgbU|59BK+@fQB{RT++L}s&z?Rr(2WWtr6c_ z?{u;dX);F-OT-h`R|(I*fPLTHI6F_~l0l9w6mG0jbk*?dcFr_Xpesu(ec%CJ`}vEw zix+TZ!Q0+Se2Z6Q0&7(u%y+1&0WOR<`NWU7>G>DP?z|ai@-(xn3L4tZVyk5&sXiJn zlj@ku1Ybr|MOA=n z6>40!^R`#|V+Phi2n~MVv0|9ZN(wC6c+O|*bWKLr7Q|wXW@UxqzWZ4I=to$%=WbY8 z#O~`;dqb=Zt}t}=A4V1yi2eeMc5~XP`kXn(=4e2Xrp3B=OihpVhT{sga4<1AhA7t~<1zvmdrz~u4vSfP<2nd2}i6=t{?bv}L&R!Gy18oPnwLcbV zuiNp$=2;Gu3v}0N{1Z>J`uZwomk+YCxo)wJhibE$3vwr4P*1vKF#gXkRX+{;ksxTTcHc|-;B*|xIw!C%$&<;c| z#3>C_I`q2ryuZbVKZ{E2ID${1N?r{)|I?qcfAA?xJ`XVvyr&5P<81mcW+t%N#VAII zHd0_P2M*ys{1C5x^_#5!@>Le*<_Y1~8$Tu1;H{+@1&Xp{ZF3E`VL1PH-(mUKVRSwx zPZ}T-#$}Zj24qQ0o{2eSs{_%ktesmD2qRNibc}S$J_90UfS%3MGwBv|KmLA-xeW8o z$2kARzlEosg<(af@9=XaYo#!^_BK}~oK5$n@wf=NvuK3XYQW~^CO3CFoX-ubH|(eX zk@xeS&wQHRgAYP~kqsX))h3=C7bArvsJ<*L;>B`tSTiqIb`fTLmyP19nr^p4Wixv3 zy_LBSJ^~91RJ2HlkaFAvxsBIEaC9i858x1<_Xs5OYo7&Z;g zr9`V5Z4iI(Ltgme6331%a^#M?6P>fOEOc^S4K;<>ah-bN8;qKXkJ(Fm-=uqrEmf#7 z5F(;NRaJ~65=H|gUm+~)W4O@g;tg}yJNB{ky(bBO^F3br))RF5f>kK6D^mza8*kgxs>c3I_>}fAOJ~3K~xNfBi1)J$d4~lt&~Vr(KW*A`Z=6) zRMBBgUX)Pw(OZsk?4u8}{@lxiX7p=+L`!u@mQz##GGQ(E zEK1GmU-|~i_uK>b--9hO3TN>q$waA65dwjkBzR^IwMF~X)nzODs?6lbt`5X9u^-p5 zp_B}xsjw4KiiaNJ=<(JgDt3ZRtIm3uZkA@(IZZ;2o7YtVn zh-vkuGefk(h7oT6$cNDr#}Uo&QIY5gjY1|wEOyM8ehmVa-2#a>^ZUD=-*-Sws+11& zh2{6(Pv!lsPw`R;w#}YOgVqIhMj84%-1&oh$ z$q`d=@jH(*cl0QoVi}I!fEF1MSgL@s?I23xk{-(jj{VDCSN_edELyzxG^)7VVi88e z4PsqUHzO8?iDaXjb+E+>hwgiX{tb6fl}C7L-5}?lqZy1CRSnU{N#dKhI^Mi}*j{9e zW?Cv&l)2in+Kd=FPwtcu*SYZ8t1O&*orT~N%<3xQ+RH7&bb4X}U6$!sjkaTQ#7K-0 zF|wER?j^l@>&>i%3nRL7^9<a=DM{l?yD*mt0iOhHdEQU7WG_I#RE1Vz4ab9Sj-G zW62i8Qu5ZhH(bt(wypeucU};wqWhzI`q5bS;ocS$u0D4iTXf= zrE|jxR(|)hEFNFt#ii&3a)ucK6NP_Q8i) z{lsrjb`~jm2cfr2&j1#@G*oO-gdR}>)`B<60FTCss%lt_IdQkC-k2CKD_@a!avF_{ zfTjEIW24uh9}G?-h{c#da7k*%(hg+5!wJg6E?Kj=#$ktCC9HXJeZk|@K~dsY7FoXa zMmE0tIJt3X?x1>i%|~2oR?^<`0vi|C=w~Ia$XOi>$aBk)2-SCf%wuzZ$|LB?E~Q$mk^AFedqpJ%-#jy*gP=^cCJmY-tc5 zsn*wtqY-%sR2|3y7!ONXpCG`YlKi)SgIjJtM)j}$h}E;_SU+7 z(6!9#w%}4hRIiF;0-&*xtkp0TV+aDC#2{09RUyX#t=ea)heZNbTJYk%(o*9)LR+u>b9U$L9a_ zc^01eDi<4%&rAArDFzYaJ$2VIC<2}Y$8u3HK`@~etP_ujCSlDhEK7wo8LCMhNUabv zp)sCOsF>df*iHwJ5~_wWSQfG#BEq0%7CUUb_!7O|m1TXr zF+k0lO)TL3VM${Q^F71K|NW1+_2CCG#}2@eeT?dwUfuyB7e^bIvX3>b^bkxxw1pOq zXLpquqOoxqH=S3X89Iw|?Ob)zdG#pgG@uqb;;AuY`wt?Y`Yea;dw}Bm-{j&HzN@86h>cI)Mc$%uF@P@w07)jc9NfLurPk8FQMj^qdY)e#O5D0PNS1*;}7p9!_yz{M*UZMu~~vw&Z6xb=z!?GrxrKGu)TF&7P$gW3mZ zMwr}Ujinz!)e-Desq=Cj*D?FBX%p;8w|+e1Q~?^m+VKx15m_QwyL(c)ODVnxa^B9keb2H#447?~M8 z&?|E_Y%Ofswy=vrzx_77!1~12rbjIOC}`U4w(c}GMfR9Kb@7n*+GhLw|6JP zCBANoc+?~iEaTaD*Iw0l4$!k3KzH`sZ6Oi6EV1O)MkZ>nhT`ViB*#sJ<6mTP3|&)FHH^y?v4cu{L|v1s8aHXBxZhIzY4 zEPM3x1qQ&tMrs?$5V}~bmdJtQ%pW`scic<=dq3jUFMW-*AN&wbpTgFw;5^ZJdV?M! zO3(%`f#?jHWelP+Y&^>|O#`#T11qh;w6TCTVS2#E{wMYmiXaN*z;n1ZY!2au-W<(n zlPoJz!OJk&&$F?H4RPZ86-fzo>oQcJ(FP|LCk8?BO+(a3u!2}isX02@V8kY!s$j#6 zkbX^F4R9{MDl)CTwU_i>+ zO@YO^!3_ zP_bwYzOFGrDXgV$4Wb3ZewV7Mpz(A~N#TS|YBsEAb51$FnlXwEqf8+$ar+N5cl-c{ zZ#axUeiLVY@Yq#3{q0rD@z*bW`K#ReU;QB{*u0BkX*NbIbbE|Y@@+w#C==G^2}`qF zCQ^}9=b0TXwe64Cw&UhBVl|1{o4lZN_z>m8?_*zoj_RQYdGV$QFUow-1{5dQr)9ixeed4WrHJDyq`THS7|U&jb)^n9jJ4gOY-60isDG1G9_u!<fTW0_J?%~v< zU&lzmv~a+b(4=b*t>lFo;c8(s@rs4t>A4f-UFGdb`JjPk{aGnLiBD~J8?~p6LXUc8xS!XQx{btYT|VnnC%rM zYa0W43v*bAZ zc+dF{P%gX&v2Hq4YEt5>Ky+IJBGIiHj%_Fa7=n*9L8)z^bUAYDAafskn9jw2&NF}W zP1c@#in%z1uAy=bA{pJhgK0MK1cJoW{c{;klq{BL^t-Ak*Taa*G96`KybY?^E;Yq%U9K5BKuj`KI);D|QZUofltm)D z%kau2iR@NJPJhMk3&l+5c^vr9&VIJN=5dVQl9hyZj>}!O5b!ub4%2Qg;3Q(2fQgnm z%dm$Ia^y1~;pHFvJ^R;dyvi2hr5Gb&3=y;@b;+;v@|RSKc6VEbcMs|OMhx`NuCeiF zUtzT}Ec|DmBXkdNaX4V5Twuf|5b*-JSS;W}0}9UB8O+Y~Hi_Z0+s1 zpfX8#+jB__paCJG58vXAv%NI^>}XeU9;l}+rPK_qt#0)v%gN^;cUWbtp(?BDwwF4I3;X~qC|~U z!BdxAE*imR2KTYKpQXL@>r- zvouc}V?wx$1{L0W7M2#aJj)m(>XjIi1^eaZX%-h3=tN{PQxVlzljfBX8i6d!(6u3zg{TILO}<$jdqTZ?N$=Zd_eJ*d z*Q?y?I0V z-1Er#8dj95tDH6swu%G;A*NS!u_h0OG6U1Nzx@e-*_ps@k{9SUd4)-2OG@w9hji(4?;&Zo4q*H)x0Qf(beFyhlZ zY7~4(&#N{LpY;igIeB5}edq(MeBgbo)D;Xi;q*BM&%DIi3$OC}b3daVju>rhvN;$* z)!?fdKdh+hnte@{9Gnp}vzQ{o7CE-eG1l^(PuZR79#$vglv%<;2 zfP)|VAbR*9LdJU2ki`sVKwLZW5d*3*C4*OSh81nA{xe#NMj)gRI}g+LbX0?x&ENHn zw36iNEcf<%ayb-1yC(-G!DX|V{V8o1BN$TA=8ErshxZ^;t7tlgrUH$Q0BrR7EIxEM zNAJG}{pNS6TX?Mz!N?ebs>HVYY1X+Q zv&n4-d(404Q<$uz5<`P0goxFMIzxs7J3cRII{lJoCOg}>YnMD+`@ebF{kNOW=-5uo zGR%&PKMF?1T(qsmYFms_6AALx2kcE%Q}nv54>noOyBrOcjUWA#AOGo}@<8to2={c! z$`Z14m3eMy>OdU@SDH)Ale~e%cTY!k_cM?Q6k<_Hw#A9T7@<+{qO3>LkIhvvx+ z9ff-z;LvYZwwr6n3P-nF zVy$IxacxUNK87MoYrM)sD=gQJ!9ZC(v>*AzBjmsPaX7f2{(68pduefSOfaRFHfW4) z1DmzyWV~OTn2F(3RW>3RtHe|1shlFAEwDyMs*vv`y?aUTbzWw6zGlZN`QEx>P$f`A zp%QTG710P1bbi0V@fT=}d;RCAM%3+$zn*0sBTB7TrAOF4nx1 zH!Obg{oM0U{t@}DcQWb=^~wUSoM)6dHUJgJnW~}t1{~r}^VOZ$aPmh#Wd7L?bKurH zQqmceT09+!X`D3`IekOtPg>Sa87IePYZx1)g&G-f0c=RUKQB<59Qylcr@!#M5oT$b z^1u5An@D$zwcNL| zM1S83-Ni+m&2T0o%L;s3FxiZX2}+K`nQ`?vJ^H$8(p(YJ0&&pD9XC7t&W!!iFzNKp77E5c?=b{X8jTbrIGc#zFli2W z*IPXPf$jGyecd25P6;Lj=w1bu7J1JHKfqJpe4K_6HY!#OMg(ijWUgGJ?m9W>MH55% zP6^Q1hUr##v%ZUB{l%=u+Qsv@UO_l>lArv$f6s&Si!A-tr`RA;V5v}=7!VC07H7u@ zo_N(x{#Q+c-T-~YyQ@jSwUMOSwW#g`Zmvf&Si|MQVz-NKtn=!({+?HESYd8{k;U7S zU%5D}n9B>grKM`(C8y5JT>Eax++M=F^BEX-Q)6to7g~s~lZ4N)MrPtW;o{mR{eF+U zfTn>#ggkd}Y?>GN^Y z5?eSbBp8-gif9m*er_O80=)=?GHuWd!pawFw`%2B=7XOQ0(PR!|26AVwvNLJ?s>G9t}H;sH$wfSUd37`-`|ty}1N*_1tPd)RtdE!)kp#nvV{$Gdh}f$u%7{r? zyP77Ywxa>XCAc(_5_^@@+ZSuF){y$$+vdgJP^c}t6i{aFsa*QM^9jo_(O(SX7BF&| zBzxOmm)VdzUXt`Gk;*8>X5)`Jltx42%03^vhce!=;_{u)P?_R)Xj9@IFjvD6}|z%Y5QscHyHwl|U#ZT-C+Dlc#6lGr}?8AGc~;Qk(&uP*|s98nK1^Usra_j8NM7>#pUeF zuj|^0C~chh5@Va+Y4U*)#OtJpEh4y;9=^TTnWiEunu^X

$blBLfe^TW`jF=zjKp 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�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


nft;lw@BDDSp&+P*(;OQ46QNHQ&>OoH8A$xVVs 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 + + + diff --git a/assets/search.svg b/assets/search.svg new file mode 100644 index 0000000..3318054 --- /dev/null +++ b/assets/search.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/star.svg b/assets/star.svg new file mode 100644 index 0000000..b19a031 --- /dev/null +++ b/assets/star.svg @@ -0,0 +1,3 @@ + + + diff --git a/assets/stars.svg b/assets/stars.svg new file mode 100644 index 0000000..595311e --- /dev/null +++ b/assets/stars.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/assets/telephone.svg b/assets/telephone.svg new file mode 100644 index 0000000..679e8a9 --- /dev/null +++ b/assets/telephone.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/twitter.svg b/assets/twitter.svg new file mode 100644 index 0000000..3001352 --- /dev/null +++ b/assets/twitter.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/x-lg.svg b/assets/x-lg.svg new file mode 100644 index 0000000..b689cbb --- /dev/null +++ b/assets/x-lg.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/assets/youtube.svg b/assets/youtube.svg new file mode 100644 index 0000000..3c9c0be --- /dev/null +++ b/assets/youtube.svg @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/composer.lock b/composer.lock index 2abc467..5e77c23 100644 --- a/composer.lock +++ b/composer.lock @@ -57,16 +57,16 @@ }, { "name": "open-function-computers-llc/rad-theme-engine", - "version": "v1.0.25", + "version": "v1.0.34", "source": { "type": "git", "url": "https://github.com/open-function-computers-llc/rad-theme-engine.git", - "reference": "59e337a405555e2eff7aca8de1da9714077aab96" + "reference": "c0b814bdd0ee1f093a051ed2e78efdf8c1f4f94e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/open-function-computers-llc/rad-theme-engine/zipball/59e337a405555e2eff7aca8de1da9714077aab96", - "reference": "59e337a405555e2eff7aca8de1da9714077aab96", + "url": "https://api.github.com/repos/open-function-computers-llc/rad-theme-engine/zipball/c0b814bdd0ee1f093a051ed2e78efdf8c1f4f94e", + "reference": "c0b814bdd0ee1f093a051ed2e78efdf8c1f4f94e", "shasum": "" }, "require": { @@ -77,6 +77,9 @@ "require-dev": { "phpunit/phpunit": "^9.5" }, + "bin": [ + "bin/getIcon" + ], "type": "library", "autoload": { "psr-4": { @@ -95,9 +98,9 @@ ], "support": { "issues": "https://github.com/open-function-computers-llc/rad-theme-engine/issues", - "source": "https://github.com/open-function-computers-llc/rad-theme-engine/tree/v1.0.25" + "source": "https://github.com/open-function-computers-llc/rad-theme-engine/tree/v1.0.34" }, - "time": "2024-01-25T19:02:08+00:00" + "time": "2025-05-20T21:03:45+00:00" }, { "name": "salesforce/handlebars-php", diff --git a/config.php b/config.php index c9939b7..e1bc882 100644 --- a/config.php +++ b/config.php @@ -1,6 +1,13 @@ true, + "flex-file-prefix" => "flex", + + "options-pages" => [ + "Site Options", + ], + /** * excerpt-length * @@ -26,6 +33,7 @@ return [ */ "menu-locations" => [ "main-nav" => "Main Navigation", + "footer-nav" => "Footer Customer Support Navigation", ], @@ -34,7 +42,22 @@ return [ * * here is where you can define your custom post types easily */ - "custom-post-types" => [], + "custom-post-types" => [ + [ + "slug" => "location", + "archive" => true, + "options-pages" => "Locations Landing Page", + "options" => [ + "supports" => ["title", "thumbnail"], + ] + ], + [ + "slug" => "testimonial", + "options" => [ + "supports" => ["title", "thumbnail"], + ] + ], + ], /** @@ -47,7 +70,9 @@ return [ */ "handlebars" => [ "additional-helpers" => [ - "formatDate" => \Helpers\DateFormatter::monthDayYear(), + "testimonial" => \Helpers\McCansHelpers::testimonial(), + "locationTile" => \Helpers\McCansHelpers::locationTile(), + "productTile" => \Helpers\McCansHelpers::productTile(), ], ], @@ -60,6 +85,7 @@ return [ "enable" => [ "post-thumbnails", "menus", + "woocommerce", ], @@ -70,5 +96,61 @@ return [ */ "disable" => [ "editor", + "customizer", + "gutenberg", + "patterns", + "emojis", + "meta-generator", + "woocommerce.breadcrumb", + "woocommerce.sidebar", + "woocommerce.result_count", + "woocommerce.page_title", + ], + + "hooks" => [ + "woocommerce_before_main_content" => function () { + // shop page + if (is_shop()) { + echo site()->render("shop-top", site()->getPost(wc_get_page_id('shop'), ["headline", "intro_text", 'thumbnail'])); + echo site()->render('woocommerce-before-content'); + return; + } + + echo site()->render('woocommerce-before-content'); + }, + "woocommerce_after_main_content" => function () { + echo site()->render('woocommerce-after-content'); + }, + "init" => function() { + remove_all_actions( 'woocommerce_before_shop_loop_item' ); + remove_all_actions( 'woocommerce_before_shop_loop_item_title' ); + remove_all_actions( 'woocommerce_shop_loop_item_title' ); + remove_all_actions( 'woocommerce_after_shop_loop_item_title' ); + remove_all_actions( 'woocommerce_after_shop_loop_item' ); + add_action( 'woocommerce_shop_loop_item_title', function() { + global $product; + + $data = site()->getPost($product->id, [ + "url", + "id", + "title", + "thumbnail", + "woocommerce.price", + "woocommerce.attribute.msrp", + "woocommerce.cartUrl", + "woocommerce.sku", + ]); + + if ($data["price"] && $data["msrp"]) { + $difference = $data["msrp"] - $data["price"]; + + if ($difference > 0) { + $data["savings"] = round(($difference / $data["msrp"]) * 100); + } + } + + echo site()->render("product-tile", $data); + }); + } ], ]; diff --git a/dist/app.css b/dist/app.css new file mode 100644 index 0000000..2bcc0b0 --- /dev/null +++ b/dist/app.css @@ -0,0 +1,12894 @@ +@charset "UTF-8"; +/*! + * Bootstrap v5.3.6 (https://getbootstrap.com/) + * Copyright 2011-2025 The Bootstrap Authors + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/main/LICENSE) + */ +:root, +[data-bs-theme=light] { + --bs-blue: #0d6efd; + --bs-indigo: #6610f2; + --bs-purple: #6f42c1; + --bs-pink: #d63384; + --bs-red: #dc3545; + --bs-orange: #fd7e14; + --bs-yellow: #ffc107; + --bs-green: #198754; + --bs-teal: #20c997; + --bs-cyan: #0dcaf0; + --bs-black: #000; + --bs-white: #fff; + --bs-gray: #6c757d; + --bs-gray-dark: #343a40; + --bs-gray-100: #f8f9fa; + --bs-gray-200: #e9ecef; + --bs-gray-300: #dee2e6; + --bs-gray-400: #ced4da; + --bs-gray-500: #adb5bd; + --bs-gray-600: #6c757d; + --bs-gray-700: #495057; + --bs-gray-800: #343a40; + --bs-gray-900: #212529; + --bs-primary: #0d6efd; + --bs-secondary: #6c757d; + --bs-success: #198754; + --bs-info: #0dcaf0; + --bs-warning: #ffc107; + --bs-danger: #dc3545; + --bs-light: #f8f9fa; + --bs-dark: #212529; + --bs-primary-rgb: 13, 110, 253; + --bs-secondary-rgb: 108, 117, 125; + --bs-success-rgb: 25, 135, 84; + --bs-info-rgb: 13, 202, 240; + --bs-warning-rgb: 255, 193, 7; + --bs-danger-rgb: 220, 53, 69; + --bs-light-rgb: 248, 249, 250; + --bs-dark-rgb: 33, 37, 41; + --bs-primary-text-emphasis: rgb(5.2, 44, 101.2); + --bs-secondary-text-emphasis: rgb(43.2, 46.8, 50); + --bs-success-text-emphasis: rgb(10, 54, 33.6); + --bs-info-text-emphasis: rgb(5.2, 80.8, 96); + --bs-warning-text-emphasis: rgb(102, 77.2, 2.8); + --bs-danger-text-emphasis: rgb(88, 21.2, 27.6); + --bs-light-text-emphasis: #495057; + --bs-dark-text-emphasis: #495057; + --bs-primary-bg-subtle: rgb(206.6, 226, 254.6); + --bs-secondary-bg-subtle: rgb(225.6, 227.4, 229); + --bs-success-bg-subtle: rgb(209, 231, 220.8); + --bs-info-bg-subtle: rgb(206.6, 244.4, 252); + --bs-warning-bg-subtle: rgb(255, 242.6, 205.4); + --bs-danger-bg-subtle: rgb(248, 214.6, 217.8); + --bs-light-bg-subtle: rgb(251.5, 252, 252.5); + --bs-dark-bg-subtle: #ced4da; + --bs-primary-border-subtle: rgb(158.2, 197, 254.2); + --bs-secondary-border-subtle: rgb(196.2, 199.8, 203); + --bs-success-border-subtle: rgb(163, 207, 186.6); + --bs-info-border-subtle: rgb(158.2, 233.8, 249); + --bs-warning-border-subtle: rgb(255, 230.2, 155.8); + --bs-danger-border-subtle: rgb(241, 174.2, 180.6); + --bs-light-border-subtle: #e9ecef; + --bs-dark-border-subtle: #adb5bd; + --bs-white-rgb: 255, 255, 255; + --bs-black-rgb: 0, 0, 0; + --bs-font-sans-serif: "Inter", sans-serif; + --bs-font-monospace: SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + --bs-gradient: linear-gradient(180deg, rgba(255, 255, 255, 0.15), rgba(255, 255, 255, 0)); + --bs-body-font-family: var(--bs-font-sans-serif); + --bs-body-font-size: 1rem; + --bs-body-font-weight: 400; + --bs-body-line-height: 1.5; + --bs-body-color: #000; + --bs-body-color-rgb: 0, 0, 0; + --bs-body-bg: #fff; + --bs-body-bg-rgb: 255, 255, 255; + --bs-emphasis-color: #000; + --bs-emphasis-color-rgb: 0, 0, 0; + --bs-secondary-color: rgba(0, 0, 0, 0.75); + --bs-secondary-color-rgb: 0, 0, 0; + --bs-secondary-bg: #e9ecef; + --bs-secondary-bg-rgb: 233, 236, 239; + --bs-tertiary-color: rgba(0, 0, 0, 0.5); + --bs-tertiary-color-rgb: 0, 0, 0; + --bs-tertiary-bg: #f8f9fa; + --bs-tertiary-bg-rgb: 248, 249, 250; + --bs-heading-color: inherit; + --bs-link-color: #0d6efd; + --bs-link-color-rgb: 13, 110, 253; + --bs-link-decoration: underline; + --bs-link-hover-color: rgb(10.4, 88, 202.4); + --bs-link-hover-color-rgb: 10, 88, 202; + --bs-code-color: #d63384; + --bs-highlight-color: #000; + --bs-highlight-bg: rgb(255, 242.6, 205.4); + --bs-border-width: 1px; + --bs-border-style: solid; + --bs-border-color: #dee2e6; + --bs-border-color-translucent: rgba(0, 0, 0, 0.175); + --bs-border-radius: 0.375rem; + --bs-border-radius-sm: 0.25rem; + --bs-border-radius-lg: 0.5rem; + --bs-border-radius-xl: 1rem; + --bs-border-radius-xxl: 2rem; + --bs-border-radius-2xl: var(--bs-border-radius-xxl); + --bs-border-radius-pill: 50rem; + --bs-box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15); + --bs-box-shadow-sm: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075); + --bs-box-shadow-lg: 0 1rem 3rem rgba(0, 0, 0, 0.175); + --bs-box-shadow-inset: inset 0 1px 2px rgba(0, 0, 0, 0.075); + --bs-focus-ring-width: 0.25rem; + --bs-focus-ring-opacity: 0.25; + --bs-focus-ring-color: rgba(13, 110, 253, 0.25); + --bs-form-valid-color: #198754; + --bs-form-valid-border-color: #198754; + --bs-form-invalid-color: #dc3545; + --bs-form-invalid-border-color: #dc3545; +} + +[data-bs-theme=dark] { + color-scheme: dark; + --bs-body-color: #dee2e6; + --bs-body-color-rgb: 222, 226, 230; + --bs-body-bg: #212529; + --bs-body-bg-rgb: 33, 37, 41; + --bs-emphasis-color: #fff; + --bs-emphasis-color-rgb: 255, 255, 255; + --bs-secondary-color: rgba(222, 226, 230, 0.75); + --bs-secondary-color-rgb: 222, 226, 230; + --bs-secondary-bg: #343a40; + --bs-secondary-bg-rgb: 52, 58, 64; + --bs-tertiary-color: rgba(222, 226, 230, 0.5); + --bs-tertiary-color-rgb: 222, 226, 230; + --bs-tertiary-bg: rgb(42.5, 47.5, 52.5); + --bs-tertiary-bg-rgb: 43, 48, 53; + --bs-primary-text-emphasis: rgb(109.8, 168, 253.8); + --bs-secondary-text-emphasis: rgb(166.8, 172.2, 177); + --bs-success-text-emphasis: rgb(117, 183, 152.4); + --bs-info-text-emphasis: rgb(109.8, 223.2, 246); + --bs-warning-text-emphasis: rgb(255, 217.8, 106.2); + --bs-danger-text-emphasis: rgb(234, 133.8, 143.4); + --bs-light-text-emphasis: #f8f9fa; + --bs-dark-text-emphasis: #dee2e6; + --bs-primary-bg-subtle: rgb(2.6, 22, 50.6); + --bs-secondary-bg-subtle: rgb(21.6, 23.4, 25); + --bs-success-bg-subtle: rgb(5, 27, 16.8); + --bs-info-bg-subtle: rgb(2.6, 40.4, 48); + --bs-warning-bg-subtle: rgb(51, 38.6, 1.4); + --bs-danger-bg-subtle: rgb(44, 10.6, 13.8); + --bs-light-bg-subtle: #343a40; + --bs-dark-bg-subtle: #1a1d20; + --bs-primary-border-subtle: rgb(7.8, 66, 151.8); + --bs-secondary-border-subtle: rgb(64.8, 70.2, 75); + --bs-success-border-subtle: rgb(15, 81, 50.4); + --bs-info-border-subtle: rgb(7.8, 121.2, 144); + --bs-warning-border-subtle: rgb(153, 115.8, 4.2); + --bs-danger-border-subtle: rgb(132, 31.8, 41.4); + --bs-light-border-subtle: #495057; + --bs-dark-border-subtle: #343a40; + --bs-heading-color: inherit; + --bs-link-color: rgb(109.8, 168, 253.8); + --bs-link-hover-color: rgb(138.84, 185.4, 254.04); + --bs-link-color-rgb: 110, 168, 254; + --bs-link-hover-color-rgb: 139, 185, 254; + --bs-code-color: rgb(230.4, 132.6, 181.2); + --bs-highlight-color: #dee2e6; + --bs-highlight-bg: rgb(102, 77.2, 2.8); + --bs-border-color: #495057; + --bs-border-color-translucent: rgba(255, 255, 255, 0.15); + --bs-form-valid-color: rgb(117, 183, 152.4); + --bs-form-valid-border-color: rgb(117, 183, 152.4); + --bs-form-invalid-color: rgb(234, 133.8, 143.4); + --bs-form-invalid-border-color: rgb(234, 133.8, 143.4); +} + +*, +*::before, +*::after { + box-sizing: border-box; +} + +@media (prefers-reduced-motion: no-preference) { + :root { + scroll-behavior: smooth; + } +} + +body { + margin: 0; + font-family: var(--bs-body-font-family); + font-size: var(--bs-body-font-size); + font-weight: var(--bs-body-font-weight); + line-height: var(--bs-body-line-height); + color: var(--bs-body-color); + text-align: var(--bs-body-text-align); + background-color: var(--bs-body-bg); + -webkit-text-size-adjust: 100%; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +hr { + margin: 1rem 0; + color: inherit; + border: 0; + border-top: var(--bs-border-width) solid; + opacity: 0.25; +} + +h6, .h6, h5, .h5, h4, .h4, h3, .h3, h2, .h2, h1, .h1 { + margin-top: 0; + margin-bottom: 0.5rem; + font-weight: 500; + line-height: 1.2; + color: var(--bs-heading-color); +} + +h1, .h1 { + font-size: calc(1.375rem + 1.5vw); +} +@media (min-width: 1200px) { + h1, .h1 { + font-size: 2.5rem; + } +} + +h2, .h2 { + font-size: calc(1.325rem + 0.9vw); +} +@media (min-width: 1200px) { + h2, .h2 { + font-size: 2rem; + } +} + +h3, .h3 { + font-size: calc(1.3rem + 0.6vw); +} +@media (min-width: 1200px) { + h3, .h3 { + font-size: 1.75rem; + } +} + +h4, .h4 { + font-size: calc(1.275rem + 0.3vw); +} +@media (min-width: 1200px) { + h4, .h4 { + font-size: 1.5rem; + } +} + +h5, .h5 { + font-size: 1.25rem; +} + +h6, .h6 { + font-size: 1rem; +} + +p { + margin-top: 0; + margin-bottom: 1rem; +} + +abbr[title] { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; + cursor: help; + -webkit-text-decoration-skip-ink: none; + text-decoration-skip-ink: none; +} + +address { + margin-bottom: 1rem; + font-style: normal; + line-height: inherit; +} + +ol, +ul { + padding-left: 2rem; +} + +ol, +ul, +dl { + margin-top: 0; + margin-bottom: 1rem; +} + +ol ol, +ul ul, +ol ul, +ul ol { + margin-bottom: 0; +} + +dt { + font-weight: 700; +} + +dd { + margin-bottom: 0.5rem; + margin-left: 0; +} + +blockquote { + margin: 0 0 1rem; +} + +b, +strong { + font-weight: bolder; +} + +small, .small { + font-size: 0.875em; +} + +mark, .mark { + padding: 0.1875em; + color: var(--bs-highlight-color); + background-color: var(--bs-highlight-bg); +} + +sub, +sup { + position: relative; + font-size: 0.75em; + line-height: 0; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +a { + color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 1)); + text-decoration: underline; +} +a:hover { + --bs-link-color-rgb: var(--bs-link-hover-color-rgb); +} + +a:not([href]):not([class]), a:not([href]):not([class]):hover { + color: inherit; + text-decoration: none; +} + +pre, +code, +kbd, +samp { + font-family: var(--bs-font-monospace); + font-size: 1em; +} + +pre { + display: block; + margin-top: 0; + margin-bottom: 1rem; + overflow: auto; + font-size: 0.875em; +} +pre code { + font-size: inherit; + color: inherit; + word-break: normal; +} + +code { + font-size: 0.875em; + color: var(--bs-code-color); + word-wrap: break-word; +} +a > code { + color: inherit; +} + +kbd { + padding: 0.1875rem 0.375rem; + font-size: 0.875em; + color: var(--bs-body-bg); + background-color: var(--bs-body-color); + border-radius: 0.25rem; +} +kbd kbd { + padding: 0; + font-size: 1em; +} + +figure { + margin: 0 0 1rem; +} + +img, +svg { + vertical-align: middle; +} + +table { + caption-side: bottom; + border-collapse: collapse; +} + +caption { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-secondary-color); + text-align: left; +} + +th { + text-align: inherit; + text-align: -webkit-match-parent; +} + +thead, +tbody, +tfoot, +tr, +td, +th { + border-color: inherit; + border-style: solid; + border-width: 0; +} + +label { + display: inline-block; +} + +button { + border-radius: 0; +} + +button:focus:not(:focus-visible) { + outline: 0; +} + +input, +button, +select, +optgroup, +textarea { + margin: 0; + font-family: inherit; + font-size: inherit; + line-height: inherit; +} + +button, +select { + text-transform: none; +} + +[role=button] { + cursor: pointer; +} + +select { + word-wrap: normal; +} +select:disabled { + opacity: 1; +} + +[list]:not([type=date]):not([type=datetime-local]):not([type=month]):not([type=week]):not([type=time])::-webkit-calendar-picker-indicator { + display: none !important; +} + +button, +[type=button], +[type=reset], +[type=submit] { + -webkit-appearance: button; +} +button:not(:disabled), +[type=button]:not(:disabled), +[type=reset]:not(:disabled), +[type=submit]:not(:disabled) { + cursor: pointer; +} + +::-moz-focus-inner { + padding: 0; + border-style: none; +} + +textarea { + resize: vertical; +} + +fieldset { + min-width: 0; + padding: 0; + margin: 0; + border: 0; +} + +legend { + float: left; + width: 100%; + padding: 0; + margin-bottom: 0.5rem; + line-height: inherit; + font-size: calc(1.275rem + 0.3vw); +} +@media (min-width: 1200px) { + legend { + font-size: 1.5rem; + } +} +legend + * { + clear: left; +} + +::-webkit-datetime-edit-fields-wrapper, +::-webkit-datetime-edit-text, +::-webkit-datetime-edit-minute, +::-webkit-datetime-edit-hour-field, +::-webkit-datetime-edit-day-field, +::-webkit-datetime-edit-month-field, +::-webkit-datetime-edit-year-field { + padding: 0; +} + +::-webkit-inner-spin-button { + height: auto; +} + +[type=search] { + -webkit-appearance: textfield; + outline-offset: -2px; +} + +/* rtl:raw: +[type="tel"], +[type="url"], +[type="email"], +[type="number"] { + direction: ltr; +} +*/ +::-webkit-search-decoration { + -webkit-appearance: none; +} + +::-webkit-color-swatch-wrapper { + padding: 0; +} + +::file-selector-button { + font: inherit; + -webkit-appearance: button; +} + +output { + display: inline-block; +} + +iframe { + border: 0; +} + +summary { + display: list-item; + cursor: pointer; +} + +progress { + vertical-align: baseline; +} + +[hidden] { + display: none !important; +} + +.lead { + font-size: 1.25rem; + font-weight: 300; +} + +.display-1 { + font-weight: 300; + line-height: 1.2; + font-size: calc(1.625rem + 4.5vw); +} +@media (min-width: 1200px) { + .display-1 { + font-size: 5rem; + } +} + +.display-2 { + font-weight: 300; + line-height: 1.2; + font-size: calc(1.575rem + 3.9vw); +} +@media (min-width: 1200px) { + .display-2 { + font-size: 4.5rem; + } +} + +.display-3 { + font-weight: 300; + line-height: 1.2; + font-size: calc(1.525rem + 3.3vw); +} +@media (min-width: 1200px) { + .display-3 { + font-size: 4rem; + } +} + +.display-4 { + font-weight: 300; + line-height: 1.2; + font-size: calc(1.475rem + 2.7vw); +} +@media (min-width: 1200px) { + .display-4 { + font-size: 3.5rem; + } +} + +.display-5 { + font-weight: 300; + line-height: 1.2; + font-size: calc(1.425rem + 2.1vw); +} +@media (min-width: 1200px) { + .display-5 { + font-size: 3rem; + } +} + +.display-6 { + font-weight: 300; + line-height: 1.2; + font-size: calc(1.375rem + 1.5vw); +} +@media (min-width: 1200px) { + .display-6 { + font-size: 2.5rem; + } +} + +.list-unstyled { + padding-left: 0; + list-style: none; +} + +.list-inline { + padding-left: 0; + list-style: none; +} + +.list-inline-item { + display: inline-block; +} +.list-inline-item:not(:last-child) { + margin-right: 0.5rem; +} + +.initialism { + font-size: 0.875em; + text-transform: uppercase; +} + +.blockquote { + margin-bottom: 1rem; + font-size: 1.25rem; +} +.blockquote > :last-child { + margin-bottom: 0; +} + +.blockquote-footer { + margin-top: -1rem; + margin-bottom: 1rem; + font-size: 0.875em; + color: #6c757d; +} +.blockquote-footer::before { + content: "— "; +} + +.img-fluid { + max-width: 100%; + height: auto; +} + +.img-thumbnail { + padding: 0.25rem; + background-color: var(--bs-body-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + max-width: 100%; + height: auto; +} + +.figure { + display: inline-block; +} + +.figure-img { + margin-bottom: 0.5rem; + line-height: 1; +} + +.figure-caption { + font-size: 0.875em; + color: var(--bs-secondary-color); +} + +.container, +.container-fluid, +.container-xxl, +.container-xl, +.container-lg, +.container-md, +.container-sm { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-right: auto; + margin-left: auto; +} + +@media (min-width: 576px) { + .container-sm, .container { + max-width: 540px; + } +} +@media (min-width: 768px) { + .container-md, .container-sm, .container { + max-width: 720px; + } +} +@media (min-width: 992px) { + .container-lg, .container-md, .container-sm, .container { + max-width: 960px; + } +} +@media (min-width: 1200px) { + .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1140px; + } +} +@media (min-width: 1400px) { + .container-xxl, .container-xl, .container-lg, .container-md, .container-sm, .container { + max-width: 1320px; + } +} +:root { + --bs-breakpoint-xs: 0; + --bs-breakpoint-sm: 576px; + --bs-breakpoint-md: 768px; + --bs-breakpoint-lg: 992px; + --bs-breakpoint-xl: 1200px; + --bs-breakpoint-xxl: 1400px; +} + +.row { + --bs-gutter-x: 1.5rem; + --bs-gutter-y: 0; + display: flex; + flex-wrap: wrap; + margin-top: calc(-1 * var(--bs-gutter-y)); + margin-right: calc(-0.5 * var(--bs-gutter-x)); + margin-left: calc(-0.5 * var(--bs-gutter-x)); +} +.row > * { + flex-shrink: 0; + width: 100%; + max-width: 100%; + padding-right: calc(var(--bs-gutter-x) * 0.5); + padding-left: calc(var(--bs-gutter-x) * 0.5); + margin-top: var(--bs-gutter-y); +} + +.col { + flex: 1 0 0; +} + +.row-cols-auto > * { + flex: 0 0 auto; + width: auto; +} + +.row-cols-1 > * { + flex: 0 0 auto; + width: 100%; +} + +.row-cols-2 > * { + flex: 0 0 auto; + width: 50%; +} + +.row-cols-3 > * { + flex: 0 0 auto; + width: 33.33333333%; +} + +.row-cols-4 > * { + flex: 0 0 auto; + width: 25%; +} + +.row-cols-5 > * { + flex: 0 0 auto; + width: 20%; +} + +.row-cols-6 > * { + flex: 0 0 auto; + width: 16.66666667%; +} + +.col-auto { + flex: 0 0 auto; + width: auto; +} + +.col-1 { + flex: 0 0 auto; + width: 8.33333333%; +} + +.col-2 { + flex: 0 0 auto; + width: 16.66666667%; +} + +.col-3 { + flex: 0 0 auto; + width: 25%; +} + +.col-4 { + flex: 0 0 auto; + width: 33.33333333%; +} + +.col-5 { + flex: 0 0 auto; + width: 41.66666667%; +} + +.col-6 { + flex: 0 0 auto; + width: 50%; +} + +.col-7 { + flex: 0 0 auto; + width: 58.33333333%; +} + +.col-8 { + flex: 0 0 auto; + width: 66.66666667%; +} + +.col-9 { + flex: 0 0 auto; + width: 75%; +} + +.col-10 { + flex: 0 0 auto; + width: 83.33333333%; +} + +.col-11 { + flex: 0 0 auto; + width: 91.66666667%; +} + +.col-12 { + flex: 0 0 auto; + width: 100%; +} + +.offset-1 { + margin-left: 8.33333333%; +} + +.offset-2 { + margin-left: 16.66666667%; +} + +.offset-3 { + margin-left: 25%; +} + +.offset-4 { + margin-left: 33.33333333%; +} + +.offset-5 { + margin-left: 41.66666667%; +} + +.offset-6 { + margin-left: 50%; +} + +.offset-7 { + margin-left: 58.33333333%; +} + +.offset-8 { + margin-left: 66.66666667%; +} + +.offset-9 { + margin-left: 75%; +} + +.offset-10 { + margin-left: 83.33333333%; +} + +.offset-11 { + margin-left: 91.66666667%; +} + +.g-0, +.gx-0 { + --bs-gutter-x: 0; +} + +.g-0, +.gy-0 { + --bs-gutter-y: 0; +} + +.g-1, +.gx-1 { + --bs-gutter-x: 0.25rem; +} + +.g-1, +.gy-1 { + --bs-gutter-y: 0.25rem; +} + +.g-2, +.gx-2 { + --bs-gutter-x: 0.5rem; +} + +.g-2, +.gy-2 { + --bs-gutter-y: 0.5rem; +} + +.g-3, +.gx-3 { + --bs-gutter-x: 1rem; +} + +.g-3, +.gy-3 { + --bs-gutter-y: 1rem; +} + +.g-4, +.gx-4 { + --bs-gutter-x: 1.5rem; +} + +.g-4, +.gy-4 { + --bs-gutter-y: 1.5rem; +} + +.g-5, +.gx-5 { + --bs-gutter-x: 3rem; +} + +.g-5, +.gy-5 { + --bs-gutter-y: 3rem; +} + +@media (min-width: 576px) { + .col-sm { + flex: 1 0 0; + } + .row-cols-sm-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-sm-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-sm-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-sm-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-sm-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-sm-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-sm-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-sm-auto { + flex: 0 0 auto; + width: auto; + } + .col-sm-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-sm-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-sm-3 { + flex: 0 0 auto; + width: 25%; + } + .col-sm-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-sm-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-sm-6 { + flex: 0 0 auto; + width: 50%; + } + .col-sm-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-sm-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-sm-9 { + flex: 0 0 auto; + width: 75%; + } + .col-sm-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-sm-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-sm-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-sm-0 { + margin-left: 0; + } + .offset-sm-1 { + margin-left: 8.33333333%; + } + .offset-sm-2 { + margin-left: 16.66666667%; + } + .offset-sm-3 { + margin-left: 25%; + } + .offset-sm-4 { + margin-left: 33.33333333%; + } + .offset-sm-5 { + margin-left: 41.66666667%; + } + .offset-sm-6 { + margin-left: 50%; + } + .offset-sm-7 { + margin-left: 58.33333333%; + } + .offset-sm-8 { + margin-left: 66.66666667%; + } + .offset-sm-9 { + margin-left: 75%; + } + .offset-sm-10 { + margin-left: 83.33333333%; + } + .offset-sm-11 { + margin-left: 91.66666667%; + } + .g-sm-0, + .gx-sm-0 { + --bs-gutter-x: 0; + } + .g-sm-0, + .gy-sm-0 { + --bs-gutter-y: 0; + } + .g-sm-1, + .gx-sm-1 { + --bs-gutter-x: 0.25rem; + } + .g-sm-1, + .gy-sm-1 { + --bs-gutter-y: 0.25rem; + } + .g-sm-2, + .gx-sm-2 { + --bs-gutter-x: 0.5rem; + } + .g-sm-2, + .gy-sm-2 { + --bs-gutter-y: 0.5rem; + } + .g-sm-3, + .gx-sm-3 { + --bs-gutter-x: 1rem; + } + .g-sm-3, + .gy-sm-3 { + --bs-gutter-y: 1rem; + } + .g-sm-4, + .gx-sm-4 { + --bs-gutter-x: 1.5rem; + } + .g-sm-4, + .gy-sm-4 { + --bs-gutter-y: 1.5rem; + } + .g-sm-5, + .gx-sm-5 { + --bs-gutter-x: 3rem; + } + .g-sm-5, + .gy-sm-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 768px) { + .col-md { + flex: 1 0 0; + } + .row-cols-md-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-md-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-md-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-md-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-md-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-md-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-md-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-md-auto { + flex: 0 0 auto; + width: auto; + } + .col-md-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-md-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-md-3 { + flex: 0 0 auto; + width: 25%; + } + .col-md-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-md-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-md-6 { + flex: 0 0 auto; + width: 50%; + } + .col-md-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-md-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-md-9 { + flex: 0 0 auto; + width: 75%; + } + .col-md-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-md-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-md-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-md-0 { + margin-left: 0; + } + .offset-md-1 { + margin-left: 8.33333333%; + } + .offset-md-2 { + margin-left: 16.66666667%; + } + .offset-md-3 { + margin-left: 25%; + } + .offset-md-4 { + margin-left: 33.33333333%; + } + .offset-md-5 { + margin-left: 41.66666667%; + } + .offset-md-6 { + margin-left: 50%; + } + .offset-md-7 { + margin-left: 58.33333333%; + } + .offset-md-8 { + margin-left: 66.66666667%; + } + .offset-md-9 { + margin-left: 75%; + } + .offset-md-10 { + margin-left: 83.33333333%; + } + .offset-md-11 { + margin-left: 91.66666667%; + } + .g-md-0, + .gx-md-0 { + --bs-gutter-x: 0; + } + .g-md-0, + .gy-md-0 { + --bs-gutter-y: 0; + } + .g-md-1, + .gx-md-1 { + --bs-gutter-x: 0.25rem; + } + .g-md-1, + .gy-md-1 { + --bs-gutter-y: 0.25rem; + } + .g-md-2, + .gx-md-2 { + --bs-gutter-x: 0.5rem; + } + .g-md-2, + .gy-md-2 { + --bs-gutter-y: 0.5rem; + } + .g-md-3, + .gx-md-3 { + --bs-gutter-x: 1rem; + } + .g-md-3, + .gy-md-3 { + --bs-gutter-y: 1rem; + } + .g-md-4, + .gx-md-4 { + --bs-gutter-x: 1.5rem; + } + .g-md-4, + .gy-md-4 { + --bs-gutter-y: 1.5rem; + } + .g-md-5, + .gx-md-5 { + --bs-gutter-x: 3rem; + } + .g-md-5, + .gy-md-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 992px) { + .col-lg { + flex: 1 0 0; + } + .row-cols-lg-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-lg-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-lg-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-lg-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-lg-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-lg-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-lg-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-lg-auto { + flex: 0 0 auto; + width: auto; + } + .col-lg-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-lg-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-lg-3 { + flex: 0 0 auto; + width: 25%; + } + .col-lg-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-lg-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-lg-6 { + flex: 0 0 auto; + width: 50%; + } + .col-lg-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-lg-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-lg-9 { + flex: 0 0 auto; + width: 75%; + } + .col-lg-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-lg-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-lg-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-lg-0 { + margin-left: 0; + } + .offset-lg-1 { + margin-left: 8.33333333%; + } + .offset-lg-2 { + margin-left: 16.66666667%; + } + .offset-lg-3 { + margin-left: 25%; + } + .offset-lg-4 { + margin-left: 33.33333333%; + } + .offset-lg-5 { + margin-left: 41.66666667%; + } + .offset-lg-6 { + margin-left: 50%; + } + .offset-lg-7 { + margin-left: 58.33333333%; + } + .offset-lg-8 { + margin-left: 66.66666667%; + } + .offset-lg-9 { + margin-left: 75%; + } + .offset-lg-10 { + margin-left: 83.33333333%; + } + .offset-lg-11 { + margin-left: 91.66666667%; + } + .g-lg-0, + .gx-lg-0 { + --bs-gutter-x: 0; + } + .g-lg-0, + .gy-lg-0 { + --bs-gutter-y: 0; + } + .g-lg-1, + .gx-lg-1 { + --bs-gutter-x: 0.25rem; + } + .g-lg-1, + .gy-lg-1 { + --bs-gutter-y: 0.25rem; + } + .g-lg-2, + .gx-lg-2 { + --bs-gutter-x: 0.5rem; + } + .g-lg-2, + .gy-lg-2 { + --bs-gutter-y: 0.5rem; + } + .g-lg-3, + .gx-lg-3 { + --bs-gutter-x: 1rem; + } + .g-lg-3, + .gy-lg-3 { + --bs-gutter-y: 1rem; + } + .g-lg-4, + .gx-lg-4 { + --bs-gutter-x: 1.5rem; + } + .g-lg-4, + .gy-lg-4 { + --bs-gutter-y: 1.5rem; + } + .g-lg-5, + .gx-lg-5 { + --bs-gutter-x: 3rem; + } + .g-lg-5, + .gy-lg-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1200px) { + .col-xl { + flex: 1 0 0; + } + .row-cols-xl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xl-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-xl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xl-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xl-0 { + margin-left: 0; + } + .offset-xl-1 { + margin-left: 8.33333333%; + } + .offset-xl-2 { + margin-left: 16.66666667%; + } + .offset-xl-3 { + margin-left: 25%; + } + .offset-xl-4 { + margin-left: 33.33333333%; + } + .offset-xl-5 { + margin-left: 41.66666667%; + } + .offset-xl-6 { + margin-left: 50%; + } + .offset-xl-7 { + margin-left: 58.33333333%; + } + .offset-xl-8 { + margin-left: 66.66666667%; + } + .offset-xl-9 { + margin-left: 75%; + } + .offset-xl-10 { + margin-left: 83.33333333%; + } + .offset-xl-11 { + margin-left: 91.66666667%; + } + .g-xl-0, + .gx-xl-0 { + --bs-gutter-x: 0; + } + .g-xl-0, + .gy-xl-0 { + --bs-gutter-y: 0; + } + .g-xl-1, + .gx-xl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xl-1, + .gy-xl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xl-2, + .gx-xl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xl-2, + .gy-xl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xl-3, + .gx-xl-3 { + --bs-gutter-x: 1rem; + } + .g-xl-3, + .gy-xl-3 { + --bs-gutter-y: 1rem; + } + .g-xl-4, + .gx-xl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xl-4, + .gy-xl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xl-5, + .gx-xl-5 { + --bs-gutter-x: 3rem; + } + .g-xl-5, + .gy-xl-5 { + --bs-gutter-y: 3rem; + } +} +@media (min-width: 1400px) { + .col-xxl { + flex: 1 0 0; + } + .row-cols-xxl-auto > * { + flex: 0 0 auto; + width: auto; + } + .row-cols-xxl-1 > * { + flex: 0 0 auto; + width: 100%; + } + .row-cols-xxl-2 > * { + flex: 0 0 auto; + width: 50%; + } + .row-cols-xxl-3 > * { + flex: 0 0 auto; + width: 33.33333333%; + } + .row-cols-xxl-4 > * { + flex: 0 0 auto; + width: 25%; + } + .row-cols-xxl-5 > * { + flex: 0 0 auto; + width: 20%; + } + .row-cols-xxl-6 > * { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xxl-auto { + flex: 0 0 auto; + width: auto; + } + .col-xxl-1 { + flex: 0 0 auto; + width: 8.33333333%; + } + .col-xxl-2 { + flex: 0 0 auto; + width: 16.66666667%; + } + .col-xxl-3 { + flex: 0 0 auto; + width: 25%; + } + .col-xxl-4 { + flex: 0 0 auto; + width: 33.33333333%; + } + .col-xxl-5 { + flex: 0 0 auto; + width: 41.66666667%; + } + .col-xxl-6 { + flex: 0 0 auto; + width: 50%; + } + .col-xxl-7 { + flex: 0 0 auto; + width: 58.33333333%; + } + .col-xxl-8 { + flex: 0 0 auto; + width: 66.66666667%; + } + .col-xxl-9 { + flex: 0 0 auto; + width: 75%; + } + .col-xxl-10 { + flex: 0 0 auto; + width: 83.33333333%; + } + .col-xxl-11 { + flex: 0 0 auto; + width: 91.66666667%; + } + .col-xxl-12 { + flex: 0 0 auto; + width: 100%; + } + .offset-xxl-0 { + margin-left: 0; + } + .offset-xxl-1 { + margin-left: 8.33333333%; + } + .offset-xxl-2 { + margin-left: 16.66666667%; + } + .offset-xxl-3 { + margin-left: 25%; + } + .offset-xxl-4 { + margin-left: 33.33333333%; + } + .offset-xxl-5 { + margin-left: 41.66666667%; + } + .offset-xxl-6 { + margin-left: 50%; + } + .offset-xxl-7 { + margin-left: 58.33333333%; + } + .offset-xxl-8 { + margin-left: 66.66666667%; + } + .offset-xxl-9 { + margin-left: 75%; + } + .offset-xxl-10 { + margin-left: 83.33333333%; + } + .offset-xxl-11 { + margin-left: 91.66666667%; + } + .g-xxl-0, + .gx-xxl-0 { + --bs-gutter-x: 0; + } + .g-xxl-0, + .gy-xxl-0 { + --bs-gutter-y: 0; + } + .g-xxl-1, + .gx-xxl-1 { + --bs-gutter-x: 0.25rem; + } + .g-xxl-1, + .gy-xxl-1 { + --bs-gutter-y: 0.25rem; + } + .g-xxl-2, + .gx-xxl-2 { + --bs-gutter-x: 0.5rem; + } + .g-xxl-2, + .gy-xxl-2 { + --bs-gutter-y: 0.5rem; + } + .g-xxl-3, + .gx-xxl-3 { + --bs-gutter-x: 1rem; + } + .g-xxl-3, + .gy-xxl-3 { + --bs-gutter-y: 1rem; + } + .g-xxl-4, + .gx-xxl-4 { + --bs-gutter-x: 1.5rem; + } + .g-xxl-4, + .gy-xxl-4 { + --bs-gutter-y: 1.5rem; + } + .g-xxl-5, + .gx-xxl-5 { + --bs-gutter-x: 3rem; + } + .g-xxl-5, + .gy-xxl-5 { + --bs-gutter-y: 3rem; + } +} +.table { + --bs-table-color-type: initial; + --bs-table-bg-type: initial; + --bs-table-color-state: initial; + --bs-table-bg-state: initial; + --bs-table-color: var(--bs-emphasis-color); + --bs-table-bg: var(--bs-body-bg); + --bs-table-border-color: var(--bs-border-color); + --bs-table-accent-bg: transparent; + --bs-table-striped-color: var(--bs-emphasis-color); + --bs-table-striped-bg: rgba(var(--bs-emphasis-color-rgb), 0.05); + --bs-table-active-color: var(--bs-emphasis-color); + --bs-table-active-bg: rgba(var(--bs-emphasis-color-rgb), 0.1); + --bs-table-hover-color: var(--bs-emphasis-color); + --bs-table-hover-bg: rgba(var(--bs-emphasis-color-rgb), 0.075); + width: 100%; + margin-bottom: 1rem; + vertical-align: top; + border-color: var(--bs-table-border-color); +} +.table > :not(caption) > * > * { + padding: 0.5rem 0.5rem; + color: var(--bs-table-color-state, var(--bs-table-color-type, var(--bs-table-color))); + background-color: var(--bs-table-bg); + border-bottom-width: var(--bs-border-width); + box-shadow: inset 0 0 0 9999px var(--bs-table-bg-state, var(--bs-table-bg-type, var(--bs-table-accent-bg))); +} +.table > tbody { + vertical-align: inherit; +} +.table > thead { + vertical-align: bottom; +} + +.table-group-divider { + border-top: calc(var(--bs-border-width) * 2) solid currentcolor; +} + +.caption-top { + caption-side: top; +} + +.table-sm > :not(caption) > * > * { + padding: 0.25rem 0.25rem; +} + +.table-bordered > :not(caption) > * { + border-width: var(--bs-border-width) 0; +} +.table-bordered > :not(caption) > * > * { + border-width: 0 var(--bs-border-width); +} + +.table-borderless > :not(caption) > * > * { + border-bottom-width: 0; +} +.table-borderless > :not(:first-child) { + border-top-width: 0; +} + +.table-striped > tbody > tr:nth-of-type(odd) > * { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg); +} + +.table-striped-columns > :not(caption) > tr > :nth-child(even) { + --bs-table-color-type: var(--bs-table-striped-color); + --bs-table-bg-type: var(--bs-table-striped-bg); +} + +.table-active { + --bs-table-color-state: var(--bs-table-active-color); + --bs-table-bg-state: var(--bs-table-active-bg); +} + +.table-hover > tbody > tr:hover > * { + --bs-table-color-state: var(--bs-table-hover-color); + --bs-table-bg-state: var(--bs-table-hover-bg); +} + +.table-primary { + --bs-table-color: #000; + --bs-table-bg: rgb(206.6, 226, 254.6); + --bs-table-border-color: rgb(165.28, 180.8, 203.68); + --bs-table-striped-bg: rgb(196.27, 214.7, 241.87); + --bs-table-striped-color: #000; + --bs-table-active-bg: rgb(185.94, 203.4, 229.14); + --bs-table-active-color: #000; + --bs-table-hover-bg: rgb(191.105, 209.05, 235.505); + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-secondary { + --bs-table-color: #000; + --bs-table-bg: rgb(225.6, 227.4, 229); + --bs-table-border-color: rgb(180.48, 181.92, 183.2); + --bs-table-striped-bg: rgb(214.32, 216.03, 217.55); + --bs-table-striped-color: #000; + --bs-table-active-bg: rgb(203.04, 204.66, 206.1); + --bs-table-active-color: #000; + --bs-table-hover-bg: rgb(208.68, 210.345, 211.825); + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-success { + --bs-table-color: #000; + --bs-table-bg: rgb(209, 231, 220.8); + --bs-table-border-color: rgb(167.2, 184.8, 176.64); + --bs-table-striped-bg: rgb(198.55, 219.45, 209.76); + --bs-table-striped-color: #000; + --bs-table-active-bg: rgb(188.1, 207.9, 198.72); + --bs-table-active-color: #000; + --bs-table-hover-bg: rgb(193.325, 213.675, 204.24); + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-info { + --bs-table-color: #000; + --bs-table-bg: rgb(206.6, 244.4, 252); + --bs-table-border-color: rgb(165.28, 195.52, 201.6); + --bs-table-striped-bg: rgb(196.27, 232.18, 239.4); + --bs-table-striped-color: #000; + --bs-table-active-bg: rgb(185.94, 219.96, 226.8); + --bs-table-active-color: #000; + --bs-table-hover-bg: rgb(191.105, 226.07, 233.1); + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-warning { + --bs-table-color: #000; + --bs-table-bg: rgb(255, 242.6, 205.4); + --bs-table-border-color: rgb(204, 194.08, 164.32); + --bs-table-striped-bg: rgb(242.25, 230.47, 195.13); + --bs-table-striped-color: #000; + --bs-table-active-bg: rgb(229.5, 218.34, 184.86); + --bs-table-active-color: #000; + --bs-table-hover-bg: rgb(235.875, 224.405, 189.995); + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-danger { + --bs-table-color: #000; + --bs-table-bg: rgb(248, 214.6, 217.8); + --bs-table-border-color: rgb(198.4, 171.68, 174.24); + --bs-table-striped-bg: rgb(235.6, 203.87, 206.91); + --bs-table-striped-color: #000; + --bs-table-active-bg: rgb(223.2, 193.14, 196.02); + --bs-table-active-color: #000; + --bs-table-hover-bg: rgb(229.4, 198.505, 201.465); + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-light { + --bs-table-color: #000; + --bs-table-bg: #f8f9fa; + --bs-table-border-color: rgb(198.4, 199.2, 200); + --bs-table-striped-bg: rgb(235.6, 236.55, 237.5); + --bs-table-striped-color: #000; + --bs-table-active-bg: rgb(223.2, 224.1, 225); + --bs-table-active-color: #000; + --bs-table-hover-bg: rgb(229.4, 230.325, 231.25); + --bs-table-hover-color: #000; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-dark { + --bs-table-color: #fff; + --bs-table-bg: #212529; + --bs-table-border-color: rgb(77.4, 80.6, 83.8); + --bs-table-striped-bg: rgb(44.1, 47.9, 51.7); + --bs-table-striped-color: #fff; + --bs-table-active-bg: rgb(55.2, 58.8, 62.4); + --bs-table-active-color: #fff; + --bs-table-hover-bg: rgb(49.65, 53.35, 57.05); + --bs-table-hover-color: #fff; + color: var(--bs-table-color); + border-color: var(--bs-table-border-color); +} + +.table-responsive { + overflow-x: auto; + -webkit-overflow-scrolling: touch; +} + +@media (max-width: 575.98px) { + .table-responsive-sm { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 767.98px) { + .table-responsive-md { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 991.98px) { + .table-responsive-lg { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1199.98px) { + .table-responsive-xl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +@media (max-width: 1399.98px) { + .table-responsive-xxl { + overflow-x: auto; + -webkit-overflow-scrolling: touch; + } +} +.form-label { + margin-bottom: 0.5rem; +} + +.col-form-label { + padding-top: calc(0.375rem + var(--bs-border-width)); + padding-bottom: calc(0.375rem + var(--bs-border-width)); + margin-bottom: 0; + font-size: inherit; + line-height: 1.5; +} + +.col-form-label-lg { + padding-top: calc(0.5rem + var(--bs-border-width)); + padding-bottom: calc(0.5rem + var(--bs-border-width)); + font-size: 1.25rem; +} + +.col-form-label-sm { + padding-top: calc(0.25rem + var(--bs-border-width)); + padding-bottom: calc(0.25rem + var(--bs-border-width)); + font-size: 0.875rem; +} + +.form-text { + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-secondary-color); +} + +.form-control { + display: block; + width: 100%; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: var(--bs-body-bg); + background-clip: padding-box; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control { + transition: none; + } +} +.form-control[type=file] { + overflow: hidden; +} +.form-control[type=file]:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control:focus { + color: var(--bs-body-color); + background-color: var(--bs-body-bg); + border-color: rgb(134, 182.5, 254); + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-control::-webkit-date-and-time-value { + min-width: 85px; + height: 1.5em; + margin: 0; +} +.form-control::-webkit-datetime-edit { + display: block; + padding: 0; +} +.form-control::-moz-placeholder { + color: var(--bs-secondary-color); + opacity: 1; +} +.form-control::placeholder { + color: var(--bs-secondary-color); + opacity: 1; +} +.form-control:disabled { + background-color: var(--bs-secondary-bg); + opacity: 1; +} +.form-control::file-selector-button { + padding: 0.375rem 0.75rem; + margin: -0.375rem -0.75rem; + margin-inline-end: 0.75rem; + color: var(--bs-body-color); + background-color: var(--bs-tertiary-bg); + pointer-events: none; + border-color: inherit; + border-style: solid; + border-width: 0; + border-inline-end-width: var(--bs-border-width); + border-radius: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-control::file-selector-button { + transition: none; + } +} +.form-control:hover:not(:disabled):not([readonly])::file-selector-button { + background-color: var(--bs-secondary-bg); +} + +.form-control-plaintext { + display: block; + width: 100%; + padding: 0.375rem 0; + margin-bottom: 0; + line-height: 1.5; + color: var(--bs-body-color); + background-color: transparent; + border: solid transparent; + border-width: var(--bs-border-width) 0; +} +.form-control-plaintext:focus { + outline: 0; +} +.form-control-plaintext.form-control-sm, .form-control-plaintext.form-control-lg { + padding-right: 0; + padding-left: 0; +} + +.form-control-sm { + min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} +.form-control-sm::file-selector-button { + padding: 0.25rem 0.5rem; + margin: -0.25rem -0.5rem; + margin-inline-end: 0.5rem; +} + +.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} +.form-control-lg::file-selector-button { + padding: 0.5rem 1rem; + margin: -0.5rem -1rem; + margin-inline-end: 1rem; +} + +textarea.form-control { + min-height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); +} +textarea.form-control-sm { + min-height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); +} +textarea.form-control-lg { + min-height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); +} + +.form-control-color { + width: 3rem; + height: calc(1.5em + 0.75rem + calc(var(--bs-border-width) * 2)); + padding: 0.375rem; +} +.form-control-color:not(:disabled):not([readonly]) { + cursor: pointer; +} +.form-control-color::-moz-color-swatch { + border: 0 !important; + border-radius: var(--bs-border-radius); +} +.form-control-color::-webkit-color-swatch { + border: 0 !important; + border-radius: var(--bs-border-radius); +} +.form-control-color.form-control-sm { + height: calc(1.5em + 0.5rem + calc(var(--bs-border-width) * 2)); +} +.form-control-color.form-control-lg { + height: calc(1.5em + 1rem + calc(var(--bs-border-width) * 2)); +} + +.form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23343a40' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + display: block; + width: 100%; + padding: 0.375rem 2.25rem 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: var(--bs-body-bg); + background-image: var(--bs-form-select-bg-img), var(--bs-form-select-bg-icon, none); + background-repeat: no-repeat; + background-position: right 0.75rem center; + background-size: 16px 12px; + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); + transition: border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-select { + transition: none; + } +} +.form-select:focus { + border-color: rgb(134, 182.5, 254); + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-select[multiple], .form-select[size]:not([size="1"]) { + padding-right: 0.75rem; + background-image: none; +} +.form-select:disabled { + background-color: var(--bs-secondary-bg); +} +.form-select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 var(--bs-body-color); +} + +.form-select-sm { + padding-top: 0.25rem; + padding-bottom: 0.25rem; + padding-left: 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} + +.form-select-lg { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + padding-left: 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} + +[data-bs-theme=dark] .form-select { + --bs-form-select-bg-img: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16'%3e%3cpath fill='none' stroke='%23dee2e6' stroke-linecap='round' stroke-linejoin='round' stroke-width='2' d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); +} + +.form-check { + display: block; + min-height: 1.5rem; + padding-left: 1.5em; + margin-bottom: 0.125rem; +} +.form-check .form-check-input { + float: left; + margin-left: -1.5em; +} + +.form-check-reverse { + padding-right: 1.5em; + padding-left: 0; + text-align: right; +} +.form-check-reverse .form-check-input { + float: right; + margin-right: -1.5em; + margin-left: 0; +} + +.form-check-input { + --bs-form-check-bg: var(--bs-body-bg); + flex-shrink: 0; + width: 1em; + height: 1em; + margin-top: 0.25em; + vertical-align: top; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: var(--bs-form-check-bg); + background-image: var(--bs-form-check-bg-image); + background-repeat: no-repeat; + background-position: center; + background-size: contain; + border: var(--bs-border-width) solid var(--bs-border-color); + -webkit-print-color-adjust: exact; + print-color-adjust: exact; +} +.form-check-input[type=checkbox] { + border-radius: 0.25em; +} +.form-check-input[type=radio] { + border-radius: 50%; +} +.form-check-input:active { + filter: brightness(90%); +} +.form-check-input:focus { + border-color: rgb(134, 182.5, 254); + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-check-input:checked { + background-color: #0d6efd; + border-color: #0d6efd; +} +.form-check-input:checked[type=checkbox] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='m6 10 3 3 6-6'/%3e%3c/svg%3e"); +} +.form-check-input:checked[type=radio] { + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='2' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-check-input[type=checkbox]:indeterminate { + background-color: #0d6efd; + border-color: #0d6efd; + --bs-form-check-bg-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20'%3e%3cpath fill='none' stroke='%23fff' stroke-linecap='round' stroke-linejoin='round' stroke-width='3' d='M6 10h8'/%3e%3c/svg%3e"); +} +.form-check-input:disabled { + pointer-events: none; + filter: none; + opacity: 0.5; +} +.form-check-input[disabled] ~ .form-check-label, .form-check-input:disabled ~ .form-check-label { + cursor: default; + opacity: 0.5; +} + +.form-switch { + padding-left: 2.5em; +} +.form-switch .form-check-input { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%280, 0, 0, 0.25%29'/%3e%3c/svg%3e"); + width: 2em; + margin-left: -2.5em; + background-image: var(--bs-form-switch-bg); + background-position: left center; + border-radius: 2em; + transition: background-position 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-switch .form-check-input { + transition: none; + } +} +.form-switch .form-check-input:focus { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgb%28134, 182.5, 254%29'/%3e%3c/svg%3e"); +} +.form-switch .form-check-input:checked { + background-position: right center; + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='%23fff'/%3e%3c/svg%3e"); +} +.form-switch.form-check-reverse { + padding-right: 2.5em; + padding-left: 0; +} +.form-switch.form-check-reverse .form-check-input { + margin-right: -2.5em; + margin-left: 0; +} + +.form-check-inline { + display: inline-block; + margin-right: 1rem; +} + +.btn-check { + position: absolute; + clip: rect(0, 0, 0, 0); + pointer-events: none; +} +.btn-check[disabled] + .btn, .btn-check:disabled + .btn { + pointer-events: none; + filter: none; + opacity: 0.65; +} + +[data-bs-theme=dark] .form-switch .form-check-input:not(:checked):not(:focus) { + --bs-form-switch-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='-4 -4 8 8'%3e%3ccircle r='3' fill='rgba%28255, 255, 255, 0.25%29'/%3e%3c/svg%3e"); +} + +.form-range { + width: 100%; + height: 1.5rem; + padding: 0; + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; + background-color: transparent; +} +.form-range:focus { + outline: 0; +} +.form-range:focus::-webkit-slider-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range:focus::-moz-range-thumb { + box-shadow: 0 0 0 1px #fff, 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.form-range::-moz-focus-outer { + border: 0; +} +.form-range::-webkit-slider-thumb { + width: 1rem; + height: 1rem; + margin-top: -0.25rem; + -webkit-appearance: none; + appearance: none; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -webkit-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-webkit-slider-thumb { + -webkit-transition: none; + transition: none; + } +} +.form-range::-webkit-slider-thumb:active { + background-color: rgb(182.4, 211.5, 254.4); +} +.form-range::-webkit-slider-runnable-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-secondary-bg); + border-color: transparent; + border-radius: 1rem; +} +.form-range::-moz-range-thumb { + width: 1rem; + height: 1rem; + -moz-appearance: none; + appearance: none; + background-color: #0d6efd; + border: 0; + border-radius: 1rem; + -moz-transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; + transition: background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-range::-moz-range-thumb { + -moz-transition: none; + transition: none; + } +} +.form-range::-moz-range-thumb:active { + background-color: rgb(182.4, 211.5, 254.4); +} +.form-range::-moz-range-track { + width: 100%; + height: 0.5rem; + color: transparent; + cursor: pointer; + background-color: var(--bs-secondary-bg); + border-color: transparent; + border-radius: 1rem; +} +.form-range:disabled { + pointer-events: none; +} +.form-range:disabled::-webkit-slider-thumb { + background-color: var(--bs-secondary-color); +} +.form-range:disabled::-moz-range-thumb { + background-color: var(--bs-secondary-color); +} + +.form-floating { + position: relative; +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext, +.form-floating > .form-select { + height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + min-height: calc(3.5rem + calc(var(--bs-border-width) * 2)); + line-height: 1.25; +} +.form-floating > label { + position: absolute; + top: 0; + left: 0; + z-index: 2; + max-width: 100%; + height: 100%; + padding: 1rem 0.75rem; + overflow: hidden; + color: rgba(var(--bs-body-color-rgb), 0.65); + text-align: start; + text-overflow: ellipsis; + white-space: nowrap; + pointer-events: none; + border: var(--bs-border-width) solid transparent; + transform-origin: 0 0; + transition: opacity 0.1s ease-in-out, transform 0.1s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .form-floating > label { + transition: none; + } +} +.form-floating > .form-control, +.form-floating > .form-control-plaintext { + padding: 1rem 0.75rem; +} +.form-floating > .form-control::-moz-placeholder, .form-floating > .form-control-plaintext::-moz-placeholder { + color: transparent; +} +.form-floating > .form-control::placeholder, +.form-floating > .form-control-plaintext::placeholder { + color: transparent; +} +.form-floating > .form-control:not(:-moz-placeholder), .form-floating > .form-control-plaintext:not(:-moz-placeholder) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:focus, .form-floating > .form-control:not(:placeholder-shown), +.form-floating > .form-control-plaintext:focus, +.form-floating > .form-control-plaintext:not(:placeholder-shown) { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-control:-webkit-autofill, +.form-floating > .form-control-plaintext:-webkit-autofill { + padding-top: 1.625rem; + padding-bottom: 0.625rem; +} +.form-floating > .form-select { + padding-top: 1.625rem; + padding-bottom: 0.625rem; + padding-left: 0.75rem; +} +.form-floating > .form-control:not(:-moz-placeholder) ~ label { + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:focus ~ label, +.form-floating > .form-control:not(:placeholder-shown) ~ label, +.form-floating > .form-control-plaintext ~ label, +.form-floating > .form-select ~ label { + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > .form-control:-webkit-autofill ~ label { + transform: scale(0.85) translateY(-0.5rem) translateX(0.15rem); +} +.form-floating > textarea:not(:-moz-placeholder) ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ""; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius); +} +.form-floating > textarea:focus ~ label::after, +.form-floating > textarea:not(:placeholder-shown) ~ label::after { + position: absolute; + inset: 1rem 0.375rem; + z-index: -1; + height: 1.5em; + content: ""; + background-color: var(--bs-body-bg); + border-radius: var(--bs-border-radius); +} +.form-floating > textarea:disabled ~ label::after { + background-color: var(--bs-secondary-bg); +} +.form-floating > .form-control-plaintext ~ label { + border-width: var(--bs-border-width) 0; +} +.form-floating > :disabled ~ label, +.form-floating > .form-control:disabled ~ label { + color: #6c757d; +} + +.input-group { + position: relative; + display: flex; + flex-wrap: wrap; + align-items: stretch; + width: 100%; +} +.input-group > .form-control, +.input-group > .form-select, +.input-group > .form-floating { + position: relative; + flex: 1 1 auto; + width: 1%; + min-width: 0; +} +.input-group > .form-control:focus, +.input-group > .form-select:focus, +.input-group > .form-floating:focus-within { + z-index: 5; +} +.input-group .btn { + position: relative; + z-index: 2; +} +.input-group .btn:focus { + z-index: 5; +} + +.input-group-text { + display: flex; + align-items: center; + padding: 0.375rem 0.75rem; + font-size: 1rem; + font-weight: 400; + line-height: 1.5; + color: var(--bs-body-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-tertiary-bg); + border: var(--bs-border-width) solid var(--bs-border-color); + border-radius: var(--bs-border-radius); +} + +.input-group-lg > .form-control, +.input-group-lg > .form-select, +.input-group-lg > .input-group-text, +.input-group-lg > .btn { + padding: 0.5rem 1rem; + font-size: 1.25rem; + border-radius: var(--bs-border-radius-lg); +} + +.input-group-sm > .form-control, +.input-group-sm > .form-select, +.input-group-sm > .input-group-text, +.input-group-sm > .btn { + padding: 0.25rem 0.5rem; + font-size: 0.875rem; + border-radius: var(--bs-border-radius-sm); +} + +.input-group-lg > .form-select, +.input-group-sm > .form-select { + padding-right: 3rem; +} + +.input-group:not(.has-validation) > :not(:last-child):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), +.input-group:not(.has-validation) > .dropdown-toggle:nth-last-child(n+3), +.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-control, +.input-group:not(.has-validation) > .form-floating:not(:last-child) > .form-select { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group.has-validation > :nth-last-child(n+3):not(.dropdown-toggle):not(.dropdown-menu):not(.form-floating), +.input-group.has-validation > .dropdown-toggle:nth-last-child(n+4), +.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-control, +.input-group.has-validation > .form-floating:nth-last-child(n+3) > .form-select { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.input-group > :not(:first-child):not(.dropdown-menu):not(.valid-tooltip):not(.valid-feedback):not(.invalid-tooltip):not(.invalid-feedback) { + margin-left: calc(-1 * var(--bs-border-width)); + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.input-group > .form-floating:not(:first-child) > .form-control, +.input-group > .form-floating:not(:first-child) > .form-select { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.valid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-form-valid-color); +} + +.valid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: var(--bs-success); + border-radius: var(--bs-border-radius); +} + +.was-validated :valid ~ .valid-feedback, +.was-validated :valid ~ .valid-tooltip, +.is-valid ~ .valid-feedback, +.is-valid ~ .valid-tooltip { + display: block; +} + +.was-validated .form-control:valid, .form-control.is-valid { + border-color: var(--bs-form-valid-border-color); + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:valid:focus, .form-control.is-valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} + +.was-validated textarea.form-control:valid, textarea.form-control.is-valid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:valid, .form-select.is-valid { + border-color: var(--bs-form-valid-border-color); +} +.was-validated .form-select:valid:not([multiple]):not([size]), .was-validated .form-select:valid:not([multiple])[size="1"], .form-select.is-valid:not([multiple]):not([size]), .form-select.is-valid:not([multiple])[size="1"] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 8 8'%3e%3cpath fill='%23198754' d='M2.3 6.73.6 4.53c-.4-1.04.46-1.4 1.1-.8l1.1 1.4 3.4-3.8c.6-.63 1.6-.27 1.2.7l-4 4.6c-.43.5-.8.4-1.1.1'/%3e%3c/svg%3e"); + padding-right: 4.125rem; + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:valid:focus, .form-select.is-valid:focus { + border-color: var(--bs-form-valid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} + +.was-validated .form-control-color:valid, .form-control-color.is-valid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} + +.was-validated .form-check-input:valid, .form-check-input.is-valid { + border-color: var(--bs-form-valid-border-color); +} +.was-validated .form-check-input:valid:checked, .form-check-input.is-valid:checked { + background-color: var(--bs-form-valid-color); +} +.was-validated .form-check-input:valid:focus, .form-check-input.is-valid:focus { + box-shadow: 0 0 0 0.25rem rgba(var(--bs-success-rgb), 0.25); +} +.was-validated .form-check-input:valid ~ .form-check-label, .form-check-input.is-valid ~ .form-check-label { + color: var(--bs-form-valid-color); +} + +.form-check-inline .form-check-input ~ .valid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group > .form-control:not(:focus):valid, .input-group > .form-control:not(:focus).is-valid, +.was-validated .input-group > .form-select:not(:focus):valid, +.input-group > .form-select:not(:focus).is-valid, +.was-validated .input-group > .form-floating:not(:focus-within):valid, +.input-group > .form-floating:not(:focus-within).is-valid { + z-index: 3; +} + +.invalid-feedback { + display: none; + width: 100%; + margin-top: 0.25rem; + font-size: 0.875em; + color: var(--bs-form-invalid-color); +} + +.invalid-tooltip { + position: absolute; + top: 100%; + z-index: 5; + display: none; + max-width: 100%; + padding: 0.25rem 0.5rem; + margin-top: 0.1rem; + font-size: 0.875rem; + color: #fff; + background-color: var(--bs-danger); + border-radius: var(--bs-border-radius); +} + +.was-validated :invalid ~ .invalid-feedback, +.was-validated :invalid ~ .invalid-tooltip, +.is-invalid ~ .invalid-feedback, +.is-invalid ~ .invalid-tooltip { + display: block; +} + +.was-validated .form-control:invalid, .form-control.is-invalid { + border-color: var(--bs-form-invalid-border-color); + padding-right: calc(1.5em + 0.75rem); + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + background-repeat: no-repeat; + background-position: right calc(0.375em + 0.1875rem) center; + background-size: calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-control:invalid:focus, .form-control.is-invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} + +.was-validated textarea.form-control:invalid, textarea.form-control.is-invalid { + padding-right: calc(1.5em + 0.75rem); + background-position: top calc(0.375em + 0.1875rem) right calc(0.375em + 0.1875rem); +} + +.was-validated .form-select:invalid, .form-select.is-invalid { + border-color: var(--bs-form-invalid-border-color); +} +.was-validated .form-select:invalid:not([multiple]):not([size]), .was-validated .form-select:invalid:not([multiple])[size="1"], .form-select.is-invalid:not([multiple]):not([size]), .form-select.is-invalid:not([multiple])[size="1"] { + --bs-form-select-bg-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 12 12' width='12' height='12' fill='none' stroke='%23dc3545'%3e%3ccircle cx='6' cy='6' r='4.5'/%3e%3cpath stroke-linejoin='round' d='M5.8 3.6h.4L6 6.5z'/%3e%3ccircle cx='6' cy='8.2' r='.6' fill='%23dc3545' stroke='none'/%3e%3c/svg%3e"); + padding-right: 4.125rem; + background-position: right 0.75rem center, center right 2.25rem; + background-size: 16px 12px, calc(0.75em + 0.375rem) calc(0.75em + 0.375rem); +} +.was-validated .form-select:invalid:focus, .form-select.is-invalid:focus { + border-color: var(--bs-form-invalid-border-color); + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} + +.was-validated .form-control-color:invalid, .form-control-color.is-invalid { + width: calc(3rem + calc(1.5em + 0.75rem)); +} + +.was-validated .form-check-input:invalid, .form-check-input.is-invalid { + border-color: var(--bs-form-invalid-border-color); +} +.was-validated .form-check-input:invalid:checked, .form-check-input.is-invalid:checked { + background-color: var(--bs-form-invalid-color); +} +.was-validated .form-check-input:invalid:focus, .form-check-input.is-invalid:focus { + box-shadow: 0 0 0 0.25rem rgba(var(--bs-danger-rgb), 0.25); +} +.was-validated .form-check-input:invalid ~ .form-check-label, .form-check-input.is-invalid ~ .form-check-label { + color: var(--bs-form-invalid-color); +} + +.form-check-inline .form-check-input ~ .invalid-feedback { + margin-left: 0.5em; +} + +.was-validated .input-group > .form-control:not(:focus):invalid, .input-group > .form-control:not(:focus).is-invalid, +.was-validated .input-group > .form-select:not(:focus):invalid, +.input-group > .form-select:not(:focus).is-invalid, +.was-validated .input-group > .form-floating:not(:focus-within):invalid, +.input-group > .form-floating:not(:focus-within).is-invalid { + z-index: 4; +} + +.btn { + --bs-btn-padding-x: 0.75rem; + --bs-btn-padding-y: 0.375rem; + --bs-btn-font-family: ; + --bs-btn-font-size: 1rem; + --bs-btn-font-weight: 400; + --bs-btn-line-height: 1.5; + --bs-btn-color: var(--bs-body-color); + --bs-btn-bg: transparent; + --bs-btn-border-width: var(--bs-border-width); + --bs-btn-border-color: transparent; + --bs-btn-border-radius: var(--bs-border-radius); + --bs-btn-hover-border-color: transparent; + --bs-btn-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.15), 0 1px 1px rgba(0, 0, 0, 0.075); + --bs-btn-disabled-opacity: 0.65; + --bs-btn-focus-box-shadow: 0 0 0 0.25rem rgba(var(--bs-btn-focus-shadow-rgb), .5); + display: inline-block; + padding: var(--bs-btn-padding-y) var(--bs-btn-padding-x); + font-family: var(--bs-btn-font-family); + font-size: var(--bs-btn-font-size); + font-weight: var(--bs-btn-font-weight); + line-height: var(--bs-btn-line-height); + color: var(--bs-btn-color); + text-align: center; + text-decoration: none; + vertical-align: middle; + cursor: pointer; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + border: var(--bs-btn-border-width) solid var(--bs-btn-border-color); + border-radius: var(--bs-btn-border-radius); + background-color: var(--bs-btn-bg); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .btn { + transition: none; + } +} +.btn:hover { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); +} +.btn-check + .btn:hover { + color: var(--bs-btn-color); + background-color: var(--bs-btn-bg); + border-color: var(--bs-btn-border-color); +} +.btn:focus-visible { + color: var(--bs-btn-hover-color); + background-color: var(--bs-btn-hover-bg); + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:focus-visible + .btn { + border-color: var(--bs-btn-hover-border-color); + outline: 0; + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:checked + .btn, :not(.btn-check) + .btn:active, .btn:first-child:active, .btn.active, .btn.show { + color: var(--bs-btn-active-color); + background-color: var(--bs-btn-active-bg); + border-color: var(--bs-btn-active-border-color); +} +.btn-check:checked + .btn:focus-visible, :not(.btn-check) + .btn:active:focus-visible, .btn:first-child:active:focus-visible, .btn.active:focus-visible, .btn.show:focus-visible { + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn-check:checked:focus-visible + .btn { + box-shadow: var(--bs-btn-focus-box-shadow); +} +.btn:disabled, .btn.disabled, fieldset:disabled .btn { + color: var(--bs-btn-disabled-color); + pointer-events: none; + background-color: var(--bs-btn-disabled-bg); + border-color: var(--bs-btn-disabled-border-color); + opacity: var(--bs-btn-disabled-opacity); +} + +.btn-primary { + --bs-btn-color: #fff; + --bs-btn-bg: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: rgb(11.05, 93.5, 215.05); + --bs-btn-hover-border-color: rgb(10.4, 88, 202.4); + --bs-btn-focus-shadow-rgb: 49, 132, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: rgb(10.4, 88, 202.4); + --bs-btn-active-border-color: rgb(9.75, 82.5, 189.75); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #0d6efd; + --bs-btn-disabled-border-color: #0d6efd; +} + +.btn-secondary { + --bs-btn-color: #fff; + --bs-btn-bg: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: rgb(91.8, 99.45, 106.25); + --bs-btn-hover-border-color: rgb(86.4, 93.6, 100); + --bs-btn-focus-shadow-rgb: 130, 138, 145; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: rgb(86.4, 93.6, 100); + --bs-btn-active-border-color: rgb(81, 87.75, 93.75); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #6c757d; + --bs-btn-disabled-border-color: #6c757d; +} + +.btn-success { + --bs-btn-color: #fff; + --bs-btn-bg: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: rgb(21.25, 114.75, 71.4); + --bs-btn-hover-border-color: rgb(20, 108, 67.2); + --bs-btn-focus-shadow-rgb: 60, 153, 110; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: rgb(20, 108, 67.2); + --bs-btn-active-border-color: rgb(18.75, 101.25, 63); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #198754; + --bs-btn-disabled-border-color: #198754; +} + +.btn-info { + --bs-btn-color: #000; + --bs-btn-bg: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: rgb(49.3, 209.95, 242.25); + --bs-btn-hover-border-color: rgb(37.2, 207.3, 241.5); + --bs-btn-focus-shadow-rgb: 11, 172, 204; + --bs-btn-active-color: #000; + --bs-btn-active-bg: rgb(61.4, 212.6, 243); + --bs-btn-active-border-color: rgb(37.2, 207.3, 241.5); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #0dcaf0; + --bs-btn-disabled-border-color: #0dcaf0; +} + +.btn-warning { + --bs-btn-color: #000; + --bs-btn-bg: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: rgb(255, 202.3, 44.2); + --bs-btn-hover-border-color: rgb(255, 199.2, 31.8); + --bs-btn-focus-shadow-rgb: 217, 164, 6; + --bs-btn-active-color: #000; + --bs-btn-active-bg: rgb(255, 205.4, 56.6); + --bs-btn-active-border-color: rgb(255, 199.2, 31.8); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #ffc107; + --bs-btn-disabled-border-color: #ffc107; +} + +.btn-danger { + --bs-btn-color: #fff; + --bs-btn-bg: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: rgb(187, 45.05, 58.65); + --bs-btn-hover-border-color: rgb(176, 42.4, 55.2); + --bs-btn-focus-shadow-rgb: 225, 83, 97; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: rgb(176, 42.4, 55.2); + --bs-btn-active-border-color: rgb(165, 39.75, 51.75); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #dc3545; + --bs-btn-disabled-border-color: #dc3545; +} + +.btn-light { + --bs-btn-color: #000; + --bs-btn-bg: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: rgb(210.8, 211.65, 212.5); + --bs-btn-hover-border-color: rgb(198.4, 199.2, 200); + --bs-btn-focus-shadow-rgb: 211, 212, 213; + --bs-btn-active-color: #000; + --bs-btn-active-bg: rgb(198.4, 199.2, 200); + --bs-btn-active-border-color: rgb(186, 186.75, 187.5); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #000; + --bs-btn-disabled-bg: #f8f9fa; + --bs-btn-disabled-border-color: #f8f9fa; +} + +.btn-dark { + --bs-btn-color: #fff; + --bs-btn-bg: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: rgb(66.3, 69.7, 73.1); + --bs-btn-hover-border-color: rgb(55.2, 58.8, 62.4); + --bs-btn-focus-shadow-rgb: 66, 70, 73; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: rgb(77.4, 80.6, 83.8); + --bs-btn-active-border-color: rgb(55.2, 58.8, 62.4); + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #fff; + --bs-btn-disabled-bg: #212529; + --bs-btn-disabled-border-color: #212529; +} + +.btn-outline-primary { + --bs-btn-color: #0d6efd; + --bs-btn-border-color: #0d6efd; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #0d6efd; + --bs-btn-hover-border-color: #0d6efd; + --bs-btn-focus-shadow-rgb: 13, 110, 253; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #0d6efd; + --bs-btn-active-border-color: #0d6efd; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0d6efd; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0d6efd; + --bs-gradient: none; +} + +.btn-outline-secondary { + --bs-btn-color: #6c757d; + --bs-btn-border-color: #6c757d; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #6c757d; + --bs-btn-hover-border-color: #6c757d; + --bs-btn-focus-shadow-rgb: 108, 117, 125; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #6c757d; + --bs-btn-active-border-color: #6c757d; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #6c757d; + --bs-gradient: none; +} + +.btn-outline-success { + --bs-btn-color: #198754; + --bs-btn-border-color: #198754; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #198754; + --bs-btn-hover-border-color: #198754; + --bs-btn-focus-shadow-rgb: 25, 135, 84; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #198754; + --bs-btn-active-border-color: #198754; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #198754; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #198754; + --bs-gradient: none; +} + +.btn-outline-info { + --bs-btn-color: #0dcaf0; + --bs-btn-border-color: #0dcaf0; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #0dcaf0; + --bs-btn-hover-border-color: #0dcaf0; + --bs-btn-focus-shadow-rgb: 13, 202, 240; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #0dcaf0; + --bs-btn-active-border-color: #0dcaf0; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #0dcaf0; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #0dcaf0; + --bs-gradient: none; +} + +.btn-outline-warning { + --bs-btn-color: #ffc107; + --bs-btn-border-color: #ffc107; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #ffc107; + --bs-btn-hover-border-color: #ffc107; + --bs-btn-focus-shadow-rgb: 255, 193, 7; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #ffc107; + --bs-btn-active-border-color: #ffc107; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #ffc107; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #ffc107; + --bs-gradient: none; +} + +.btn-outline-danger { + --bs-btn-color: #dc3545; + --bs-btn-border-color: #dc3545; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #dc3545; + --bs-btn-hover-border-color: #dc3545; + --bs-btn-focus-shadow-rgb: 220, 53, 69; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #dc3545; + --bs-btn-active-border-color: #dc3545; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #dc3545; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #dc3545; + --bs-gradient: none; +} + +.btn-outline-light { + --bs-btn-color: #f8f9fa; + --bs-btn-border-color: #f8f9fa; + --bs-btn-hover-color: #000; + --bs-btn-hover-bg: #f8f9fa; + --bs-btn-hover-border-color: #f8f9fa; + --bs-btn-focus-shadow-rgb: 248, 249, 250; + --bs-btn-active-color: #000; + --bs-btn-active-bg: #f8f9fa; + --bs-btn-active-border-color: #f8f9fa; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #f8f9fa; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #f8f9fa; + --bs-gradient: none; +} + +.btn-outline-dark { + --bs-btn-color: #212529; + --bs-btn-border-color: #212529; + --bs-btn-hover-color: #fff; + --bs-btn-hover-bg: #212529; + --bs-btn-hover-border-color: #212529; + --bs-btn-focus-shadow-rgb: 33, 37, 41; + --bs-btn-active-color: #fff; + --bs-btn-active-bg: #212529; + --bs-btn-active-border-color: #212529; + --bs-btn-active-shadow: inset 0 3px 5px rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: #212529; + --bs-btn-disabled-bg: transparent; + --bs-btn-disabled-border-color: #212529; + --bs-gradient: none; +} + +.btn-link { + --bs-btn-font-weight: 400; + --bs-btn-color: var(--bs-link-color); + --bs-btn-bg: transparent; + --bs-btn-border-color: transparent; + --bs-btn-hover-color: var(--bs-link-hover-color); + --bs-btn-hover-border-color: transparent; + --bs-btn-active-color: var(--bs-link-hover-color); + --bs-btn-active-border-color: transparent; + --bs-btn-disabled-color: #6c757d; + --bs-btn-disabled-border-color: transparent; + --bs-btn-box-shadow: 0 0 0 #000; + --bs-btn-focus-shadow-rgb: 49, 132, 253; + text-decoration: underline; +} +.btn-link:focus-visible { + color: var(--bs-btn-color); +} +.btn-link:hover { + color: var(--bs-btn-hover-color); +} + +.btn-lg, .btn-group-lg > .btn { + --bs-btn-padding-y: 0.5rem; + --bs-btn-padding-x: 1rem; + --bs-btn-font-size: 1.25rem; + --bs-btn-border-radius: var(--bs-border-radius-lg); +} + +.btn-sm, .btn-group-sm > .btn { + --bs-btn-padding-y: 0.25rem; + --bs-btn-padding-x: 0.5rem; + --bs-btn-font-size: 0.875rem; + --bs-btn-border-radius: var(--bs-border-radius-sm); +} + +.fade { + transition: opacity 0.15s linear; +} +@media (prefers-reduced-motion: reduce) { + .fade { + transition: none; + } +} +.fade:not(.show) { + opacity: 0; +} + +.collapse:not(.show) { + display: none; +} + +.collapsing { + height: 0; + overflow: hidden; + transition: height 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing { + transition: none; + } +} +.collapsing.collapse-horizontal { + width: 0; + height: auto; + transition: width 0.35s ease; +} +@media (prefers-reduced-motion: reduce) { + .collapsing.collapse-horizontal { + transition: none; + } +} + +.dropup, +.dropend, +.dropdown, +.dropstart, +.dropup-center, +.dropdown-center { + position: relative; +} + +.dropdown-toggle { + white-space: nowrap; +} +.dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid; + border-right: 0.3em solid transparent; + border-bottom: 0; + border-left: 0.3em solid transparent; +} +.dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropdown-menu { + --bs-dropdown-zindex: 1000; + --bs-dropdown-min-width: 10rem; + --bs-dropdown-padding-x: 0; + --bs-dropdown-padding-y: 0.5rem; + --bs-dropdown-spacer: 0.125rem; + --bs-dropdown-font-size: 1rem; + --bs-dropdown-color: var(--bs-body-color); + --bs-dropdown-bg: var(--bs-body-bg); + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-border-radius: var(--bs-border-radius); + --bs-dropdown-border-width: var(--bs-border-width); + --bs-dropdown-inner-border-radius: calc(var(--bs-border-radius) - var(--bs-border-width)); + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-divider-margin-y: 0.5rem; + --bs-dropdown-box-shadow: var(--bs-box-shadow); + --bs-dropdown-link-color: var(--bs-body-color); + --bs-dropdown-link-hover-color: var(--bs-body-color); + --bs-dropdown-link-hover-bg: var(--bs-tertiary-bg); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #0d6efd; + --bs-dropdown-link-disabled-color: var(--bs-tertiary-color); + --bs-dropdown-item-padding-x: 1rem; + --bs-dropdown-item-padding-y: 0.25rem; + --bs-dropdown-header-color: #6c757d; + --bs-dropdown-header-padding-x: 1rem; + --bs-dropdown-header-padding-y: 0.5rem; + position: absolute; + z-index: var(--bs-dropdown-zindex); + display: none; + min-width: var(--bs-dropdown-min-width); + padding: var(--bs-dropdown-padding-y) var(--bs-dropdown-padding-x); + margin: 0; + font-size: var(--bs-dropdown-font-size); + color: var(--bs-dropdown-color); + text-align: left; + list-style: none; + background-color: var(--bs-dropdown-bg); + background-clip: padding-box; + border: var(--bs-dropdown-border-width) solid var(--bs-dropdown-border-color); + border-radius: var(--bs-dropdown-border-radius); +} +.dropdown-menu[data-bs-popper] { + top: 100%; + left: 0; + margin-top: var(--bs-dropdown-spacer); +} + +.dropdown-menu-start { + --bs-position: start; +} +.dropdown-menu-start[data-bs-popper] { + right: auto; + left: 0; +} + +.dropdown-menu-end { + --bs-position: end; +} +.dropdown-menu-end[data-bs-popper] { + right: 0; + left: auto; +} + +@media (min-width: 576px) { + .dropdown-menu-sm-start { + --bs-position: start; + } + .dropdown-menu-sm-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-sm-end { + --bs-position: end; + } + .dropdown-menu-sm-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 768px) { + .dropdown-menu-md-start { + --bs-position: start; + } + .dropdown-menu-md-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-md-end { + --bs-position: end; + } + .dropdown-menu-md-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 992px) { + .dropdown-menu-lg-start { + --bs-position: start; + } + .dropdown-menu-lg-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-lg-end { + --bs-position: end; + } + .dropdown-menu-lg-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1200px) { + .dropdown-menu-xl-start { + --bs-position: start; + } + .dropdown-menu-xl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xl-end { + --bs-position: end; + } + .dropdown-menu-xl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +@media (min-width: 1400px) { + .dropdown-menu-xxl-start { + --bs-position: start; + } + .dropdown-menu-xxl-start[data-bs-popper] { + right: auto; + left: 0; + } + .dropdown-menu-xxl-end { + --bs-position: end; + } + .dropdown-menu-xxl-end[data-bs-popper] { + right: 0; + left: auto; + } +} +.dropup .dropdown-menu[data-bs-popper] { + top: auto; + bottom: 100%; + margin-top: 0; + margin-bottom: var(--bs-dropdown-spacer); +} +.dropup .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0; + border-right: 0.3em solid transparent; + border-bottom: 0.3em solid; + border-left: 0.3em solid transparent; +} +.dropup .dropdown-toggle:empty::after { + margin-left: 0; +} + +.dropend .dropdown-menu[data-bs-popper] { + top: 0; + right: auto; + left: 100%; + margin-top: 0; + margin-left: var(--bs-dropdown-spacer); +} +.dropend .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0; + border-bottom: 0.3em solid transparent; + border-left: 0.3em solid; +} +.dropend .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropend .dropdown-toggle::after { + vertical-align: 0; +} + +.dropstart .dropdown-menu[data-bs-popper] { + top: 0; + right: 100%; + left: auto; + margin-top: 0; + margin-right: var(--bs-dropdown-spacer); +} +.dropstart .dropdown-toggle::after { + display: inline-block; + margin-left: 0.255em; + vertical-align: 0.255em; + content: ""; +} +.dropstart .dropdown-toggle::after { + display: none; +} +.dropstart .dropdown-toggle::before { + display: inline-block; + margin-right: 0.255em; + vertical-align: 0.255em; + content: ""; + border-top: 0.3em solid transparent; + border-right: 0.3em solid; + border-bottom: 0.3em solid transparent; +} +.dropstart .dropdown-toggle:empty::after { + margin-left: 0; +} +.dropstart .dropdown-toggle::before { + vertical-align: 0; +} + +.dropdown-divider { + height: 0; + margin: var(--bs-dropdown-divider-margin-y) 0; + overflow: hidden; + border-top: 1px solid var(--bs-dropdown-divider-bg); + opacity: 1; +} + +.dropdown-item { + display: block; + width: 100%; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + clear: both; + font-weight: 400; + color: var(--bs-dropdown-link-color); + text-align: inherit; + text-decoration: none; + white-space: nowrap; + background-color: transparent; + border: 0; + border-radius: var(--bs-dropdown-item-border-radius, 0); +} +.dropdown-item:hover, .dropdown-item:focus { + color: var(--bs-dropdown-link-hover-color); + background-color: var(--bs-dropdown-link-hover-bg); +} +.dropdown-item.active, .dropdown-item:active { + color: var(--bs-dropdown-link-active-color); + text-decoration: none; + background-color: var(--bs-dropdown-link-active-bg); +} +.dropdown-item.disabled, .dropdown-item:disabled { + color: var(--bs-dropdown-link-disabled-color); + pointer-events: none; + background-color: transparent; +} + +.dropdown-menu.show { + display: block; +} + +.dropdown-header { + display: block; + padding: var(--bs-dropdown-header-padding-y) var(--bs-dropdown-header-padding-x); + margin-bottom: 0; + font-size: 0.875rem; + color: var(--bs-dropdown-header-color); + white-space: nowrap; +} + +.dropdown-item-text { + display: block; + padding: var(--bs-dropdown-item-padding-y) var(--bs-dropdown-item-padding-x); + color: var(--bs-dropdown-link-color); +} + +.dropdown-menu-dark { + --bs-dropdown-color: #dee2e6; + --bs-dropdown-bg: #343a40; + --bs-dropdown-border-color: var(--bs-border-color-translucent); + --bs-dropdown-box-shadow: ; + --bs-dropdown-link-color: #dee2e6; + --bs-dropdown-link-hover-color: #fff; + --bs-dropdown-divider-bg: var(--bs-border-color-translucent); + --bs-dropdown-link-hover-bg: rgba(255, 255, 255, 0.15); + --bs-dropdown-link-active-color: #fff; + --bs-dropdown-link-active-bg: #0d6efd; + --bs-dropdown-link-disabled-color: #adb5bd; + --bs-dropdown-header-color: #adb5bd; +} + +.btn-group, +.btn-group-vertical { + position: relative; + display: inline-flex; + vertical-align: middle; +} +.btn-group > .btn, +.btn-group-vertical > .btn { + position: relative; + flex: 1 1 auto; +} +.btn-group > .btn-check:checked + .btn, +.btn-group > .btn-check:focus + .btn, +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active, +.btn-group-vertical > .btn-check:checked + .btn, +.btn-group-vertical > .btn-check:focus + .btn, +.btn-group-vertical > .btn:hover, +.btn-group-vertical > .btn:focus, +.btn-group-vertical > .btn:active, +.btn-group-vertical > .btn.active { + z-index: 1; +} + +.btn-toolbar { + display: flex; + flex-wrap: wrap; + justify-content: flex-start; +} +.btn-toolbar .input-group { + width: auto; +} + +.btn-group { + border-radius: var(--bs-border-radius); +} +.btn-group > :not(.btn-check:first-child) + .btn, +.btn-group > .btn-group:not(:first-child) { + margin-left: calc(-1 * var(--bs-border-width)); +} +.btn-group > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group > .btn.dropdown-toggle-split:first-child, +.btn-group > .btn-group:not(:last-child) > .btn { + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.btn-group > .btn:nth-child(n+3), +.btn-group > :not(.btn-check) + .btn, +.btn-group > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} + +.dropdown-toggle-split { + padding-right: 0.5625rem; + padding-left: 0.5625rem; +} +.dropdown-toggle-split::after, .dropup .dropdown-toggle-split::after, .dropend .dropdown-toggle-split::after { + margin-left: 0; +} +.dropstart .dropdown-toggle-split::before { + margin-right: 0; +} + +.btn-sm + .dropdown-toggle-split, .btn-group-sm > .btn + .dropdown-toggle-split { + padding-right: 0.375rem; + padding-left: 0.375rem; +} + +.btn-lg + .dropdown-toggle-split, .btn-group-lg > .btn + .dropdown-toggle-split { + padding-right: 0.75rem; + padding-left: 0.75rem; +} + +.btn-group-vertical { + flex-direction: column; + align-items: flex-start; + justify-content: center; +} +.btn-group-vertical > .btn, +.btn-group-vertical > .btn-group { + width: 100%; +} +.btn-group-vertical > .btn:not(:first-child), +.btn-group-vertical > .btn-group:not(:first-child) { + margin-top: calc(-1 * var(--bs-border-width)); +} +.btn-group-vertical > .btn:not(:last-child):not(.dropdown-toggle), +.btn-group-vertical > .btn-group:not(:last-child) > .btn { + border-bottom-right-radius: 0; + border-bottom-left-radius: 0; +} +.btn-group-vertical > .btn:nth-child(n+3), +.btn-group-vertical > :not(.btn-check) + .btn, +.btn-group-vertical > .btn-group:not(:first-child) > .btn { + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav { + --bs-nav-link-padding-x: 1rem; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-link-color); + --bs-nav-link-hover-color: var(--bs-link-hover-color); + --bs-nav-link-disabled-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} + +.nav-link { + display: block; + padding: var(--bs-nav-link-padding-y) var(--bs-nav-link-padding-x); + font-size: var(--bs-nav-link-font-size); + font-weight: var(--bs-nav-link-font-weight); + color: var(--bs-nav-link-color); + text-decoration: none; + background: none; + border: 0; + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .nav-link { + transition: none; + } +} +.nav-link:hover, .nav-link:focus { + color: var(--bs-nav-link-hover-color); +} +.nav-link:focus-visible { + outline: 0; + box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); +} +.nav-link.disabled, .nav-link:disabled { + color: var(--bs-nav-link-disabled-color); + pointer-events: none; + cursor: default; +} + +.nav-tabs { + --bs-nav-tabs-border-width: var(--bs-border-width); + --bs-nav-tabs-border-color: var(--bs-border-color); + --bs-nav-tabs-border-radius: var(--bs-border-radius); + --bs-nav-tabs-link-hover-border-color: var(--bs-secondary-bg) var(--bs-secondary-bg) var(--bs-border-color); + --bs-nav-tabs-link-active-color: var(--bs-emphasis-color); + --bs-nav-tabs-link-active-bg: var(--bs-body-bg); + --bs-nav-tabs-link-active-border-color: var(--bs-border-color) var(--bs-border-color) var(--bs-body-bg); + border-bottom: var(--bs-nav-tabs-border-width) solid var(--bs-nav-tabs-border-color); +} +.nav-tabs .nav-link { + margin-bottom: calc(-1 * var(--bs-nav-tabs-border-width)); + border: var(--bs-nav-tabs-border-width) solid transparent; + border-top-left-radius: var(--bs-nav-tabs-border-radius); + border-top-right-radius: var(--bs-nav-tabs-border-radius); +} +.nav-tabs .nav-link:hover, .nav-tabs .nav-link:focus { + isolation: isolate; + border-color: var(--bs-nav-tabs-link-hover-border-color); +} +.nav-tabs .nav-link.active, +.nav-tabs .nav-item.show .nav-link { + color: var(--bs-nav-tabs-link-active-color); + background-color: var(--bs-nav-tabs-link-active-bg); + border-color: var(--bs-nav-tabs-link-active-border-color); +} +.nav-tabs .dropdown-menu { + margin-top: calc(-1 * var(--bs-nav-tabs-border-width)); + border-top-left-radius: 0; + border-top-right-radius: 0; +} + +.nav-pills { + --bs-nav-pills-border-radius: var(--bs-border-radius); + --bs-nav-pills-link-active-color: #fff; + --bs-nav-pills-link-active-bg: #0d6efd; +} +.nav-pills .nav-link { + border-radius: var(--bs-nav-pills-border-radius); +} +.nav-pills .nav-link.active, +.nav-pills .show > .nav-link { + color: var(--bs-nav-pills-link-active-color); + background-color: var(--bs-nav-pills-link-active-bg); +} + +.nav-underline { + --bs-nav-underline-gap: 1rem; + --bs-nav-underline-border-width: 0.125rem; + --bs-nav-underline-link-active-color: var(--bs-emphasis-color); + gap: var(--bs-nav-underline-gap); +} +.nav-underline .nav-link { + padding-right: 0; + padding-left: 0; + border-bottom: var(--bs-nav-underline-border-width) solid transparent; +} +.nav-underline .nav-link:hover, .nav-underline .nav-link:focus { + border-bottom-color: currentcolor; +} +.nav-underline .nav-link.active, +.nav-underline .show > .nav-link { + font-weight: 700; + color: var(--bs-nav-underline-link-active-color); + border-bottom-color: currentcolor; +} + +.nav-fill > .nav-link, +.nav-fill .nav-item { + flex: 1 1 auto; + text-align: center; +} + +.nav-justified > .nav-link, +.nav-justified .nav-item { + flex-grow: 1; + flex-basis: 0; + text-align: center; +} + +.nav-fill .nav-item .nav-link, +.nav-justified .nav-item .nav-link { + width: 100%; +} + +.tab-content > .tab-pane { + display: none; +} +.tab-content > .active { + display: block; +} + +.navbar { + --bs-navbar-padding-x: 0; + --bs-navbar-padding-y: 0.5rem; + --bs-navbar-color: rgba(var(--bs-emphasis-color-rgb), 0.65); + --bs-navbar-hover-color: rgba(var(--bs-emphasis-color-rgb), 0.8); + --bs-navbar-disabled-color: rgba(var(--bs-emphasis-color-rgb), 0.3); + --bs-navbar-active-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-padding-y: 0.3125rem; + --bs-navbar-brand-margin-end: 1rem; + --bs-navbar-brand-font-size: 1.25rem; + --bs-navbar-brand-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-brand-hover-color: rgba(var(--bs-emphasis-color-rgb), 1); + --bs-navbar-nav-link-padding-x: 0.5rem; + --bs-navbar-toggler-padding-y: 0.25rem; + --bs-navbar-toggler-padding-x: 0.75rem; + --bs-navbar-toggler-font-size: 1.25rem; + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%280, 0, 0, 0.75%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); + --bs-navbar-toggler-border-color: rgba(var(--bs-emphasis-color-rgb), 0.15); + --bs-navbar-toggler-border-radius: var(--bs-border-radius); + --bs-navbar-toggler-focus-width: 0.25rem; + --bs-navbar-toggler-transition: box-shadow 0.15s ease-in-out; + position: relative; + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + padding: var(--bs-navbar-padding-y) var(--bs-navbar-padding-x); +} +.navbar > .container, +.navbar > .container-fluid, +.navbar > .container-sm, +.navbar > .container-md, +.navbar > .container-lg, +.navbar > .container-xl, +.navbar > .container-xxl { + display: flex; + flex-wrap: inherit; + align-items: center; + justify-content: space-between; +} +.navbar-brand { + padding-top: var(--bs-navbar-brand-padding-y); + padding-bottom: var(--bs-navbar-brand-padding-y); + margin-right: var(--bs-navbar-brand-margin-end); + font-size: var(--bs-navbar-brand-font-size); + color: var(--bs-navbar-brand-color); + text-decoration: none; + white-space: nowrap; +} +.navbar-brand:hover, .navbar-brand:focus { + color: var(--bs-navbar-brand-hover-color); +} + +.navbar-nav { + --bs-nav-link-padding-x: 0; + --bs-nav-link-padding-y: 0.5rem; + --bs-nav-link-font-weight: ; + --bs-nav-link-color: var(--bs-navbar-color); + --bs-nav-link-hover-color: var(--bs-navbar-hover-color); + --bs-nav-link-disabled-color: var(--bs-navbar-disabled-color); + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + list-style: none; +} +.navbar-nav .nav-link.active, .navbar-nav .nav-link.show { + color: var(--bs-navbar-active-color); +} +.navbar-nav .dropdown-menu { + position: static; +} + +.navbar-text { + padding-top: 0.5rem; + padding-bottom: 0.5rem; + color: var(--bs-navbar-color); +} +.navbar-text a, +.navbar-text a:hover, +.navbar-text a:focus { + color: var(--bs-navbar-active-color); +} + +.navbar-collapse { + flex-grow: 1; + flex-basis: 100%; + align-items: center; +} + +.navbar-toggler { + padding: var(--bs-navbar-toggler-padding-y) var(--bs-navbar-toggler-padding-x); + font-size: var(--bs-navbar-toggler-font-size); + line-height: 1; + color: var(--bs-navbar-color); + background-color: transparent; + border: var(--bs-border-width) solid var(--bs-navbar-toggler-border-color); + border-radius: var(--bs-navbar-toggler-border-radius); + transition: var(--bs-navbar-toggler-transition); +} +@media (prefers-reduced-motion: reduce) { + .navbar-toggler { + transition: none; + } +} +.navbar-toggler:hover { + text-decoration: none; +} +.navbar-toggler:focus { + text-decoration: none; + outline: 0; + box-shadow: 0 0 0 var(--bs-navbar-toggler-focus-width); +} + +.navbar-toggler-icon { + display: inline-block; + width: 1.5em; + height: 1.5em; + vertical-align: middle; + background-image: var(--bs-navbar-toggler-icon-bg); + background-repeat: no-repeat; + background-position: center; + background-size: 100%; +} + +.navbar-nav-scroll { + max-height: var(--bs-scroll-height, 75vh); + overflow-y: auto; +} + +@media (min-width: 576px) { + .navbar-expand-sm { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-sm .navbar-nav { + flex-direction: row; + } + .navbar-expand-sm .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-sm .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-sm .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-sm .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-sm .navbar-toggler { + display: none; + } + .navbar-expand-sm .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-sm .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-sm .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 768px) { + .navbar-expand-md { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-md .navbar-nav { + flex-direction: row; + } + .navbar-expand-md .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-md .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-md .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-md .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-md .navbar-toggler { + display: none; + } + .navbar-expand-md .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-md .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-md .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 992px) { + .navbar-expand-lg { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-lg .navbar-nav { + flex-direction: row; + } + .navbar-expand-lg .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-lg .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-lg .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-lg .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-lg .navbar-toggler { + display: none; + } + .navbar-expand-lg .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-lg .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-lg .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1200px) { + .navbar-expand-xl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xl .navbar-toggler { + display: none; + } + .navbar-expand-xl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +@media (min-width: 1400px) { + .navbar-expand-xxl { + flex-wrap: nowrap; + justify-content: flex-start; + } + .navbar-expand-xxl .navbar-nav { + flex-direction: row; + } + .navbar-expand-xxl .navbar-nav .dropdown-menu { + position: absolute; + } + .navbar-expand-xxl .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); + } + .navbar-expand-xxl .navbar-nav-scroll { + overflow: visible; + } + .navbar-expand-xxl .navbar-collapse { + display: flex !important; + flex-basis: auto; + } + .navbar-expand-xxl .navbar-toggler { + display: none; + } + .navbar-expand-xxl .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-header { + display: none; + } + .navbar-expand-xxl .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + } +} +.navbar-expand { + flex-wrap: nowrap; + justify-content: flex-start; +} +.navbar-expand .navbar-nav { + flex-direction: row; +} +.navbar-expand .navbar-nav .dropdown-menu { + position: absolute; +} +.navbar-expand .navbar-nav .nav-link { + padding-right: var(--bs-navbar-nav-link-padding-x); + padding-left: var(--bs-navbar-nav-link-padding-x); +} +.navbar-expand .navbar-nav-scroll { + overflow: visible; +} +.navbar-expand .navbar-collapse { + display: flex !important; + flex-basis: auto; +} +.navbar-expand .navbar-toggler { + display: none; +} +.navbar-expand .offcanvas { + position: static; + z-index: auto; + flex-grow: 1; + width: auto !important; + height: auto !important; + visibility: visible !important; + background-color: transparent !important; + border: 0 !important; + transform: none !important; + transition: none; +} +.navbar-expand .offcanvas .offcanvas-header { + display: none; +} +.navbar-expand .offcanvas .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; +} + +.navbar-dark, +.navbar[data-bs-theme=dark] { + --bs-navbar-color: rgba(255, 255, 255, 0.55); + --bs-navbar-hover-color: rgba(255, 255, 255, 0.75); + --bs-navbar-disabled-color: rgba(255, 255, 255, 0.25); + --bs-navbar-active-color: #fff; + --bs-navbar-brand-color: #fff; + --bs-navbar-brand-hover-color: #fff; + --bs-navbar-toggler-border-color: rgba(255, 255, 255, 0.1); + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +[data-bs-theme=dark] .navbar-toggler-icon { + --bs-navbar-toggler-icon-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 30 30'%3e%3cpath stroke='rgba%28255, 255, 255, 0.55%29' stroke-linecap='round' stroke-miterlimit='10' stroke-width='2' d='M4 7h22M4 15h22M4 23h22'/%3e%3c/svg%3e"); +} + +.card { + --bs-card-spacer-y: 1rem; + --bs-card-spacer-x: 1rem; + --bs-card-title-spacer-y: 0.5rem; + --bs-card-title-color: ; + --bs-card-subtitle-color: ; + --bs-card-border-width: var(--bs-border-width); + --bs-card-border-color: var(--bs-border-color-translucent); + --bs-card-border-radius: var(--bs-border-radius); + --bs-card-box-shadow: ; + --bs-card-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); + --bs-card-cap-padding-y: 0.5rem; + --bs-card-cap-padding-x: 1rem; + --bs-card-cap-bg: rgba(var(--bs-body-color-rgb), 0.03); + --bs-card-cap-color: ; + --bs-card-height: ; + --bs-card-color: ; + --bs-card-bg: var(--bs-body-bg); + --bs-card-img-overlay-padding: 1rem; + --bs-card-group-margin: 0.75rem; + position: relative; + display: flex; + flex-direction: column; + min-width: 0; + height: var(--bs-card-height); + color: var(--bs-body-color); + word-wrap: break-word; + background-color: var(--bs-card-bg); + background-clip: border-box; + border: var(--bs-card-border-width) solid var(--bs-card-border-color); + border-radius: var(--bs-card-border-radius); +} +.card > hr { + margin-right: 0; + margin-left: 0; +} +.card > .list-group { + border-top: inherit; + border-bottom: inherit; +} +.card > .list-group:first-child { + border-top-width: 0; + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); +} +.card > .list-group:last-child { + border-bottom-width: 0; + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); +} +.card > .card-header + .list-group, +.card > .list-group + .card-footer { + border-top: 0; +} + +.card-body { + flex: 1 1 auto; + padding: var(--bs-card-spacer-y) var(--bs-card-spacer-x); + color: var(--bs-card-color); +} + +.card-title { + margin-bottom: var(--bs-card-title-spacer-y); + color: var(--bs-card-title-color); +} + +.card-subtitle { + margin-top: calc(-0.5 * var(--bs-card-title-spacer-y)); + margin-bottom: 0; + color: var(--bs-card-subtitle-color); +} + +.card-text:last-child { + margin-bottom: 0; +} + +.card-link + .card-link { + margin-left: var(--bs-card-spacer-x); +} + +.card-header { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + margin-bottom: 0; + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-bottom: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-header:first-child { + border-radius: var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius) 0 0; +} + +.card-footer { + padding: var(--bs-card-cap-padding-y) var(--bs-card-cap-padding-x); + color: var(--bs-card-cap-color); + background-color: var(--bs-card-cap-bg); + border-top: var(--bs-card-border-width) solid var(--bs-card-border-color); +} +.card-footer:last-child { + border-radius: 0 0 var(--bs-card-inner-border-radius) var(--bs-card-inner-border-radius); +} + +.card-header-tabs { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-bottom: calc(-1 * var(--bs-card-cap-padding-y)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); + border-bottom: 0; +} +.card-header-tabs .nav-link.active { + background-color: var(--bs-card-bg); + border-bottom-color: var(--bs-card-bg); +} + +.card-header-pills { + margin-right: calc(-0.5 * var(--bs-card-cap-padding-x)); + margin-left: calc(-0.5 * var(--bs-card-cap-padding-x)); +} + +.card-img-overlay { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + padding: var(--bs-card-img-overlay-padding); + border-radius: var(--bs-card-inner-border-radius); +} + +.card-img, +.card-img-top, +.card-img-bottom { + width: 100%; +} + +.card-img, +.card-img-top { + border-top-left-radius: var(--bs-card-inner-border-radius); + border-top-right-radius: var(--bs-card-inner-border-radius); +} + +.card-img, +.card-img-bottom { + border-bottom-right-radius: var(--bs-card-inner-border-radius); + border-bottom-left-radius: var(--bs-card-inner-border-radius); +} + +.card-group > .card { + margin-bottom: var(--bs-card-group-margin); +} +@media (min-width: 576px) { + .card-group { + display: flex; + flex-flow: row wrap; + } + .card-group > .card { + flex: 1 0 0; + margin-bottom: 0; + } + .card-group > .card + .card { + margin-left: 0; + border-left: 0; + } + .card-group > .card:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; + } + .card-group > .card:not(:last-child) > .card-img-top, + .card-group > .card:not(:last-child) > .card-header { + border-top-right-radius: 0; + } + .card-group > .card:not(:last-child) > .card-img-bottom, + .card-group > .card:not(:last-child) > .card-footer { + border-bottom-right-radius: 0; + } + .card-group > .card:not(:first-child) { + border-top-left-radius: 0; + border-bottom-left-radius: 0; + } + .card-group > .card:not(:first-child) > .card-img-top, + .card-group > .card:not(:first-child) > .card-header { + border-top-left-radius: 0; + } + .card-group > .card:not(:first-child) > .card-img-bottom, + .card-group > .card:not(:first-child) > .card-footer { + border-bottom-left-radius: 0; + } +} + +.accordion { + --bs-accordion-color: var(--bs-body-color); + --bs-accordion-bg: var(--bs-body-bg); + --bs-accordion-transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out, border-radius 0.15s ease; + --bs-accordion-border-color: var(--bs-border-color); + --bs-accordion-border-width: var(--bs-border-width); + --bs-accordion-border-radius: var(--bs-border-radius); + --bs-accordion-inner-border-radius: calc(var(--bs-border-radius) - (var(--bs-border-width))); + --bs-accordion-btn-padding-x: 1.25rem; + --bs-accordion-btn-padding-y: 1rem; + --bs-accordion-btn-color: var(--bs-body-color); + --bs-accordion-btn-bg: var(--bs-accordion-bg); + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='%23000' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + --bs-accordion-btn-icon-width: 1.25rem; + --bs-accordion-btn-icon-transform: rotate(-180deg); + --bs-accordion-btn-icon-transition: transform 0.2s ease-in-out; + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='none' stroke='rgb%285.2, 44, 101.2%29' stroke-linecap='round' stroke-linejoin='round'%3e%3cpath d='m2 5 6 6 6-6'/%3e%3c/svg%3e"); + --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-accordion-body-padding-x: 1.25rem; + --bs-accordion-body-padding-y: 1rem; + --bs-accordion-active-color: var(--bs-primary-text-emphasis); + --bs-accordion-active-bg: var(--bs-primary-bg-subtle); +} + +.accordion-button { + position: relative; + display: flex; + align-items: center; + width: 100%; + padding: var(--bs-accordion-btn-padding-y) var(--bs-accordion-btn-padding-x); + font-size: 1rem; + color: var(--bs-accordion-btn-color); + text-align: left; + background-color: var(--bs-accordion-btn-bg); + border: 0; + border-radius: 0; + overflow-anchor: none; + transition: var(--bs-accordion-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button { + transition: none; + } +} +.accordion-button:not(.collapsed) { + color: var(--bs-accordion-active-color); + background-color: var(--bs-accordion-active-bg); + box-shadow: inset 0 calc(-1 * var(--bs-accordion-border-width)) 0 var(--bs-accordion-border-color); +} +.accordion-button:not(.collapsed)::after { + background-image: var(--bs-accordion-btn-active-icon); + transform: var(--bs-accordion-btn-icon-transform); +} +.accordion-button::after { + flex-shrink: 0; + width: var(--bs-accordion-btn-icon-width); + height: var(--bs-accordion-btn-icon-width); + margin-left: auto; + content: ""; + background-image: var(--bs-accordion-btn-icon); + background-repeat: no-repeat; + background-size: var(--bs-accordion-btn-icon-width); + transition: var(--bs-accordion-btn-icon-transition); +} +@media (prefers-reduced-motion: reduce) { + .accordion-button::after { + transition: none; + } +} +.accordion-button:hover { + z-index: 2; +} +.accordion-button:focus { + z-index: 3; + outline: 0; + box-shadow: var(--bs-accordion-btn-focus-box-shadow); +} + +.accordion-header { + margin-bottom: 0; +} + +.accordion-item { + color: var(--bs-accordion-color); + background-color: var(--bs-accordion-bg); + border: var(--bs-accordion-border-width) solid var(--bs-accordion-border-color); +} +.accordion-item:first-of-type { + border-top-left-radius: var(--bs-accordion-border-radius); + border-top-right-radius: var(--bs-accordion-border-radius); +} +.accordion-item:first-of-type > .accordion-header .accordion-button { + border-top-left-radius: var(--bs-accordion-inner-border-radius); + border-top-right-radius: var(--bs-accordion-inner-border-radius); +} +.accordion-item:not(:first-of-type) { + border-top: 0; +} +.accordion-item:last-of-type { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); +} +.accordion-item:last-of-type > .accordion-header .accordion-button.collapsed { + border-bottom-right-radius: var(--bs-accordion-inner-border-radius); + border-bottom-left-radius: var(--bs-accordion-inner-border-radius); +} +.accordion-item:last-of-type > .accordion-collapse { + border-bottom-right-radius: var(--bs-accordion-border-radius); + border-bottom-left-radius: var(--bs-accordion-border-radius); +} + +.accordion-body { + padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x); +} + +.accordion-flush > .accordion-item { + border-right: 0; + border-left: 0; + border-radius: 0; +} +.accordion-flush > .accordion-item:first-child { + border-top: 0; +} +.accordion-flush > .accordion-item:last-child { + border-bottom: 0; +} +.accordion-flush > .accordion-item > .accordion-collapse, +.accordion-flush > .accordion-item > .accordion-header .accordion-button, +.accordion-flush > .accordion-item > .accordion-header .accordion-button.collapsed { + border-radius: 0; +} + +[data-bs-theme=dark] .accordion-button::after { + --bs-accordion-btn-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28109.8, 168, 253.8%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e"); + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='rgb%28109.8, 168, 253.8%29'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e"); +} + +.breadcrumb { + --bs-breadcrumb-padding-x: 0; + --bs-breadcrumb-padding-y: 0; + --bs-breadcrumb-margin-bottom: 1rem; + --bs-breadcrumb-bg: ; + --bs-breadcrumb-border-radius: ; + --bs-breadcrumb-divider-color: var(--bs-secondary-color); + --bs-breadcrumb-item-padding-x: 0.5rem; + --bs-breadcrumb-item-active-color: var(--bs-secondary-color); + display: flex; + flex-wrap: wrap; + padding: var(--bs-breadcrumb-padding-y) var(--bs-breadcrumb-padding-x); + margin-bottom: var(--bs-breadcrumb-margin-bottom); + font-size: var(--bs-breadcrumb-font-size); + list-style: none; + background-color: var(--bs-breadcrumb-bg); + border-radius: var(--bs-breadcrumb-border-radius); +} + +.breadcrumb-item + .breadcrumb-item { + padding-left: var(--bs-breadcrumb-item-padding-x); +} +.breadcrumb-item + .breadcrumb-item::before { + float: left; + padding-right: var(--bs-breadcrumb-item-padding-x); + color: var(--bs-breadcrumb-divider-color); + content: var(--bs-breadcrumb-divider, "/") /* rtl: var(--bs-breadcrumb-divider, "/") */; +} +.breadcrumb-item.active { + color: var(--bs-breadcrumb-item-active-color); +} + +.pagination { + --bs-pagination-padding-x: 0.75rem; + --bs-pagination-padding-y: 0.375rem; + --bs-pagination-font-size: 1rem; + --bs-pagination-color: var(--bs-link-color); + --bs-pagination-bg: var(--bs-body-bg); + --bs-pagination-border-width: var(--bs-border-width); + --bs-pagination-border-color: var(--bs-border-color); + --bs-pagination-border-radius: var(--bs-border-radius); + --bs-pagination-hover-color: var(--bs-link-hover-color); + --bs-pagination-hover-bg: var(--bs-tertiary-bg); + --bs-pagination-hover-border-color: var(--bs-border-color); + --bs-pagination-focus-color: var(--bs-link-hover-color); + --bs-pagination-focus-bg: var(--bs-secondary-bg); + --bs-pagination-focus-box-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-pagination-active-color: #fff; + --bs-pagination-active-bg: #0d6efd; + --bs-pagination-active-border-color: #0d6efd; + --bs-pagination-disabled-color: var(--bs-secondary-color); + --bs-pagination-disabled-bg: var(--bs-secondary-bg); + --bs-pagination-disabled-border-color: var(--bs-border-color); + display: flex; + padding-left: 0; + list-style: none; +} + +.page-link { + position: relative; + display: block; + padding: var(--bs-pagination-padding-y) var(--bs-pagination-padding-x); + font-size: var(--bs-pagination-font-size); + color: var(--bs-pagination-color); + text-decoration: none; + background-color: var(--bs-pagination-bg); + border: var(--bs-pagination-border-width) solid var(--bs-pagination-border-color); + transition: color 0.15s ease-in-out, background-color 0.15s ease-in-out, border-color 0.15s ease-in-out, box-shadow 0.15s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .page-link { + transition: none; + } +} +.page-link:hover { + z-index: 2; + color: var(--bs-pagination-hover-color); + background-color: var(--bs-pagination-hover-bg); + border-color: var(--bs-pagination-hover-border-color); +} +.page-link:focus { + z-index: 3; + color: var(--bs-pagination-focus-color); + background-color: var(--bs-pagination-focus-bg); + outline: 0; + box-shadow: var(--bs-pagination-focus-box-shadow); +} +.page-link.active, .active > .page-link { + z-index: 3; + color: var(--bs-pagination-active-color); + background-color: var(--bs-pagination-active-bg); + border-color: var(--bs-pagination-active-border-color); +} +.page-link.disabled, .disabled > .page-link { + color: var(--bs-pagination-disabled-color); + pointer-events: none; + background-color: var(--bs-pagination-disabled-bg); + border-color: var(--bs-pagination-disabled-border-color); +} + +.page-item:not(:first-child) .page-link { + margin-left: calc(-1 * var(--bs-border-width)); +} +.page-item:first-child .page-link { + border-top-left-radius: var(--bs-pagination-border-radius); + border-bottom-left-radius: var(--bs-pagination-border-radius); +} +.page-item:last-child .page-link { + border-top-right-radius: var(--bs-pagination-border-radius); + border-bottom-right-radius: var(--bs-pagination-border-radius); +} + +.pagination-lg { + --bs-pagination-padding-x: 1.5rem; + --bs-pagination-padding-y: 0.75rem; + --bs-pagination-font-size: 1.25rem; + --bs-pagination-border-radius: var(--bs-border-radius-lg); +} + +.pagination-sm { + --bs-pagination-padding-x: 0.5rem; + --bs-pagination-padding-y: 0.25rem; + --bs-pagination-font-size: 0.875rem; + --bs-pagination-border-radius: var(--bs-border-radius-sm); +} + +.badge { + --bs-badge-padding-x: 0.65em; + --bs-badge-padding-y: 0.35em; + --bs-badge-font-size: 0.75em; + --bs-badge-font-weight: 700; + --bs-badge-color: #fff; + --bs-badge-border-radius: var(--bs-border-radius); + display: inline-block; + padding: var(--bs-badge-padding-y) var(--bs-badge-padding-x); + font-size: var(--bs-badge-font-size); + font-weight: var(--bs-badge-font-weight); + line-height: 1; + color: var(--bs-badge-color); + text-align: center; + white-space: nowrap; + vertical-align: baseline; + border-radius: var(--bs-badge-border-radius); +} +.badge:empty { + display: none; +} + +.btn .badge { + position: relative; + top: -1px; +} + +.alert { + --bs-alert-bg: transparent; + --bs-alert-padding-x: 1rem; + --bs-alert-padding-y: 1rem; + --bs-alert-margin-bottom: 1rem; + --bs-alert-color: inherit; + --bs-alert-border-color: transparent; + --bs-alert-border: var(--bs-border-width) solid var(--bs-alert-border-color); + --bs-alert-border-radius: var(--bs-border-radius); + --bs-alert-link-color: inherit; + position: relative; + padding: var(--bs-alert-padding-y) var(--bs-alert-padding-x); + margin-bottom: var(--bs-alert-margin-bottom); + color: var(--bs-alert-color); + background-color: var(--bs-alert-bg); + border: var(--bs-alert-border); + border-radius: var(--bs-alert-border-radius); +} + +.alert-heading { + color: inherit; +} + +.alert-link { + font-weight: 700; + color: var(--bs-alert-link-color); +} + +.alert-dismissible { + padding-right: 3rem; +} +.alert-dismissible .btn-close { + position: absolute; + top: 0; + right: 0; + z-index: 2; + padding: 1.25rem 1rem; +} + +.alert-primary { + --bs-alert-color: var(--bs-primary-text-emphasis); + --bs-alert-bg: var(--bs-primary-bg-subtle); + --bs-alert-border-color: var(--bs-primary-border-subtle); + --bs-alert-link-color: var(--bs-primary-text-emphasis); +} + +.alert-secondary { + --bs-alert-color: var(--bs-secondary-text-emphasis); + --bs-alert-bg: var(--bs-secondary-bg-subtle); + --bs-alert-border-color: var(--bs-secondary-border-subtle); + --bs-alert-link-color: var(--bs-secondary-text-emphasis); +} + +.alert-success { + --bs-alert-color: var(--bs-success-text-emphasis); + --bs-alert-bg: var(--bs-success-bg-subtle); + --bs-alert-border-color: var(--bs-success-border-subtle); + --bs-alert-link-color: var(--bs-success-text-emphasis); +} + +.alert-info { + --bs-alert-color: var(--bs-info-text-emphasis); + --bs-alert-bg: var(--bs-info-bg-subtle); + --bs-alert-border-color: var(--bs-info-border-subtle); + --bs-alert-link-color: var(--bs-info-text-emphasis); +} + +.alert-warning { + --bs-alert-color: var(--bs-warning-text-emphasis); + --bs-alert-bg: var(--bs-warning-bg-subtle); + --bs-alert-border-color: var(--bs-warning-border-subtle); + --bs-alert-link-color: var(--bs-warning-text-emphasis); +} + +.alert-danger { + --bs-alert-color: var(--bs-danger-text-emphasis); + --bs-alert-bg: var(--bs-danger-bg-subtle); + --bs-alert-border-color: var(--bs-danger-border-subtle); + --bs-alert-link-color: var(--bs-danger-text-emphasis); +} + +.alert-light { + --bs-alert-color: var(--bs-light-text-emphasis); + --bs-alert-bg: var(--bs-light-bg-subtle); + --bs-alert-border-color: var(--bs-light-border-subtle); + --bs-alert-link-color: var(--bs-light-text-emphasis); +} + +.alert-dark { + --bs-alert-color: var(--bs-dark-text-emphasis); + --bs-alert-bg: var(--bs-dark-bg-subtle); + --bs-alert-border-color: var(--bs-dark-border-subtle); + --bs-alert-link-color: var(--bs-dark-text-emphasis); +} + +@keyframes progress-bar-stripes { + 0% { + background-position-x: var(--bs-progress-height); + } +} +.progress, +.progress-stacked { + --bs-progress-height: 1rem; + --bs-progress-font-size: 0.75rem; + --bs-progress-bg: var(--bs-secondary-bg); + --bs-progress-border-radius: var(--bs-border-radius); + --bs-progress-box-shadow: var(--bs-box-shadow-inset); + --bs-progress-bar-color: #fff; + --bs-progress-bar-bg: #0d6efd; + --bs-progress-bar-transition: width 0.6s ease; + display: flex; + height: var(--bs-progress-height); + overflow: hidden; + font-size: var(--bs-progress-font-size); + background-color: var(--bs-progress-bg); + border-radius: var(--bs-progress-border-radius); +} + +.progress-bar { + display: flex; + flex-direction: column; + justify-content: center; + overflow: hidden; + color: var(--bs-progress-bar-color); + text-align: center; + white-space: nowrap; + background-color: var(--bs-progress-bar-bg); + transition: var(--bs-progress-bar-transition); +} +@media (prefers-reduced-motion: reduce) { + .progress-bar { + transition: none; + } +} + +.progress-bar-striped { + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: var(--bs-progress-height) var(--bs-progress-height); +} + +.progress-stacked > .progress { + overflow: visible; +} + +.progress-stacked > .progress > .progress-bar { + width: 100%; +} + +.progress-bar-animated { + animation: 1s linear infinite progress-bar-stripes; +} +@media (prefers-reduced-motion: reduce) { + .progress-bar-animated { + animation: none; + } +} + +.list-group { + --bs-list-group-color: var(--bs-body-color); + --bs-list-group-bg: var(--bs-body-bg); + --bs-list-group-border-color: var(--bs-border-color); + --bs-list-group-border-width: var(--bs-border-width); + --bs-list-group-border-radius: var(--bs-border-radius); + --bs-list-group-item-padding-x: 1rem; + --bs-list-group-item-padding-y: 0.5rem; + --bs-list-group-action-color: var(--bs-secondary-color); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-tertiary-bg); + --bs-list-group-action-active-color: var(--bs-body-color); + --bs-list-group-action-active-bg: var(--bs-secondary-bg); + --bs-list-group-disabled-color: var(--bs-secondary-color); + --bs-list-group-disabled-bg: var(--bs-body-bg); + --bs-list-group-active-color: #fff; + --bs-list-group-active-bg: #0d6efd; + --bs-list-group-active-border-color: #0d6efd; + display: flex; + flex-direction: column; + padding-left: 0; + margin-bottom: 0; + border-radius: var(--bs-list-group-border-radius); +} + +.list-group-numbered { + list-style-type: none; + counter-reset: section; +} +.list-group-numbered > .list-group-item::before { + content: counters(section, ".") ". "; + counter-increment: section; +} + +.list-group-item { + position: relative; + display: block; + padding: var(--bs-list-group-item-padding-y) var(--bs-list-group-item-padding-x); + color: var(--bs-list-group-color); + text-decoration: none; + background-color: var(--bs-list-group-bg); + border: var(--bs-list-group-border-width) solid var(--bs-list-group-border-color); +} +.list-group-item:first-child { + border-top-left-radius: inherit; + border-top-right-radius: inherit; +} +.list-group-item:last-child { + border-bottom-right-radius: inherit; + border-bottom-left-radius: inherit; +} +.list-group-item.disabled, .list-group-item:disabled { + color: var(--bs-list-group-disabled-color); + pointer-events: none; + background-color: var(--bs-list-group-disabled-bg); +} +.list-group-item.active { + z-index: 2; + color: var(--bs-list-group-active-color); + background-color: var(--bs-list-group-active-bg); + border-color: var(--bs-list-group-active-border-color); +} +.list-group-item + .list-group-item { + border-top-width: 0; +} +.list-group-item + .list-group-item.active { + margin-top: calc(-1 * var(--bs-list-group-border-width)); + border-top-width: var(--bs-list-group-border-width); +} + +.list-group-item-action { + width: 100%; + color: var(--bs-list-group-action-color); + text-align: inherit; +} +.list-group-item-action:not(.active):hover, .list-group-item-action:not(.active):focus { + z-index: 1; + color: var(--bs-list-group-action-hover-color); + text-decoration: none; + background-color: var(--bs-list-group-action-hover-bg); +} +.list-group-item-action:not(.active):active { + color: var(--bs-list-group-action-active-color); + background-color: var(--bs-list-group-action-active-bg); +} + +.list-group-horizontal { + flex-direction: row; +} +.list-group-horizontal > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; +} +.list-group-horizontal > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; +} +.list-group-horizontal > .list-group-item.active { + margin-top: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; +} +.list-group-horizontal > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); +} + +@media (min-width: 576px) { + .list-group-horizontal-sm { + flex-direction: row; + } + .list-group-horizontal-sm > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-sm > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-sm > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-sm > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 768px) { + .list-group-horizontal-md { + flex-direction: row; + } + .list-group-horizontal-md > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-md > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-md > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-md > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 992px) { + .list-group-horizontal-lg { + flex-direction: row; + } + .list-group-horizontal-lg > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-lg > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-lg > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-lg > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1200px) { + .list-group-horizontal-xl { + flex-direction: row; + } + .list-group-horizontal-xl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-xl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +@media (min-width: 1400px) { + .list-group-horizontal-xxl { + flex-direction: row; + } + .list-group-horizontal-xxl > .list-group-item:first-child:not(:last-child) { + border-bottom-left-radius: var(--bs-list-group-border-radius); + border-top-right-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item:last-child:not(:first-child) { + border-top-right-radius: var(--bs-list-group-border-radius); + border-bottom-left-radius: 0; + } + .list-group-horizontal-xxl > .list-group-item.active { + margin-top: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item { + border-top-width: var(--bs-list-group-border-width); + border-left-width: 0; + } + .list-group-horizontal-xxl > .list-group-item + .list-group-item.active { + margin-left: calc(-1 * var(--bs-list-group-border-width)); + border-left-width: var(--bs-list-group-border-width); + } +} +.list-group-flush { + border-radius: 0; +} +.list-group-flush > .list-group-item { + border-width: 0 0 var(--bs-list-group-border-width); +} +.list-group-flush > .list-group-item:last-child { + border-bottom-width: 0; +} + +.list-group-item-primary { + --bs-list-group-color: var(--bs-primary-text-emphasis); + --bs-list-group-bg: var(--bs-primary-bg-subtle); + --bs-list-group-border-color: var(--bs-primary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-primary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-primary-border-subtle); + --bs-list-group-active-color: var(--bs-primary-bg-subtle); + --bs-list-group-active-bg: var(--bs-primary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-primary-text-emphasis); +} + +.list-group-item-secondary { + --bs-list-group-color: var(--bs-secondary-text-emphasis); + --bs-list-group-bg: var(--bs-secondary-bg-subtle); + --bs-list-group-border-color: var(--bs-secondary-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-secondary-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-secondary-border-subtle); + --bs-list-group-active-color: var(--bs-secondary-bg-subtle); + --bs-list-group-active-bg: var(--bs-secondary-text-emphasis); + --bs-list-group-active-border-color: var(--bs-secondary-text-emphasis); +} + +.list-group-item-success { + --bs-list-group-color: var(--bs-success-text-emphasis); + --bs-list-group-bg: var(--bs-success-bg-subtle); + --bs-list-group-border-color: var(--bs-success-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-success-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-success-border-subtle); + --bs-list-group-active-color: var(--bs-success-bg-subtle); + --bs-list-group-active-bg: var(--bs-success-text-emphasis); + --bs-list-group-active-border-color: var(--bs-success-text-emphasis); +} + +.list-group-item-info { + --bs-list-group-color: var(--bs-info-text-emphasis); + --bs-list-group-bg: var(--bs-info-bg-subtle); + --bs-list-group-border-color: var(--bs-info-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-info-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-info-border-subtle); + --bs-list-group-active-color: var(--bs-info-bg-subtle); + --bs-list-group-active-bg: var(--bs-info-text-emphasis); + --bs-list-group-active-border-color: var(--bs-info-text-emphasis); +} + +.list-group-item-warning { + --bs-list-group-color: var(--bs-warning-text-emphasis); + --bs-list-group-bg: var(--bs-warning-bg-subtle); + --bs-list-group-border-color: var(--bs-warning-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-warning-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-warning-border-subtle); + --bs-list-group-active-color: var(--bs-warning-bg-subtle); + --bs-list-group-active-bg: var(--bs-warning-text-emphasis); + --bs-list-group-active-border-color: var(--bs-warning-text-emphasis); +} + +.list-group-item-danger { + --bs-list-group-color: var(--bs-danger-text-emphasis); + --bs-list-group-bg: var(--bs-danger-bg-subtle); + --bs-list-group-border-color: var(--bs-danger-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-danger-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-danger-border-subtle); + --bs-list-group-active-color: var(--bs-danger-bg-subtle); + --bs-list-group-active-bg: var(--bs-danger-text-emphasis); + --bs-list-group-active-border-color: var(--bs-danger-text-emphasis); +} + +.list-group-item-light { + --bs-list-group-color: var(--bs-light-text-emphasis); + --bs-list-group-bg: var(--bs-light-bg-subtle); + --bs-list-group-border-color: var(--bs-light-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-light-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-light-border-subtle); + --bs-list-group-active-color: var(--bs-light-bg-subtle); + --bs-list-group-active-bg: var(--bs-light-text-emphasis); + --bs-list-group-active-border-color: var(--bs-light-text-emphasis); +} + +.list-group-item-dark { + --bs-list-group-color: var(--bs-dark-text-emphasis); + --bs-list-group-bg: var(--bs-dark-bg-subtle); + --bs-list-group-border-color: var(--bs-dark-border-subtle); + --bs-list-group-action-hover-color: var(--bs-emphasis-color); + --bs-list-group-action-hover-bg: var(--bs-dark-border-subtle); + --bs-list-group-action-active-color: var(--bs-emphasis-color); + --bs-list-group-action-active-bg: var(--bs-dark-border-subtle); + --bs-list-group-active-color: var(--bs-dark-bg-subtle); + --bs-list-group-active-bg: var(--bs-dark-text-emphasis); + --bs-list-group-active-border-color: var(--bs-dark-text-emphasis); +} + +.btn-close { + --bs-btn-close-color: #000; + --bs-btn-close-bg: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23000'%3e%3cpath d='M.293.293a1 1 0 0 1 1.414 0L8 6.586 14.293.293a1 1 0 1 1 1.414 1.414L9.414 8l6.293 6.293a1 1 0 0 1-1.414 1.414L8 9.414l-6.293 6.293a1 1 0 0 1-1.414-1.414L6.586 8 .293 1.707a1 1 0 0 1 0-1.414'/%3e%3c/svg%3e"); + --bs-btn-close-opacity: 0.5; + --bs-btn-close-hover-opacity: 0.75; + --bs-btn-close-focus-shadow: 0 0 0 0.25rem rgba(13, 110, 253, 0.25); + --bs-btn-close-focus-opacity: 1; + --bs-btn-close-disabled-opacity: 0.25; + box-sizing: content-box; + width: 1em; + height: 1em; + padding: 0.25em 0.25em; + color: var(--bs-btn-close-color); + background: transparent var(--bs-btn-close-bg) center/1em auto no-repeat; + filter: var(--bs-btn-close-filter); + border: 0; + border-radius: 0.375rem; + opacity: var(--bs-btn-close-opacity); +} +.btn-close:hover { + color: var(--bs-btn-close-color); + text-decoration: none; + opacity: var(--bs-btn-close-hover-opacity); +} +.btn-close:focus { + outline: 0; + box-shadow: var(--bs-btn-close-focus-shadow); + opacity: var(--bs-btn-close-focus-opacity); +} +.btn-close:disabled, .btn-close.disabled { + pointer-events: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + opacity: var(--bs-btn-close-disabled-opacity); +} + +.btn-close-white { + --bs-btn-close-filter: invert(1) grayscale(100%) brightness(200%); +} + +:root, +[data-bs-theme=light] { + --bs-btn-close-filter: ; +} + +[data-bs-theme=dark] { + --bs-btn-close-filter: invert(1) grayscale(100%) brightness(200%); +} + +.toast { + --bs-toast-zindex: 1090; + --bs-toast-padding-x: 0.75rem; + --bs-toast-padding-y: 0.5rem; + --bs-toast-spacing: 1.5rem; + --bs-toast-max-width: 350px; + --bs-toast-font-size: 0.875rem; + --bs-toast-color: ; + --bs-toast-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-border-width: var(--bs-border-width); + --bs-toast-border-color: var(--bs-border-color-translucent); + --bs-toast-border-radius: var(--bs-border-radius); + --bs-toast-box-shadow: var(--bs-box-shadow); + --bs-toast-header-color: var(--bs-secondary-color); + --bs-toast-header-bg: rgba(var(--bs-body-bg-rgb), 0.85); + --bs-toast-header-border-color: var(--bs-border-color-translucent); + width: var(--bs-toast-max-width); + max-width: 100%; + font-size: var(--bs-toast-font-size); + color: var(--bs-toast-color); + pointer-events: auto; + background-color: var(--bs-toast-bg); + background-clip: padding-box; + border: var(--bs-toast-border-width) solid var(--bs-toast-border-color); + box-shadow: var(--bs-toast-box-shadow); + border-radius: var(--bs-toast-border-radius); +} +.toast.showing { + opacity: 0; +} +.toast:not(.show) { + display: none; +} + +.toast-container { + --bs-toast-zindex: 1090; + position: absolute; + z-index: var(--bs-toast-zindex); + width: -moz-max-content; + width: max-content; + max-width: 100%; + pointer-events: none; +} +.toast-container > :not(:last-child) { + margin-bottom: var(--bs-toast-spacing); +} + +.toast-header { + display: flex; + align-items: center; + padding: var(--bs-toast-padding-y) var(--bs-toast-padding-x); + color: var(--bs-toast-header-color); + background-color: var(--bs-toast-header-bg); + background-clip: padding-box; + border-bottom: var(--bs-toast-border-width) solid var(--bs-toast-header-border-color); + border-top-left-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); + border-top-right-radius: calc(var(--bs-toast-border-radius) - var(--bs-toast-border-width)); +} +.toast-header .btn-close { + margin-right: calc(-0.5 * var(--bs-toast-padding-x)); + margin-left: var(--bs-toast-padding-x); +} + +.toast-body { + padding: var(--bs-toast-padding-x); + word-wrap: break-word; +} + +.modal { + --bs-modal-zindex: 1055; + --bs-modal-width: 500px; + --bs-modal-padding: 1rem; + --bs-modal-margin: 0.5rem; + --bs-modal-color: var(--bs-body-color); + --bs-modal-bg: var(--bs-body-bg); + --bs-modal-border-color: var(--bs-border-color-translucent); + --bs-modal-border-width: var(--bs-border-width); + --bs-modal-border-radius: var(--bs-border-radius-lg); + --bs-modal-box-shadow: var(--bs-box-shadow-sm); + --bs-modal-inner-border-radius: calc(var(--bs-border-radius-lg) - (var(--bs-border-width))); + --bs-modal-header-padding-x: 1rem; + --bs-modal-header-padding-y: 1rem; + --bs-modal-header-padding: 1rem 1rem; + --bs-modal-header-border-color: var(--bs-border-color); + --bs-modal-header-border-width: var(--bs-border-width); + --bs-modal-title-line-height: 1.5; + --bs-modal-footer-gap: 0.5rem; + --bs-modal-footer-bg: ; + --bs-modal-footer-border-color: var(--bs-border-color); + --bs-modal-footer-border-width: var(--bs-border-width); + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-modal-zindex); + display: none; + width: 100%; + height: 100%; + overflow-x: hidden; + overflow-y: auto; + outline: 0; +} + +.modal-dialog { + position: relative; + width: auto; + margin: var(--bs-modal-margin); + pointer-events: none; +} +.modal.fade .modal-dialog { + transform: translate(0, -50px); + transition: transform 0.3s ease-out; +} +@media (prefers-reduced-motion: reduce) { + .modal.fade .modal-dialog { + transition: none; + } +} +.modal.show .modal-dialog { + transform: none; +} +.modal.modal-static .modal-dialog { + transform: scale(1.02); +} + +.modal-dialog-scrollable { + height: calc(100% - var(--bs-modal-margin) * 2); +} +.modal-dialog-scrollable .modal-content { + max-height: 100%; + overflow: hidden; +} +.modal-dialog-scrollable .modal-body { + overflow-y: auto; +} + +.modal-dialog-centered { + display: flex; + align-items: center; + min-height: calc(100% - var(--bs-modal-margin) * 2); +} + +.modal-content { + position: relative; + display: flex; + flex-direction: column; + width: 100%; + color: var(--bs-modal-color); + pointer-events: auto; + background-color: var(--bs-modal-bg); + background-clip: padding-box; + border: var(--bs-modal-border-width) solid var(--bs-modal-border-color); + border-radius: var(--bs-modal-border-radius); + outline: 0; +} + +.modal-backdrop { + --bs-backdrop-zindex: 1050; + --bs-backdrop-bg: #000; + --bs-backdrop-opacity: 0.5; + position: fixed; + top: 0; + left: 0; + z-index: var(--bs-backdrop-zindex); + width: 100vw; + height: 100vh; + background-color: var(--bs-backdrop-bg); +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop.show { + opacity: var(--bs-backdrop-opacity); +} + +.modal-header { + display: flex; + flex-shrink: 0; + align-items: center; + padding: var(--bs-modal-header-padding); + border-bottom: var(--bs-modal-header-border-width) solid var(--bs-modal-header-border-color); + border-top-left-radius: var(--bs-modal-inner-border-radius); + border-top-right-radius: var(--bs-modal-inner-border-radius); +} +.modal-header .btn-close { + padding: calc(var(--bs-modal-header-padding-y) * 0.5) calc(var(--bs-modal-header-padding-x) * 0.5); + margin-top: calc(-0.5 * var(--bs-modal-header-padding-y)); + margin-right: calc(-0.5 * var(--bs-modal-header-padding-x)); + margin-bottom: calc(-0.5 * var(--bs-modal-header-padding-y)); + margin-left: auto; +} + +.modal-title { + margin-bottom: 0; + line-height: var(--bs-modal-title-line-height); +} + +.modal-body { + position: relative; + flex: 1 1 auto; + padding: var(--bs-modal-padding); +} + +.modal-footer { + display: flex; + flex-shrink: 0; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + padding: calc(var(--bs-modal-padding) - var(--bs-modal-footer-gap) * 0.5); + background-color: var(--bs-modal-footer-bg); + border-top: var(--bs-modal-footer-border-width) solid var(--bs-modal-footer-border-color); + border-bottom-right-radius: var(--bs-modal-inner-border-radius); + border-bottom-left-radius: var(--bs-modal-inner-border-radius); +} +.modal-footer > * { + margin: calc(var(--bs-modal-footer-gap) * 0.5); +} + +@media (min-width: 576px) { + .modal { + --bs-modal-margin: 1.75rem; + --bs-modal-box-shadow: var(--bs-box-shadow); + } + .modal-dialog { + max-width: var(--bs-modal-width); + margin-right: auto; + margin-left: auto; + } + .modal-sm { + --bs-modal-width: 300px; + } +} +@media (min-width: 992px) { + .modal-lg, + .modal-xl { + --bs-modal-width: 800px; + } +} +@media (min-width: 1200px) { + .modal-xl { + --bs-modal-width: 1140px; + } +} +.modal-fullscreen { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; +} +.modal-fullscreen .modal-content { + height: 100%; + border: 0; + border-radius: 0; +} +.modal-fullscreen .modal-header, +.modal-fullscreen .modal-footer { + border-radius: 0; +} +.modal-fullscreen .modal-body { + overflow-y: auto; +} + +@media (max-width: 575.98px) { + .modal-fullscreen-sm-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-sm-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-header, + .modal-fullscreen-sm-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-sm-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 767.98px) { + .modal-fullscreen-md-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-md-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-md-down .modal-header, + .modal-fullscreen-md-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-md-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 991.98px) { + .modal-fullscreen-lg-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-lg-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-header, + .modal-fullscreen-lg-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-lg-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 1199.98px) { + .modal-fullscreen-xl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-header, + .modal-fullscreen-xl-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-xl-down .modal-body { + overflow-y: auto; + } +} +@media (max-width: 1399.98px) { + .modal-fullscreen-xxl-down { + width: 100vw; + max-width: none; + height: 100%; + margin: 0; + } + .modal-fullscreen-xxl-down .modal-content { + height: 100%; + border: 0; + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-header, + .modal-fullscreen-xxl-down .modal-footer { + border-radius: 0; + } + .modal-fullscreen-xxl-down .modal-body { + overflow-y: auto; + } +} +.tooltip { + --bs-tooltip-zindex: 1080; + --bs-tooltip-max-width: 200px; + --bs-tooltip-padding-x: 0.5rem; + --bs-tooltip-padding-y: 0.25rem; + --bs-tooltip-margin: ; + --bs-tooltip-font-size: 0.875rem; + --bs-tooltip-color: var(--bs-body-bg); + --bs-tooltip-bg: var(--bs-emphasis-color); + --bs-tooltip-border-radius: var(--bs-border-radius); + --bs-tooltip-opacity: 0.9; + --bs-tooltip-arrow-width: 0.8rem; + --bs-tooltip-arrow-height: 0.4rem; + z-index: var(--bs-tooltip-zindex); + display: block; + margin: var(--bs-tooltip-margin); + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-tooltip-font-size); + word-wrap: break-word; + opacity: 0; +} +.tooltip.show { + opacity: var(--bs-tooltip-opacity); +} +.tooltip .tooltip-arrow { + display: block; + width: var(--bs-tooltip-arrow-width); + height: var(--bs-tooltip-arrow-height); +} +.tooltip .tooltip-arrow::before { + position: absolute; + content: ""; + border-color: transparent; + border-style: solid; +} + +.bs-tooltip-top .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow { + bottom: calc(-1 * var(--bs-tooltip-arrow-height)); +} +.bs-tooltip-top .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=top] .tooltip-arrow::before { + top: -1px; + border-width: var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-top-color: var(--bs-tooltip-bg); +} + +/* rtl:begin:ignore */ +.bs-tooltip-end .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow { + left: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-end .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=right] .tooltip-arrow::before { + right: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height) calc(var(--bs-tooltip-arrow-width) * 0.5) 0; + border-right-color: var(--bs-tooltip-bg); +} + +/* rtl:end:ignore */ +.bs-tooltip-bottom .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow { + top: calc(-1 * var(--bs-tooltip-arrow-height)); +} +.bs-tooltip-bottom .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=bottom] .tooltip-arrow::before { + bottom: -1px; + border-width: 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-bottom-color: var(--bs-tooltip-bg); +} + +/* rtl:begin:ignore */ +.bs-tooltip-start .tooltip-arrow, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow { + right: calc(-1 * var(--bs-tooltip-arrow-height)); + width: var(--bs-tooltip-arrow-height); + height: var(--bs-tooltip-arrow-width); +} +.bs-tooltip-start .tooltip-arrow::before, .bs-tooltip-auto[data-popper-placement^=left] .tooltip-arrow::before { + left: -1px; + border-width: calc(var(--bs-tooltip-arrow-width) * 0.5) 0 calc(var(--bs-tooltip-arrow-width) * 0.5) var(--bs-tooltip-arrow-height); + border-left-color: var(--bs-tooltip-bg); +} + +/* rtl:end:ignore */ +.tooltip-inner { + max-width: var(--bs-tooltip-max-width); + padding: var(--bs-tooltip-padding-y) var(--bs-tooltip-padding-x); + color: var(--bs-tooltip-color); + text-align: center; + background-color: var(--bs-tooltip-bg); + border-radius: var(--bs-tooltip-border-radius); +} + +.popover { + --bs-popover-zindex: 1070; + --bs-popover-max-width: 276px; + --bs-popover-font-size: 0.875rem; + --bs-popover-bg: var(--bs-body-bg); + --bs-popover-border-width: var(--bs-border-width); + --bs-popover-border-color: var(--bs-border-color-translucent); + --bs-popover-border-radius: var(--bs-border-radius-lg); + --bs-popover-inner-border-radius: calc(var(--bs-border-radius-lg) - var(--bs-border-width)); + --bs-popover-box-shadow: var(--bs-box-shadow); + --bs-popover-header-padding-x: 1rem; + --bs-popover-header-padding-y: 0.5rem; + --bs-popover-header-font-size: 1rem; + --bs-popover-header-color: inherit; + --bs-popover-header-bg: var(--bs-secondary-bg); + --bs-popover-body-padding-x: 1rem; + --bs-popover-body-padding-y: 1rem; + --bs-popover-body-color: var(--bs-body-color); + --bs-popover-arrow-width: 1rem; + --bs-popover-arrow-height: 0.5rem; + --bs-popover-arrow-border: var(--bs-popover-border-color); + z-index: var(--bs-popover-zindex); + display: block; + max-width: var(--bs-popover-max-width); + font-family: var(--bs-font-sans-serif); + font-style: normal; + font-weight: 400; + line-height: 1.5; + text-align: left; + text-align: start; + text-decoration: none; + text-shadow: none; + text-transform: none; + letter-spacing: normal; + word-break: normal; + white-space: normal; + word-spacing: normal; + line-break: auto; + font-size: var(--bs-popover-font-size); + word-wrap: break-word; + background-color: var(--bs-popover-bg); + background-clip: padding-box; + border: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-radius: var(--bs-popover-border-radius); +} +.popover .popover-arrow { + display: block; + width: var(--bs-popover-arrow-width); + height: var(--bs-popover-arrow-height); +} +.popover .popover-arrow::before, .popover .popover-arrow::after { + position: absolute; + display: block; + content: ""; + border-color: transparent; + border-style: solid; + border-width: 0; +} + +.bs-popover-top > .popover-arrow, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow { + bottom: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +} +.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before, .bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { + border-width: var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; +} +.bs-popover-top > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::before { + bottom: 0; + border-top-color: var(--bs-popover-arrow-border); +} +.bs-popover-top > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=top] > .popover-arrow::after { + bottom: var(--bs-popover-border-width); + border-top-color: var(--bs-popover-bg); +} + +/* rtl:begin:ignore */ +.bs-popover-end > .popover-arrow, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow { + left: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before, .bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height) calc(var(--bs-popover-arrow-width) * 0.5) 0; +} +.bs-popover-end > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::before { + left: 0; + border-right-color: var(--bs-popover-arrow-border); +} +.bs-popover-end > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=right] > .popover-arrow::after { + left: var(--bs-popover-border-width); + border-right-color: var(--bs-popover-bg); +} + +/* rtl:end:ignore */ +.bs-popover-bottom > .popover-arrow, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow { + top: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); +} +.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before, .bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { + border-width: 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); +} +.bs-popover-bottom > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::before { + top: 0; + border-bottom-color: var(--bs-popover-arrow-border); +} +.bs-popover-bottom > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=bottom] > .popover-arrow::after { + top: var(--bs-popover-border-width); + border-bottom-color: var(--bs-popover-bg); +} +.bs-popover-bottom .popover-header::before, .bs-popover-auto[data-popper-placement^=bottom] .popover-header::before { + position: absolute; + top: 0; + left: 50%; + display: block; + width: var(--bs-popover-arrow-width); + margin-left: calc(-0.5 * var(--bs-popover-arrow-width)); + content: ""; + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-header-bg); +} + +/* rtl:begin:ignore */ +.bs-popover-start > .popover-arrow, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow { + right: calc(-1 * (var(--bs-popover-arrow-height)) - var(--bs-popover-border-width)); + width: var(--bs-popover-arrow-height); + height: var(--bs-popover-arrow-width); +} +.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before, .bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { + border-width: calc(var(--bs-popover-arrow-width) * 0.5) 0 calc(var(--bs-popover-arrow-width) * 0.5) var(--bs-popover-arrow-height); +} +.bs-popover-start > .popover-arrow::before, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::before { + right: 0; + border-left-color: var(--bs-popover-arrow-border); +} +.bs-popover-start > .popover-arrow::after, .bs-popover-auto[data-popper-placement^=left] > .popover-arrow::after { + right: var(--bs-popover-border-width); + border-left-color: var(--bs-popover-bg); +} + +/* rtl:end:ignore */ +.popover-header { + padding: var(--bs-popover-header-padding-y) var(--bs-popover-header-padding-x); + margin-bottom: 0; + font-size: var(--bs-popover-header-font-size); + color: var(--bs-popover-header-color); + background-color: var(--bs-popover-header-bg); + border-bottom: var(--bs-popover-border-width) solid var(--bs-popover-border-color); + border-top-left-radius: var(--bs-popover-inner-border-radius); + border-top-right-radius: var(--bs-popover-inner-border-radius); +} +.popover-header:empty { + display: none; +} + +.popover-body { + padding: var(--bs-popover-body-padding-y) var(--bs-popover-body-padding-x); + color: var(--bs-popover-body-color); +} + +.carousel { + position: relative; +} + +.carousel.pointer-event { + touch-action: pan-y; +} + +.carousel-inner { + position: relative; + width: 100%; + overflow: hidden; +} +.carousel-inner::after { + display: block; + clear: both; + content: ""; +} + +.carousel-item { + position: relative; + display: none; + float: left; + width: 100%; + margin-right: -100%; + backface-visibility: hidden; + transition: transform 0.6s ease-in-out; +} +@media (prefers-reduced-motion: reduce) { + .carousel-item { + transition: none; + } +} + +.carousel-item.active, +.carousel-item-next, +.carousel-item-prev { + display: block; +} + +.carousel-item-next:not(.carousel-item-start), +.active.carousel-item-end { + transform: translateX(100%); +} + +.carousel-item-prev:not(.carousel-item-end), +.active.carousel-item-start { + transform: translateX(-100%); +} + +.carousel-fade .carousel-item { + opacity: 0; + transition-property: opacity; + transform: none; +} +.carousel-fade .carousel-item.active, +.carousel-fade .carousel-item-next.carousel-item-start, +.carousel-fade .carousel-item-prev.carousel-item-end { + z-index: 1; + opacity: 1; +} +.carousel-fade .active.carousel-item-start, +.carousel-fade .active.carousel-item-end { + z-index: 0; + opacity: 0; + transition: opacity 0s 0.6s; +} +@media (prefers-reduced-motion: reduce) { + .carousel-fade .active.carousel-item-start, + .carousel-fade .active.carousel-item-end { + transition: none; + } +} + +.carousel-control-prev, +.carousel-control-next { + position: absolute; + top: 0; + bottom: 0; + z-index: 1; + display: flex; + align-items: center; + justify-content: center; + width: 15%; + padding: 0; + color: #fff; + text-align: center; + background: none; + filter: var(--bs-carousel-control-icon-filter); + border: 0; + opacity: 0.5; + transition: opacity 0.15s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-control-prev, + .carousel-control-next { + transition: none; + } +} +.carousel-control-prev:hover, .carousel-control-prev:focus, +.carousel-control-next:hover, +.carousel-control-next:focus { + color: #fff; + text-decoration: none; + outline: 0; + opacity: 0.9; +} + +.carousel-control-prev { + left: 0; +} + +.carousel-control-next { + right: 0; +} + +.carousel-control-prev-icon, +.carousel-control-next-icon { + display: inline-block; + width: 2rem; + height: 2rem; + background-repeat: no-repeat; + background-position: 50%; + background-size: 100% 100%; +} + +.carousel-control-prev-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e")*/; +} + +.carousel-control-next-icon { + background-image: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M4.646 1.646a.5.5 0 0 1 .708 0l6 6a.5.5 0 0 1 0 .708l-6 6a.5.5 0 0 1-.708-.708L10.293 8 4.646 2.354a.5.5 0 0 1 0-.708'/%3e%3c/svg%3e") /*rtl:url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%23fff'%3e%3cpath d='M11.354 1.646a.5.5 0 0 1 0 .708L5.707 8l5.647 5.646a.5.5 0 0 1-.708.708l-6-6a.5.5 0 0 1 0-.708l6-6a.5.5 0 0 1 .708 0'/%3e%3c/svg%3e")*/; +} + +.carousel-indicators { + position: absolute; + right: 0; + bottom: 0; + left: 0; + z-index: 2; + display: flex; + justify-content: center; + padding: 0; + margin-right: 15%; + margin-bottom: 1rem; + margin-left: 15%; +} +.carousel-indicators [data-bs-target] { + box-sizing: content-box; + flex: 0 1 auto; + width: 30px; + height: 3px; + padding: 0; + margin-right: 3px; + margin-left: 3px; + text-indent: -999px; + cursor: pointer; + background-color: var(--bs-carousel-indicator-active-bg); + background-clip: padding-box; + border: 0; + border-top: 10px solid transparent; + border-bottom: 10px solid transparent; + opacity: 0.5; + transition: opacity 0.6s ease; +} +@media (prefers-reduced-motion: reduce) { + .carousel-indicators [data-bs-target] { + transition: none; + } +} +.carousel-indicators .active { + opacity: 1; +} + +.carousel-caption { + position: absolute; + right: 15%; + bottom: 1.25rem; + left: 15%; + padding-top: 1.25rem; + padding-bottom: 1.25rem; + color: var(--bs-carousel-caption-color); + text-align: center; +} + +.carousel-dark { + --bs-carousel-indicator-active-bg: #000; + --bs-carousel-caption-color: #000; + --bs-carousel-control-icon-filter: invert(1) grayscale(100); +} + +:root, +[data-bs-theme=light] { + --bs-carousel-indicator-active-bg: #fff; + --bs-carousel-caption-color: #fff; + --bs-carousel-control-icon-filter: ; +} + +[data-bs-theme=dark] { + --bs-carousel-indicator-active-bg: #000; + --bs-carousel-caption-color: #000; + --bs-carousel-control-icon-filter: invert(1) grayscale(100); +} + +.spinner-grow, +.spinner-border { + display: inline-block; + width: var(--bs-spinner-width); + height: var(--bs-spinner-height); + vertical-align: var(--bs-spinner-vertical-align); + border-radius: 50%; + animation: var(--bs-spinner-animation-speed) linear infinite var(--bs-spinner-animation-name); +} + +@keyframes spinner-border { + to { + transform: rotate(360deg) /* rtl:ignore */; + } +} +.spinner-border { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-border-width: 0.25em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-border; + border: var(--bs-spinner-border-width) solid currentcolor; + border-right-color: transparent; +} + +.spinner-border-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; + --bs-spinner-border-width: 0.2em; +} + +@keyframes spinner-grow { + 0% { + transform: scale(0); + } + 50% { + opacity: 1; + transform: none; + } +} +.spinner-grow { + --bs-spinner-width: 2rem; + --bs-spinner-height: 2rem; + --bs-spinner-vertical-align: -0.125em; + --bs-spinner-animation-speed: 0.75s; + --bs-spinner-animation-name: spinner-grow; + background-color: currentcolor; + opacity: 0; +} + +.spinner-grow-sm { + --bs-spinner-width: 1rem; + --bs-spinner-height: 1rem; +} + +@media (prefers-reduced-motion: reduce) { + .spinner-border, + .spinner-grow { + --bs-spinner-animation-speed: 1.5s; + } +} +.offcanvas, .offcanvas-xxl, .offcanvas-xl, .offcanvas-lg, .offcanvas-md, .offcanvas-sm { + --bs-offcanvas-zindex: 1045; + --bs-offcanvas-width: 400px; + --bs-offcanvas-height: 30vh; + --bs-offcanvas-padding-x: 1rem; + --bs-offcanvas-padding-y: 1rem; + --bs-offcanvas-color: var(--bs-body-color); + --bs-offcanvas-bg: var(--bs-body-bg); + --bs-offcanvas-border-width: var(--bs-border-width); + --bs-offcanvas-border-color: var(--bs-border-color-translucent); + --bs-offcanvas-box-shadow: var(--bs-box-shadow-sm); + --bs-offcanvas-transition: transform 0.3s ease-in-out; + --bs-offcanvas-title-line-height: 1.5; +} + +@media (max-width: 575.98px) { + .offcanvas-sm { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 575.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-sm { + transition: none; + } +} +@media (max-width: 575.98px) { + .offcanvas-sm.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-sm.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-sm.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-sm.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-sm.showing, .offcanvas-sm.show:not(.hiding) { + transform: none; + } + .offcanvas-sm.showing, .offcanvas-sm.hiding, .offcanvas-sm.show { + visibility: visible; + } +} +@media (min-width: 576px) { + .offcanvas-sm { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-sm .offcanvas-header { + display: none; + } + .offcanvas-sm .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 767.98px) { + .offcanvas-md { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 767.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-md { + transition: none; + } +} +@media (max-width: 767.98px) { + .offcanvas-md.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-md.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-md.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-md.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-md.showing, .offcanvas-md.show:not(.hiding) { + transform: none; + } + .offcanvas-md.showing, .offcanvas-md.hiding, .offcanvas-md.show { + visibility: visible; + } +} +@media (min-width: 768px) { + .offcanvas-md { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-md .offcanvas-header { + display: none; + } + .offcanvas-md .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 991.98px) { + .offcanvas-lg { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 991.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-lg { + transition: none; + } +} +@media (max-width: 991.98px) { + .offcanvas-lg.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-lg.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-lg.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-lg.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-lg.showing, .offcanvas-lg.show:not(.hiding) { + transform: none; + } + .offcanvas-lg.showing, .offcanvas-lg.hiding, .offcanvas-lg.show { + visibility: visible; + } +} +@media (min-width: 992px) { + .offcanvas-lg { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-lg .offcanvas-header { + display: none; + } + .offcanvas-lg .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 1199.98px) { + .offcanvas-xl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 1199.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xl { + transition: none; + } +} +@media (max-width: 1199.98px) { + .offcanvas-xl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-xl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-xl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-xl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-xl.showing, .offcanvas-xl.show:not(.hiding) { + transform: none; + } + .offcanvas-xl.showing, .offcanvas-xl.hiding, .offcanvas-xl.show { + visibility: visible; + } +} +@media (min-width: 1200px) { + .offcanvas-xl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xl .offcanvas-header { + display: none; + } + .offcanvas-xl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +@media (max-width: 1399.98px) { + .offcanvas-xxl { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); + } +} +@media (max-width: 1399.98px) and (prefers-reduced-motion: reduce) { + .offcanvas-xxl { + transition: none; + } +} +@media (max-width: 1399.98px) { + .offcanvas-xxl.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); + } + .offcanvas-xxl.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); + } + .offcanvas-xxl.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); + } + .offcanvas-xxl.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); + } + .offcanvas-xxl.showing, .offcanvas-xxl.show:not(.hiding) { + transform: none; + } + .offcanvas-xxl.showing, .offcanvas-xxl.hiding, .offcanvas-xxl.show { + visibility: visible; + } +} +@media (min-width: 1400px) { + .offcanvas-xxl { + --bs-offcanvas-height: auto; + --bs-offcanvas-border-width: 0; + background-color: transparent !important; + } + .offcanvas-xxl .offcanvas-header { + display: none; + } + .offcanvas-xxl .offcanvas-body { + display: flex; + flex-grow: 0; + padding: 0; + overflow-y: visible; + background-color: transparent !important; + } +} + +.offcanvas { + position: fixed; + bottom: 0; + z-index: var(--bs-offcanvas-zindex); + display: flex; + flex-direction: column; + max-width: 100%; + color: var(--bs-offcanvas-color); + visibility: hidden; + background-color: var(--bs-offcanvas-bg); + background-clip: padding-box; + outline: 0; + transition: var(--bs-offcanvas-transition); +} +@media (prefers-reduced-motion: reduce) { + .offcanvas { + transition: none; + } +} +.offcanvas.offcanvas-start { + top: 0; + left: 0; + width: var(--bs-offcanvas-width); + border-right: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(-100%); +} +.offcanvas.offcanvas-end { + top: 0; + right: 0; + width: var(--bs-offcanvas-width); + border-left: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateX(100%); +} +.offcanvas.offcanvas-top { + top: 0; + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-bottom: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(-100%); +} +.offcanvas.offcanvas-bottom { + right: 0; + left: 0; + height: var(--bs-offcanvas-height); + max-height: 100%; + border-top: var(--bs-offcanvas-border-width) solid var(--bs-offcanvas-border-color); + transform: translateY(100%); +} +.offcanvas.showing, .offcanvas.show:not(.hiding) { + transform: none; +} +.offcanvas.showing, .offcanvas.hiding, .offcanvas.show { + visibility: visible; +} + +.offcanvas-backdrop { + position: fixed; + top: 0; + left: 0; + z-index: 1040; + width: 100vw; + height: 100vh; + background-color: #000; +} +.offcanvas-backdrop.fade { + opacity: 0; +} +.offcanvas-backdrop.show { + opacity: 0.5; +} + +.offcanvas-header { + display: flex; + align-items: center; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); +} +.offcanvas-header .btn-close { + padding: calc(var(--bs-offcanvas-padding-y) * 0.5) calc(var(--bs-offcanvas-padding-x) * 0.5); + margin-top: calc(-0.5 * var(--bs-offcanvas-padding-y)); + margin-right: calc(-0.5 * var(--bs-offcanvas-padding-x)); + margin-bottom: calc(-0.5 * var(--bs-offcanvas-padding-y)); + margin-left: auto; +} + +.offcanvas-title { + margin-bottom: 0; + line-height: var(--bs-offcanvas-title-line-height); +} + +.offcanvas-body { + flex-grow: 1; + padding: var(--bs-offcanvas-padding-y) var(--bs-offcanvas-padding-x); + overflow-y: auto; +} + +.placeholder { + display: inline-block; + min-height: 1em; + vertical-align: middle; + cursor: wait; + background-color: currentcolor; + opacity: 0.5; +} +.placeholder.btn::before { + display: inline-block; + content: ""; +} + +.placeholder-xs { + min-height: 0.6em; +} + +.placeholder-sm { + min-height: 0.8em; +} + +.placeholder-lg { + min-height: 1.2em; +} + +.placeholder-glow .placeholder { + animation: placeholder-glow 2s ease-in-out infinite; +} + +@keyframes placeholder-glow { + 50% { + opacity: 0.2; + } +} +.placeholder-wave { + -webkit-mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + mask-image: linear-gradient(130deg, #000 55%, rgba(0, 0, 0, 0.8) 75%, #000 95%); + -webkit-mask-size: 200% 100%; + mask-size: 200% 100%; + animation: placeholder-wave 2s linear infinite; +} + +@keyframes placeholder-wave { + 100% { + -webkit-mask-position: -200% 0%; + mask-position: -200% 0%; + } +} +.clearfix::after { + display: block; + clear: both; + content: ""; +} + +.text-bg-primary { + color: #fff !important; + background-color: RGBA(var(--bs-primary-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-secondary { + color: #fff !important; + background-color: RGBA(var(--bs-secondary-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-success { + color: #fff !important; + background-color: RGBA(var(--bs-success-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-info { + color: #000 !important; + background-color: RGBA(var(--bs-info-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-warning { + color: #000 !important; + background-color: RGBA(var(--bs-warning-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-danger { + color: #fff !important; + background-color: RGBA(var(--bs-danger-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-light { + color: #000 !important; + background-color: RGBA(var(--bs-light-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.text-bg-dark { + color: #fff !important; + background-color: RGBA(var(--bs-dark-rgb), var(--bs-bg-opacity, 1)) !important; +} + +.link-primary { + color: RGBA(var(--bs-primary-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-primary-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-primary:hover, .link-primary:focus { + color: RGBA(10, 88, 202, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(10, 88, 202, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-secondary { + color: RGBA(var(--bs-secondary-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-secondary-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-secondary:hover, .link-secondary:focus { + color: RGBA(86, 94, 100, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(86, 94, 100, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-success { + color: RGBA(var(--bs-success-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-success-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-success:hover, .link-success:focus { + color: RGBA(20, 108, 67, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(20, 108, 67, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-info { + color: RGBA(var(--bs-info-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-info-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-info:hover, .link-info:focus { + color: RGBA(61, 213, 243, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(61, 213, 243, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-warning { + color: RGBA(var(--bs-warning-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-warning-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-warning:hover, .link-warning:focus { + color: RGBA(255, 205, 57, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(255, 205, 57, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-danger { + color: RGBA(var(--bs-danger-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-danger-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-danger:hover, .link-danger:focus { + color: RGBA(176, 42, 55, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(176, 42, 55, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-light { + color: RGBA(var(--bs-light-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-light-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-light:hover, .link-light:focus { + color: RGBA(249, 250, 251, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(249, 250, 251, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-dark { + color: RGBA(var(--bs-dark-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-dark-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-dark:hover, .link-dark:focus { + color: RGBA(26, 30, 33, var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(26, 30, 33, var(--bs-link-underline-opacity, 1)) !important; +} + +.link-body-emphasis { + color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 1)) !important; + text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 1)) !important; +} +.link-body-emphasis:hover, .link-body-emphasis:focus { + color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-opacity, 0.75)) !important; + text-decoration-color: RGBA(var(--bs-emphasis-color-rgb), var(--bs-link-underline-opacity, 0.75)) !important; +} + +.focus-ring:focus { + outline: 0; + box-shadow: var(--bs-focus-ring-x, 0) var(--bs-focus-ring-y, 0) var(--bs-focus-ring-blur, 0) var(--bs-focus-ring-width) var(--bs-focus-ring-color); +} + +.icon-link { + display: inline-flex; + gap: 0.375rem; + align-items: center; + text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-opacity, 0.5)); + text-underline-offset: 0.25em; + backface-visibility: hidden; +} +.icon-link > .bi { + flex-shrink: 0; + width: 1em; + height: 1em; + fill: currentcolor; + transition: 0.2s ease-in-out transform; +} +@media (prefers-reduced-motion: reduce) { + .icon-link > .bi { + transition: none; + } +} + +.icon-link-hover:hover > .bi, .icon-link-hover:focus-visible > .bi { + transform: var(--bs-icon-link-transform, translate3d(0.25em, 0, 0)); +} + +.ratio { + position: relative; + width: 100%; +} +.ratio::before { + display: block; + padding-top: var(--bs-aspect-ratio); + content: ""; +} +.ratio > * { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; +} + +.ratio-1x1 { + --bs-aspect-ratio: 100%; +} + +.ratio-4x3 { + --bs-aspect-ratio: 75%; +} + +.ratio-16x9 { + --bs-aspect-ratio: 56.25%; +} + +.ratio-21x9 { + --bs-aspect-ratio: 42.8571428571%; +} + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; +} + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; +} + +.sticky-top { + position: sticky; + top: 0; + z-index: 1020; +} + +.sticky-bottom { + position: sticky; + bottom: 0; + z-index: 1020; +} + +@media (min-width: 576px) { + .sticky-sm-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-sm-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 768px) { + .sticky-md-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-md-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 992px) { + .sticky-lg-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-lg-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1200px) { + .sticky-xl-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xl-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +@media (min-width: 1400px) { + .sticky-xxl-top { + position: sticky; + top: 0; + z-index: 1020; + } + .sticky-xxl-bottom { + position: sticky; + bottom: 0; + z-index: 1020; + } +} +.hstack { + display: flex; + flex-direction: row; + align-items: center; + align-self: stretch; +} + +.vstack { + display: flex; + flex: 1 1 auto; + flex-direction: column; + align-self: stretch; +} + +.visually-hidden, +.visually-hidden-focusable:not(:focus):not(:focus-within) { + width: 1px !important; + height: 1px !important; + padding: 0 !important; + margin: -1px !important; + overflow: hidden !important; + clip: rect(0, 0, 0, 0) !important; + white-space: nowrap !important; + border: 0 !important; +} +.visually-hidden:not(caption), +.visually-hidden-focusable:not(:focus):not(:focus-within):not(caption) { + position: absolute !important; +} +.visually-hidden *, +.visually-hidden-focusable:not(:focus):not(:focus-within) * { + overflow: hidden !important; +} + +.stretched-link::after { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1; + content: ""; +} + +.text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.vr { + display: inline-block; + align-self: stretch; + width: var(--bs-border-width); + min-height: 1em; + background-color: currentcolor; + opacity: 0.25; +} + +.align-baseline { + vertical-align: baseline !important; +} + +.align-top { + vertical-align: top !important; +} + +.align-middle { + vertical-align: middle !important; +} + +.align-bottom { + vertical-align: bottom !important; +} + +.align-text-bottom { + vertical-align: text-bottom !important; +} + +.align-text-top { + vertical-align: text-top !important; +} + +.float-start { + float: left !important; +} + +.float-end { + float: right !important; +} + +.float-none { + float: none !important; +} + +.object-fit-contain { + -o-object-fit: contain !important; + object-fit: contain !important; +} + +.object-fit-cover { + -o-object-fit: cover !important; + object-fit: cover !important; +} + +.object-fit-fill { + -o-object-fit: fill !important; + object-fit: fill !important; +} + +.object-fit-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; +} + +.object-fit-none { + -o-object-fit: none !important; + object-fit: none !important; +} + +.opacity-0 { + opacity: 0 !important; +} + +.opacity-25 { + opacity: 0.25 !important; +} + +.opacity-50 { + opacity: 0.5 !important; +} + +.opacity-75 { + opacity: 0.75 !important; +} + +.opacity-100 { + opacity: 1 !important; +} + +.overflow-auto { + overflow: auto !important; +} + +.overflow-hidden { + overflow: hidden !important; +} + +.overflow-visible { + overflow: visible !important; +} + +.overflow-scroll { + overflow: scroll !important; +} + +.overflow-x-auto { + overflow-x: auto !important; +} + +.overflow-x-hidden { + overflow-x: hidden !important; +} + +.overflow-x-visible { + overflow-x: visible !important; +} + +.overflow-x-scroll { + overflow-x: scroll !important; +} + +.overflow-y-auto { + overflow-y: auto !important; +} + +.overflow-y-hidden { + overflow-y: hidden !important; +} + +.overflow-y-visible { + overflow-y: visible !important; +} + +.overflow-y-scroll { + overflow-y: scroll !important; +} + +.d-inline { + display: inline !important; +} + +.d-inline-block { + display: inline-block !important; +} + +.d-block { + display: block !important; +} + +.d-grid { + display: grid !important; +} + +.d-inline-grid { + display: inline-grid !important; +} + +.d-table { + display: table !important; +} + +.d-table-row { + display: table-row !important; +} + +.d-table-cell { + display: table-cell !important; +} + +.d-flex { + display: flex !important; +} + +.d-inline-flex { + display: inline-flex !important; +} + +.d-none { + display: none !important; +} + +.shadow { + box-shadow: var(--bs-box-shadow) !important; +} + +.shadow-sm { + box-shadow: var(--bs-box-shadow-sm) !important; +} + +.shadow-lg { + box-shadow: var(--bs-box-shadow-lg) !important; +} + +.shadow-none { + box-shadow: none !important; +} + +.focus-ring-primary { + --bs-focus-ring-color: rgba(var(--bs-primary-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-secondary { + --bs-focus-ring-color: rgba(var(--bs-secondary-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-success { + --bs-focus-ring-color: rgba(var(--bs-success-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-info { + --bs-focus-ring-color: rgba(var(--bs-info-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-warning { + --bs-focus-ring-color: rgba(var(--bs-warning-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-danger { + --bs-focus-ring-color: rgba(var(--bs-danger-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-light { + --bs-focus-ring-color: rgba(var(--bs-light-rgb), var(--bs-focus-ring-opacity)); +} + +.focus-ring-dark { + --bs-focus-ring-color: rgba(var(--bs-dark-rgb), var(--bs-focus-ring-opacity)); +} + +.position-static { + position: static !important; +} + +.position-relative { + position: relative !important; +} + +.position-absolute { + position: absolute !important; +} + +.position-fixed { + position: fixed !important; +} + +.position-sticky { + position: sticky !important; +} + +.top-0 { + top: 0 !important; +} + +.top-50 { + top: 50% !important; +} + +.top-100 { + top: 100% !important; +} + +.bottom-0 { + bottom: 0 !important; +} + +.bottom-50 { + bottom: 50% !important; +} + +.bottom-100 { + bottom: 100% !important; +} + +.start-0 { + left: 0 !important; +} + +.start-50 { + left: 50% !important; +} + +.start-100 { + left: 100% !important; +} + +.end-0 { + right: 0 !important; +} + +.end-50 { + right: 50% !important; +} + +.end-100 { + right: 100% !important; +} + +.translate-middle { + transform: translate(-50%, -50%) !important; +} + +.translate-middle-x { + transform: translateX(-50%) !important; +} + +.translate-middle-y { + transform: translateY(-50%) !important; +} + +.border { + border: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-0 { + border: 0 !important; +} + +.border-top { + border-top: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-top-0 { + border-top: 0 !important; +} + +.border-end { + border-right: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-end-0 { + border-right: 0 !important; +} + +.border-bottom { + border-bottom: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-bottom-0 { + border-bottom: 0 !important; +} + +.border-start { + border-left: var(--bs-border-width) var(--bs-border-style) var(--bs-border-color) !important; +} + +.border-start-0 { + border-left: 0 !important; +} + +.border-primary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-primary-rgb), var(--bs-border-opacity)) !important; +} + +.border-secondary { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-secondary-rgb), var(--bs-border-opacity)) !important; +} + +.border-success { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-success-rgb), var(--bs-border-opacity)) !important; +} + +.border-info { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-info-rgb), var(--bs-border-opacity)) !important; +} + +.border-warning { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-warning-rgb), var(--bs-border-opacity)) !important; +} + +.border-danger { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-danger-rgb), var(--bs-border-opacity)) !important; +} + +.border-light { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-light-rgb), var(--bs-border-opacity)) !important; +} + +.border-dark { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-dark-rgb), var(--bs-border-opacity)) !important; +} + +.border-black { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-black-rgb), var(--bs-border-opacity)) !important; +} + +.border-white { + --bs-border-opacity: 1; + border-color: rgba(var(--bs-white-rgb), var(--bs-border-opacity)) !important; +} + +.border-primary-subtle { + border-color: var(--bs-primary-border-subtle) !important; +} + +.border-secondary-subtle { + border-color: var(--bs-secondary-border-subtle) !important; +} + +.border-success-subtle { + border-color: var(--bs-success-border-subtle) !important; +} + +.border-info-subtle { + border-color: var(--bs-info-border-subtle) !important; +} + +.border-warning-subtle { + border-color: var(--bs-warning-border-subtle) !important; +} + +.border-danger-subtle { + border-color: var(--bs-danger-border-subtle) !important; +} + +.border-light-subtle { + border-color: var(--bs-light-border-subtle) !important; +} + +.border-dark-subtle { + border-color: var(--bs-dark-border-subtle) !important; +} + +.border-1 { + border-width: 1px !important; +} + +.border-2 { + border-width: 2px !important; +} + +.border-3 { + border-width: 3px !important; +} + +.border-4 { + border-width: 4px !important; +} + +.border-5 { + border-width: 5px !important; +} + +.border-opacity-10 { + --bs-border-opacity: 0.1; +} + +.border-opacity-25 { + --bs-border-opacity: 0.25; +} + +.border-opacity-50 { + --bs-border-opacity: 0.5; +} + +.border-opacity-75 { + --bs-border-opacity: 0.75; +} + +.border-opacity-100 { + --bs-border-opacity: 1; +} + +.w-25 { + width: 25% !important; +} + +.w-50 { + width: 50% !important; +} + +.w-75 { + width: 75% !important; +} + +.w-100 { + width: 100% !important; +} + +.w-auto { + width: auto !important; +} + +.mw-100 { + max-width: 100% !important; +} + +.vw-100 { + width: 100vw !important; +} + +.min-vw-100 { + min-width: 100vw !important; +} + +.h-25 { + height: 25% !important; +} + +.h-50 { + height: 50% !important; +} + +.h-75 { + height: 75% !important; +} + +.h-100 { + height: 100% !important; +} + +.h-auto { + height: auto !important; +} + +.mh-100 { + max-height: 100% !important; +} + +.vh-100 { + height: 100vh !important; +} + +.min-vh-100 { + min-height: 100vh !important; +} + +.flex-fill { + flex: 1 1 auto !important; +} + +.flex-row { + flex-direction: row !important; +} + +.flex-column { + flex-direction: column !important; +} + +.flex-row-reverse { + flex-direction: row-reverse !important; +} + +.flex-column-reverse { + flex-direction: column-reverse !important; +} + +.flex-grow-0 { + flex-grow: 0 !important; +} + +.flex-grow-1 { + flex-grow: 1 !important; +} + +.flex-shrink-0 { + flex-shrink: 0 !important; +} + +.flex-shrink-1 { + flex-shrink: 1 !important; +} + +.flex-wrap { + flex-wrap: wrap !important; +} + +.flex-nowrap { + flex-wrap: nowrap !important; +} + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; +} + +.justify-content-start { + justify-content: flex-start !important; +} + +.justify-content-end { + justify-content: flex-end !important; +} + +.justify-content-center { + justify-content: center !important; +} + +.justify-content-between { + justify-content: space-between !important; +} + +.justify-content-around { + justify-content: space-around !important; +} + +.justify-content-evenly { + justify-content: space-evenly !important; +} + +.align-items-start { + align-items: flex-start !important; +} + +.align-items-end { + align-items: flex-end !important; +} + +.align-items-center { + align-items: center !important; +} + +.align-items-baseline { + align-items: baseline !important; +} + +.align-items-stretch { + align-items: stretch !important; +} + +.align-content-start { + align-content: flex-start !important; +} + +.align-content-end { + align-content: flex-end !important; +} + +.align-content-center { + align-content: center !important; +} + +.align-content-between { + align-content: space-between !important; +} + +.align-content-around { + align-content: space-around !important; +} + +.align-content-stretch { + align-content: stretch !important; +} + +.align-self-auto { + align-self: auto !important; +} + +.align-self-start { + align-self: flex-start !important; +} + +.align-self-end { + align-self: flex-end !important; +} + +.align-self-center { + align-self: center !important; +} + +.align-self-baseline { + align-self: baseline !important; +} + +.align-self-stretch { + align-self: stretch !important; +} + +.order-first { + order: -1 !important; +} + +.order-0 { + order: 0 !important; +} + +.order-1 { + order: 1 !important; +} + +.order-2 { + order: 2 !important; +} + +.order-3 { + order: 3 !important; +} + +.order-4 { + order: 4 !important; +} + +.order-5 { + order: 5 !important; +} + +.order-last { + order: 6 !important; +} + +.m-0 { + margin: 0 !important; +} + +.m-1 { + margin: 0.25rem !important; +} + +.m-2 { + margin: 0.5rem !important; +} + +.m-3 { + margin: 1rem !important; +} + +.m-4 { + margin: 1.5rem !important; +} + +.m-5 { + margin: 3rem !important; +} + +.m-auto { + margin: auto !important; +} + +.mx-0 { + margin-right: 0 !important; + margin-left: 0 !important; +} + +.mx-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; +} + +.mx-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; +} + +.mx-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; +} + +.mx-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; +} + +.mx-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; +} + +.mx-auto { + margin-right: auto !important; + margin-left: auto !important; +} + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; +} + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; +} + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; +} + +.my-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; +} + +.my-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; +} + +.my-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; +} + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; +} + +.mt-0 { + margin-top: 0 !important; +} + +.mt-1 { + margin-top: 0.25rem !important; +} + +.mt-2 { + margin-top: 0.5rem !important; +} + +.mt-3 { + margin-top: 1rem !important; +} + +.mt-4 { + margin-top: 1.5rem !important; +} + +.mt-5 { + margin-top: 3rem !important; +} + +.mt-auto { + margin-top: auto !important; +} + +.me-0 { + margin-right: 0 !important; +} + +.me-1 { + margin-right: 0.25rem !important; +} + +.me-2 { + margin-right: 0.5rem !important; +} + +.me-3 { + margin-right: 1rem !important; +} + +.me-4 { + margin-right: 1.5rem !important; +} + +.me-5 { + margin-right: 3rem !important; +} + +.me-auto { + margin-right: auto !important; +} + +.mb-0 { + margin-bottom: 0 !important; +} + +.mb-1 { + margin-bottom: 0.25rem !important; +} + +.mb-2 { + margin-bottom: 0.5rem !important; +} + +.mb-3 { + margin-bottom: 1rem !important; +} + +.mb-4 { + margin-bottom: 1.5rem !important; +} + +.mb-5 { + margin-bottom: 3rem !important; +} + +.mb-auto { + margin-bottom: auto !important; +} + +.ms-0 { + margin-left: 0 !important; +} + +.ms-1 { + margin-left: 0.25rem !important; +} + +.ms-2 { + margin-left: 0.5rem !important; +} + +.ms-3 { + margin-left: 1rem !important; +} + +.ms-4 { + margin-left: 1.5rem !important; +} + +.ms-5 { + margin-left: 3rem !important; +} + +.ms-auto { + margin-left: auto !important; +} + +.p-0 { + padding: 0 !important; +} + +.p-1 { + padding: 0.25rem !important; +} + +.p-2 { + padding: 0.5rem !important; +} + +.p-3 { + padding: 1rem !important; +} + +.p-4 { + padding: 1.5rem !important; +} + +.p-5 { + padding: 3rem !important; +} + +.px-0 { + padding-right: 0 !important; + padding-left: 0 !important; +} + +.px-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; +} + +.px-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; +} + +.px-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; +} + +.px-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; +} + +.px-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; +} + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; +} + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; +} + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; +} + +.py-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; +} + +.py-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; +} + +.py-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; +} + +.pt-0 { + padding-top: 0 !important; +} + +.pt-1 { + padding-top: 0.25rem !important; +} + +.pt-2 { + padding-top: 0.5rem !important; +} + +.pt-3 { + padding-top: 1rem !important; +} + +.pt-4 { + padding-top: 1.5rem !important; +} + +.pt-5 { + padding-top: 3rem !important; +} + +.pe-0 { + padding-right: 0 !important; +} + +.pe-1 { + padding-right: 0.25rem !important; +} + +.pe-2 { + padding-right: 0.5rem !important; +} + +.pe-3 { + padding-right: 1rem !important; +} + +.pe-4 { + padding-right: 1.5rem !important; +} + +.pe-5 { + padding-right: 3rem !important; +} + +.pb-0 { + padding-bottom: 0 !important; +} + +.pb-1 { + padding-bottom: 0.25rem !important; +} + +.pb-2 { + padding-bottom: 0.5rem !important; +} + +.pb-3 { + padding-bottom: 1rem !important; +} + +.pb-4 { + padding-bottom: 1.5rem !important; +} + +.pb-5 { + padding-bottom: 3rem !important; +} + +.ps-0 { + padding-left: 0 !important; +} + +.ps-1 { + padding-left: 0.25rem !important; +} + +.ps-2 { + padding-left: 0.5rem !important; +} + +.ps-3 { + padding-left: 1rem !important; +} + +.ps-4 { + padding-left: 1.5rem !important; +} + +.ps-5 { + padding-left: 3rem !important; +} + +.gap-0 { + gap: 0 !important; +} + +.gap-1 { + gap: 0.25rem !important; +} + +.gap-2 { + gap: 0.5rem !important; +} + +.gap-3 { + gap: 1rem !important; +} + +.gap-4 { + gap: 1.5rem !important; +} + +.gap-5 { + gap: 3rem !important; +} + +.row-gap-0 { + row-gap: 0 !important; +} + +.row-gap-1 { + row-gap: 0.25rem !important; +} + +.row-gap-2 { + row-gap: 0.5rem !important; +} + +.row-gap-3 { + row-gap: 1rem !important; +} + +.row-gap-4 { + row-gap: 1.5rem !important; +} + +.row-gap-5 { + row-gap: 3rem !important; +} + +.column-gap-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; +} + +.column-gap-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; +} + +.column-gap-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; +} + +.column-gap-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; +} + +.column-gap-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; +} + +.column-gap-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; +} + +.font-monospace { + font-family: var(--bs-font-monospace) !important; +} + +.fs-1 { + font-size: calc(1.375rem + 1.5vw) !important; +} + +.fs-2 { + font-size: calc(1.325rem + 0.9vw) !important; +} + +.fs-3 { + font-size: calc(1.3rem + 0.6vw) !important; +} + +.fs-4 { + font-size: calc(1.275rem + 0.3vw) !important; +} + +.fs-5 { + font-size: 1.25rem !important; +} + +.fs-6 { + font-size: 1rem !important; +} + +.fst-italic { + font-style: italic !important; +} + +.fst-normal { + font-style: normal !important; +} + +.fw-lighter { + font-weight: lighter !important; +} + +.fw-light { + font-weight: 300 !important; +} + +.fw-normal { + font-weight: 400 !important; +} + +.fw-medium { + font-weight: 500 !important; +} + +.fw-semibold { + font-weight: 600 !important; +} + +.fw-bold { + font-weight: 700 !important; +} + +.fw-bolder { + font-weight: bolder !important; +} + +.lh-1 { + line-height: 1 !important; +} + +.lh-sm { + line-height: 1.25 !important; +} + +.lh-base { + line-height: 1.5 !important; +} + +.lh-lg { + line-height: 2 !important; +} + +.text-start { + text-align: left !important; +} + +.text-end { + text-align: right !important; +} + +.text-center { + text-align: center !important; +} + +.text-decoration-none { + text-decoration: none !important; +} + +.text-decoration-underline { + text-decoration: underline !important; +} + +.text-decoration-line-through { + text-decoration: line-through !important; +} + +.text-lowercase { + text-transform: lowercase !important; +} + +.text-uppercase { + text-transform: uppercase !important; +} + +.text-capitalize { + text-transform: capitalize !important; +} + +.text-wrap { + white-space: normal !important; +} + +.text-nowrap { + white-space: nowrap !important; +} + +/* rtl:begin:remove */ +.text-break { + word-wrap: break-word !important; + word-break: break-word !important; +} + +/* rtl:end:remove */ +.text-primary { + --bs-text-opacity: 1; + color: rgba(var(--bs-primary-rgb), var(--bs-text-opacity)) !important; +} + +.text-secondary { + --bs-text-opacity: 1; + color: rgba(var(--bs-secondary-rgb), var(--bs-text-opacity)) !important; +} + +.text-success { + --bs-text-opacity: 1; + color: rgba(var(--bs-success-rgb), var(--bs-text-opacity)) !important; +} + +.text-info { + --bs-text-opacity: 1; + color: rgba(var(--bs-info-rgb), var(--bs-text-opacity)) !important; +} + +.text-warning { + --bs-text-opacity: 1; + color: rgba(var(--bs-warning-rgb), var(--bs-text-opacity)) !important; +} + +.text-danger { + --bs-text-opacity: 1; + color: rgba(var(--bs-danger-rgb), var(--bs-text-opacity)) !important; +} + +.text-light { + --bs-text-opacity: 1; + color: rgba(var(--bs-light-rgb), var(--bs-text-opacity)) !important; +} + +.text-dark { + --bs-text-opacity: 1; + color: rgba(var(--bs-dark-rgb), var(--bs-text-opacity)) !important; +} + +.text-black { + --bs-text-opacity: 1; + color: rgba(var(--bs-black-rgb), var(--bs-text-opacity)) !important; +} + +.text-white { + --bs-text-opacity: 1; + color: rgba(var(--bs-white-rgb), var(--bs-text-opacity)) !important; +} + +.text-body { + --bs-text-opacity: 1; + color: rgba(var(--bs-body-color-rgb), var(--bs-text-opacity)) !important; +} + +.text-muted { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; +} + +.text-black-50 { + --bs-text-opacity: 1; + color: rgba(0, 0, 0, 0.5) !important; +} + +.text-white-50 { + --bs-text-opacity: 1; + color: rgba(255, 255, 255, 0.5) !important; +} + +.text-body-secondary { + --bs-text-opacity: 1; + color: var(--bs-secondary-color) !important; +} + +.text-body-tertiary { + --bs-text-opacity: 1; + color: var(--bs-tertiary-color) !important; +} + +.text-body-emphasis { + --bs-text-opacity: 1; + color: var(--bs-emphasis-color) !important; +} + +.text-reset { + --bs-text-opacity: 1; + color: inherit !important; +} + +.text-opacity-25 { + --bs-text-opacity: 0.25; +} + +.text-opacity-50 { + --bs-text-opacity: 0.5; +} + +.text-opacity-75 { + --bs-text-opacity: 0.75; +} + +.text-opacity-100 { + --bs-text-opacity: 1; +} + +.text-primary-emphasis { + color: var(--bs-primary-text-emphasis) !important; +} + +.text-secondary-emphasis { + color: var(--bs-secondary-text-emphasis) !important; +} + +.text-success-emphasis { + color: var(--bs-success-text-emphasis) !important; +} + +.text-info-emphasis { + color: var(--bs-info-text-emphasis) !important; +} + +.text-warning-emphasis { + color: var(--bs-warning-text-emphasis) !important; +} + +.text-danger-emphasis { + color: var(--bs-danger-text-emphasis) !important; +} + +.text-light-emphasis { + color: var(--bs-light-text-emphasis) !important; +} + +.text-dark-emphasis { + color: var(--bs-dark-text-emphasis) !important; +} + +.link-opacity-10 { + --bs-link-opacity: 0.1; +} + +.link-opacity-10-hover:hover { + --bs-link-opacity: 0.1; +} + +.link-opacity-25 { + --bs-link-opacity: 0.25; +} + +.link-opacity-25-hover:hover { + --bs-link-opacity: 0.25; +} + +.link-opacity-50 { + --bs-link-opacity: 0.5; +} + +.link-opacity-50-hover:hover { + --bs-link-opacity: 0.5; +} + +.link-opacity-75 { + --bs-link-opacity: 0.75; +} + +.link-opacity-75-hover:hover { + --bs-link-opacity: 0.75; +} + +.link-opacity-100 { + --bs-link-opacity: 1; +} + +.link-opacity-100-hover:hover { + --bs-link-opacity: 1; +} + +.link-offset-1 { + text-underline-offset: 0.125em !important; +} + +.link-offset-1-hover:hover { + text-underline-offset: 0.125em !important; +} + +.link-offset-2 { + text-underline-offset: 0.25em !important; +} + +.link-offset-2-hover:hover { + text-underline-offset: 0.25em !important; +} + +.link-offset-3 { + text-underline-offset: 0.375em !important; +} + +.link-offset-3-hover:hover { + text-underline-offset: 0.375em !important; +} + +.link-underline-primary { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-primary-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-secondary { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-secondary-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-success { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-success-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-info { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-info-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-warning { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-warning-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-danger { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-danger-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-light { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-light-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline-dark { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-dark-rgb), var(--bs-link-underline-opacity)) !important; +} + +.link-underline { + --bs-link-underline-opacity: 1; + text-decoration-color: rgba(var(--bs-link-color-rgb), var(--bs-link-underline-opacity, 1)) !important; +} + +.link-underline-opacity-0 { + --bs-link-underline-opacity: 0; +} + +.link-underline-opacity-0-hover:hover { + --bs-link-underline-opacity: 0; +} + +.link-underline-opacity-10 { + --bs-link-underline-opacity: 0.1; +} + +.link-underline-opacity-10-hover:hover { + --bs-link-underline-opacity: 0.1; +} + +.link-underline-opacity-25 { + --bs-link-underline-opacity: 0.25; +} + +.link-underline-opacity-25-hover:hover { + --bs-link-underline-opacity: 0.25; +} + +.link-underline-opacity-50 { + --bs-link-underline-opacity: 0.5; +} + +.link-underline-opacity-50-hover:hover { + --bs-link-underline-opacity: 0.5; +} + +.link-underline-opacity-75 { + --bs-link-underline-opacity: 0.75; +} + +.link-underline-opacity-75-hover:hover { + --bs-link-underline-opacity: 0.75; +} + +.link-underline-opacity-100 { + --bs-link-underline-opacity: 1; +} + +.link-underline-opacity-100-hover:hover { + --bs-link-underline-opacity: 1; +} + +.bg-primary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-primary-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-success { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-success-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-info { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-info-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-warning { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-warning-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-danger { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-danger-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-light { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-light-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-dark { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-dark-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-black { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-black-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-white { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-white-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-body { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-body-bg-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-transparent { + --bs-bg-opacity: 1; + background-color: transparent !important; +} + +.bg-body-secondary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-secondary-bg-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-body-tertiary { + --bs-bg-opacity: 1; + background-color: rgba(var(--bs-tertiary-bg-rgb), var(--bs-bg-opacity)) !important; +} + +.bg-opacity-10 { + --bs-bg-opacity: 0.1; +} + +.bg-opacity-25 { + --bs-bg-opacity: 0.25; +} + +.bg-opacity-50 { + --bs-bg-opacity: 0.5; +} + +.bg-opacity-75 { + --bs-bg-opacity: 0.75; +} + +.bg-opacity-100 { + --bs-bg-opacity: 1; +} + +.bg-primary-subtle { + background-color: var(--bs-primary-bg-subtle) !important; +} + +.bg-secondary-subtle { + background-color: var(--bs-secondary-bg-subtle) !important; +} + +.bg-success-subtle { + background-color: var(--bs-success-bg-subtle) !important; +} + +.bg-info-subtle { + background-color: var(--bs-info-bg-subtle) !important; +} + +.bg-warning-subtle { + background-color: var(--bs-warning-bg-subtle) !important; +} + +.bg-danger-subtle { + background-color: var(--bs-danger-bg-subtle) !important; +} + +.bg-light-subtle { + background-color: var(--bs-light-bg-subtle) !important; +} + +.bg-dark-subtle { + background-color: var(--bs-dark-bg-subtle) !important; +} + +.bg-gradient { + background-image: var(--bs-gradient) !important; +} + +.user-select-all { + -webkit-user-select: all !important; + -moz-user-select: all !important; + user-select: all !important; +} + +.user-select-auto { + -webkit-user-select: auto !important; + -moz-user-select: auto !important; + user-select: auto !important; +} + +.user-select-none { + -webkit-user-select: none !important; + -moz-user-select: none !important; + user-select: none !important; +} + +.pe-none { + pointer-events: none !important; +} + +.pe-auto { + pointer-events: auto !important; +} + +.rounded { + border-radius: var(--bs-border-radius) !important; +} + +.rounded-0 { + border-radius: 0 !important; +} + +.rounded-1 { + border-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-2 { + border-radius: var(--bs-border-radius) !important; +} + +.rounded-3 { + border-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-4 { + border-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-5 { + border-radius: var(--bs-border-radius-xxl) !important; +} + +.rounded-circle { + border-radius: 50% !important; +} + +.rounded-pill { + border-radius: var(--bs-border-radius-pill) !important; +} + +.rounded-top { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} + +.rounded-top-0 { + border-top-left-radius: 0 !important; + border-top-right-radius: 0 !important; +} + +.rounded-top-1 { + border-top-left-radius: var(--bs-border-radius-sm) !important; + border-top-right-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-top-2 { + border-top-left-radius: var(--bs-border-radius) !important; + border-top-right-radius: var(--bs-border-radius) !important; +} + +.rounded-top-3 { + border-top-left-radius: var(--bs-border-radius-lg) !important; + border-top-right-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-top-4 { + border-top-left-radius: var(--bs-border-radius-xl) !important; + border-top-right-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-top-5 { + border-top-left-radius: var(--bs-border-radius-xxl) !important; + border-top-right-radius: var(--bs-border-radius-xxl) !important; +} + +.rounded-top-circle { + border-top-left-radius: 50% !important; + border-top-right-radius: 50% !important; +} + +.rounded-top-pill { + border-top-left-radius: var(--bs-border-radius-pill) !important; + border-top-right-radius: var(--bs-border-radius-pill) !important; +} + +.rounded-end { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} + +.rounded-end-0 { + border-top-right-radius: 0 !important; + border-bottom-right-radius: 0 !important; +} + +.rounded-end-1 { + border-top-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-right-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-end-2 { + border-top-right-radius: var(--bs-border-radius) !important; + border-bottom-right-radius: var(--bs-border-radius) !important; +} + +.rounded-end-3 { + border-top-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-right-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-end-4 { + border-top-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-right-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-end-5 { + border-top-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; +} + +.rounded-end-circle { + border-top-right-radius: 50% !important; + border-bottom-right-radius: 50% !important; +} + +.rounded-end-pill { + border-top-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-right-radius: var(--bs-border-radius-pill) !important; +} + +.rounded-bottom { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} + +.rounded-bottom-0 { + border-bottom-right-radius: 0 !important; + border-bottom-left-radius: 0 !important; +} + +.rounded-bottom-1 { + border-bottom-right-radius: var(--bs-border-radius-sm) !important; + border-bottom-left-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-bottom-2 { + border-bottom-right-radius: var(--bs-border-radius) !important; + border-bottom-left-radius: var(--bs-border-radius) !important; +} + +.rounded-bottom-3 { + border-bottom-right-radius: var(--bs-border-radius-lg) !important; + border-bottom-left-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-bottom-4 { + border-bottom-right-radius: var(--bs-border-radius-xl) !important; + border-bottom-left-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-bottom-5 { + border-bottom-right-radius: var(--bs-border-radius-xxl) !important; + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; +} + +.rounded-bottom-circle { + border-bottom-right-radius: 50% !important; + border-bottom-left-radius: 50% !important; +} + +.rounded-bottom-pill { + border-bottom-right-radius: var(--bs-border-radius-pill) !important; + border-bottom-left-radius: var(--bs-border-radius-pill) !important; +} + +.rounded-start { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} + +.rounded-start-0 { + border-bottom-left-radius: 0 !important; + border-top-left-radius: 0 !important; +} + +.rounded-start-1 { + border-bottom-left-radius: var(--bs-border-radius-sm) !important; + border-top-left-radius: var(--bs-border-radius-sm) !important; +} + +.rounded-start-2 { + border-bottom-left-radius: var(--bs-border-radius) !important; + border-top-left-radius: var(--bs-border-radius) !important; +} + +.rounded-start-3 { + border-bottom-left-radius: var(--bs-border-radius-lg) !important; + border-top-left-radius: var(--bs-border-radius-lg) !important; +} + +.rounded-start-4 { + border-bottom-left-radius: var(--bs-border-radius-xl) !important; + border-top-left-radius: var(--bs-border-radius-xl) !important; +} + +.rounded-start-5 { + border-bottom-left-radius: var(--bs-border-radius-xxl) !important; + border-top-left-radius: var(--bs-border-radius-xxl) !important; +} + +.rounded-start-circle { + border-bottom-left-radius: 50% !important; + border-top-left-radius: 50% !important; +} + +.rounded-start-pill { + border-bottom-left-radius: var(--bs-border-radius-pill) !important; + border-top-left-radius: var(--bs-border-radius-pill) !important; +} + +.visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden !important; +} + +.z-n1 { + z-index: -1 !important; +} + +.z-0 { + z-index: 0 !important; +} + +.z-1 { + z-index: 1 !important; +} + +.z-2 { + z-index: 2 !important; +} + +.z-3 { + z-index: 3 !important; +} + +@media (min-width: 576px) { + .float-sm-start { + float: left !important; + } + .float-sm-end { + float: right !important; + } + .float-sm-none { + float: none !important; + } + .object-fit-sm-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-sm-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-sm-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-sm-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-sm-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-sm-inline { + display: inline !important; + } + .d-sm-inline-block { + display: inline-block !important; + } + .d-sm-block { + display: block !important; + } + .d-sm-grid { + display: grid !important; + } + .d-sm-inline-grid { + display: inline-grid !important; + } + .d-sm-table { + display: table !important; + } + .d-sm-table-row { + display: table-row !important; + } + .d-sm-table-cell { + display: table-cell !important; + } + .d-sm-flex { + display: flex !important; + } + .d-sm-inline-flex { + display: inline-flex !important; + } + .d-sm-none { + display: none !important; + } + .flex-sm-fill { + flex: 1 1 auto !important; + } + .flex-sm-row { + flex-direction: row !important; + } + .flex-sm-column { + flex-direction: column !important; + } + .flex-sm-row-reverse { + flex-direction: row-reverse !important; + } + .flex-sm-column-reverse { + flex-direction: column-reverse !important; + } + .flex-sm-grow-0 { + flex-grow: 0 !important; + } + .flex-sm-grow-1 { + flex-grow: 1 !important; + } + .flex-sm-shrink-0 { + flex-shrink: 0 !important; + } + .flex-sm-shrink-1 { + flex-shrink: 1 !important; + } + .flex-sm-wrap { + flex-wrap: wrap !important; + } + .flex-sm-nowrap { + flex-wrap: nowrap !important; + } + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-sm-start { + justify-content: flex-start !important; + } + .justify-content-sm-end { + justify-content: flex-end !important; + } + .justify-content-sm-center { + justify-content: center !important; + } + .justify-content-sm-between { + justify-content: space-between !important; + } + .justify-content-sm-around { + justify-content: space-around !important; + } + .justify-content-sm-evenly { + justify-content: space-evenly !important; + } + .align-items-sm-start { + align-items: flex-start !important; + } + .align-items-sm-end { + align-items: flex-end !important; + } + .align-items-sm-center { + align-items: center !important; + } + .align-items-sm-baseline { + align-items: baseline !important; + } + .align-items-sm-stretch { + align-items: stretch !important; + } + .align-content-sm-start { + align-content: flex-start !important; + } + .align-content-sm-end { + align-content: flex-end !important; + } + .align-content-sm-center { + align-content: center !important; + } + .align-content-sm-between { + align-content: space-between !important; + } + .align-content-sm-around { + align-content: space-around !important; + } + .align-content-sm-stretch { + align-content: stretch !important; + } + .align-self-sm-auto { + align-self: auto !important; + } + .align-self-sm-start { + align-self: flex-start !important; + } + .align-self-sm-end { + align-self: flex-end !important; + } + .align-self-sm-center { + align-self: center !important; + } + .align-self-sm-baseline { + align-self: baseline !important; + } + .align-self-sm-stretch { + align-self: stretch !important; + } + .order-sm-first { + order: -1 !important; + } + .order-sm-0 { + order: 0 !important; + } + .order-sm-1 { + order: 1 !important; + } + .order-sm-2 { + order: 2 !important; + } + .order-sm-3 { + order: 3 !important; + } + .order-sm-4 { + order: 4 !important; + } + .order-sm-5 { + order: 5 !important; + } + .order-sm-last { + order: 6 !important; + } + .m-sm-0 { + margin: 0 !important; + } + .m-sm-1 { + margin: 0.25rem !important; + } + .m-sm-2 { + margin: 0.5rem !important; + } + .m-sm-3 { + margin: 1rem !important; + } + .m-sm-4 { + margin: 1.5rem !important; + } + .m-sm-5 { + margin: 3rem !important; + } + .m-sm-auto { + margin: auto !important; + } + .mx-sm-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-sm-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-sm-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-sm-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-sm-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-sm-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-sm-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-sm-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-sm-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-sm-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-sm-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-sm-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-sm-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-sm-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-sm-0 { + margin-top: 0 !important; + } + .mt-sm-1 { + margin-top: 0.25rem !important; + } + .mt-sm-2 { + margin-top: 0.5rem !important; + } + .mt-sm-3 { + margin-top: 1rem !important; + } + .mt-sm-4 { + margin-top: 1.5rem !important; + } + .mt-sm-5 { + margin-top: 3rem !important; + } + .mt-sm-auto { + margin-top: auto !important; + } + .me-sm-0 { + margin-right: 0 !important; + } + .me-sm-1 { + margin-right: 0.25rem !important; + } + .me-sm-2 { + margin-right: 0.5rem !important; + } + .me-sm-3 { + margin-right: 1rem !important; + } + .me-sm-4 { + margin-right: 1.5rem !important; + } + .me-sm-5 { + margin-right: 3rem !important; + } + .me-sm-auto { + margin-right: auto !important; + } + .mb-sm-0 { + margin-bottom: 0 !important; + } + .mb-sm-1 { + margin-bottom: 0.25rem !important; + } + .mb-sm-2 { + margin-bottom: 0.5rem !important; + } + .mb-sm-3 { + margin-bottom: 1rem !important; + } + .mb-sm-4 { + margin-bottom: 1.5rem !important; + } + .mb-sm-5 { + margin-bottom: 3rem !important; + } + .mb-sm-auto { + margin-bottom: auto !important; + } + .ms-sm-0 { + margin-left: 0 !important; + } + .ms-sm-1 { + margin-left: 0.25rem !important; + } + .ms-sm-2 { + margin-left: 0.5rem !important; + } + .ms-sm-3 { + margin-left: 1rem !important; + } + .ms-sm-4 { + margin-left: 1.5rem !important; + } + .ms-sm-5 { + margin-left: 3rem !important; + } + .ms-sm-auto { + margin-left: auto !important; + } + .p-sm-0 { + padding: 0 !important; + } + .p-sm-1 { + padding: 0.25rem !important; + } + .p-sm-2 { + padding: 0.5rem !important; + } + .p-sm-3 { + padding: 1rem !important; + } + .p-sm-4 { + padding: 1.5rem !important; + } + .p-sm-5 { + padding: 3rem !important; + } + .px-sm-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-sm-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-sm-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-sm-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-sm-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-sm-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-sm-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-sm-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-sm-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-sm-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-sm-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-sm-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-sm-0 { + padding-top: 0 !important; + } + .pt-sm-1 { + padding-top: 0.25rem !important; + } + .pt-sm-2 { + padding-top: 0.5rem !important; + } + .pt-sm-3 { + padding-top: 1rem !important; + } + .pt-sm-4 { + padding-top: 1.5rem !important; + } + .pt-sm-5 { + padding-top: 3rem !important; + } + .pe-sm-0 { + padding-right: 0 !important; + } + .pe-sm-1 { + padding-right: 0.25rem !important; + } + .pe-sm-2 { + padding-right: 0.5rem !important; + } + .pe-sm-3 { + padding-right: 1rem !important; + } + .pe-sm-4 { + padding-right: 1.5rem !important; + } + .pe-sm-5 { + padding-right: 3rem !important; + } + .pb-sm-0 { + padding-bottom: 0 !important; + } + .pb-sm-1 { + padding-bottom: 0.25rem !important; + } + .pb-sm-2 { + padding-bottom: 0.5rem !important; + } + .pb-sm-3 { + padding-bottom: 1rem !important; + } + .pb-sm-4 { + padding-bottom: 1.5rem !important; + } + .pb-sm-5 { + padding-bottom: 3rem !important; + } + .ps-sm-0 { + padding-left: 0 !important; + } + .ps-sm-1 { + padding-left: 0.25rem !important; + } + .ps-sm-2 { + padding-left: 0.5rem !important; + } + .ps-sm-3 { + padding-left: 1rem !important; + } + .ps-sm-4 { + padding-left: 1.5rem !important; + } + .ps-sm-5 { + padding-left: 3rem !important; + } + .gap-sm-0 { + gap: 0 !important; + } + .gap-sm-1 { + gap: 0.25rem !important; + } + .gap-sm-2 { + gap: 0.5rem !important; + } + .gap-sm-3 { + gap: 1rem !important; + } + .gap-sm-4 { + gap: 1.5rem !important; + } + .gap-sm-5 { + gap: 3rem !important; + } + .row-gap-sm-0 { + row-gap: 0 !important; + } + .row-gap-sm-1 { + row-gap: 0.25rem !important; + } + .row-gap-sm-2 { + row-gap: 0.5rem !important; + } + .row-gap-sm-3 { + row-gap: 1rem !important; + } + .row-gap-sm-4 { + row-gap: 1.5rem !important; + } + .row-gap-sm-5 { + row-gap: 3rem !important; + } + .column-gap-sm-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-sm-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-sm-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-sm-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-sm-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-sm-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-sm-start { + text-align: left !important; + } + .text-sm-end { + text-align: right !important; + } + .text-sm-center { + text-align: center !important; + } +} +@media (min-width: 768px) { + .float-md-start { + float: left !important; + } + .float-md-end { + float: right !important; + } + .float-md-none { + float: none !important; + } + .object-fit-md-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-md-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-md-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-md-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-md-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-md-inline { + display: inline !important; + } + .d-md-inline-block { + display: inline-block !important; + } + .d-md-block { + display: block !important; + } + .d-md-grid { + display: grid !important; + } + .d-md-inline-grid { + display: inline-grid !important; + } + .d-md-table { + display: table !important; + } + .d-md-table-row { + display: table-row !important; + } + .d-md-table-cell { + display: table-cell !important; + } + .d-md-flex { + display: flex !important; + } + .d-md-inline-flex { + display: inline-flex !important; + } + .d-md-none { + display: none !important; + } + .flex-md-fill { + flex: 1 1 auto !important; + } + .flex-md-row { + flex-direction: row !important; + } + .flex-md-column { + flex-direction: column !important; + } + .flex-md-row-reverse { + flex-direction: row-reverse !important; + } + .flex-md-column-reverse { + flex-direction: column-reverse !important; + } + .flex-md-grow-0 { + flex-grow: 0 !important; + } + .flex-md-grow-1 { + flex-grow: 1 !important; + } + .flex-md-shrink-0 { + flex-shrink: 0 !important; + } + .flex-md-shrink-1 { + flex-shrink: 1 !important; + } + .flex-md-wrap { + flex-wrap: wrap !important; + } + .flex-md-nowrap { + flex-wrap: nowrap !important; + } + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-md-start { + justify-content: flex-start !important; + } + .justify-content-md-end { + justify-content: flex-end !important; + } + .justify-content-md-center { + justify-content: center !important; + } + .justify-content-md-between { + justify-content: space-between !important; + } + .justify-content-md-around { + justify-content: space-around !important; + } + .justify-content-md-evenly { + justify-content: space-evenly !important; + } + .align-items-md-start { + align-items: flex-start !important; + } + .align-items-md-end { + align-items: flex-end !important; + } + .align-items-md-center { + align-items: center !important; + } + .align-items-md-baseline { + align-items: baseline !important; + } + .align-items-md-stretch { + align-items: stretch !important; + } + .align-content-md-start { + align-content: flex-start !important; + } + .align-content-md-end { + align-content: flex-end !important; + } + .align-content-md-center { + align-content: center !important; + } + .align-content-md-between { + align-content: space-between !important; + } + .align-content-md-around { + align-content: space-around !important; + } + .align-content-md-stretch { + align-content: stretch !important; + } + .align-self-md-auto { + align-self: auto !important; + } + .align-self-md-start { + align-self: flex-start !important; + } + .align-self-md-end { + align-self: flex-end !important; + } + .align-self-md-center { + align-self: center !important; + } + .align-self-md-baseline { + align-self: baseline !important; + } + .align-self-md-stretch { + align-self: stretch !important; + } + .order-md-first { + order: -1 !important; + } + .order-md-0 { + order: 0 !important; + } + .order-md-1 { + order: 1 !important; + } + .order-md-2 { + order: 2 !important; + } + .order-md-3 { + order: 3 !important; + } + .order-md-4 { + order: 4 !important; + } + .order-md-5 { + order: 5 !important; + } + .order-md-last { + order: 6 !important; + } + .m-md-0 { + margin: 0 !important; + } + .m-md-1 { + margin: 0.25rem !important; + } + .m-md-2 { + margin: 0.5rem !important; + } + .m-md-3 { + margin: 1rem !important; + } + .m-md-4 { + margin: 1.5rem !important; + } + .m-md-5 { + margin: 3rem !important; + } + .m-md-auto { + margin: auto !important; + } + .mx-md-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-md-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-md-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-md-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-md-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-md-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-md-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-md-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-md-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-md-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-md-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-md-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-md-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-md-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-md-0 { + margin-top: 0 !important; + } + .mt-md-1 { + margin-top: 0.25rem !important; + } + .mt-md-2 { + margin-top: 0.5rem !important; + } + .mt-md-3 { + margin-top: 1rem !important; + } + .mt-md-4 { + margin-top: 1.5rem !important; + } + .mt-md-5 { + margin-top: 3rem !important; + } + .mt-md-auto { + margin-top: auto !important; + } + .me-md-0 { + margin-right: 0 !important; + } + .me-md-1 { + margin-right: 0.25rem !important; + } + .me-md-2 { + margin-right: 0.5rem !important; + } + .me-md-3 { + margin-right: 1rem !important; + } + .me-md-4 { + margin-right: 1.5rem !important; + } + .me-md-5 { + margin-right: 3rem !important; + } + .me-md-auto { + margin-right: auto !important; + } + .mb-md-0 { + margin-bottom: 0 !important; + } + .mb-md-1 { + margin-bottom: 0.25rem !important; + } + .mb-md-2 { + margin-bottom: 0.5rem !important; + } + .mb-md-3 { + margin-bottom: 1rem !important; + } + .mb-md-4 { + margin-bottom: 1.5rem !important; + } + .mb-md-5 { + margin-bottom: 3rem !important; + } + .mb-md-auto { + margin-bottom: auto !important; + } + .ms-md-0 { + margin-left: 0 !important; + } + .ms-md-1 { + margin-left: 0.25rem !important; + } + .ms-md-2 { + margin-left: 0.5rem !important; + } + .ms-md-3 { + margin-left: 1rem !important; + } + .ms-md-4 { + margin-left: 1.5rem !important; + } + .ms-md-5 { + margin-left: 3rem !important; + } + .ms-md-auto { + margin-left: auto !important; + } + .p-md-0 { + padding: 0 !important; + } + .p-md-1 { + padding: 0.25rem !important; + } + .p-md-2 { + padding: 0.5rem !important; + } + .p-md-3 { + padding: 1rem !important; + } + .p-md-4 { + padding: 1.5rem !important; + } + .p-md-5 { + padding: 3rem !important; + } + .px-md-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-md-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-md-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-md-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-md-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-md-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-md-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-md-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-md-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-md-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-md-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-md-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-md-0 { + padding-top: 0 !important; + } + .pt-md-1 { + padding-top: 0.25rem !important; + } + .pt-md-2 { + padding-top: 0.5rem !important; + } + .pt-md-3 { + padding-top: 1rem !important; + } + .pt-md-4 { + padding-top: 1.5rem !important; + } + .pt-md-5 { + padding-top: 3rem !important; + } + .pe-md-0 { + padding-right: 0 !important; + } + .pe-md-1 { + padding-right: 0.25rem !important; + } + .pe-md-2 { + padding-right: 0.5rem !important; + } + .pe-md-3 { + padding-right: 1rem !important; + } + .pe-md-4 { + padding-right: 1.5rem !important; + } + .pe-md-5 { + padding-right: 3rem !important; + } + .pb-md-0 { + padding-bottom: 0 !important; + } + .pb-md-1 { + padding-bottom: 0.25rem !important; + } + .pb-md-2 { + padding-bottom: 0.5rem !important; + } + .pb-md-3 { + padding-bottom: 1rem !important; + } + .pb-md-4 { + padding-bottom: 1.5rem !important; + } + .pb-md-5 { + padding-bottom: 3rem !important; + } + .ps-md-0 { + padding-left: 0 !important; + } + .ps-md-1 { + padding-left: 0.25rem !important; + } + .ps-md-2 { + padding-left: 0.5rem !important; + } + .ps-md-3 { + padding-left: 1rem !important; + } + .ps-md-4 { + padding-left: 1.5rem !important; + } + .ps-md-5 { + padding-left: 3rem !important; + } + .gap-md-0 { + gap: 0 !important; + } + .gap-md-1 { + gap: 0.25rem !important; + } + .gap-md-2 { + gap: 0.5rem !important; + } + .gap-md-3 { + gap: 1rem !important; + } + .gap-md-4 { + gap: 1.5rem !important; + } + .gap-md-5 { + gap: 3rem !important; + } + .row-gap-md-0 { + row-gap: 0 !important; + } + .row-gap-md-1 { + row-gap: 0.25rem !important; + } + .row-gap-md-2 { + row-gap: 0.5rem !important; + } + .row-gap-md-3 { + row-gap: 1rem !important; + } + .row-gap-md-4 { + row-gap: 1.5rem !important; + } + .row-gap-md-5 { + row-gap: 3rem !important; + } + .column-gap-md-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-md-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-md-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-md-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-md-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-md-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-md-start { + text-align: left !important; + } + .text-md-end { + text-align: right !important; + } + .text-md-center { + text-align: center !important; + } +} +@media (min-width: 992px) { + .float-lg-start { + float: left !important; + } + .float-lg-end { + float: right !important; + } + .float-lg-none { + float: none !important; + } + .object-fit-lg-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-lg-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-lg-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-lg-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-lg-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-lg-inline { + display: inline !important; + } + .d-lg-inline-block { + display: inline-block !important; + } + .d-lg-block { + display: block !important; + } + .d-lg-grid { + display: grid !important; + } + .d-lg-inline-grid { + display: inline-grid !important; + } + .d-lg-table { + display: table !important; + } + .d-lg-table-row { + display: table-row !important; + } + .d-lg-table-cell { + display: table-cell !important; + } + .d-lg-flex { + display: flex !important; + } + .d-lg-inline-flex { + display: inline-flex !important; + } + .d-lg-none { + display: none !important; + } + .flex-lg-fill { + flex: 1 1 auto !important; + } + .flex-lg-row { + flex-direction: row !important; + } + .flex-lg-column { + flex-direction: column !important; + } + .flex-lg-row-reverse { + flex-direction: row-reverse !important; + } + .flex-lg-column-reverse { + flex-direction: column-reverse !important; + } + .flex-lg-grow-0 { + flex-grow: 0 !important; + } + .flex-lg-grow-1 { + flex-grow: 1 !important; + } + .flex-lg-shrink-0 { + flex-shrink: 0 !important; + } + .flex-lg-shrink-1 { + flex-shrink: 1 !important; + } + .flex-lg-wrap { + flex-wrap: wrap !important; + } + .flex-lg-nowrap { + flex-wrap: nowrap !important; + } + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-lg-start { + justify-content: flex-start !important; + } + .justify-content-lg-end { + justify-content: flex-end !important; + } + .justify-content-lg-center { + justify-content: center !important; + } + .justify-content-lg-between { + justify-content: space-between !important; + } + .justify-content-lg-around { + justify-content: space-around !important; + } + .justify-content-lg-evenly { + justify-content: space-evenly !important; + } + .align-items-lg-start { + align-items: flex-start !important; + } + .align-items-lg-end { + align-items: flex-end !important; + } + .align-items-lg-center { + align-items: center !important; + } + .align-items-lg-baseline { + align-items: baseline !important; + } + .align-items-lg-stretch { + align-items: stretch !important; + } + .align-content-lg-start { + align-content: flex-start !important; + } + .align-content-lg-end { + align-content: flex-end !important; + } + .align-content-lg-center { + align-content: center !important; + } + .align-content-lg-between { + align-content: space-between !important; + } + .align-content-lg-around { + align-content: space-around !important; + } + .align-content-lg-stretch { + align-content: stretch !important; + } + .align-self-lg-auto { + align-self: auto !important; + } + .align-self-lg-start { + align-self: flex-start !important; + } + .align-self-lg-end { + align-self: flex-end !important; + } + .align-self-lg-center { + align-self: center !important; + } + .align-self-lg-baseline { + align-self: baseline !important; + } + .align-self-lg-stretch { + align-self: stretch !important; + } + .order-lg-first { + order: -1 !important; + } + .order-lg-0 { + order: 0 !important; + } + .order-lg-1 { + order: 1 !important; + } + .order-lg-2 { + order: 2 !important; + } + .order-lg-3 { + order: 3 !important; + } + .order-lg-4 { + order: 4 !important; + } + .order-lg-5 { + order: 5 !important; + } + .order-lg-last { + order: 6 !important; + } + .m-lg-0 { + margin: 0 !important; + } + .m-lg-1 { + margin: 0.25rem !important; + } + .m-lg-2 { + margin: 0.5rem !important; + } + .m-lg-3 { + margin: 1rem !important; + } + .m-lg-4 { + margin: 1.5rem !important; + } + .m-lg-5 { + margin: 3rem !important; + } + .m-lg-auto { + margin: auto !important; + } + .mx-lg-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-lg-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-lg-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-lg-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-lg-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-lg-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-lg-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-lg-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-lg-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-lg-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-lg-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-lg-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-lg-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-lg-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-lg-0 { + margin-top: 0 !important; + } + .mt-lg-1 { + margin-top: 0.25rem !important; + } + .mt-lg-2 { + margin-top: 0.5rem !important; + } + .mt-lg-3 { + margin-top: 1rem !important; + } + .mt-lg-4 { + margin-top: 1.5rem !important; + } + .mt-lg-5 { + margin-top: 3rem !important; + } + .mt-lg-auto { + margin-top: auto !important; + } + .me-lg-0 { + margin-right: 0 !important; + } + .me-lg-1 { + margin-right: 0.25rem !important; + } + .me-lg-2 { + margin-right: 0.5rem !important; + } + .me-lg-3 { + margin-right: 1rem !important; + } + .me-lg-4 { + margin-right: 1.5rem !important; + } + .me-lg-5 { + margin-right: 3rem !important; + } + .me-lg-auto { + margin-right: auto !important; + } + .mb-lg-0 { + margin-bottom: 0 !important; + } + .mb-lg-1 { + margin-bottom: 0.25rem !important; + } + .mb-lg-2 { + margin-bottom: 0.5rem !important; + } + .mb-lg-3 { + margin-bottom: 1rem !important; + } + .mb-lg-4 { + margin-bottom: 1.5rem !important; + } + .mb-lg-5 { + margin-bottom: 3rem !important; + } + .mb-lg-auto { + margin-bottom: auto !important; + } + .ms-lg-0 { + margin-left: 0 !important; + } + .ms-lg-1 { + margin-left: 0.25rem !important; + } + .ms-lg-2 { + margin-left: 0.5rem !important; + } + .ms-lg-3 { + margin-left: 1rem !important; + } + .ms-lg-4 { + margin-left: 1.5rem !important; + } + .ms-lg-5 { + margin-left: 3rem !important; + } + .ms-lg-auto { + margin-left: auto !important; + } + .p-lg-0 { + padding: 0 !important; + } + .p-lg-1 { + padding: 0.25rem !important; + } + .p-lg-2 { + padding: 0.5rem !important; + } + .p-lg-3 { + padding: 1rem !important; + } + .p-lg-4 { + padding: 1.5rem !important; + } + .p-lg-5 { + padding: 3rem !important; + } + .px-lg-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-lg-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-lg-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-lg-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-lg-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-lg-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-lg-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-lg-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-lg-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-lg-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-lg-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-lg-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-lg-0 { + padding-top: 0 !important; + } + .pt-lg-1 { + padding-top: 0.25rem !important; + } + .pt-lg-2 { + padding-top: 0.5rem !important; + } + .pt-lg-3 { + padding-top: 1rem !important; + } + .pt-lg-4 { + padding-top: 1.5rem !important; + } + .pt-lg-5 { + padding-top: 3rem !important; + } + .pe-lg-0 { + padding-right: 0 !important; + } + .pe-lg-1 { + padding-right: 0.25rem !important; + } + .pe-lg-2 { + padding-right: 0.5rem !important; + } + .pe-lg-3 { + padding-right: 1rem !important; + } + .pe-lg-4 { + padding-right: 1.5rem !important; + } + .pe-lg-5 { + padding-right: 3rem !important; + } + .pb-lg-0 { + padding-bottom: 0 !important; + } + .pb-lg-1 { + padding-bottom: 0.25rem !important; + } + .pb-lg-2 { + padding-bottom: 0.5rem !important; + } + .pb-lg-3 { + padding-bottom: 1rem !important; + } + .pb-lg-4 { + padding-bottom: 1.5rem !important; + } + .pb-lg-5 { + padding-bottom: 3rem !important; + } + .ps-lg-0 { + padding-left: 0 !important; + } + .ps-lg-1 { + padding-left: 0.25rem !important; + } + .ps-lg-2 { + padding-left: 0.5rem !important; + } + .ps-lg-3 { + padding-left: 1rem !important; + } + .ps-lg-4 { + padding-left: 1.5rem !important; + } + .ps-lg-5 { + padding-left: 3rem !important; + } + .gap-lg-0 { + gap: 0 !important; + } + .gap-lg-1 { + gap: 0.25rem !important; + } + .gap-lg-2 { + gap: 0.5rem !important; + } + .gap-lg-3 { + gap: 1rem !important; + } + .gap-lg-4 { + gap: 1.5rem !important; + } + .gap-lg-5 { + gap: 3rem !important; + } + .row-gap-lg-0 { + row-gap: 0 !important; + } + .row-gap-lg-1 { + row-gap: 0.25rem !important; + } + .row-gap-lg-2 { + row-gap: 0.5rem !important; + } + .row-gap-lg-3 { + row-gap: 1rem !important; + } + .row-gap-lg-4 { + row-gap: 1.5rem !important; + } + .row-gap-lg-5 { + row-gap: 3rem !important; + } + .column-gap-lg-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-lg-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-lg-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-lg-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-lg-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-lg-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-lg-start { + text-align: left !important; + } + .text-lg-end { + text-align: right !important; + } + .text-lg-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .float-xl-start { + float: left !important; + } + .float-xl-end { + float: right !important; + } + .float-xl-none { + float: none !important; + } + .object-fit-xl-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-xl-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-xl-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-xl-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-xl-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-xl-inline { + display: inline !important; + } + .d-xl-inline-block { + display: inline-block !important; + } + .d-xl-block { + display: block !important; + } + .d-xl-grid { + display: grid !important; + } + .d-xl-inline-grid { + display: inline-grid !important; + } + .d-xl-table { + display: table !important; + } + .d-xl-table-row { + display: table-row !important; + } + .d-xl-table-cell { + display: table-cell !important; + } + .d-xl-flex { + display: flex !important; + } + .d-xl-inline-flex { + display: inline-flex !important; + } + .d-xl-none { + display: none !important; + } + .flex-xl-fill { + flex: 1 1 auto !important; + } + .flex-xl-row { + flex-direction: row !important; + } + .flex-xl-column { + flex-direction: column !important; + } + .flex-xl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xl-grow-0 { + flex-grow: 0 !important; + } + .flex-xl-grow-1 { + flex-grow: 1 !important; + } + .flex-xl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xl-wrap { + flex-wrap: wrap !important; + } + .flex-xl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xl-start { + justify-content: flex-start !important; + } + .justify-content-xl-end { + justify-content: flex-end !important; + } + .justify-content-xl-center { + justify-content: center !important; + } + .justify-content-xl-between { + justify-content: space-between !important; + } + .justify-content-xl-around { + justify-content: space-around !important; + } + .justify-content-xl-evenly { + justify-content: space-evenly !important; + } + .align-items-xl-start { + align-items: flex-start !important; + } + .align-items-xl-end { + align-items: flex-end !important; + } + .align-items-xl-center { + align-items: center !important; + } + .align-items-xl-baseline { + align-items: baseline !important; + } + .align-items-xl-stretch { + align-items: stretch !important; + } + .align-content-xl-start { + align-content: flex-start !important; + } + .align-content-xl-end { + align-content: flex-end !important; + } + .align-content-xl-center { + align-content: center !important; + } + .align-content-xl-between { + align-content: space-between !important; + } + .align-content-xl-around { + align-content: space-around !important; + } + .align-content-xl-stretch { + align-content: stretch !important; + } + .align-self-xl-auto { + align-self: auto !important; + } + .align-self-xl-start { + align-self: flex-start !important; + } + .align-self-xl-end { + align-self: flex-end !important; + } + .align-self-xl-center { + align-self: center !important; + } + .align-self-xl-baseline { + align-self: baseline !important; + } + .align-self-xl-stretch { + align-self: stretch !important; + } + .order-xl-first { + order: -1 !important; + } + .order-xl-0 { + order: 0 !important; + } + .order-xl-1 { + order: 1 !important; + } + .order-xl-2 { + order: 2 !important; + } + .order-xl-3 { + order: 3 !important; + } + .order-xl-4 { + order: 4 !important; + } + .order-xl-5 { + order: 5 !important; + } + .order-xl-last { + order: 6 !important; + } + .m-xl-0 { + margin: 0 !important; + } + .m-xl-1 { + margin: 0.25rem !important; + } + .m-xl-2 { + margin: 0.5rem !important; + } + .m-xl-3 { + margin: 1rem !important; + } + .m-xl-4 { + margin: 1.5rem !important; + } + .m-xl-5 { + margin: 3rem !important; + } + .m-xl-auto { + margin: auto !important; + } + .mx-xl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xl-0 { + margin-top: 0 !important; + } + .mt-xl-1 { + margin-top: 0.25rem !important; + } + .mt-xl-2 { + margin-top: 0.5rem !important; + } + .mt-xl-3 { + margin-top: 1rem !important; + } + .mt-xl-4 { + margin-top: 1.5rem !important; + } + .mt-xl-5 { + margin-top: 3rem !important; + } + .mt-xl-auto { + margin-top: auto !important; + } + .me-xl-0 { + margin-right: 0 !important; + } + .me-xl-1 { + margin-right: 0.25rem !important; + } + .me-xl-2 { + margin-right: 0.5rem !important; + } + .me-xl-3 { + margin-right: 1rem !important; + } + .me-xl-4 { + margin-right: 1.5rem !important; + } + .me-xl-5 { + margin-right: 3rem !important; + } + .me-xl-auto { + margin-right: auto !important; + } + .mb-xl-0 { + margin-bottom: 0 !important; + } + .mb-xl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xl-3 { + margin-bottom: 1rem !important; + } + .mb-xl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xl-5 { + margin-bottom: 3rem !important; + } + .mb-xl-auto { + margin-bottom: auto !important; + } + .ms-xl-0 { + margin-left: 0 !important; + } + .ms-xl-1 { + margin-left: 0.25rem !important; + } + .ms-xl-2 { + margin-left: 0.5rem !important; + } + .ms-xl-3 { + margin-left: 1rem !important; + } + .ms-xl-4 { + margin-left: 1.5rem !important; + } + .ms-xl-5 { + margin-left: 3rem !important; + } + .ms-xl-auto { + margin-left: auto !important; + } + .p-xl-0 { + padding: 0 !important; + } + .p-xl-1 { + padding: 0.25rem !important; + } + .p-xl-2 { + padding: 0.5rem !important; + } + .p-xl-3 { + padding: 1rem !important; + } + .p-xl-4 { + padding: 1.5rem !important; + } + .p-xl-5 { + padding: 3rem !important; + } + .px-xl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xl-0 { + padding-top: 0 !important; + } + .pt-xl-1 { + padding-top: 0.25rem !important; + } + .pt-xl-2 { + padding-top: 0.5rem !important; + } + .pt-xl-3 { + padding-top: 1rem !important; + } + .pt-xl-4 { + padding-top: 1.5rem !important; + } + .pt-xl-5 { + padding-top: 3rem !important; + } + .pe-xl-0 { + padding-right: 0 !important; + } + .pe-xl-1 { + padding-right: 0.25rem !important; + } + .pe-xl-2 { + padding-right: 0.5rem !important; + } + .pe-xl-3 { + padding-right: 1rem !important; + } + .pe-xl-4 { + padding-right: 1.5rem !important; + } + .pe-xl-5 { + padding-right: 3rem !important; + } + .pb-xl-0 { + padding-bottom: 0 !important; + } + .pb-xl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xl-3 { + padding-bottom: 1rem !important; + } + .pb-xl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xl-5 { + padding-bottom: 3rem !important; + } + .ps-xl-0 { + padding-left: 0 !important; + } + .ps-xl-1 { + padding-left: 0.25rem !important; + } + .ps-xl-2 { + padding-left: 0.5rem !important; + } + .ps-xl-3 { + padding-left: 1rem !important; + } + .ps-xl-4 { + padding-left: 1.5rem !important; + } + .ps-xl-5 { + padding-left: 3rem !important; + } + .gap-xl-0 { + gap: 0 !important; + } + .gap-xl-1 { + gap: 0.25rem !important; + } + .gap-xl-2 { + gap: 0.5rem !important; + } + .gap-xl-3 { + gap: 1rem !important; + } + .gap-xl-4 { + gap: 1.5rem !important; + } + .gap-xl-5 { + gap: 3rem !important; + } + .row-gap-xl-0 { + row-gap: 0 !important; + } + .row-gap-xl-1 { + row-gap: 0.25rem !important; + } + .row-gap-xl-2 { + row-gap: 0.5rem !important; + } + .row-gap-xl-3 { + row-gap: 1rem !important; + } + .row-gap-xl-4 { + row-gap: 1.5rem !important; + } + .row-gap-xl-5 { + row-gap: 3rem !important; + } + .column-gap-xl-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-xl-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-xl-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-xl-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-xl-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-xl-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-xl-start { + text-align: left !important; + } + .text-xl-end { + text-align: right !important; + } + .text-xl-center { + text-align: center !important; + } +} +@media (min-width: 1400px) { + .float-xxl-start { + float: left !important; + } + .float-xxl-end { + float: right !important; + } + .float-xxl-none { + float: none !important; + } + .object-fit-xxl-contain { + -o-object-fit: contain !important; + object-fit: contain !important; + } + .object-fit-xxl-cover { + -o-object-fit: cover !important; + object-fit: cover !important; + } + .object-fit-xxl-fill { + -o-object-fit: fill !important; + object-fit: fill !important; + } + .object-fit-xxl-scale { + -o-object-fit: scale-down !important; + object-fit: scale-down !important; + } + .object-fit-xxl-none { + -o-object-fit: none !important; + object-fit: none !important; + } + .d-xxl-inline { + display: inline !important; + } + .d-xxl-inline-block { + display: inline-block !important; + } + .d-xxl-block { + display: block !important; + } + .d-xxl-grid { + display: grid !important; + } + .d-xxl-inline-grid { + display: inline-grid !important; + } + .d-xxl-table { + display: table !important; + } + .d-xxl-table-row { + display: table-row !important; + } + .d-xxl-table-cell { + display: table-cell !important; + } + .d-xxl-flex { + display: flex !important; + } + .d-xxl-inline-flex { + display: inline-flex !important; + } + .d-xxl-none { + display: none !important; + } + .flex-xxl-fill { + flex: 1 1 auto !important; + } + .flex-xxl-row { + flex-direction: row !important; + } + .flex-xxl-column { + flex-direction: column !important; + } + .flex-xxl-row-reverse { + flex-direction: row-reverse !important; + } + .flex-xxl-column-reverse { + flex-direction: column-reverse !important; + } + .flex-xxl-grow-0 { + flex-grow: 0 !important; + } + .flex-xxl-grow-1 { + flex-grow: 1 !important; + } + .flex-xxl-shrink-0 { + flex-shrink: 0 !important; + } + .flex-xxl-shrink-1 { + flex-shrink: 1 !important; + } + .flex-xxl-wrap { + flex-wrap: wrap !important; + } + .flex-xxl-nowrap { + flex-wrap: nowrap !important; + } + .flex-xxl-wrap-reverse { + flex-wrap: wrap-reverse !important; + } + .justify-content-xxl-start { + justify-content: flex-start !important; + } + .justify-content-xxl-end { + justify-content: flex-end !important; + } + .justify-content-xxl-center { + justify-content: center !important; + } + .justify-content-xxl-between { + justify-content: space-between !important; + } + .justify-content-xxl-around { + justify-content: space-around !important; + } + .justify-content-xxl-evenly { + justify-content: space-evenly !important; + } + .align-items-xxl-start { + align-items: flex-start !important; + } + .align-items-xxl-end { + align-items: flex-end !important; + } + .align-items-xxl-center { + align-items: center !important; + } + .align-items-xxl-baseline { + align-items: baseline !important; + } + .align-items-xxl-stretch { + align-items: stretch !important; + } + .align-content-xxl-start { + align-content: flex-start !important; + } + .align-content-xxl-end { + align-content: flex-end !important; + } + .align-content-xxl-center { + align-content: center !important; + } + .align-content-xxl-between { + align-content: space-between !important; + } + .align-content-xxl-around { + align-content: space-around !important; + } + .align-content-xxl-stretch { + align-content: stretch !important; + } + .align-self-xxl-auto { + align-self: auto !important; + } + .align-self-xxl-start { + align-self: flex-start !important; + } + .align-self-xxl-end { + align-self: flex-end !important; + } + .align-self-xxl-center { + align-self: center !important; + } + .align-self-xxl-baseline { + align-self: baseline !important; + } + .align-self-xxl-stretch { + align-self: stretch !important; + } + .order-xxl-first { + order: -1 !important; + } + .order-xxl-0 { + order: 0 !important; + } + .order-xxl-1 { + order: 1 !important; + } + .order-xxl-2 { + order: 2 !important; + } + .order-xxl-3 { + order: 3 !important; + } + .order-xxl-4 { + order: 4 !important; + } + .order-xxl-5 { + order: 5 !important; + } + .order-xxl-last { + order: 6 !important; + } + .m-xxl-0 { + margin: 0 !important; + } + .m-xxl-1 { + margin: 0.25rem !important; + } + .m-xxl-2 { + margin: 0.5rem !important; + } + .m-xxl-3 { + margin: 1rem !important; + } + .m-xxl-4 { + margin: 1.5rem !important; + } + .m-xxl-5 { + margin: 3rem !important; + } + .m-xxl-auto { + margin: auto !important; + } + .mx-xxl-0 { + margin-right: 0 !important; + margin-left: 0 !important; + } + .mx-xxl-1 { + margin-right: 0.25rem !important; + margin-left: 0.25rem !important; + } + .mx-xxl-2 { + margin-right: 0.5rem !important; + margin-left: 0.5rem !important; + } + .mx-xxl-3 { + margin-right: 1rem !important; + margin-left: 1rem !important; + } + .mx-xxl-4 { + margin-right: 1.5rem !important; + margin-left: 1.5rem !important; + } + .mx-xxl-5 { + margin-right: 3rem !important; + margin-left: 3rem !important; + } + .mx-xxl-auto { + margin-right: auto !important; + margin-left: auto !important; + } + .my-xxl-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; + } + .my-xxl-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; + } + .my-xxl-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; + } + .my-xxl-3 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; + } + .my-xxl-4 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; + } + .my-xxl-5 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; + } + .my-xxl-auto { + margin-top: auto !important; + margin-bottom: auto !important; + } + .mt-xxl-0 { + margin-top: 0 !important; + } + .mt-xxl-1 { + margin-top: 0.25rem !important; + } + .mt-xxl-2 { + margin-top: 0.5rem !important; + } + .mt-xxl-3 { + margin-top: 1rem !important; + } + .mt-xxl-4 { + margin-top: 1.5rem !important; + } + .mt-xxl-5 { + margin-top: 3rem !important; + } + .mt-xxl-auto { + margin-top: auto !important; + } + .me-xxl-0 { + margin-right: 0 !important; + } + .me-xxl-1 { + margin-right: 0.25rem !important; + } + .me-xxl-2 { + margin-right: 0.5rem !important; + } + .me-xxl-3 { + margin-right: 1rem !important; + } + .me-xxl-4 { + margin-right: 1.5rem !important; + } + .me-xxl-5 { + margin-right: 3rem !important; + } + .me-xxl-auto { + margin-right: auto !important; + } + .mb-xxl-0 { + margin-bottom: 0 !important; + } + .mb-xxl-1 { + margin-bottom: 0.25rem !important; + } + .mb-xxl-2 { + margin-bottom: 0.5rem !important; + } + .mb-xxl-3 { + margin-bottom: 1rem !important; + } + .mb-xxl-4 { + margin-bottom: 1.5rem !important; + } + .mb-xxl-5 { + margin-bottom: 3rem !important; + } + .mb-xxl-auto { + margin-bottom: auto !important; + } + .ms-xxl-0 { + margin-left: 0 !important; + } + .ms-xxl-1 { + margin-left: 0.25rem !important; + } + .ms-xxl-2 { + margin-left: 0.5rem !important; + } + .ms-xxl-3 { + margin-left: 1rem !important; + } + .ms-xxl-4 { + margin-left: 1.5rem !important; + } + .ms-xxl-5 { + margin-left: 3rem !important; + } + .ms-xxl-auto { + margin-left: auto !important; + } + .p-xxl-0 { + padding: 0 !important; + } + .p-xxl-1 { + padding: 0.25rem !important; + } + .p-xxl-2 { + padding: 0.5rem !important; + } + .p-xxl-3 { + padding: 1rem !important; + } + .p-xxl-4 { + padding: 1.5rem !important; + } + .p-xxl-5 { + padding: 3rem !important; + } + .px-xxl-0 { + padding-right: 0 !important; + padding-left: 0 !important; + } + .px-xxl-1 { + padding-right: 0.25rem !important; + padding-left: 0.25rem !important; + } + .px-xxl-2 { + padding-right: 0.5rem !important; + padding-left: 0.5rem !important; + } + .px-xxl-3 { + padding-right: 1rem !important; + padding-left: 1rem !important; + } + .px-xxl-4 { + padding-right: 1.5rem !important; + padding-left: 1.5rem !important; + } + .px-xxl-5 { + padding-right: 3rem !important; + padding-left: 3rem !important; + } + .py-xxl-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; + } + .py-xxl-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; + } + .py-xxl-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; + } + .py-xxl-3 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; + } + .py-xxl-4 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; + } + .py-xxl-5 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; + } + .pt-xxl-0 { + padding-top: 0 !important; + } + .pt-xxl-1 { + padding-top: 0.25rem !important; + } + .pt-xxl-2 { + padding-top: 0.5rem !important; + } + .pt-xxl-3 { + padding-top: 1rem !important; + } + .pt-xxl-4 { + padding-top: 1.5rem !important; + } + .pt-xxl-5 { + padding-top: 3rem !important; + } + .pe-xxl-0 { + padding-right: 0 !important; + } + .pe-xxl-1 { + padding-right: 0.25rem !important; + } + .pe-xxl-2 { + padding-right: 0.5rem !important; + } + .pe-xxl-3 { + padding-right: 1rem !important; + } + .pe-xxl-4 { + padding-right: 1.5rem !important; + } + .pe-xxl-5 { + padding-right: 3rem !important; + } + .pb-xxl-0 { + padding-bottom: 0 !important; + } + .pb-xxl-1 { + padding-bottom: 0.25rem !important; + } + .pb-xxl-2 { + padding-bottom: 0.5rem !important; + } + .pb-xxl-3 { + padding-bottom: 1rem !important; + } + .pb-xxl-4 { + padding-bottom: 1.5rem !important; + } + .pb-xxl-5 { + padding-bottom: 3rem !important; + } + .ps-xxl-0 { + padding-left: 0 !important; + } + .ps-xxl-1 { + padding-left: 0.25rem !important; + } + .ps-xxl-2 { + padding-left: 0.5rem !important; + } + .ps-xxl-3 { + padding-left: 1rem !important; + } + .ps-xxl-4 { + padding-left: 1.5rem !important; + } + .ps-xxl-5 { + padding-left: 3rem !important; + } + .gap-xxl-0 { + gap: 0 !important; + } + .gap-xxl-1 { + gap: 0.25rem !important; + } + .gap-xxl-2 { + gap: 0.5rem !important; + } + .gap-xxl-3 { + gap: 1rem !important; + } + .gap-xxl-4 { + gap: 1.5rem !important; + } + .gap-xxl-5 { + gap: 3rem !important; + } + .row-gap-xxl-0 { + row-gap: 0 !important; + } + .row-gap-xxl-1 { + row-gap: 0.25rem !important; + } + .row-gap-xxl-2 { + row-gap: 0.5rem !important; + } + .row-gap-xxl-3 { + row-gap: 1rem !important; + } + .row-gap-xxl-4 { + row-gap: 1.5rem !important; + } + .row-gap-xxl-5 { + row-gap: 3rem !important; + } + .column-gap-xxl-0 { + -moz-column-gap: 0 !important; + column-gap: 0 !important; + } + .column-gap-xxl-1 { + -moz-column-gap: 0.25rem !important; + column-gap: 0.25rem !important; + } + .column-gap-xxl-2 { + -moz-column-gap: 0.5rem !important; + column-gap: 0.5rem !important; + } + .column-gap-xxl-3 { + -moz-column-gap: 1rem !important; + column-gap: 1rem !important; + } + .column-gap-xxl-4 { + -moz-column-gap: 1.5rem !important; + column-gap: 1.5rem !important; + } + .column-gap-xxl-5 { + -moz-column-gap: 3rem !important; + column-gap: 3rem !important; + } + .text-xxl-start { + text-align: left !important; + } + .text-xxl-end { + text-align: right !important; + } + .text-xxl-center { + text-align: center !important; + } +} +@media (min-width: 1200px) { + .fs-1 { + font-size: 2.5rem !important; + } + .fs-2 { + font-size: 2rem !important; + } + .fs-3 { + font-size: 1.75rem !important; + } + .fs-4 { + font-size: 1.5rem !important; + } +} +@media print { + .d-print-inline { + display: inline !important; + } + .d-print-inline-block { + display: inline-block !important; + } + .d-print-block { + display: block !important; + } + .d-print-grid { + display: grid !important; + } + .d-print-inline-grid { + display: inline-grid !important; + } + .d-print-table { + display: table !important; + } + .d-print-table-row { + display: table-row !important; + } + .d-print-table-cell { + display: table-cell !important; + } + .d-print-flex { + display: flex !important; + } + .d-print-inline-flex { + display: inline-flex !important; + } + .d-print-none { + display: none !important; + } +} +/* Slider */ +.slick-slider { + position: relative; + display: block; + box-sizing: border-box; + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; + touch-action: pan-y; + -webkit-tap-highlight-color: transparent; +} + +.slick-list { + position: relative; + overflow: hidden; + display: block; + margin: 0; + padding: 0; +} +.slick-list:focus { + outline: none; +} +.slick-list.dragging { + cursor: pointer; + cursor: hand; +} + +.slick-slider .slick-track, +.slick-slider .slick-list { + transform: translate3d(0, 0, 0); +} + +.slick-track { + position: relative; + left: 0; + top: 0; + display: block; + margin-left: auto; + margin-right: auto; +} +.slick-track:before, .slick-track:after { + content: ""; + display: table; +} +.slick-track:after { + clear: both; +} +.slick-loading .slick-track { + visibility: hidden; +} + +.slick-slide { + float: left; + height: 100%; + min-height: 1px; + display: none; +} +[dir=rtl] .slick-slide { + float: right; +} +.slick-slide img { + display: block; +} +.slick-slide.slick-loading img { + display: none; +} +.slick-slide.dragging img { + pointer-events: none; +} +.slick-initialized .slick-slide { + display: block; +} +.slick-loading .slick-slide { + visibility: hidden; +} +.slick-vertical .slick-slide { + display: block; + height: auto; + border: 1px solid transparent; +} + +.slick-arrow.slick-hidden { + display: none; +} + +/* Slider */ +.slick-loading .slick-list { + background: #fff url("/wp-content/themes/mccans-theme/dist/images/vendor/slick-carousel/slick/ajax-loader.gif") center center no-repeat; +} + +/* Icons */ +@font-face { + font-family: "slick"; + src: url("/wp-content/themes/mccans-theme/dist/fonts/vendor/slick-carousel/slick/slick.eot"); + src: url("/wp-content/themes/mccans-theme/dist/fonts/vendor/slick-carousel/slick/slick.eot?#iefix") format("embedded-opentype"), url("/wp-content/themes/mccans-theme/dist/fonts/vendor/slick-carousel/slick/slick.woff") format("woff"), url("/wp-content/themes/mccans-theme/dist/fonts/vendor/slick-carousel/slick/slick.ttf") format("truetype"), url("/wp-content/themes/mccans-theme/dist/fonts/vendor/slick-carousel/slick/slick.svg#slick") format("svg"); + font-weight: normal; + font-style: normal; +} +/* Arrows */ +.slick-prev, +.slick-next { + position: absolute; + display: block; + height: 20px; + width: 20px; + line-height: 0px; + font-size: 0px; + cursor: pointer; + background: transparent; + color: transparent; + top: 50%; + transform: translate(0, -50%); + padding: 0; + border: none; + outline: none; +} +.slick-prev:hover, .slick-prev:focus, +.slick-next:hover, +.slick-next:focus { + outline: none; + background: transparent; + color: transparent; +} +.slick-prev:hover:before, .slick-prev:focus:before, +.slick-next:hover:before, +.slick-next:focus:before { + opacity: 1; +} +.slick-prev.slick-disabled:before, +.slick-next.slick-disabled:before { + opacity: 0.25; +} +.slick-prev:before, +.slick-next:before { + font-family: "slick"; + font-size: 20px; + line-height: 1; + color: white; + opacity: 0.75; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} + +.slick-prev { + left: -25px; +} +[dir=rtl] .slick-prev { + left: auto; + right: -25px; +} +.slick-prev:before { + content: "←"; +} +[dir=rtl] .slick-prev:before { + content: "→"; +} + +.slick-next { + right: -25px; +} +[dir=rtl] .slick-next { + left: -25px; + right: auto; +} +.slick-next:before { + content: "→"; +} +[dir=rtl] .slick-next:before { + content: "←"; +} + +/* Dots */ +.slick-dotted.slick-slider { + margin-bottom: 30px; +} + +.slick-dots { + position: absolute; + bottom: -25px; + list-style: none; + display: block; + text-align: center; + padding: 0; + margin: 0; + width: 100%; +} +.slick-dots li { + position: relative; + display: inline-block; + height: 20px; + width: 20px; + margin: 0 5px; + padding: 0; + cursor: pointer; +} +.slick-dots li button { + border: 0; + background: transparent; + display: block; + height: 20px; + width: 20px; + outline: none; + line-height: 0px; + font-size: 0px; + color: transparent; + padding: 5px; + cursor: pointer; +} +.slick-dots li button:hover, .slick-dots li button:focus { + outline: none; +} +.slick-dots li button:hover:before, .slick-dots li button:focus:before { + opacity: 1; +} +.slick-dots li button:before { + position: absolute; + top: 0; + left: 0; + content: "•"; + width: 20px; + height: 20px; + font-family: "slick"; + font-size: 6px; + line-height: 20px; + text-align: center; + color: black; + opacity: 0.25; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +.slick-dots li.slick-active button:before { + color: black; + opacity: 0.75; +} + +img { + max-width: 100%; +} + +.montserrat, div.product-tile a.added_to_cart, footer.sub-footer, footer.site-footer .logo-col, footer.site-footer h2, footer.site-footer .h2, .cta-button a, .single-location .form-wrapper p:has(input[type=submit]) a, .cta-button input, .single-location .form-wrapper p:has(input[type=submit]) input, .headline-xl, section.intro-slide h1, section.intro-slide .h1, .background-image-cta h1, .background-image-cta .h1, .background-image-cta h2, .background-image-cta .h2, .background-image-cta h3, .background-image-cta .h3, .headline-lg, .single-location h1, .single-location .h1, .post-type-archive-location .intro h1, .post-type-archive-location .intro .h1, .testimonials-section h1, .testimonials-section .h1, .testimonials-section h2, .testimonials-section .h2, .testimonials-section h3, .testimonials-section .h3, .plain-text h1, .plain-text .h1, .plain-text h2, .plain-text .h2, .plain-text h3, .plain-text .h3 { + font-family: "Montserrat", sans-serif; +} + +.change-black-to-red, div.product-tile a.added_to_cart::after, .testimonials-section .testimonials .slick-arrow img { + filter: invert(10%) sepia(79%) saturate(7388%) hue-rotate(2deg) brightness(86%) contrast(111%); +} + +.headline-lg, .single-location h1, .single-location .h1, .post-type-archive-location .intro h1, .post-type-archive-location .intro .h1, .testimonials-section h1, .testimonials-section .h1, .testimonials-section h2, .testimonials-section .h2, .testimonials-section h3, .testimonials-section .h3, .plain-text h1, .plain-text .h1, .plain-text h2, .plain-text .h2, .plain-text h3, .plain-text .h3 { + font-weight: 600; + font-size: 60px; + line-height: 60px; + letter-spacing: -3%; +} +@media (max-width: 767.98px) { + .headline-lg, .single-location h1, .single-location .h1, .post-type-archive-location .intro h1, .post-type-archive-location .intro .h1, .testimonials-section h1, .testimonials-section .h1, .testimonials-section h2, .testimonials-section .h2, .testimonials-section h3, .testimonials-section .h3, .plain-text h1, .plain-text .h1, .plain-text h2, .plain-text .h2, .plain-text h3, .plain-text .h3 { + font-size: 45px; + line-height: 45px; + } +} + +.headline-xl, section.intro-slide h1, section.intro-slide .h1, .background-image-cta h1, .background-image-cta .h1, .background-image-cta h2, .background-image-cta .h2, .background-image-cta h3, .background-image-cta .h3 { + font-weight: 600; + font-size: 91px; + line-height: 89px; + letter-spacing: -3%; +} +@media (max-width: 767.98px) { + .headline-xl, section.intro-slide h1, section.intro-slide .h1, .background-image-cta h1, .background-image-cta .h1, .background-image-cta h2, .background-image-cta .h2, .background-image-cta h3, .background-image-cta .h3 { + font-size: 65px; + line-height: 65px; + } +} + +.cta-button, .single-location .form-wrapper p:has(input[type=submit]) { + margin: 0; +} +.cta-button a, .single-location .form-wrapper p:has(input[type=submit]) a, .cta-button input, .single-location .form-wrapper p:has(input[type=submit]) input { + text-transform: uppercase; + background-color: #ae1716; + color: #fff !important; + text-decoration: none; + display: inline-block; + min-height: 47px; + line-height: 47px; + border: 1px solid #ae1716; + border-radius: 25px; + padding: 0 60px; + transition: all 0.3s ease; + font-size: 20px; +} +.cta-button a:hover, .single-location .form-wrapper p:has(input[type=submit]) a:hover, .cta-button input:hover, .single-location .form-wrapper p:has(input[type=submit]) input:hover { + background-color: #f5f5f5; + color: #ae1716 !important; +} +.cta-button.small a, .single-location .form-wrapper p.small:has(input[type=submit]) a { + padding: 0 25px; + min-height: 32px; + line-height: 32px; + font-size: 1rem; +} + +.leaflet-map { + height: 360px; + margin-bottom: 1rem; +} + +input, label, textarea { + max-width: 100%; +} + +.top-bar { + background-color: #f5f5f5; + padding: 25px 0 25px; +} +.top-bar input[type=text] { + border: 0; + border-radius: 25px; + height: 38px; + line-height: 30px; + padding-left: 30px; + background: url("/wp-content/themes/mccans-theme/assets/search.svg") 10px center no-repeat; + background-color: #fff; +} +.top-bar a.account-button { + border: 0; + text-transform: uppercase; + color: #ae1716; + font-weight: bold; + background: transparent; + text-decoration: none; + display: flex; + align-items: center; + gap: 1rem; +} + +.main-nav { + padding: 2rem 0; +} +.main-nav .logo-wrapper { + max-width: 400px; + width: 20%; +} +@media (max-width: 767.98px) { + .main-nav .logo-wrapper { + width: 100%; + display: flex; + justify-content: space-between; + max-width: 100%; + gap: 3rem; + align-items: center; + } + .main-nav .logo-wrapper img { + max-width: 250px; + } + .main-nav .logo-wrapper a { + color: #000; + } + .main-nav .logo-wrapper svg { + width: 50px; + height: 50px; + } +} +@media (max-width: 575.98px) { + .main-nav .logo-wrapper { + gap: 1rem !important; + } +} +@media (min-width: 768px) { + .main-nav .logo-wrapper #mobile-nav-toggle { + display: none; + } +} +.main-nav .logo-wrapper #mobile-nav-toggle svg:first-of-type { + display: block; +} +.main-nav .logo-wrapper #mobile-nav-toggle svg:last-of-type { + display: none; +} +.mobile-nav-open .main-nav .logo-wrapper #mobile-nav-toggle svg:first-of-type { + display: none; +} +.mobile-nav-open .main-nav .logo-wrapper #mobile-nav-toggle svg:last-of-type { + display: block; +} +.main-nav .logo-wrapper img { + width: 100%; +} +.main-nav nav.main-nav { + display: none; + width: 100%; +} +.mobile-nav-open .main-nav nav.main-nav { + display: flex; + flex-direction: column; +} +@media (min-width: 768px) { + .main-nav nav.main-nav { + display: flex; + width: auto; + } +} +.main-nav .menu-main-menu-container { + display: flex; + align-items: center; +} +@media (max-width: 767.98px) { + .main-nav .menu-main-menu-container { + width: 100%; + } + .main-nav .menu-main-menu-container > ul { + width: 100%; + } +} +.main-nav #menu-main-menu { + display: flex; + margin: 0; + padding: 0; + list-style-type: none; + gap: 1rem; +} +@media (max-width: 767.98px) { + .main-nav #menu-main-menu { + flex-direction: column; + } +} +.main-nav #menu-main-menu a { + text-transform: uppercase; + color: #000; + text-decoration: none; +} +.main-nav #menu-main-menu > li { + position: relative; +} +@media (min-width: 992px) { + .main-nav #menu-main-menu > li:hover > ul { + display: block; + position: absolute; + top: 100%; + left: 0; + list-style-type: none; + padding: 0; + } +} +@media (max-width: 767.98px) { + .main-nav #menu-main-menu > li.children-showing ul { + display: flex; + flex-direction: column; + list-style-type: none; + } + .main-nav #menu-main-menu > li.children-showing ul li { + position: relative; + } + .main-nav #menu-main-menu > li.children-showing ul a { + width: 100%; + } + .main-nav #menu-main-menu > li.children-showing .toggle-sub-nav { + transform: rotate(180deg); + } +} +.main-nav #menu-main-menu ul { + display: none; +} +.main-nav .toggle-sub-nav { + width: 16px; + height: 16px; + background-image: url("/wp-content/themes/mccans-theme/assets/chevron-down.svg"); + background-position: center; + background-size: contain; + background-repeat: no-repeat; + border: 0; + background-color: transparent; +} +@media (max-width: 767.98px) { + .main-nav .toggle-sub-nav { + width: 30px; + height: 30px; + position: absolute; + right: 0; + top: 0; + } +} + +footer.site-footer { + background-color: #f5f5f5; + padding: 2rem 0; +} +footer.site-footer h2, footer.site-footer .h2 { + font-weight: 600; + font-size: 25px; + text-transform: uppercase; + margin-bottom: 1rem; +} +footer.site-footer ul { + padding: 0; + margin: 0; + list-style-type: none; +} +footer.site-footer ul li a { + font-size: 20px; + color: #000; + text-decoration: none; +} +footer.site-footer nav#social-nav ul { + list-style-type: none; + padding: 0; + margin: 0; + display: flex; + gap: 1rem; +} +footer.site-footer nav#social-nav ul a { + display: flex; + color: #000; + background-color: #d9d9d9; + width: 36px; + height: 36px; + border-radius: 18px; + justify-content: center; + align-items: center; + transition: all 0.3s ease; +} +footer.site-footer nav#social-nav ul a:hover { + background-color: #fff; + color: #ae1716; +} +footer.site-footer .logo-col { + max-width: 336px; + text-align: center; + text-transform: uppercase; + font-size: 20px; + line-height: 27px; + letter-spacing: -2%; + font-weight: 600; +} +footer.site-footer .logo-col img { + display: block; + margin-bottom: 1rem; + max-width: 336px; + margin: 0 auto; +} +@media (max-width: 991.98px) { + footer.site-footer .logo-col { + max-width: 100%; + } +} + +footer.sub-footer { + background-color: #f5f5f5; + border-top: 1px solid #cbcbcb; + padding: 1.5rem 0; +} + +.background-image-cta { + padding: 5rem 0; + background-size: cover; + background-position: center; + position: relative; +} +.background-image-cta:before { + content: ""; + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: linear-gradient(to right, rgba(255, 255, 255, 0.8), transparent); + z-index: 1; +} +.background-image-cta .container { + position: relative; + z-index: 2; +} +.background-image-cta h1, .background-image-cta .h1, .background-image-cta h2, .background-image-cta .h2, .background-image-cta h3, .background-image-cta .h3 { + text-transform: uppercase; +} +.background-image-cta p { + font-size: 27px; + margin-bottom: 2rem; +} + +.plain-text { + padding: 6rem 0; +} +.plain-text h1, .plain-text .h1, .plain-text h2, .plain-text .h2, .plain-text h3, .plain-text .h3 { + text-transform: uppercase; + text-align: center; + margin-bottom: 2rem; +} +.plain-text p { + text-align: center; + max-width: 950px; + margin: 0 auto; +} + +.logo-slider .logo { + filter: grayscale(100%); +} +.logo-slider .logo:hover { + filter: grayscale(0%); +} + +.testimonials-section { + overflow: hidden; +} +.testimonials-section h1, .testimonials-section .h1, .testimonials-section h2, .testimonials-section .h2, .testimonials-section h3, .testimonials-section .h3 { + text-transform: uppercase; + text-align: center; + margin-bottom: 2rem; +} +.testimonials-section .testimonials { + padding: 0 2rem; + position: relative; +} +.testimonials-section .testimonials .slick-arrow { + width: 60px; + height: 55px; + z-index: 99; +} +.testimonials-section .testimonials .slick-arrow img { + width: 60px; + height: 55px; +} +.testimonials-section .testimonials .slick-arrow.slick-next { + right: 4rem; +} +.testimonials-section .testimonials .slick-arrow.slick-next:before { + content: ""; +} +.testimonials-section .testimonials .slick-arrow.slick-prev { + left: 4rem; +} +.testimonials-section .testimonials .slick-arrow.slick-prev:before { + content: ""; +} +.testimonials-section .testimonials .slick-dots { + bottom: 3rem; +} +.testimonials-section .testimonials .slick-dots li button:before { + font-size: 20px; +} +.testimonials-section .testimonials .slick-dots li.slick-active button:before { + color: #ae1716; +} +.testimonials-section .testimonials .testimonial { + background: #fff; + border-radius: 15px; + box-shadow: 0 0 30px rgba(0, 0, 0, 0.1); + margin: 1rem 3rem; + width: calc(100% - 3rem) !important; + transform: translateX(-1.5rem); +} +.testimonials-section .testimonials .testimonial .stars { + background-image: url(/wp-content/themes/mccans-theme/assets/stars.svg); + display: block; + height: 40px; + width: 0; + margin: 2rem auto; +} +.testimonials-section .testimonials .testimonial .stars.stars-5 { + width: 213px; +} +.testimonials-section .testimonials .testimonial .stars.stars-4 { + width: 170px; +} +.testimonials-section .testimonials .testimonial .stars.stars-3 { + width: 130px; +} +.testimonials-section .testimonials .testimonial .stars.stars-2 { + width: 90px; +} +.testimonials-section .testimonials .testimonial .stars.stars-1 { + width: 50px; +} +.testimonials-section .testimonials .testimonial .quote { + text-align: center; + font-size: 25px; + line-height: 45px; + padding: 0 4rem; + margin-bottom: 3rem; +} +.testimonials-section .testimonials .testimonial .person-details { + display: flex; + gap: 1rem; + justify-content: center; + align-items: center; + padding-bottom: 8rem; + font-size: 26px; + line-height: 35px; +} +.testimonials-section .testimonials .testimonial .person-details .image-wrapper { + width: 105px; + height: 105px; + border-radius: 50%; + overflow: hidden; +} +.testimonials-section .testimonials .testimonial .person-details .image-wrapper img { + width: 100%; +} +.testimonials-section .testimonials .testimonial .person-details p { + margin-bottom: 0; +} +.testimonials-section .testimonials .testimonial .person-details p.name { + font-weight: bold; +} + +.top-image { + position: relative; + background-size: cover; + background-position: center; + height: 500px; +} +.top-image::before { + content: ""; + position: absolute; + width: 100%; + height: 100%; + top: 0; + left: 0; + background-color: #000; + opacity: 0.3; +} + +section.intro-slide { + position: relative; + background-position: center; + background-size: cover; + background-repeat: no-repeat; + padding: 12rem 0; +} +section.intro-slide:before { + content: ""; + width: 100%; + height: 100%; + position: absolute; + top: 0; + left: 0; + z-index: 1; + background-color: rgba(0, 0, 0, 0.3); +} +section.intro-slide .container { + position: relative; + z-index: 2; + color: #fff; + text-align: center; +} +section.intro-slide h1, section.intro-slide .h1 { + text-transform: uppercase; +} +section.intro-slide p { + font-size: 34px; +} + +section.woocommerce-wrapper { + margin-top: 4rem; +} +section.woocommerce-wrapper ul.products { + display: flex; + flex-wrap: wrap; +} + +div.product-tile { + border-radius: 15px; + box-shadow: 0 0 20px rgba(0, 0, 0, 0.1); + padding: 1rem; + position: relative; + height: 100%; +} +div.product-tile a.add_to_cart_button { + position: absolute; + top: 1rem; + right: 1rem; + width: 35px; + height: 35px; + padding: 0 !important; + display: flex !important; + justify-content: center; + align-items: center; + margin: 0 !important; + transition: all 0.3s ease; + border-radius: 50%; +} +div.product-tile a.add_to_cart_button img { + margin: 0 !important; + width: 20px !important; +} +div.product-tile a.add_to_cart_button::after { + position: absolute; + left: 80%; + margin: 0 !important; + top: -20%; +} +div.product-tile a.added_to_cart { + padding-top: 0; + position: absolute; + display: block; + color: #c80000; + font-size: 0.8rem; + text-transform: uppercase; + font-weight: bold; +} +div.product-tile a.added_to_cart::after { + content: ""; + width: 13px; + height: 14px; + display: block; + background-image: url("/wp-content/themes/mccans-theme/assets/chevron-right.svg"); + position: absolute; + left: 103%; + top: 3px; + background-size: contain; +} +div.product-tile a.added_to_cart:hover::after { + left: 105%; +} +div.product-tile:hover .add_to_cart_button { + opacity: 1; +} +div.product-tile h2, div.product-tile .h2 { + font-weight: bold; + font-size: 20px; + line-height: 26px; + text-align: center; +} +div.product-tile h2 a, div.product-tile .h2 a { + color: #000; + text-decoration: none; +} +div.product-tile h2 a:hover, div.product-tile .h2 a:hover { + color: #c80000; +} +div.product-tile p.price { + color: #c80000 !important; + font-size: 25px !important; + line-height: 26px; + text-align: center; + margin: 2rem 0 0 !important; + font-weight: bold !important; +} +div.product-tile p.msrp { + color: #acacac !important; + font-size: 15px !important; + line-height: 21px; + text-align: center; + margin: 0; +} +div.product-tile p.savings { + color: #c80000 !important; + font-size: 16px !important; + line-height: 16px; + text-align: center; + margin: 0; +} + +.post-type-archive-location .intro { + text-align: center; + padding-top: 6rem; + padding-bottom: 6rem; +} +.post-type-archive-location .intro h1, .post-type-archive-location .intro .h1 { + margin-bottom: 2rem; +} +.post-type-archive-location .intro > * { + max-width: 850px; + margin: 0 auto; +} +.post-type-archive-location .location-tile { + width: calc(50% - 2.5rem); + margin-bottom: 3rem; + color: #505050; +} +.post-type-archive-location .location-tile:first-of-type { + width: 100%; +} +.post-type-archive-location .location-tile:first-of-type .leaflet-map { + height: 500px; +} +.post-type-archive-location .location-tile h2, .post-type-archive-location .location-tile .h2 { + color: #ae1716; + text-transform: uppercase; + margin-bottom: 0; +} +.post-type-archive-location .location-tile a { + color: #505050; + text-decoration: none; +} + +.single-location .top-image { + margin-bottom: 6rem; +} +.single-location h1, .single-location .h1 { + margin-bottom: 2rem; +} +.single-location .form-wrapper { + margin-bottom: 8rem; +} +.single-location .form-wrapper label { + font-weight: bold; +} +.single-location .form-wrapper .wpcf7-checkbox .wpcf7-list-item { + display: block; + margin: 0 0 0.5rem 0; +} +.single-location .form-wrapper .wpcf7-checkbox .wpcf7-list-item:last-of-type { + margin: 0; +} +.single-location .form-wrapper .wpcf7-checkbox .wpcf7-list-item label { + font-weight: normal; +} +.single-location p { + color: #505050; +} +.single-location p strong { + text-transform: uppercase; +} +.single-location .address a { + color: #505050; + text-decoration: none; +} diff --git a/dist/app.js b/dist/app.js new file mode 100644 index 0000000..5ceba91 --- /dev/null +++ b/dist/app.js @@ -0,0 +1,14026 @@ +/******/ (() => { // webpackBootstrap +/******/ var __webpack_modules__ = ({ + +/***/ "./node_modules/jquery/dist/jquery.js": +/*!********************************************!*\ + !*** ./node_modules/jquery/dist/jquery.js ***! + \********************************************/ +/***/ (function(module, exports) { + +var __WEBPACK_AMD_DEFINE_ARRAY__, __WEBPACK_AMD_DEFINE_RESULT__;/*! + * jQuery JavaScript Library v3.7.1 + * https://jquery.com/ + * + * Copyright OpenJS Foundation and other contributors + * Released under the MIT license + * https://jquery.org/license + * + * Date: 2023-08-28T13:37Z + */ +( function( global, factory ) { + + "use strict"; + + if ( true && 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 trac-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. + // Support: QtWeb <=3.8.5, WebKit <=534.34, wkhtmltopdf tool <=0.12.5 + // Plus for old WebKit, typeof returns "function" for HTML collections + // (e.g., `typeof document.getElementsByTagName("div") === "function"`). (gh-4756) + return typeof obj === "function" && typeof obj.nodeType !== "number" && + typeof obj.item !== "function"; + }; + + +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.7.1", + + rhtmlSuffix = /HTML$/i, + + // 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; + }, + + + // Retrieve the text value of an array of DOM nodes + text: 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 += jQuery.text( node ); + } + } + if ( nodeType === 1 || nodeType === 11 ) { + return elem.textContent; + } + if ( nodeType === 9 ) { + return elem.documentElement.textContent; + } + if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + + // Do not include comment or processing instruction nodes + + return ret; + }, + + // 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 ); + }, + + isXMLDoc: function( elem ) { + var namespace = elem && elem.namespaceURI, + docElem = elem && ( elem.ownerDocument || elem ).documentElement; + + // Assume HTML when documentElement doesn't yet exist, such as inside + // document fragments. + return !rhtmlSuffix.test( namespace || docElem && docElem.nodeName || "HTML" ); + }, + + // 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; +} + + +function nodeName( elem, name ) { + + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + +} +var pop = arr.pop; + + +var sort = arr.sort; + + +var splice = arr.splice; + + +var whitespace = "[\\x20\\t\\r\\n\\f]"; + + +var rtrimCSS = new RegExp( + "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", + "g" +); + + + + +// Note: an element does not contain itself +jQuery.contains = function( a, b ) { + var bup = b && b.parentNode; + + return a === bup || !!( bup && bup.nodeType === 1 && ( + + // Support: IE 9 - 11+ + // IE doesn't have `contains` on SVG. + a.contains ? + a.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + ) ); +}; + + + + +// CSS string/identifier serialization +// https://drafts.csswg.org/cssom/#common-serializing-idioms +var rcssescape = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\x80-\uFFFF\w-]/g; + +function fcssescape( 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; +} + +jQuery.escapeSelector = function( sel ) { + return ( sel + "" ).replace( rcssescape, fcssescape ); +}; + + + + +var preferredDoc = document, + pushNative = push; + +( function() { + +var i, + Expr, + outermostContext, + sortInput, + hasDuplicate, + push = pushNative, + + // Local document vars + document, + documentElement, + documentIsHTML, + rbuggyQSA, + matches, + + // Instance-specific data + expando = jQuery.expando, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + nonnativeSelectorCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|" + + "loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // 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: https://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" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rleadingCombinator = 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" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + + // CSS escapes + // https://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; + + if ( nonHex ) { + + // Strip the backslash prefix from a non-hex escape sequence + return 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 + return high < 0 ? + String.fromCharCode( high + 0x10000 ) : + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes; see `setDocument`. + // Support: IE 9 - 11+, Edge 12 - 18+ + // Removing the function wrapper causes a "Permission Denied" + // error in IE/Edge. + unloadHandler = function() { + setDocument(); + }, + + inDisabledFieldset = addCombinator( + function( elem ) { + return elem.disabled === true && nodeName( elem, "fieldset" ); + }, + { dir: "parentNode", next: "legend" } + ); + +// Support: IE <=9 only +// Accessing document.activeElement can throw unexpectedly +// https://bugs.jquery.com/ticket/13393 +function safeActiveElement() { + try { + return document.activeElement; + } catch ( err ) { } +} + +// 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: function( target, els ) { + pushNative.apply( target, slice.call( els ) ); + }, + call: function( target ) { + pushNative.apply( target, slice.call( arguments, 1 ) ); + } + }; +} + +function find( 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 9 only + // getElementById can match elements by name instead of ID + if ( elem.id === m ) { + push.call( results, elem ); + return results; + } + } else { + return results; + } + + // Element context + } else { + + // Support: IE 9 only + // getElementById can match elements by name instead of ID + if ( newContext && ( elem = newContext.getElementById( m ) ) && + find.contains( context, elem ) && + elem.id === m ) { + + push.call( results, elem ); + return results; + } + } + + // Type selector + } else if ( match[ 2 ] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Class selector + } else if ( ( m = match[ 3 ] ) && context.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // Take advantage of querySelectorAll + if ( !nonnativeSelectorCache[ selector + " " ] && + ( !rbuggyQSA || !rbuggyQSA.test( selector ) ) ) { + + 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 ) || rleadingCombinator.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. + // 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 ( newContext != context || !support.scope ) { + + // Capture the context ID, setting it first if necessary + if ( ( nid = context.getAttribute( "id" ) ) ) { + nid = jQuery.escapeSelector( nid ); + } 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( rtrimCSS, "$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 https://github.com/jquery/sizzle/issues/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 jQuery selector module + * @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; + } +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + return nodeName( elem, "input" ) && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + return ( nodeName( elem, "input" ) || nodeName( elem, "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 + 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 jQuery selector 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; +} + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [node] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +function setDocument( node ) { + var 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; + documentElement = document.documentElement; + documentIsHTML = !jQuery.isXMLDoc( document ); + + // Support: iOS 7 only, IE 9 - 11+ + // Older browsers didn't support unprefixed `matches`. + matches = documentElement.matches || + documentElement.webkitMatchesSelector || + documentElement.msMatchesSelector; + + // Support: IE 9 - 11+, Edge 12 - 18+ + // Accessing iframe documents after unload throws "permission denied" errors + // (see trac-13936). + // Limit the fix to IE & Edge Legacy; despite Edge 15+ implementing `matches`, + // all IE 9+ and Edge Legacy versions implement `msMatchesSelector` as well. + if ( documentElement.msMatchesSelector && + + // 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 + preferredDoc != document && + ( subWindow = document.defaultView ) && subWindow.top !== subWindow ) { + + // Support: IE 9 - 11+, Edge 12 - 18+ + subWindow.addEventListener( "unload", unloadHandler ); + } + + // 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 ) { + documentElement.appendChild( el ).id = jQuery.expando; + return !document.getElementsByName || + !document.getElementsByName( jQuery.expando ).length; + } ); + + // Support: IE 9 only + // Check to see if it's possible to do matchesSelector + // on a disconnected node. + support.disconnectedMatch = assert( function( el ) { + return matches.call( el, "*" ); + } ); + + // Support: IE 9 - 11+, Edge 12 - 18+ + // IE/Edge don't support the :scope pseudo-class. + support.scope = assert( function() { + return document.querySelectorAll( ":scope" ); + } ); + + // Support: Chrome 105 - 111 only, Safari 15.4 - 16.3 only + // Make sure the `:has()` argument is parsed unforgivingly. + // We include `*` in the test to detect buggy implementations that are + // _selectively_ forgiving (specifically when the list includes at least + // one valid selector). + // Note that we treat complete lack of support for `:has()` as if it were + // spec-compliant support, which is fine because use of `:has()` in such + // environments will fail in the qSA path and fall back to jQuery traversal + // anyway. + support.cssHas = assert( function() { + try { + document.querySelector( ":has(*,:jqfake)" ); + return false; + } catch ( e ) { + return true; + } + } ); + + // 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 = function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else { + return context.querySelectorAll( tag ); + } + }; + + // Class + Expr.find.CLASS = function( className, context ) { + if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + rbuggyQSA = []; + + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert( function( el ) { + + var input; + + documentElement.appendChild( el ).innerHTML = + "" + + ""; + + // Support: iOS <=7 - 8 only + // Boolean attributes and "value" are not treated correctly in some XML documents + if ( !el.querySelectorAll( "[selected]" ).length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: iOS <=7 - 8 only + if ( !el.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push( "~=" ); + } + + // Support: iOS 8 only + // 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: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + if ( !el.querySelectorAll( ":checked" ).length ) { + rbuggyQSA.push( ":checked" ); + } + + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + input = document.createElement( "input" ); + input.setAttribute( "type", "hidden" ); + el.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE 9 - 11+ + // IE's :disabled selector does not pick up the children of disabled fieldsets + // Support: Chrome <=105+, Firefox <=104+, Safari <=15.4+ + // In some of the document kinds, these selectors wouldn't work natively. + // This is probably OK but for backwards compatibility we want to maintain + // handling them through jQuery traversal in jQuery 3.x. + documentElement.appendChild( el ).disabled = true; + if ( el.querySelectorAll( ":disabled" ).length !== 2 ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // 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 + "*(?:''|\"\")" ); + } + } ); + + if ( !support.cssHas ) { + + // Support: Chrome 105 - 110+, Safari 15.4 - 16.3+ + // Our regular `try-catch` mechanism fails to detect natively-unsupported + // pseudo-classes inside `:has()` (such as `:has(:contains("Foo"))`) + // in browsers that parse the `:has()` argument as a forgiving selector list. + // https://drafts.csswg.org/selectors/#relational now requires the argument + // to be parsed unforgivingly, but browsers have not yet fully adjusted. + rbuggyQSA.push( ":has" ); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join( "|" ) ); + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = 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 && + find.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 && + find.contains( preferredDoc, b ) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + }; + + return document; +} + +find.matches = function( expr, elements ) { + return find( expr, null, null, elements ); +}; + +find.matchesSelector = function( elem, expr ) { + setDocument( elem ); + + if ( documentIsHTML && + !nonnativeSelectorCache[ 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 find( expr, document, null, [ elem ] ).length > 0; +}; + +find.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 jQuery.contains( context, elem ); +}; + + +find.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 (see trac-13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + if ( val !== undefined ) { + return val; + } + + return elem.getAttribute( name ); +}; + +find.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +jQuery.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + // + // Support: Android <=4.0+ + // Testing for detecting duplicates is unpredictable so instead assume we can't + // depend on duplicate detection in all browsers without a stable sort. + hasDuplicate = !support.sortStable; + sortInput = !support.sortStable && slice.call( results, 0 ); + sort.call( results, sortOrder ); + + if ( hasDuplicate ) { + while ( ( elem = results[ i++ ] ) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + splice.call( results, duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +jQuery.fn.uniqueSort = function() { + return this.pushStack( jQuery.uniqueSort( slice.apply( this ) ) ); +}; + +Expr = jQuery.expr = { + + // 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 ] ) { + find.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 ] ) { + find.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 expectedNodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { + return true; + } : + function( elem ) { + return nodeName( elem, expectedNodeName ); + }; + }, + + 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 = find.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + if ( operator === "=" ) { + return result === check; + } + if ( operator === "!=" ) { + return result !== check; + } + if ( operator === "^=" ) { + return check && result.indexOf( check ) === 0; + } + if ( operator === "*=" ) { + return check && result.indexOf( check ) > -1; + } + if ( operator === "$=" ) { + return check && result.slice( -check.length ) === check; + } + if ( operator === "~=" ) { + return ( " " + result.replace( rwhitespace, " " ) + " " ) + .indexOf( check ) > -1; + } + if ( operator === "|=" ) { + return result === check || result.slice( 0, check.length + 1 ) === check + "-"; + } + + return false; + }; + }, + + 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, 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 ? + nodeName( node, 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 + outerCache = parent[ expando ] || ( parent[ expando ] = {} ); + cache = outerCache[ 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 ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + } else { + + // Use previously-cached element index if available + if ( useCache ) { + outerCache = elem[ expando ] || ( elem[ expando ] = {} ); + cache = outerCache[ 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 ? + nodeName( node, name ) : + node.nodeType === 1 ) && + ++diff ) { + + // Cache the index of each encountered element + if ( useCache ) { + outerCache = node[ expando ] || + ( node[ expando ] = {} ); + outerCache[ 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 + // https://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() ] || + find.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as jQuery 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.call( 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( rtrimCSS, "$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 + // (see https://github.com/jquery/sizzle/issues/299) + input[ 0 ] = null; + return !results.pop(); + }; + } ), + + has: markFunction( function( selector ) { + return function( elem ) { + return find( selector, elem ).length > 0; + }; + } ), + + contains: markFunction( function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || jQuery.text( 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." + // https://www.w3.org/TR/selectors/#lang-pseudo + lang: markFunction( function( lang ) { + + // lang value must be a valid identifier + if ( !ridentifier.test( lang || "" ) ) { + find.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 === documentElement; + }, + + focus: function( elem ) { + return elem === safeActiveElement() && + 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 + // https://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + return ( nodeName( elem, "input" ) && !!elem.checked ) || + ( nodeName( elem, "option" ) && !!elem.selected ); + }, + + selected: function( elem ) { + + // Support: IE <=11+ + // Accessing the selectedIndex property + // forces the browser to treat the default option as + // selected when in an optgroup. + if ( elem.parentNode ) { + // eslint-disable-next-line no-unused-expressions + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + empty: function( elem ) { + + // https://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 ) { + return nodeName( elem, "input" ) && elem.type === "button" || + nodeName( elem, "button" ); + }, + + text: function( elem ) { + var attr; + return nodeName( elem, "input" ) && elem.type === "text" && + + // Support: IE <10 only + // 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; + + if ( argument < 0 ) { + i = argument + length; + } else if ( argument > length ) { + i = length; + } else { + i = 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(); + +function tokenize( 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 = rleadingCombinator.exec( soFar ) ) ) { + matched = match.shift(); + tokens.push( { + value: matched, + + // Cast descendant combinators to space + type: match[ 0 ].replace( rtrimCSS, " " ) + } ); + 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 + if ( parseOnly ) { + return soFar.length; + } + + return soFar ? + find.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, 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 ] = {} ); + + if ( skip && nodeName( elem, skip ) ) { + elem = elem[ dir ] || elem; + } else if ( ( oldCache = outerCache[ 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 + outerCache[ 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++ ) { + find( 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, matcherOut, + 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; + + if ( matcher ) { + + // If we have a postFinder, or filtered seed, or non-seed postFilter + // or preexisting results, + matcherOut = postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results; + + // Find primary matches + matcher( matcherIn, matcherOut, context, xml ); + } else { + matcherOut = matcherIn; + } + + // 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.call( 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.call( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + + // 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 + var ret = ( !leadingRelative && ( xml || context != outermostContext ) ) || ( + ( checkContext = context ).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + + // Avoid hanging onto element + // (see https://github.com/jquery/sizzle/issues/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( rtrimCSS, "$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: iOS <=7 - 9 only + // Tolerate NodeList properties (IE: "length"; Safari: ) matching + // elements by id. (see trac-14142) + 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 ) ) { + push.call( results, 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 ) { + + jQuery.uniqueSort( results ); + } + } + + // Override manipulation of globals by nested matchers + if ( outermost ) { + dirruns = dirrunsUnique; + outermostContext = contextBackup; + } + + return unmatched; + }; + + return bySet ? + markFunction( superMatcher ) : + superMatcher; +} + +function compile( 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 jQuery's compiled + * selector functions + * @param {String|Function} selector A selector or a pre-compiled + * selector function built with jQuery selector compile + * @param {Element} context + * @param {Array} [results] + * @param {Array} [seed] A set of elements to match against + */ +function select( 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 + +// Support: Android <=4.0 - 4.1+ +// Sort stability +support.sortStable = expando.split( "" ).sort( sortOrder ).join( "" ) === expando; + +// Initialize against the default document +setDocument(); + +// Support: Android <=4.0 - 4.1+ +// 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; +} ); + +jQuery.find = find; + +// Deprecated +jQuery.expr[ ":" ] = jQuery.expr.pseudos; +jQuery.unique = jQuery.uniqueSort; + +// These have always been private, but they used to be documented as part of +// Sizzle so let's maintain them for now for backwards compatibility purposes. +find.compile = compile; +find.select = select; +find.setDocument = setDocument; +find.tokenize = tokenize; + +find.escape = jQuery.escapeSelector; +find.getText = jQuery.text; +find.isXML = jQuery.isXMLDoc; +find.selectors = jQuery.expr; +find.support = jQuery.support; +find.uniqueSort = jQuery.uniqueSort; + + /* eslint-enable */ + +} )(); + + +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; + +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 (trac-9521) + // Strict HTML recognition (trac-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 jQuery#find + 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.error ); + } + + // 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 error, in case of exception + // since it's otherwise lost when execution goes async + if ( jQuery.Deferred.getErrorHook ) { + process.error = jQuery.Deferred.getErrorHook(); + + // The deprecated alias of the above. While the name suggests + // returning the stack, not an error instance, jQuery just passes + // it directly to `console.warn` so both will work; an instance + // just better cooperates with source maps. + } else if ( jQuery.Deferred.getStackHook ) { + process.error = 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 primary Deferred + primary = 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 ) ) { + primary.resolveWith( resolveContexts, resolveValues ); + } + }; + }; + + // Single- and empty arguments are adopted like Promise.resolve + if ( remaining <= 1 ) { + adoptValue( singleValue, primary.done( updateFunc( i ) ).resolve, primary.reject, + !remaining ); + + // Use .then() to unwrap secondary thenables (cf. gh-3000) + if ( primary.state() === "pending" || + isFunction( resolveValues[ i ] && resolveValues[ i ].then ) ) { + + return primary.then(); + } + } + + // Multiple arguments are aggregated like Promise.all array elements + while ( i-- ) { + adoptValue( resolveValues[ i ], updateFunc( i ), primary.reject ); + } + + return primary.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$/; + +// If `jQuery.Deferred.getErrorHook` is defined, `asyncError` is an error +// captured before the async barrier to get the original error cause +// which may otherwise be hidden. +jQuery.Deferred.exceptionHook = function( error, asyncError ) { + + // 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, asyncError ); + } +}; + + + + +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 trac-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 (trac-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 trac-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 (trac-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 (trac-11217) + // Support: Windows Web Apps (WWA) + // `name` and `type` must use .setAttribute for WWA (trac-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 (trac-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 (trac-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 (trac-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 rtypenamespace = /^([^.]*)(?:\.(.+)|)/; + +function returnTrue() { + return true; +} + +function returnFalse() { + return false; +} + +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 (trac-13208) + // Don't process clicks on disabled elements (trac-6911, trac-8165, trac-11382, trac-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 (trac-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", true ); + } + + // 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, isSetup ) { + + // Missing `isSetup` indicates a trigger call, which must force setup through jQuery.event.add + if ( !isSetup ) { + 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 result, + saved = dataPriv.get( this, type ); + + if ( ( event.isTrigger & 1 ) && this[ type ] ) { + + // Interrupt processing of the outer synthetic .trigger()ed event + if ( !saved ) { + + // 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 + this[ type ](); + result = dataPriv.get( this, type ); + dataPriv.set( this, type, false ); + + if ( saved !== result ) { + + // Cancel the outer synthetic event + event.stopImmediatePropagation(); + event.preventDefault(); + + return result; + } + + // 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 ) { + + // ...and capture the result + dataPriv.set( this, type, jQuery.event.trigger( + saved[ 0 ], + saved.slice( 1 ), + this + ) ); + + // Abort handling of the native event by all jQuery handlers while allowing + // native handlers on the same element to run. On target, this is achieved + // by stopping immediate propagation just on the jQuery event. However, + // the native event is re-wrapped by a jQuery one on each level of the + // propagation so the only way to stop it for jQuery is to stop it for + // everyone via native `stopPropagation()`. This is not a problem for + // focus/blur which don't bubble, but it does also stop click on checkboxes + // and radios. We accept this limitation. + event.stopPropagation(); + event.isImmediatePropagationStopped = returnTrue; + } + } + } ); +} + +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 (trac-504, trac-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: true +}, jQuery.event.addProp ); + +jQuery.each( { focus: "focusin", blur: "focusout" }, function( type, delegateType ) { + + function focusMappedHandler( nativeEvent ) { + if ( document.documentMode ) { + + // Support: IE 11+ + // Attach a single focusin/focusout handler on the document while someone wants + // focus/blur. This is because the former are synchronous in IE while the latter + // are async. In other browsers, all those handlers are invoked synchronously. + + // `handle` from private data would already wrap the event, but we need + // to change the `type` here. + var handle = dataPriv.get( this, "handle" ), + event = jQuery.event.fix( nativeEvent ); + event.type = nativeEvent.type === "focusin" ? "focus" : "blur"; + event.isSimulated = true; + + // First, handle focusin/focusout + handle( nativeEvent ); + + // ...then, handle focus/blur + // + // focus/blur don't bubble while focusin/focusout do; simulate the former by only + // invoking the handler at the lower level. + if ( event.target === event.currentTarget ) { + + // The setup part calls `leverageNative`, which, in turn, calls + // `jQuery.event.add`, so event handle will already have been set + // by this point. + handle( event ); + } + } else { + + // For non-IE browsers, attach a single capturing handler on the document + // while someone wants focusin/focusout. + jQuery.event.simulate( delegateType, nativeEvent.target, + jQuery.event.fix( nativeEvent ) ); + } + } + + jQuery.event.special[ type ] = { + + // Utilize native event if possible so blur/focus sequence is correct + setup: function() { + + var attaches; + + // Claim the first handler + // dataPriv.set( this, "focus", ... ) + // dataPriv.set( this, "blur", ... ) + leverageNative( this, type, true ); + + if ( document.documentMode ) { + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + attaches = dataPriv.get( this, delegateType ); + if ( !attaches ) { + this.addEventListener( delegateType, focusMappedHandler ); + } + dataPriv.set( this, delegateType, ( attaches || 0 ) + 1 ); + } else { + + // 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; + }, + + teardown: function() { + var attaches; + + if ( document.documentMode ) { + attaches = dataPriv.get( this, delegateType ) - 1; + if ( !attaches ) { + this.removeEventListener( delegateType, focusMappedHandler ); + dataPriv.remove( this, delegateType ); + } else { + dataPriv.set( this, delegateType, attaches ); + } + } else { + + // Return false to indicate standard teardown should be applied + return false; + } + }, + + // Suppress native focus or blur if we're currently inside + // a leveraged native-event stack + _default: function( event ) { + return dataPriv.get( event.target, type ); + }, + + delegateType: delegateType + }; + + // 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 + // + // Support: IE 9 - 11+ + // To preserve relative focusin/focus & focusout/blur event order guaranteed on the 3.x branch, + // attach a single handler for both events in IE. + jQuery.event.special[ delegateType ] = { + setup: function() { + + // Handle: regular nodes (via `this.ownerDocument`), window + // (via `this.document`) & document (via `this`). + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ); + + // Support: IE 9 - 11+ + // We use the same native handler for focusin & focus (and focusout & blur) + // so we need to coordinate setup & teardown parts between those events. + // Use `delegateType` as the key as `type` is already used by `leverageNative`. + if ( !attaches ) { + if ( document.documentMode ) { + this.addEventListener( delegateType, focusMappedHandler ); + } else { + doc.addEventListener( type, focusMappedHandler, true ); + } + } + dataPriv.set( dataHolder, delegateType, ( attaches || 0 ) + 1 ); + }, + teardown: function() { + var doc = this.ownerDocument || this.document || this, + dataHolder = document.documentMode ? this : doc, + attaches = dataPriv.get( dataHolder, delegateType ) - 1; + + if ( !attaches ) { + if ( document.documentMode ) { + this.removeEventListener( delegateType, focusMappedHandler ); + } else { + doc.removeEventListener( type, focusMappedHandler, true ); + } + dataPriv.remove( dataHolder, delegateType ); + } else { + dataPriv.set( dataHolder, delegateType, attaches ); + } + } + }; +} ); + +// 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 (trac-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; + + // Re-enable 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 { + + // Unwrap a CDATA section containing script contents. This shouldn't be + // needed as in XML documents they're already not visible when + // inspecting element contents and in HTML documents they have no + // meaning but we're preserving that logic for backwards compatibility. + // This will be removed completely in 4.0. See gh-4904. + 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 jQuery#find 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 rcustomProp = /^--/; + + +var getStyles = function( elem ) { + + // Support: IE <=11 only, Firefox <=30 (trac-15098, trac-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 (trac-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! + // + // Support: Firefox 70+ + // Only Firefox includes border widths + // in computed dimensions. (gh-4529) + 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;border-collapse:separate"; + tr.style.cssText = "box-sizing:content-box;border:1px solid"; + + // Support: Chrome 86+ + // Height set through cssText does not get applied. + // Computed height then comes back as 0. + tr.style.height = "1px"; + trChild.style.height = "9px"; + + // Support: Android 8 Chrome 86+ + // In our bodyBackground.html iframe, + // display for all div elements is set to "inline", + // which causes a problem only in Android 8 Chrome 86. + // Ensuring the div is `display: block` + // gets around this issue. + trChild.style.display = "block"; + + documentElement + .appendChild( table ) + .appendChild( tr ) + .appendChild( trChild ); + + trStyle = window.getComputedStyle( tr ); + reliableTrDimensionsVal = ( parseInt( trStyle.height, 10 ) + + parseInt( trStyle.borderTopWidth, 10 ) + + parseInt( trStyle.borderBottomWidth, 10 ) ) === tr.offsetHeight; + + documentElement.removeChild( table ); + } + return reliableTrDimensionsVal; + } + } ); +} )(); + + +function curCSS( elem, name, computed ) { + var width, minWidth, maxWidth, ret, + isCustomProp = rcustomProp.test( name ), + + // 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, trac-12537) + // .css('--customProperty) (gh-3144) + if ( computed ) { + + // Support: IE <=9 - 11+ + // IE only supports `"float"` in `getPropertyValue`; in computed styles + // it's only available as `"cssFloat"`. We no longer modify properties + // sent to `.css()` apart from camelCasing, so we need to check both. + // Normally, this would create difference in behavior: if + // `getPropertyValue` returns an empty string, the value returned + // by `.css()` would be `undefined`. This is usually the case for + // disconnected elements. However, in IE even disconnected elements + // with no styles return `"none"` for `getPropertyValue( "float" )` + ret = computed.getPropertyValue( name ) || computed[ name ]; + + if ( isCustomProp && ret ) { + + // Support: Firefox 105+, Chrome <=105+ + // Spec requires trimming whitespace for custom properties (gh-4926). + // Firefox only trims leading whitespace. Chrome just collapses + // both leading & trailing whitespace to a single space. + // + // Fall back to `undefined` if empty string returned. + // This collapses a missing definition with property defined + // and set to an empty string but there's no standard API + // allowing us to differentiate them without a performance penalty + // and returning `undefined` aligns with older jQuery. + // + // rtrimCSS treats U+000D CARRIAGE RETURN and U+000C FORM FEED + // as whitespace while CSS does not, but this is not a problem + // because CSS preprocessing replaces them with U+000A LINE FEED + // (which *is* CSS whitespace) + // https://www.w3.org/TR/css-syntax-3/#input-preprocessing + ret = ret.replace( rtrimCSS, "$1" ) || undefined; + } + + 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]).+)/, + 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, + marginDelta = 0; + + // Adjustment may not be necessary + if ( box === ( isBorderBox ? "border" : "content" ) ) { + return 0; + } + + for ( ; i < 4; i += 2 ) { + + // Both box models exclude margin + // Count margin delta separately to only add it after scroll gutter adjustment. + // This is needed to make negative margins work with `outerHeight( true )` (gh-3982). + if ( box === "margin" ) { + marginDelta += 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 + marginDelta; +} + +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, + aspectRatio: true, + borderImageSlice: true, + columnCount: 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, + scale: true, + widows: true, + zIndex: true, + zoom: true, + + // SVG-related + fillOpacity: true, + floodOpacity: true, + stopOpacity: true, + strokeMiterlimit: true, + strokeOpacity: 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 (trac-7345) + if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) { + value = adjustCSS( elem, name, ret ); + + // Fixes bug trac-9237 + type = "number"; + } + + // Make sure that null and NaN values aren't set (trac-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 )` (trac-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. +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 + // Use proper attribute retrieval (trac-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 classNames, cur, curValue, className, i, finalValue; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).addClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + classNames = classesToArray( value ); + + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + if ( cur.indexOf( " " + className + " " ) < 0 ) { + cur += className + " "; + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + this.setAttribute( "class", finalValue ); + } + } + } ); + } + + return this; + }, + + removeClass: function( value ) { + var classNames, cur, curValue, className, i, finalValue; + + if ( isFunction( value ) ) { + return this.each( function( j ) { + jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) ); + } ); + } + + if ( !arguments.length ) { + return this.attr( "class", "" ); + } + + classNames = classesToArray( value ); + + if ( classNames.length ) { + return this.each( function() { + curValue = getClass( this ); + + // This expression is here for better compressibility (see addClass) + cur = this.nodeType === 1 && ( " " + stripAndCollapse( curValue ) + " " ); + + if ( cur ) { + for ( i = 0; i < classNames.length; i++ ) { + className = classNames[ i ]; + + // Remove *all* instances + while ( cur.indexOf( " " + className + " " ) > -1 ) { + cur = cur.replace( " " + className + " ", " " ); + } + } + + // Only assign if different to avoid unneeded rendering. + finalValue = stripAndCollapse( cur ); + if ( curValue !== finalValue ) { + this.setAttribute( "class", finalValue ); + } + } + } ); + } + + return this; + }, + + toggleClass: function( value, stateVal ) { + var classNames, className, i, self, + type = typeof value, + isValidValue = type === "string" || Array.isArray( value ); + + if ( isFunction( value ) ) { + return this.each( function( i ) { + jQuery( this ).toggleClass( + value.call( this, i, getClass( this ), stateVal ), + stateVal + ); + } ); + } + + if ( typeof stateVal === "boolean" && isValidValue ) { + return stateVal ? this.addClass( value ) : this.removeClass( value ); + } + + classNames = classesToArray( value ); + + return this.each( function() { + if ( isValidValue ) { + + // Toggle individual class names + self = jQuery( this ); + + for ( i = 0; i < classNames.length; i++ ) { + 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 (trac-14686, trac-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 (trac-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 +var location = window.location; + +var nonce = { guid: Date.now() }; + +var rquery = ( /\?/ ); + + + +// Cross-browser xml parsing +jQuery.parseXML = function( data ) { + var xml, parserErrorElem; + 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 ) {} + + parserErrorElem = xml && xml.getElementsByTagName( "parsererror" )[ 0 ]; + if ( !xml || parserErrorElem ) { + jQuery.error( "Invalid XML: " + ( + parserErrorElem ? + jQuery.map( parserErrorElem.childNodes, function( el ) { + return el.textContent; + } ).join( "\n" ) : + data + ) ); + } + return xml; +}; + + +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 (trac-9951) + // Bubble up to document, then to window; watch for a global ownerDocument var (trac-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 (trac-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 ); + } + } +} ); + + +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, + + // trac-7653, trac-8125, trac-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 (trac-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 trac-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 (trac-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 trac-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 (trac-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; + + // trac-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 but not if jsonp + if ( !isSuccess && + jQuery.inArray( "script", s.dataTypes ) > -1 && + jQuery.inArray( "json", s.dataTypes ) < 0 ) { + 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 (trac-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 + // trac-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 trac-8605, trac-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 ) { + + // trac-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( " {{#wp-header}} + +
+ +
+ + diff --git a/tpl/index.tpl b/tpl/index.tpl index bacfef6..a1bde94 100644 --- a/tpl/index.tpl +++ b/tpl/index.tpl @@ -1,39 +1,11 @@ +
+
+
+ +
+

This fell back to the index file, not good, catch it upstream!

+
-
-
-

- Welcome to Rad Theme Engine! -

- - -

Get started by editing these template files to build out your site layouts and content.

-

All template files need to be valid handlebars files, with tags that look like this: {{#raw}}{{#formatDate now}}{{/raw}}. Note: the now variable got its value passed by the PHP file to this template, and the #formatDate prefix is a handlebars helper. You can write your own helpers very easily, and RAD comes preloaded with a bunch of really useful ones!

- -

That tag is rendered into this: {{#formatDate now }}

-
-
- -
-
-

We also passed the WordPress saved content to this template, asking specifically for the content, title, and published_at date. Here is a quick example of how to use that data:

-

Title: {{ post.title }}

-

Published: {{ post.published_at }}

-

Content:

- {{{ post.content }}} -
-
-
- -
-

- For more help getting started on your new RAD project, visit the
- RAD Theme Engine Docs -

-
+
diff --git a/tpl/location-tile.tpl b/tpl/location-tile.tpl new file mode 100644 index 0000000..fd75aff --- /dev/null +++ b/tpl/location-tile.tpl @@ -0,0 +1,21 @@ +
+
+
+
+

{{ title }}

+

{{ address_1 }}
+ {{#if city}} + {{ city }}, + {{else}} + {{ title }}, + {{/if}} + + {{ state }} {{ zip }}
+ {{ phone }} +

+ + +
+
diff --git a/tpl/location.tpl b/tpl/location.tpl new file mode 100644 index 0000000..e5e1ad1 --- /dev/null +++ b/tpl/location.tpl @@ -0,0 +1,44 @@ +
+   +
+ +
+
+
+
+

{{ title }} Location

+

{{{ intro }}}

+ +
+ {{{ form }}} +
+
+ +
+
+ +
+
+

{{ title }} Store:
+ {{ address_1 }}
+ {{#if city}} + {{ city }}, + {{else}} + {{ title }}, + {{/if}} + + {{ state }} {{ zip }}
+ {{ phone }} +

+
+ +
+

Hours:
+ {{#nl2br hours }} +

+
+
+
+
+
+
diff --git a/tpl/locations.tpl b/tpl/locations.tpl new file mode 100644 index 0000000..7a8e9e3 --- /dev/null +++ b/tpl/locations.tpl @@ -0,0 +1,22 @@ +
+   +
+ +
+
+
+
+

{{ headline }}

+

{{{ intro }}}

+
+
+ +
+
+ {{#each locations}} + {{#locationTile .}} + {{/each}} +
+
+
+
diff --git a/tpl/page.tpl b/tpl/page.tpl new file mode 100644 index 0000000..86170c3 --- /dev/null +++ b/tpl/page.tpl @@ -0,0 +1,9 @@ +
+
+
+
+ {{{ content }}} +
+
+
+
diff --git a/tpl/product-tile.tpl b/tpl/product-tile.tpl new file mode 100644 index 0000000..429d9cd --- /dev/null +++ b/tpl/product-tile.tpl @@ -0,0 +1,26 @@ +
+ + Add To Cart + + + {{ title }} + +

+ {{ title }} +

+

${{ price }}

+ {{#if msrp}} +

MSRP: ${{ msrp }}

+ {{/if}} + {{#if savings}} +

(You save {{ savings }}%)

+ {{/if}} +
diff --git a/tpl/shop-top.tpl b/tpl/shop-top.tpl new file mode 100644 index 0000000..77fa956 --- /dev/null +++ b/tpl/shop-top.tpl @@ -0,0 +1,10 @@ +
+
+
+
+

{{ headline }}

+

{{ intro_text }}

+
+
+
+
diff --git a/tpl/testimonial-block.tpl b/tpl/testimonial-block.tpl new file mode 100644 index 0000000..aab742a --- /dev/null +++ b/tpl/testimonial-block.tpl @@ -0,0 +1,18 @@ +
+
 
+

“{{ quote }}”

+
+
+ {{#if thumbnail}} + {{ title }} + {{else}} + {{ title }} + {{/if}} +
+ +
+

{{ title }}

+

{{ position }}

+
+
+
diff --git a/tpl/woocommerce-after-content.tpl b/tpl/woocommerce-after-content.tpl new file mode 100644 index 0000000..73667e7 --- /dev/null +++ b/tpl/woocommerce-after-content.tpl @@ -0,0 +1,5 @@ + +
+
+ + diff --git a/tpl/woocommerce-before-content.tpl b/tpl/woocommerce-before-content.tpl new file mode 100644 index 0000000..3020d66 --- /dev/null +++ b/tpl/woocommerce-before-content.tpl @@ -0,0 +1,4 @@ +
+
+
+
diff --git a/vendor/.htaccess b/vendor/.htaccess new file mode 100644 index 0000000..3afcdbe --- /dev/null +++ b/vendor/.htaccess @@ -0,0 +1,6 @@ +# Apache 2.2 +Order Allow,Deny +Deny from all + +# Apache 2.4+ +Require all denied diff --git a/vendor/autoload.php b/vendor/autoload.php new file mode 100644 index 0000000..f77f153 --- /dev/null +++ b/vendor/autoload.php @@ -0,0 +1,25 @@ +realpath = realpath($opened_path) ?: $opened_path; + $opened_path = $this->realpath; + $this->handle = fopen($this->realpath, $mode); + $this->position = 0; + + return (bool) $this->handle; + } + + public function stream_read($count) + { + $data = fread($this->handle, $count); + + if ($this->position === 0) { + $data = preg_replace('{^#!.*\r?\n}', '', $data); + } + + $this->position += strlen($data); + + return $data; + } + + public function stream_cast($castAs) + { + return $this->handle; + } + + public function stream_close() + { + fclose($this->handle); + } + + public function stream_lock($operation) + { + return $operation ? flock($this->handle, $operation) : true; + } + + public function stream_seek($offset, $whence) + { + if (0 === fseek($this->handle, $offset, $whence)) { + $this->position = ftell($this->handle); + return true; + } + + return false; + } + + public function stream_tell() + { + return $this->position; + } + + public function stream_eof() + { + return feof($this->handle); + } + + public function stream_stat() + { + return array(); + } + + public function stream_set_option($option, $arg1, $arg2) + { + return true; + } + + public function url_stat($path, $flags) + { + $path = substr($path, 17); + if (file_exists($path)) { + return stat($path); + } + + return false; + } + } + } + + if ( + (function_exists('stream_get_wrappers') && in_array('phpvfscomposer', stream_get_wrappers(), true)) + || (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) + ) { + return include("phpvfscomposer://" . __DIR__ . '/..'.'/open-function-computers-llc/rad-theme-engine/bin/getIcon'); + } +} + +return include __DIR__ . '/..'.'/open-function-computers-llc/rad-theme-engine/bin/getIcon'; diff --git a/vendor/composer/ClassLoader.php b/vendor/composer/ClassLoader.php new file mode 100644 index 0000000..7824d8f --- /dev/null +++ b/vendor/composer/ClassLoader.php @@ -0,0 +1,579 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer\Autoload; + +/** + * ClassLoader implements a PSR-0, PSR-4 and classmap class loader. + * + * $loader = new \Composer\Autoload\ClassLoader(); + * + * // register classes with namespaces + * $loader->add('Symfony\Component', __DIR__.'/component'); + * $loader->add('Symfony', __DIR__.'/framework'); + * + * // activate the autoloader + * $loader->register(); + * + * // to enable searching the include path (eg. for PEAR packages) + * $loader->setUseIncludePath(true); + * + * In this example, if you try to use a class in the Symfony\Component + * namespace or one of its children (Symfony\Component\Console for instance), + * the autoloader will first look for the class under the component/ + * directory, and it will then fallback to the framework/ directory if not + * found before giving up. + * + * This class is loosely based on the Symfony UniversalClassLoader. + * + * @author Fabien Potencier + * @author Jordi Boggiano + * @see https://www.php-fig.org/psr/psr-0/ + * @see https://www.php-fig.org/psr/psr-4/ + */ +class ClassLoader +{ + /** @var \Closure(string):void */ + private static $includeFile; + + /** @var string|null */ + private $vendorDir; + + // PSR-4 + /** + * @var array> + */ + private $prefixLengthsPsr4 = array(); + /** + * @var array> + */ + private $prefixDirsPsr4 = array(); + /** + * @var list + */ + private $fallbackDirsPsr4 = array(); + + // PSR-0 + /** + * List of PSR-0 prefixes + * + * Structured as array('F (first letter)' => array('Foo\Bar (full prefix)' => array('path', 'path2'))) + * + * @var array>> + */ + private $prefixesPsr0 = array(); + /** + * @var list + */ + private $fallbackDirsPsr0 = array(); + + /** @var bool */ + private $useIncludePath = false; + + /** + * @var array + */ + private $classMap = array(); + + /** @var bool */ + private $classMapAuthoritative = false; + + /** + * @var array + */ + private $missingClasses = array(); + + /** @var string|null */ + private $apcuPrefix; + + /** + * @var array + */ + private static $registeredLoaders = array(); + + /** + * @param string|null $vendorDir + */ + public function __construct($vendorDir = null) + { + $this->vendorDir = $vendorDir; + self::initializeIncludeClosure(); + } + + /** + * @return array> + */ + public function getPrefixes() + { + if (!empty($this->prefixesPsr0)) { + return call_user_func_array('array_merge', array_values($this->prefixesPsr0)); + } + + return array(); + } + + /** + * @return array> + */ + public function getPrefixesPsr4() + { + return $this->prefixDirsPsr4; + } + + /** + * @return list + */ + public function getFallbackDirs() + { + return $this->fallbackDirsPsr0; + } + + /** + * @return list + */ + public function getFallbackDirsPsr4() + { + return $this->fallbackDirsPsr4; + } + + /** + * @return array Array of classname => path + */ + public function getClassMap() + { + return $this->classMap; + } + + /** + * @param array $classMap Class to filename map + * + * @return void + */ + public function addClassMap(array $classMap) + { + if ($this->classMap) { + $this->classMap = array_merge($this->classMap, $classMap); + } else { + $this->classMap = $classMap; + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, either + * appending or prepending to the ones previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 root directories + * @param bool $prepend Whether to prepend the directories + * + * @return void + */ + public function add($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + if ($prepend) { + $this->fallbackDirsPsr0 = array_merge( + $paths, + $this->fallbackDirsPsr0 + ); + } else { + $this->fallbackDirsPsr0 = array_merge( + $this->fallbackDirsPsr0, + $paths + ); + } + + return; + } + + $first = $prefix[0]; + if (!isset($this->prefixesPsr0[$first][$prefix])) { + $this->prefixesPsr0[$first][$prefix] = $paths; + + return; + } + if ($prepend) { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $paths, + $this->prefixesPsr0[$first][$prefix] + ); + } else { + $this->prefixesPsr0[$first][$prefix] = array_merge( + $this->prefixesPsr0[$first][$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, either + * appending or prepending to the ones previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * @param bool $prepend Whether to prepend the directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function addPsr4($prefix, $paths, $prepend = false) + { + $paths = (array) $paths; + if (!$prefix) { + // Register directories for the root namespace. + if ($prepend) { + $this->fallbackDirsPsr4 = array_merge( + $paths, + $this->fallbackDirsPsr4 + ); + } else { + $this->fallbackDirsPsr4 = array_merge( + $this->fallbackDirsPsr4, + $paths + ); + } + } elseif (!isset($this->prefixDirsPsr4[$prefix])) { + // Register directories for a new namespace. + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = $paths; + } elseif ($prepend) { + // Prepend directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $paths, + $this->prefixDirsPsr4[$prefix] + ); + } else { + // Append directories for an already registered namespace. + $this->prefixDirsPsr4[$prefix] = array_merge( + $this->prefixDirsPsr4[$prefix], + $paths + ); + } + } + + /** + * Registers a set of PSR-0 directories for a given prefix, + * replacing any others previously set for this prefix. + * + * @param string $prefix The prefix + * @param list|string $paths The PSR-0 base directories + * + * @return void + */ + public function set($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr0 = (array) $paths; + } else { + $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths; + } + } + + /** + * Registers a set of PSR-4 directories for a given namespace, + * replacing any others previously set for this namespace. + * + * @param string $prefix The prefix/namespace, with trailing '\\' + * @param list|string $paths The PSR-4 base directories + * + * @throws \InvalidArgumentException + * + * @return void + */ + public function setPsr4($prefix, $paths) + { + if (!$prefix) { + $this->fallbackDirsPsr4 = (array) $paths; + } else { + $length = strlen($prefix); + if ('\\' !== $prefix[$length - 1]) { + throw new \InvalidArgumentException("A non-empty PSR-4 prefix must end with a namespace separator."); + } + $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length; + $this->prefixDirsPsr4[$prefix] = (array) $paths; + } + } + + /** + * Turns on searching the include path for class files. + * + * @param bool $useIncludePath + * + * @return void + */ + public function setUseIncludePath($useIncludePath) + { + $this->useIncludePath = $useIncludePath; + } + + /** + * Can be used to check if the autoloader uses the include path to check + * for classes. + * + * @return bool + */ + public function getUseIncludePath() + { + return $this->useIncludePath; + } + + /** + * Turns off searching the prefix and fallback directories for classes + * that have not been registered with the class map. + * + * @param bool $classMapAuthoritative + * + * @return void + */ + public function setClassMapAuthoritative($classMapAuthoritative) + { + $this->classMapAuthoritative = $classMapAuthoritative; + } + + /** + * Should class lookup fail if not found in the current class map? + * + * @return bool + */ + public function isClassMapAuthoritative() + { + return $this->classMapAuthoritative; + } + + /** + * APCu prefix to use to cache found/not-found classes, if the extension is enabled. + * + * @param string|null $apcuPrefix + * + * @return void + */ + public function setApcuPrefix($apcuPrefix) + { + $this->apcuPrefix = function_exists('apcu_fetch') && filter_var(ini_get('apc.enabled'), FILTER_VALIDATE_BOOLEAN) ? $apcuPrefix : null; + } + + /** + * The APCu prefix in use, or null if APCu caching is not enabled. + * + * @return string|null + */ + public function getApcuPrefix() + { + return $this->apcuPrefix; + } + + /** + * Registers this instance as an autoloader. + * + * @param bool $prepend Whether to prepend the autoloader or not + * + * @return void + */ + public function register($prepend = false) + { + spl_autoload_register(array($this, 'loadClass'), true, $prepend); + + if (null === $this->vendorDir) { + return; + } + + if ($prepend) { + self::$registeredLoaders = array($this->vendorDir => $this) + self::$registeredLoaders; + } else { + unset(self::$registeredLoaders[$this->vendorDir]); + self::$registeredLoaders[$this->vendorDir] = $this; + } + } + + /** + * Unregisters this instance as an autoloader. + * + * @return void + */ + public function unregister() + { + spl_autoload_unregister(array($this, 'loadClass')); + + if (null !== $this->vendorDir) { + unset(self::$registeredLoaders[$this->vendorDir]); + } + } + + /** + * Loads the given class or interface. + * + * @param string $class The name of the class + * @return true|null True if loaded, null otherwise + */ + public function loadClass($class) + { + if ($file = $this->findFile($class)) { + $includeFile = self::$includeFile; + $includeFile($file); + + return true; + } + + return null; + } + + /** + * Finds the path to the file where the class is defined. + * + * @param string $class The name of the class + * + * @return string|false The path if found, false otherwise + */ + public function findFile($class) + { + // class map lookup + if (isset($this->classMap[$class])) { + return $this->classMap[$class]; + } + if ($this->classMapAuthoritative || isset($this->missingClasses[$class])) { + return false; + } + if (null !== $this->apcuPrefix) { + $file = apcu_fetch($this->apcuPrefix.$class, $hit); + if ($hit) { + return $file; + } + } + + $file = $this->findFileWithExtension($class, '.php'); + + // Search for Hack files if we are running on HHVM + if (false === $file && defined('HHVM_VERSION')) { + $file = $this->findFileWithExtension($class, '.hh'); + } + + if (null !== $this->apcuPrefix) { + apcu_add($this->apcuPrefix.$class, $file); + } + + if (false === $file) { + // Remember that this class does not exist. + $this->missingClasses[$class] = true; + } + + return $file; + } + + /** + * Returns the currently registered loaders keyed by their corresponding vendor directories. + * + * @return array + */ + public static function getRegisteredLoaders() + { + return self::$registeredLoaders; + } + + /** + * @param string $class + * @param string $ext + * @return string|false + */ + private function findFileWithExtension($class, $ext) + { + // PSR-4 lookup + $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . $ext; + + $first = $class[0]; + if (isset($this->prefixLengthsPsr4[$first])) { + $subPath = $class; + while (false !== $lastPos = strrpos($subPath, '\\')) { + $subPath = substr($subPath, 0, $lastPos); + $search = $subPath . '\\'; + if (isset($this->prefixDirsPsr4[$search])) { + $pathEnd = DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $lastPos + 1); + foreach ($this->prefixDirsPsr4[$search] as $dir) { + if (file_exists($file = $dir . $pathEnd)) { + return $file; + } + } + } + } + } + + // PSR-4 fallback dirs + foreach ($this->fallbackDirsPsr4 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) { + return $file; + } + } + + // PSR-0 lookup + if (false !== $pos = strrpos($class, '\\')) { + // namespaced class name + $logicalPathPsr0 = substr($logicalPathPsr4, 0, $pos + 1) + . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR); + } else { + // PEAR-like class name + $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . $ext; + } + + if (isset($this->prefixesPsr0[$first])) { + foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) { + if (0 === strpos($class, $prefix)) { + foreach ($dirs as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + } + } + } + + // PSR-0 fallback dirs + foreach ($this->fallbackDirsPsr0 as $dir) { + if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) { + return $file; + } + } + + // PSR-0 include paths. + if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) { + return $file; + } + + return false; + } + + /** + * @return void + */ + private static function initializeIncludeClosure() + { + if (self::$includeFile !== null) { + return; + } + + /** + * Scope isolated include. + * + * Prevents access to $this/self from included files. + * + * @param string $file + * @return void + */ + self::$includeFile = \Closure::bind(static function($file) { + include $file; + }, null, null); + } +} diff --git a/vendor/composer/InstalledVersions.php b/vendor/composer/InstalledVersions.php new file mode 100644 index 0000000..51e734a --- /dev/null +++ b/vendor/composer/InstalledVersions.php @@ -0,0 +1,359 @@ + + * Jordi Boggiano + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace Composer; + +use Composer\Autoload\ClassLoader; +use Composer\Semver\VersionParser; + +/** + * This class is copied in every Composer installed project and available to all + * + * See also https://getcomposer.org/doc/07-runtime.md#installed-versions + * + * To require its presence, you can require `composer-runtime-api ^2.0` + * + * @final + */ +class InstalledVersions +{ + /** + * @var mixed[]|null + * @psalm-var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array}|array{}|null + */ + private static $installed; + + /** + * @var bool|null + */ + private static $canGetVendors; + + /** + * @var array[] + * @psalm-var array}> + */ + private static $installedByVendor = array(); + + /** + * Returns a list of all package names which are present, either by being installed, replaced or provided + * + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackages() + { + $packages = array(); + foreach (self::getInstalled() as $installed) { + $packages[] = array_keys($installed['versions']); + } + + if (1 === \count($packages)) { + return $packages[0]; + } + + return array_keys(array_flip(\call_user_func_array('array_merge', $packages))); + } + + /** + * Returns a list of all package names with a specific type e.g. 'library' + * + * @param string $type + * @return string[] + * @psalm-return list + */ + public static function getInstalledPackagesByType($type) + { + $packagesByType = array(); + + foreach (self::getInstalled() as $installed) { + foreach ($installed['versions'] as $name => $package) { + if (isset($package['type']) && $package['type'] === $type) { + $packagesByType[] = $name; + } + } + } + + return $packagesByType; + } + + /** + * Checks whether the given package is installed + * + * This also returns true if the package name is provided or replaced by another package + * + * @param string $packageName + * @param bool $includeDevRequirements + * @return bool + */ + public static function isInstalled($packageName, $includeDevRequirements = true) + { + foreach (self::getInstalled() as $installed) { + if (isset($installed['versions'][$packageName])) { + return $includeDevRequirements || !isset($installed['versions'][$packageName]['dev_requirement']) || $installed['versions'][$packageName]['dev_requirement'] === false; + } + } + + return false; + } + + /** + * Checks whether the given package satisfies a version constraint + * + * e.g. If you want to know whether version 2.3+ of package foo/bar is installed, you would call: + * + * Composer\InstalledVersions::satisfies(new VersionParser, 'foo/bar', '^2.3') + * + * @param VersionParser $parser Install composer/semver to have access to this class and functionality + * @param string $packageName + * @param string|null $constraint A version constraint to check for, if you pass one you have to make sure composer/semver is required by your package + * @return bool + */ + public static function satisfies(VersionParser $parser, $packageName, $constraint) + { + $constraint = $parser->parseConstraints((string) $constraint); + $provided = $parser->parseConstraints(self::getVersionRanges($packageName)); + + return $provided->matches($constraint); + } + + /** + * Returns a version constraint representing all the range(s) which are installed for a given package + * + * It is easier to use this via isInstalled() with the $constraint argument if you need to check + * whether a given version of a package is installed, and not just whether it exists + * + * @param string $packageName + * @return string Version constraint usable with composer/semver + */ + public static function getVersionRanges($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + $ranges = array(); + if (isset($installed['versions'][$packageName]['pretty_version'])) { + $ranges[] = $installed['versions'][$packageName]['pretty_version']; + } + if (array_key_exists('aliases', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['aliases']); + } + if (array_key_exists('replaced', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['replaced']); + } + if (array_key_exists('provided', $installed['versions'][$packageName])) { + $ranges = array_merge($ranges, $installed['versions'][$packageName]['provided']); + } + + return implode(' || ', $ranges); + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['version'])) { + return null; + } + + return $installed['versions'][$packageName]['version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as version, use satisfies or getVersionRanges if you need to know if a given version is present + */ + public static function getPrettyVersion($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['pretty_version'])) { + return null; + } + + return $installed['versions'][$packageName]['pretty_version']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as reference + */ + public static function getReference($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + if (!isset($installed['versions'][$packageName]['reference'])) { + return null; + } + + return $installed['versions'][$packageName]['reference']; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @param string $packageName + * @return string|null If the package is being replaced or provided but is not really installed, null will be returned as install path. Packages of type metapackages also have a null install path. + */ + public static function getInstallPath($packageName) + { + foreach (self::getInstalled() as $installed) { + if (!isset($installed['versions'][$packageName])) { + continue; + } + + return isset($installed['versions'][$packageName]['install_path']) ? $installed['versions'][$packageName]['install_path'] : null; + } + + throw new \OutOfBoundsException('Package "' . $packageName . '" is not installed'); + } + + /** + * @return array + * @psalm-return array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool} + */ + public static function getRootPackage() + { + $installed = self::getInstalled(); + + return $installed[0]['root']; + } + + /** + * Returns the raw installed.php data for custom implementations + * + * @deprecated Use getAllRawData() instead which returns all datasets for all autoloaders present in the process. getRawData only returns the first dataset loaded, which may not be what you expect. + * @return array[] + * @psalm-return array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} + */ + public static function getRawData() + { + @trigger_error('getRawData only returns the first dataset loaded, which may not be what you expect. Use getAllRawData() instead which returns all datasets for all autoloaders present in the process.', E_USER_DEPRECATED); + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + self::$installed = include __DIR__ . '/installed.php'; + } else { + self::$installed = array(); + } + } + + return self::$installed; + } + + /** + * Returns the raw data of all installed.php which are currently loaded for custom implementations + * + * @return array[] + * @psalm-return list}> + */ + public static function getAllRawData() + { + return self::getInstalled(); + } + + /** + * Lets you reload the static array from another file + * + * This is only useful for complex integrations in which a project needs to use + * this class but then also needs to execute another project's autoloader in process, + * and wants to ensure both projects have access to their version of installed.php. + * + * A typical case would be PHPUnit, where it would need to make sure it reads all + * the data it needs from this class, then call reload() with + * `require $CWD/vendor/composer/installed.php` (or similar) as input to make sure + * the project in which it runs can then also use this class safely, without + * interference between PHPUnit's dependencies and the project's dependencies. + * + * @param array[] $data A vendor/composer/installed.php data set + * @return void + * + * @psalm-param array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $data + */ + public static function reload($data) + { + self::$installed = $data; + self::$installedByVendor = array(); + } + + /** + * @return array[] + * @psalm-return list}> + */ + private static function getInstalled() + { + if (null === self::$canGetVendors) { + self::$canGetVendors = method_exists('Composer\Autoload\ClassLoader', 'getRegisteredLoaders'); + } + + $installed = array(); + + if (self::$canGetVendors) { + foreach (ClassLoader::getRegisteredLoaders() as $vendorDir => $loader) { + if (isset(self::$installedByVendor[$vendorDir])) { + $installed[] = self::$installedByVendor[$vendorDir]; + } elseif (is_file($vendorDir.'/composer/installed.php')) { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require $vendorDir.'/composer/installed.php'; + $installed[] = self::$installedByVendor[$vendorDir] = $required; + if (null === self::$installed && strtr($vendorDir.'/composer', '\\', '/') === strtr(__DIR__, '\\', '/')) { + self::$installed = $installed[count($installed) - 1]; + } + } + } + } + + if (null === self::$installed) { + // only require the installed.php file if this file is loaded from its dumped location, + // and not from its source location in the composer/composer package, see https://github.com/composer/composer/issues/9937 + if (substr(__DIR__, -8, 1) !== 'C') { + /** @var array{root: array{name: string, pretty_version: string, version: string, reference: string|null, type: string, install_path: string, aliases: string[], dev: bool}, versions: array} $required */ + $required = require __DIR__ . '/installed.php'; + self::$installed = $required; + } else { + self::$installed = array(); + } + } + + if (self::$installed !== array()) { + $installed[] = self::$installed; + } + + return $installed; + } +} diff --git a/vendor/composer/LICENSE b/vendor/composer/LICENSE new file mode 100644 index 0000000..f27399a --- /dev/null +++ b/vendor/composer/LICENSE @@ -0,0 +1,21 @@ + +Copyright (c) Nils Adermann, Jordi Boggiano + +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. + diff --git a/vendor/composer/autoload_classmap.php b/vendor/composer/autoload_classmap.php new file mode 100644 index 0000000..0fb0a2c --- /dev/null +++ b/vendor/composer/autoload_classmap.php @@ -0,0 +1,10 @@ + $vendorDir . '/composer/InstalledVersions.php', +); diff --git a/vendor/composer/autoload_namespaces.php b/vendor/composer/autoload_namespaces.php new file mode 100644 index 0000000..12e4927 --- /dev/null +++ b/vendor/composer/autoload_namespaces.php @@ -0,0 +1,10 @@ + array($vendorDir . '/salesforce/handlebars-php/src'), +); diff --git a/vendor/composer/autoload_psr4.php b/vendor/composer/autoload_psr4.php new file mode 100644 index 0000000..51a984f --- /dev/null +++ b/vendor/composer/autoload_psr4.php @@ -0,0 +1,12 @@ + array($vendorDir . '/open-function-computers-llc/rad-theme-engine/src'), + 'PostTypes\\' => array($vendorDir . '/jjgrainger/posttypes/src'), + 'Helpers\\' => array($baseDir . '/helpers'), +); diff --git a/vendor/composer/autoload_real.php b/vendor/composer/autoload_real.php new file mode 100644 index 0000000..047811c --- /dev/null +++ b/vendor/composer/autoload_real.php @@ -0,0 +1,38 @@ +register(true); + + return $loader; + } +} diff --git a/vendor/composer/autoload_static.php b/vendor/composer/autoload_static.php new file mode 100644 index 0000000..4e284c5 --- /dev/null +++ b/vendor/composer/autoload_static.php @@ -0,0 +1,63 @@ + + array ( + 'ofc\\' => 4, + ), + 'P' => + array ( + 'PostTypes\\' => 10, + ), + 'H' => + array ( + 'Helpers\\' => 8, + ), + ); + + public static $prefixDirsPsr4 = array ( + 'ofc\\' => + array ( + 0 => __DIR__ . '/..' . '/open-function-computers-llc/rad-theme-engine/src', + ), + 'PostTypes\\' => + array ( + 0 => __DIR__ . '/..' . '/jjgrainger/posttypes/src', + ), + 'Helpers\\' => + array ( + 0 => __DIR__ . '/../..' . '/helpers', + ), + ); + + public static $prefixesPsr0 = array ( + 'H' => + array ( + 'Handlebars' => + array ( + 0 => __DIR__ . '/..' . '/salesforce/handlebars-php/src', + ), + ), + ); + + public static $classMap = array ( + 'Composer\\InstalledVersions' => __DIR__ . '/..' . '/composer/InstalledVersions.php', + ); + + public static function getInitializer(ClassLoader $loader) + { + return \Closure::bind(function () use ($loader) { + $loader->prefixLengthsPsr4 = ComposerStaticInit3607194100d6f07e79a6cf21cb37ba8f::$prefixLengthsPsr4; + $loader->prefixDirsPsr4 = ComposerStaticInit3607194100d6f07e79a6cf21cb37ba8f::$prefixDirsPsr4; + $loader->prefixesPsr0 = ComposerStaticInit3607194100d6f07e79a6cf21cb37ba8f::$prefixesPsr0; + $loader->classMap = ComposerStaticInit3607194100d6f07e79a6cf21cb37ba8f::$classMap; + + }, null, ClassLoader::class); + } +} diff --git a/vendor/composer/installed.json b/vendor/composer/installed.json new file mode 100644 index 0000000..81e868b --- /dev/null +++ b/vendor/composer/installed.json @@ -0,0 +1,168 @@ +{ + "packages": [ + { + "name": "jjgrainger/posttypes", + "version": "v2.2.1", + "version_normalized": "2.2.1.0", + "source": { + "type": "git", + "url": "https://github.com/jjgrainger/PostTypes.git", + "reference": "2f20f628ec44404960df4b1ae5d623397a66aec1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/jjgrainger/PostTypes/zipball/2f20f628ec44404960df4b1ae5d623397a66aec1", + "reference": "2f20f628ec44404960df4b1ae5d623397a66aec1", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.6", + "squizlabs/php_codesniffer": "3.*" + }, + "time": "2024-10-13T17:23:48+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "PostTypes\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Joe Grainger", + "homepage": "https://jjgrainger.co.uk" + } + ], + "description": "Simple WordPress custom post types.", + "homepage": "https://posttypes.jjgrainger.co.uk", + "keywords": [ + "post-types", + "wordpress" + ], + "support": { + "issues": "https://github.com/jjgrainger/posttypes/issues", + "source": "https://github.com/jjgrainger/posttypes" + }, + "install-path": "../jjgrainger/posttypes" + }, + { + "name": "open-function-computers-llc/rad-theme-engine", + "version": "v1.0.34", + "version_normalized": "1.0.34.0", + "source": { + "type": "git", + "url": "https://github.com/open-function-computers-llc/rad-theme-engine.git", + "reference": "c0b814bdd0ee1f093a051ed2e78efdf8c1f4f94e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/open-function-computers-llc/rad-theme-engine/zipball/c0b814bdd0ee1f093a051ed2e78efdf8c1f4f94e", + "reference": "c0b814bdd0ee1f093a051ed2e78efdf8c1f4f94e", + "shasum": "" + }, + "require": { + "jjgrainger/posttypes": "^2.1", + "php": ">=7.4", + "salesforce/handlebars-php": "^2.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "time": "2025-05-20T21:03:45+00:00", + "bin": [ + "bin/getIcon" + ], + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-4": { + "ofc\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A suite of classes to make WordPress theme development cleaner", + "keywords": [ + "handlebars", + "theme", + "wordpress" + ], + "support": { + "issues": "https://github.com/open-function-computers-llc/rad-theme-engine/issues", + "source": "https://github.com/open-function-computers-llc/rad-theme-engine/tree/v1.0.34" + }, + "install-path": "../open-function-computers-llc/rad-theme-engine" + }, + { + "name": "salesforce/handlebars-php", + "version": "2.3.0", + "version_normalized": "2.3.0.0", + "source": { + "type": "git", + "url": "https://github.com/salesforce/handlebars-php.git", + "reference": "59fc47c7b2701659cb483d0f3461c4f712693b2b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/salesforce/handlebars-php/zipball/59fc47c7b2701659cb483d0f3461c4f712693b2b", + "reference": "59fc47c7b2701659cb483d0f3461c4f712693b2b", + "shasum": "" + }, + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4" + }, + "time": "2020-06-08T17:23:52+00:00", + "type": "library", + "installation-source": "dist", + "autoload": { + "psr-0": { + "Handlebars": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "fzerorubigd", + "email": "fzerorubigd@gmail.com" + }, + { + "name": "Behrooz Shabani (everplays)", + "email": "everplays@gmail.com" + }, + { + "name": "Mardix", + "homepage": "https://github.com/mardix" + } + ], + "description": "Handlebars processor for php", + "homepage": "http://www.github.com/salesforce/handlebars-php", + "keywords": [ + "handlebars", + "mustache", + "templating" + ], + "support": { + "issues": "https://github.com/salesforce/handlebars-php/issues", + "source": "https://github.com/salesforce/handlebars-php/tree/2.3.0" + }, + "install-path": "../salesforce/handlebars-php" + } + ], + "dev": true, + "dev-package-names": [] +} diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php new file mode 100644 index 0000000..99a04c7 --- /dev/null +++ b/vendor/composer/installed.php @@ -0,0 +1,50 @@ + array( + 'name' => 'open-function-computers-llc/wp-theme', + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'reference' => 'c074a5ef18d6702ae4abe09fa1289fc93726117d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev' => true, + ), + 'versions' => array( + 'jjgrainger/posttypes' => array( + 'pretty_version' => 'v2.2.1', + 'version' => '2.2.1.0', + 'reference' => '2f20f628ec44404960df4b1ae5d623397a66aec1', + 'type' => 'library', + 'install_path' => __DIR__ . '/../jjgrainger/posttypes', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'open-function-computers-llc/rad-theme-engine' => array( + 'pretty_version' => 'v1.0.34', + 'version' => '1.0.34.0', + 'reference' => 'c0b814bdd0ee1f093a051ed2e78efdf8c1f4f94e', + 'type' => 'library', + 'install_path' => __DIR__ . '/../open-function-computers-llc/rad-theme-engine', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'open-function-computers-llc/wp-theme' => array( + 'pretty_version' => 'dev-main', + 'version' => 'dev-main', + 'reference' => 'c074a5ef18d6702ae4abe09fa1289fc93726117d', + 'type' => 'library', + 'install_path' => __DIR__ . '/../../', + 'aliases' => array(), + 'dev_requirement' => false, + ), + 'salesforce/handlebars-php' => array( + 'pretty_version' => '2.3.0', + 'version' => '2.3.0.0', + 'reference' => '59fc47c7b2701659cb483d0f3461c4f712693b2b', + 'type' => 'library', + 'install_path' => __DIR__ . '/../salesforce/handlebars-php', + 'aliases' => array(), + 'dev_requirement' => false, + ), + ), +); diff --git a/vendor/composer/platform_check.php b/vendor/composer/platform_check.php new file mode 100644 index 0000000..580fa96 --- /dev/null +++ b/vendor/composer/platform_check.php @@ -0,0 +1,26 @@ += 70400)) { + $issues[] = 'Your Composer dependencies require a PHP version ">= 7.4.0". You are running ' . PHP_VERSION . '.'; +} + +if ($issues) { + if (!headers_sent()) { + header('HTTP/1.1 500 Internal Server Error'); + } + if (!ini_get('display_errors')) { + if (PHP_SAPI === 'cli' || PHP_SAPI === 'phpdbg') { + fwrite(STDERR, 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . implode(PHP_EOL, $issues) . PHP_EOL.PHP_EOL); + } elseif (!headers_sent()) { + echo 'Composer detected issues in your platform:' . PHP_EOL.PHP_EOL . str_replace('You are running '.PHP_VERSION.'.', '', implode(PHP_EOL, $issues)) . PHP_EOL.PHP_EOL; + } + } + trigger_error( + 'Composer detected issues in your platform: ' . implode(' ', $issues), + E_USER_ERROR + ); +} diff --git a/vendor/jjgrainger/posttypes/.gitattributes b/vendor/jjgrainger/posttypes/.gitattributes new file mode 100644 index 0000000..e9d9d40 --- /dev/null +++ b/vendor/jjgrainger/posttypes/.gitattributes @@ -0,0 +1 @@ +/examples export-ignore diff --git a/vendor/jjgrainger/posttypes/.gitbook.yml b/vendor/jjgrainger/posttypes/.gitbook.yml new file mode 100644 index 0000000..8df9419 --- /dev/null +++ b/vendor/jjgrainger/posttypes/.gitbook.yml @@ -0,0 +1,3 @@ +root: ./docs/ +structure: + readme: ../README.md diff --git a/vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/bug-report.md b/vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 0000000..7773491 --- /dev/null +++ b/vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,11 @@ +--- +name: "🐛 Bug Report" +about: "Report an error or unexpected behaviour you found when using the code." +--- + +Please consider the following when creating your Bug Report: + +* Provide as much detail about the problem. +* Give steps to help reproduce the problem. +* Code examples and error messages are useful. +* Version numbers (PHP, PostTypes, WordPress) are useful. diff --git a/vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/documentation-improvement.md b/vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/documentation-improvement.md new file mode 100644 index 0000000..e1184b3 --- /dev/null +++ b/vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/documentation-improvement.md @@ -0,0 +1,10 @@ +--- +name: "📖 Documentation Improvement" +about: "Suggest improvements for the documentation. This could be anything from fixing spelling errors to adding new sections." +--- + +Please consider the following when creating your Documentation Improvement: + +* Please check the documentation first for your answer. +* Provide code examples if necessary. +* Keep questions relevant to PostTypes. diff --git a/vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/feature-request.md b/vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 0000000..3a3eedf --- /dev/null +++ b/vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,11 @@ +--- +name: "🚀 Feature Request" +about: "Suggest an idea for an improvement or additional functionality." +--- + +Please consider the following when creating your Feature Request: + +* Provide a description of the change you want to make. +* Highlight the problem it attempts to solve. +* Offer examples of how it would be used. +* Provide links to WordPress documentation were relevant. diff --git a/vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/support-question.md b/vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/support-question.md new file mode 100644 index 0000000..3bae323 --- /dev/null +++ b/vendor/jjgrainger/posttypes/.github/ISSUE_TEMPLATE/support-question.md @@ -0,0 +1,9 @@ +--- +name: "🎈 Support Question" +about: "For general questions and support." +--- + +Please consider the following when creating your Support Question: + +* Provide links to the pages you're referring to. +* Offer an explanation on how this is an improvement. diff --git a/vendor/jjgrainger/posttypes/.github/PULL_REQUEST_TEMPLATE.md b/vendor/jjgrainger/posttypes/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..2e89a79 --- /dev/null +++ b/vendor/jjgrainger/posttypes/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,8 @@ +Thank you for your Pull Request! + +Please consider the following when creating your pull request: + +* Please provide a description with your pull request. +* DO NOT include issue numbers in your pull request title +* Reference issue numbers in this description. +* Use bullet points if you're covering a lot of changes. diff --git a/vendor/jjgrainger/posttypes/.github/workflows/tests.yml b/vendor/jjgrainger/posttypes/.github/workflows/tests.yml new file mode 100644 index 0000000..f5729e7 --- /dev/null +++ b/vendor/jjgrainger/posttypes/.github/workflows/tests.yml @@ -0,0 +1,45 @@ +name: tests + +on: + push: + branches: + - master + pull_request: + branches: + - master + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Setup PHP + uses: shivammathur/setup-php@v2 + with: + php-version: '8.3' + + - name: Validate composer.json and composer.lock + run: composer validate --strict + + - name: Cache Composer packages + id: composer-cache + uses: actions/cache@v4 + with: + path: vendor + key: ${{ runner.os }}-php-${{ hashFiles('**/composer.lock') }} + restore-keys: | + ${{ runner.os }}-php- + + - name: Install dependencies + run: composer install --prefer-dist --no-progress + + - name: Run test suite + run: composer run-script test + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4 + with: + file: ./coverage.xml + env: + CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} diff --git a/vendor/jjgrainger/posttypes/.gitignore b/vendor/jjgrainger/posttypes/.gitignore new file mode 100644 index 0000000..7506fef --- /dev/null +++ b/vendor/jjgrainger/posttypes/.gitignore @@ -0,0 +1,3 @@ +/vendor +.phpunit.result.cache +coverage.xml diff --git a/vendor/jjgrainger/posttypes/CONTRIBUTING.md b/vendor/jjgrainger/posttypes/CONTRIBUTING.md new file mode 100644 index 0000000..1aa32e3 --- /dev/null +++ b/vendor/jjgrainger/posttypes/CONTRIBUTING.md @@ -0,0 +1,143 @@ +# Contributing + +First, thank you for taking the time to contribute to [PostTypes](https://github.com/jjgrainger/PostTypes), you're amazing! 🎉 👏 🙌 + +All contributions are welcome and appreciated. It is recommended that you read through this document before making your first contribution. + +The following instructions are recommended as _guidelines_ and not strict rules. However, following this guide will make it easier for both you and the maintainers when working on the project. + +**There are 3 ways you can contribute to PostTypes.** + +* [Create an Issue](#create-an-issue) +* [Submit a Pull Request](#submit-a-pull-request) +* [Show Support](#show-support) + +## Purpose + +PostTypes mission is to _create advanced WordPress custom post types easily_. + +Its focus is on the creation of custom post types, specifically around the admin interface, providing methods to create advanced post tables, columns, filters and more. + +It also makes it easy to create taxonomies and assign them to post types. + +Although its focus is on the admin interface, PostTypes **is not for custom fields**. There are plenty of solutions for creating custom fields in WordPress. PostTypes has no intention of being one. + +Please keep this in mind when contributing to the project. + +## Create an Issue + +If you would like to report a bug, feature request, documentation improvement or question please [create an issue](https://github.com/jjgrainger/PostTypes/issues/new). Before creating a new issue please check it has not already been raised by searching [issues](https://github.com/jjgrainger/PostTypes/issues) on GitHub. + +When creating an issue it is best to provide as much information as possible in order to help the discussion move quickly and efficiently. + +**There are 4 types of issues:** + +* [Bug Reports](#bug-report) +* [Feature Requests](#feature-request) +* [Documentation Improvements](#documentation-improvement) +* [Support Questions](#support-questions) + +### 🐛 Bug Report + +Bug reports highlight an error or unexpected behaviour when using the code. In order to resolve the issue, enough detail must be provided in order to recreate the problem so it can be investigated and fixed. + +**Tips on creating bug reports:** + +* Provide as much detail about the problem. +* Give steps to help reproduce the problem. +* Code examples and error messages are useful. +* Version numbers (PHP, PostTypes, WordPress) are useful. + +### 🚀 Feature Request + +Feature requests suggest an idea for an improvement or additional functionality. Feature requests should be raised **before submitting a [pull request](#submit-a-pull-request)**. This provides an opportunity for discussion and help prevent unnecessary work from being carried out. + +**Tips on creating feature requests:** + +* Provide a description of the change you want to make. +* Highlight the problem it attempts to solve. +* Offer examples of how it would be used. +* Provide links to WordPress documentation where relevant. + +### 📖 Documentation Improvements + +Documentation improvements suggest ways to enhance the [documentation](https://posttypes.jjgrainger.co.uk). This could be anything from fixing spelling errors to adding new sections. + +**Tips on creating documentation improvements:** + +* Provide links to the pages you're referring to. +* Offer an explanation on how this is an improvement. + +### 🎈 Support Questions + +For general questions and support. This is also a catch-all for anything that doesn't fit in the categories above. + +**Tips on creating support questions:** + +* Please check the [documentation](https://posttypes.jjgrainger.co.uk) first for your answer. +* Provide code examples if necessary. +* Keep questions relevant to PostTypes. + +### Labels + +Labels are used to help organise different types of issues. Labels are prefixed with their group, which currently are _type_ and _status_. Maintainers will apply the correct labels to an issue when they are reviewed. + +| Label | Description | +| --- | --- | +| **Type: Bug** | Bug reports and issues with unexpected behaviour | +| **Type: Feature** | Feature requests and ideas | +| **Type: Docs** | Improvements and fixes around documentation | +| **Type: Support** | General support and questions | +| **Status: Discussion** | An issue that needs discussion before it can be worked on. | +| **Status: Ready** | An issue that is ready to be picked up. | +| **Status: In Progress** | An issue that is currently being worked. | +| **Status: Review** | An issue that is finished and ready to be reviewed and merged. | +| **Status: Complete** | An issue that is finished and merged into master. | + +This is not an exhaustive list. Labels may be changed and new ones created over time. For a complete list, see the [GitHub repo](https://github.com/jjgrainger/PostTypes/labels). + +## Submit a Pull Request + +**Before submitting a Pull Request** it is recommended you [create an issue](#create-an-issue) first. This provides an opportunity to open up a discussion before any work takes place. + +### Basic Workflow + +1. [Create a Fork](https://guides.github.com/activities/forking/#fork) of the main [jjgrainger/PostTypes](https://github.com/jjgrainger/PostTypes) repository. +1. [Clone your fork](https://guides.github.com/activities/forking/#clone) locally to your machine. +1. Create a branch with one of the relevant [branch prefixes](#branch-prefixes). +1. Commit work to your branch. +1. Push your branch to your fork on GitHub. +1. Create a [pull request](https://github.com/jjgrainger/PostTypes/compare) comparing your forks branch against the main repository's `master`. + +**Tips on creating pull requests:** + +* [Reference issue numbers](https://help.github.com/articles/closing-issues-using-keywords/) in your commits where applicable. +* Commit *little and often*, smaller commits make it easier to review code. +* **Do not** include issue numbers in the title of your pull request. +* Please provide a description with your pull request with details about the change you are trying to make. +* Please link to any issues the pull request is related. + +### Branch Prefixes + +Branch prefixes are used to help categorise the working branches by type. + +| Prefix | Description | Example | +| --- | --- | --- | +| `fix/` | An attempt to fix a bug | `fix/incorrect-post-type-name` | +| `feature/` | A new feature being worked on | `feature/bulk-update-actions` | +| `docs/` | Documentation fix, addition or improvement | `docs/fix-spelling-errors` | +| `release/` | A release branch to create a new release. | `release/v2.0.1` | + +The `release/` prefix is to be used by **maintainers only**. + +The `docs/` prefix is used alongside [Gitbook](https://www.gitbook.com/) where the docs are hosted. Branches with this prefix will be automatically generated and made available as a version on the [documentation site](https://posttypes.jjgrainger.co.uk). This provides an opportunity to preview changes and approve them before being merged. + +## Show Support + +PostTypes is open source and free to use. It was created to solve a problem while giving something back to the community. There are many ways to show your support, some ideas include: + +* Creating an [issue](https://github.com/jjgrainger/PostTypes/issues/new) and [pull requests](https://github.com/jjgrainger/PostTypes/compare). +* [Staring](https://github.com/jjgrainger/PostTypes/stargazers) the project on GitHub. +* Saying "thank you" over on [Twitter](https://twitter.com/jjgrainger) +* Spread the word and let others know. +* [Buy me a beer](https://www.paypal.me/jjgrainger/5). diff --git a/vendor/jjgrainger/posttypes/Changelog.md b/vendor/jjgrainger/posttypes/Changelog.md new file mode 100644 index 0000000..d75cfec --- /dev/null +++ b/vendor/jjgrainger/posttypes/Changelog.md @@ -0,0 +1,49 @@ +# Changelog + +##### v2.2.1 +* merge [pull requests #95](https://github.com/jjgrainger/PostTypes/pull/95): Update tests +* merge [pull requests #93](https://github.com/jjgrainger/PostTypes/pull/93): Fix empty array if taxonomy query var is null +* merge [pull requests #88](https://github.com/jjgrainger/PostTypes/pull/88): Fix docblock definition + +##### v2.2 +* merge [pull requests #81](https://github.com/jjgrainger/PostTypes/pull/81): Fix Taxonomy dropdown filter +* merge [pull requests #80](https://github.com/jjgrainger/PostTypes/pull/80): Fix Modify Existing Objects +* merge [pull requests #72](https://github.com/jjgrainger/PostTypes/pull/72): fix issue 71 +* merge [pull requests #74](https://github.com/jjgrainger/PostTypes/pull/74): Allow setting false to sort by alphabetical +* merge [pull requests #79](https://github.com/jjgrainger/PostTypes/pull/79): Update docs and README examples +* merge [pull requests #78](https://github.com/jjgrainger/PostTypes/pull/78): Maintenance + + +##### v2.1 +* merge [pull reqeuest #45](https://github.com/jjgrainger/PostTypes/pull/45): add PHP 7.2 Compatibility +* merge [pull reqeuest #46](https://github.com/jjgrainger/PostTypes/pull/46): Make sure the "orderby" query var is a string when sorting by columns. +* merge [pull reqeuest #55](https://github.com/jjgrainger/PostTypes/pull/55): Fix column mismatch broken sort +* merge [pull reqeuest #56](https://github.com/jjgrainger/PostTypes/pull/56): Grammar mistakes corrected +* merge [pull reqeuest #61](https://github.com/jjgrainger/PostTypes/pull/61): Fix incorrect property types +* merge [pull reqeuest #62](https://github.com/jjgrainger/PostTypes/pull/62): Allow for multiple taxonomies and post types to be added +* merge [pull reqeuest #63](https://github.com/jjgrainger/PostTypes/pull/63): Update Taxonomy columns documentation +* merge [pull reqeuest #64](https://github.com/jjgrainger/PostTypes/pull/64): Update minimum PHP version, phpunit and phpcs + +##### v2.0.1 +* merge [pull reqeuest #19](https://github.com/jjgrainger/PostTypes/pull/19): Use wp_dropdown_categories function for post filtering selectbox +* update minimum php version to 5.6 + +##### v2.0 +* fix [issue #9](https://github.com/jjgrainger/PostTypes/issues/9): add unit tests +* fix [issue #12](https://github.com/jjgrainger/PostTypes/issues/12) and [issue #13](https://github.com/jjgrainger/PostTypes/issues/13): generating duplicate columns +* fix [issue #2](https://github.com/jjgrainger/PostTypes/issues/2) and [issue #16](https://github.com/jjgrainger/PostTypes/issues/16): translations not working +* create Taxonomy class +* fix [issue #11](https://github.com/jjgrainger/PostTypes/issues/11): add `columns()` to Taxonomy class +* update [`examples/books.php`](https://github.com/jjgrainger/PostTypes/blob/master/examples/books.php) + +##### v1.1.2 +* fix PHPCS as dev requirement +* add version to composer json + +##### v1.1.1 +* fix [issue #8](https://github.com/jjgrainger/PostTypes/issues/8): Error with `$addTaxonomy` + +##### v1.1 +* fix [issue #6](https://github.com/jjgrainger/PostTypes/issues/6): problem registering existing taxonomies +* add [issue #1](https://github.com/jjgrainger/PostTypes/issues/1): Add PHPCS and Travic integration +* merge [pull request #3](https://github.com/jjgrainger/PostTypes/pull/3): Add `labels()` method to `PostTypes` diff --git a/vendor/jjgrainger/posttypes/LICENSE b/vendor/jjgrainger/posttypes/LICENSE new file mode 100644 index 0000000..0da0591 --- /dev/null +++ b/vendor/jjgrainger/posttypes/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 jjgrainger + +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. diff --git a/vendor/jjgrainger/posttypes/README.md b/vendor/jjgrainger/posttypes/README.md new file mode 100644 index 0000000..782016a --- /dev/null +++ b/vendor/jjgrainger/posttypes/README.md @@ -0,0 +1,89 @@ +# PostTypes v2.2.1 + +[![tests](https://github.com/jjgrainger/PostTypes/actions/workflows/tests.yml/badge.svg)](https://github.com/jjgrainger/PostTypes/actions/workflows/tests.yml) [![codecov](https://codecov.io/gh/jjgrainger/PostTypes/branch/master/graph/badge.svg?token=SGrK2xDF46)](https://codecov.io/gh/jjgrainger/PostTypes) [![Latest Stable Version](https://flat.badgen.net/github/release/jjgrainger/PostTypes/stable)](https://packagist.org/packages/jjgrainger/posttypes) [![Total Downloads](https://flat.badgen.net/packagist/dt/jjgrainger/PostTypes)](https://packagist.org/packages/jjgrainger/posttypes) [![License](https://flat.badgen.net/github/license/jjgrainger/PostTypes)](https://packagist.org/packages/jjgrainger/posttypes) + +> Simple WordPress custom post types. + +## Requirements + +* PHP >=7.2 +* [Composer](https://getcomposer.org/) +* [WordPress](https://wordpress.org) >=5.1 + +## Installation + +#### Install with composer + +Run the following in your terminal to install PostTypes with [Composer](https://getcomposer.org/). + +``` +$ composer require jjgrainger/posttypes +``` + +PostTypes uses [PSR-4](https://www.php-fig.org/psr/psr-4/) autoloading and can be used with the Composer's autoloader. Below is a basic example of getting started, though your setup may be different depending on how you are using Composer. + +```php +require __DIR__ . '/vendor/autoload.php'; + +use PostTypes\PostType; + +$books = new PostType( 'book' ); + +$books->register(); +``` + +See Composer's [basic usage](https://getcomposer.org/doc/01-basic-usage.md#autoloading) guide for details on working with Composer and autoloading. + +## Basic Usage + +Below is a basic example of setting up a simple book post type with a genre taxonomy. For more information, check out the [online documentation here](https://posttypes.jjgrainger.co.uk). + +```php +// Require the Composer autoloader. +require __DIR__ . '/vendor/autoload.php'; + +// Import PostTypes. +use PostTypes\PostType; +use PostTypes\Taxonomy; + +// Create a book post type. +$books = new PostType( 'book' ); + +// Attach the genre taxonomy (which is created below). +$books->taxonomy( 'genre' ); + +// Hide the date and author columns. +$books->columns()->hide( [ 'date', 'author' ] ); + +// Set the Books menu icon. +$books->icon( 'dashicons-book-alt' ); + +// Register the post type to WordPress. +$books->register(); + +// Create a genre taxonomy. +$genres = new Taxonomy( 'genre' ); + +// Set options for the taxonomy. +$genres->options( [ + 'hierarchical' => false, +] ); + +// Register the taxonomy to WordPress. +$genres->register(); +``` + +## Notes + +* The full documentation can be found online at [posttypes.jjgrainger.co.uk](https://posttypes.jjgrainger.co.uk) +* The class has no methods for making custom fields for post types, use [Advanced Custom Fields](https://advancedcustomfields.com) +* The book's example used in the README.md can be found in [examples/books.php](examples/books.php) +* Licensed under the [MIT License](https://github.com/jjgrainger/PostTypes/blob/master/LICENSE) +* Maintained under the [Semantic Versioning Guide](https://semver.org) + +## Author + +**Joe Grainger** + +* [https://jjgrainger.co.uk](https://jjgrainger.co.uk) +* [https://twitter.com/jjgrainger](https://twitter.com/jjgrainger) diff --git a/vendor/jjgrainger/posttypes/codecov.yml b/vendor/jjgrainger/posttypes/codecov.yml new file mode 100644 index 0000000..69cb760 --- /dev/null +++ b/vendor/jjgrainger/posttypes/codecov.yml @@ -0,0 +1 @@ +comment: false diff --git a/vendor/jjgrainger/posttypes/composer.json b/vendor/jjgrainger/posttypes/composer.json new file mode 100644 index 0000000..011d3a1 --- /dev/null +++ b/vendor/jjgrainger/posttypes/composer.json @@ -0,0 +1,37 @@ +{ + "name": "jjgrainger/posttypes", + "description": "Simple WordPress custom post types.", + "keywords": ["wordpress", "post-types"], + "license": "MIT", + "homepage": "https://posttypes.jjgrainger.co.uk", + "support": { + "issues": "https://github.com/jjgrainger/posttypes/issues", + "source": "https://github.com/jjgrainger/posttypes" + }, + "authors": [ + { + "name": "Joe Grainger", + "homepage": "https://jjgrainger.co.uk" + } + ], + "require": { + "php": ">=7.2" + }, + "require-dev": { + "phpunit/phpunit": "^9.6", + "squizlabs/php_codesniffer": "3.*" + }, + "autoload": { + "psr-4": { + "PostTypes\\": "src/" + } + }, + "scripts": { + "test": [ + "./vendor/bin/phpcs --standard=psr2 src", + "./vendor/bin/phpunit --coverage-clover=coverage.xml" + ] + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/vendor/jjgrainger/posttypes/composer.lock b/vendor/jjgrainger/posttypes/composer.lock new file mode 100644 index 0000000..b53ef6a --- /dev/null +++ b/vendor/jjgrainger/posttypes/composer.lock @@ -0,0 +1,1842 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "ce0e59647caa2ce5d97d11f9eaad608d", + "packages": [], + "packages-dev": [ + { + "name": "doctrine/instantiator", + "version": "2.0.0", + "source": { + "type": "git", + "url": "https://github.com/doctrine/instantiator.git", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/instantiator/zipball/c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "reference": "c6222283fa3f4ac679f8b9ced9a4e23f163e80d0", + "shasum": "" + }, + "require": { + "php": "^8.1" + }, + "require-dev": { + "doctrine/coding-standard": "^11", + "ext-pdo": "*", + "ext-phar": "*", + "phpbench/phpbench": "^1.2", + "phpstan/phpstan": "^1.9.4", + "phpstan/phpstan-phpunit": "^1.3", + "phpunit/phpunit": "^9.5.27", + "vimeo/psalm": "^5.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com", + "homepage": "https://ocramius.github.io/" + } + ], + "description": "A small, lightweight utility to instantiate objects in PHP without invoking their constructors", + "homepage": "https://www.doctrine-project.org/projects/instantiator.html", + "keywords": [ + "constructor", + "instantiate" + ], + "support": { + "issues": "https://github.com/doctrine/instantiator/issues", + "source": "https://github.com/doctrine/instantiator/tree/2.0.0" + }, + "funding": [ + { + "url": "https://www.doctrine-project.org/sponsorship.html", + "type": "custom" + }, + { + "url": "https://www.patreon.com/phpdoctrine", + "type": "patreon" + }, + { + "url": "https://tidelift.com/funding/github/packagist/doctrine%2Finstantiator", + "type": "tidelift" + } + ], + "time": "2022-12-30T00:23:10+00:00" + }, + { + "name": "myclabs/deep-copy", + "version": "1.12.0", + "source": { + "type": "git", + "url": "https://github.com/myclabs/DeepCopy.git", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/myclabs/DeepCopy/zipball/3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "reference": "3a6b9a42cd8f8771bd4295d13e1423fa7f3d942c", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "conflict": { + "doctrine/collections": "<1.6.8", + "doctrine/common": "<2.13.3 || >=3 <3.2.2" + }, + "require-dev": { + "doctrine/collections": "^1.6.8", + "doctrine/common": "^2.13.3 || ^3.2.2", + "phpspec/prophecy": "^1.10", + "phpunit/phpunit": "^7.5.20 || ^8.5.23 || ^9.5.13" + }, + "type": "library", + "autoload": { + "files": [ + "src/DeepCopy/deep_copy.php" + ], + "psr-4": { + "DeepCopy\\": "src/DeepCopy/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "Create deep copies (clones) of your objects", + "keywords": [ + "clone", + "copy", + "duplicate", + "object", + "object graph" + ], + "support": { + "issues": "https://github.com/myclabs/DeepCopy/issues", + "source": "https://github.com/myclabs/DeepCopy/tree/1.12.0" + }, + "funding": [ + { + "url": "https://tidelift.com/funding/github/packagist/myclabs/deep-copy", + "type": "tidelift" + } + ], + "time": "2024-06-12T14:39:25+00:00" + }, + { + "name": "nikic/php-parser", + "version": "v5.3.1", + "source": { + "type": "git", + "url": "https://github.com/nikic/PHP-Parser.git", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/8eea230464783aa9671db8eea6f8c6ac5285794b", + "reference": "8eea230464783aa9671db8eea6f8c6ac5285794b", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "ext-json": "*", + "ext-tokenizer": "*", + "php": ">=7.4" + }, + "require-dev": { + "ircmaxell/php-yacc": "^0.0.7", + "phpunit/phpunit": "^9.0" + }, + "bin": [ + "bin/php-parse" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "PhpParser\\": "lib/PhpParser" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Nikita Popov" + } + ], + "description": "A PHP parser written in PHP", + "keywords": [ + "parser", + "php" + ], + "support": { + "issues": "https://github.com/nikic/PHP-Parser/issues", + "source": "https://github.com/nikic/PHP-Parser/tree/v5.3.1" + }, + "time": "2024-10-08T18:51:32+00:00" + }, + { + "name": "phar-io/manifest", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/phar-io/manifest.git", + "reference": "54750ef60c58e43759730615a392c31c80e23176" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/manifest/zipball/54750ef60c58e43759730615a392c31c80e23176", + "reference": "54750ef60c58e43759730615a392c31c80e23176", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-phar": "*", + "ext-xmlwriter": "*", + "phar-io/version": "^3.0.1", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Component for reading phar.io manifest information from a PHP Archive (PHAR)", + "support": { + "issues": "https://github.com/phar-io/manifest/issues", + "source": "https://github.com/phar-io/manifest/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:33:53+00:00" + }, + { + "name": "phar-io/version", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/phar-io/version.git", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phar-io/version/zipball/4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "reference": "4f7fd7836c6f332bb2933569e566a0d6c4cbed74", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + }, + { + "name": "Sebastian Heuer", + "email": "sebastian@phpeople.de", + "role": "Developer" + }, + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "Developer" + } + ], + "description": "Library for handling version information and constraints", + "support": { + "issues": "https://github.com/phar-io/version/issues", + "source": "https://github.com/phar-io/version/tree/3.2.1" + }, + "time": "2022-02-21T01:04:05+00:00" + }, + { + "name": "phpunit/php-code-coverage", + "version": "9.2.32", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-code-coverage.git", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/85402a822d1ecf1db1096959413d35e1c37cf1a5", + "reference": "85402a822d1ecf1db1096959413d35e1c37cf1a5", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-libxml": "*", + "ext-xmlwriter": "*", + "nikic/php-parser": "^4.19.1 || ^5.1.0", + "php": ">=7.3", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-text-template": "^2.0.4", + "sebastian/code-unit-reverse-lookup": "^2.0.3", + "sebastian/complexity": "^2.0.3", + "sebastian/environment": "^5.1.5", + "sebastian/lines-of-code": "^1.0.4", + "sebastian/version": "^3.0.2", + "theseer/tokenizer": "^1.2.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.6" + }, + "suggest": { + "ext-pcov": "PHP extension that provides line coverage", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "9.2.x-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that provides collection, processing, and rendering functionality for PHP code coverage information.", + "homepage": "https://github.com/sebastianbergmann/php-code-coverage", + "keywords": [ + "coverage", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", + "security": "https://github.com/sebastianbergmann/php-code-coverage/security/policy", + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.32" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-08-22T04:23:01+00:00" + }, + { + "name": "phpunit/php-file-iterator", + "version": "3.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-file-iterator.git", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "FilterIterator implementation that filters files based on a list of suffixes.", + "homepage": "https://github.com/sebastianbergmann/php-file-iterator/", + "keywords": [ + "filesystem", + "iterator" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2021-12-02T12:48:52+00:00" + }, + { + "name": "phpunit/php-invoker", + "version": "3.1.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-invoker.git", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-invoker/zipball/5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "reference": "5a10147d0aaf65b58940a0b72f71c9ac0423cc67", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "ext-pcntl": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-pcntl": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Invoke callables with a timeout", + "homepage": "https://github.com/sebastianbergmann/php-invoker/", + "keywords": [ + "process" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-invoker/issues", + "source": "https://github.com/sebastianbergmann/php-invoker/tree/3.1.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:58:55+00:00" + }, + { + "name": "phpunit/php-text-template", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-text-template.git", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-text-template/zipball/5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "reference": "5da5f67fc95621df9ff4c4e5a84d6a8a2acf7c28", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Simple template engine.", + "homepage": "https://github.com/sebastianbergmann/php-text-template/", + "keywords": [ + "template" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-text-template/issues", + "source": "https://github.com/sebastianbergmann/php-text-template/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T05:33:50+00:00" + }, + { + "name": "phpunit/php-timer", + "version": "5.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/php-timer.git", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/php-timer/zipball/5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "reference": "5a63ce20ed1b5bf577850e2c4e87f4aa902afbd2", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Utility class for timing", + "homepage": "https://github.com/sebastianbergmann/php-timer/", + "keywords": [ + "timer" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/php-timer/issues", + "source": "https://github.com/sebastianbergmann/php-timer/tree/5.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:16:10+00:00" + }, + { + "name": "phpunit/phpunit", + "version": "9.6.21", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/phpunit.git", + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", + "reference": "de6abf3b6f8dd955fac3caad3af7a9504e8c2ffa", + "shasum": "" + }, + "require": { + "doctrine/instantiator": "^1.5.0 || ^2", + "ext-dom": "*", + "ext-json": "*", + "ext-libxml": "*", + "ext-mbstring": "*", + "ext-xml": "*", + "ext-xmlwriter": "*", + "myclabs/deep-copy": "^1.12.0", + "phar-io/manifest": "^2.0.4", + "phar-io/version": "^3.2.1", + "php": ">=7.3", + "phpunit/php-code-coverage": "^9.2.32", + "phpunit/php-file-iterator": "^3.0.6", + "phpunit/php-invoker": "^3.1.1", + "phpunit/php-text-template": "^2.0.4", + "phpunit/php-timer": "^5.0.3", + "sebastian/cli-parser": "^1.0.2", + "sebastian/code-unit": "^1.0.8", + "sebastian/comparator": "^4.0.8", + "sebastian/diff": "^4.0.6", + "sebastian/environment": "^5.1.5", + "sebastian/exporter": "^4.0.6", + "sebastian/global-state": "^5.0.7", + "sebastian/object-enumerator": "^4.0.4", + "sebastian/resource-operations": "^3.0.4", + "sebastian/type": "^3.2.1", + "sebastian/version": "^3.0.2" + }, + "suggest": { + "ext-soap": "To be able to generate mocks based on WSDL files", + "ext-xdebug": "PHP extension that provides line coverage as well as branch and path coverage" + }, + "bin": [ + "phpunit" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "9.6-dev" + } + }, + "autoload": { + "files": [ + "src/Framework/Assert/Functions.php" + ], + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "The PHP Unit Testing framework.", + "homepage": "https://phpunit.de/", + "keywords": [ + "phpunit", + "testing", + "xunit" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/phpunit/issues", + "security": "https://github.com/sebastianbergmann/phpunit/security/policy", + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.6.21" + }, + "funding": [ + { + "url": "https://phpunit.de/sponsors.html", + "type": "custom" + }, + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/phpunit/phpunit", + "type": "tidelift" + } + ], + "time": "2024-09-19T10:50:18+00:00" + }, + { + "name": "sebastian/cli-parser", + "version": "1.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/cli-parser.git", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/cli-parser/zipball/2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "reference": "2b56bea83a09de3ac06bb18b92f068e60cc6f50b", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for parsing CLI options", + "homepage": "https://github.com/sebastianbergmann/cli-parser", + "support": { + "issues": "https://github.com/sebastianbergmann/cli-parser/issues", + "source": "https://github.com/sebastianbergmann/cli-parser/tree/1.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:27:43+00:00" + }, + { + "name": "sebastian/code-unit", + "version": "1.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit.git", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit/zipball/1fc9f64c0927627ef78ba436c9b17d967e68e120", + "reference": "1fc9f64c0927627ef78ba436c9b17d967e68e120", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the PHP code units", + "homepage": "https://github.com/sebastianbergmann/code-unit", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit/issues", + "source": "https://github.com/sebastianbergmann/code-unit/tree/1.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:08:54+00:00" + }, + { + "name": "sebastian/code-unit-reverse-lookup", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/code-unit-reverse-lookup.git", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/code-unit-reverse-lookup/zipball/ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "reference": "ac91f01ccec49fb77bdc6fd1e548bc70f7faa3e5", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Looks up which function or method a line of code belongs to", + "homepage": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/", + "support": { + "issues": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/issues", + "source": "https://github.com/sebastianbergmann/code-unit-reverse-lookup/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T05:30:19+00:00" + }, + { + "name": "sebastian/comparator", + "version": "4.0.8", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/comparator.git", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/comparator/zipball/fa0f136dd2334583309d32b62544682ee972b51a", + "reference": "fa0f136dd2334583309d32b62544682ee972b51a", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/diff": "^4.0", + "sebastian/exporter": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@2bepublished.at" + } + ], + "description": "Provides the functionality to compare PHP values for equality", + "homepage": "https://github.com/sebastianbergmann/comparator", + "keywords": [ + "comparator", + "compare", + "equality" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/comparator/issues", + "source": "https://github.com/sebastianbergmann/comparator/tree/4.0.8" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2022-09-14T12:41:17+00:00" + }, + { + "name": "sebastian/complexity", + "version": "2.0.3", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/complexity.git", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/complexity/zipball/25f207c40d62b8b7aa32f5ab026c53561964053a", + "reference": "25f207c40d62b8b7aa32f5ab026c53561964053a", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for calculating the complexity of PHP code units", + "homepage": "https://github.com/sebastianbergmann/complexity", + "support": { + "issues": "https://github.com/sebastianbergmann/complexity/issues", + "source": "https://github.com/sebastianbergmann/complexity/tree/2.0.3" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:19:30+00:00" + }, + { + "name": "sebastian/diff", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/diff.git", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/diff/zipball/ba01945089c3a293b01ba9badc29ad55b106b0bc", + "reference": "ba01945089c3a293b01ba9badc29ad55b106b0bc", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3", + "symfony/process": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Kore Nordmann", + "email": "mail@kore-nordmann.de" + } + ], + "description": "Diff implementation", + "homepage": "https://github.com/sebastianbergmann/diff", + "keywords": [ + "diff", + "udiff", + "unidiff", + "unified diff" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/diff/issues", + "source": "https://github.com/sebastianbergmann/diff/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:30:58+00:00" + }, + { + "name": "sebastian/environment", + "version": "5.1.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/environment.git", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/environment/zipball/830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "reference": "830c43a844f1f8d5b7a1f6d6076b784454d8b7ed", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-posix": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.1-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides functionality to handle HHVM/PHP environments", + "homepage": "http://www.github.com/sebastianbergmann/environment", + "keywords": [ + "Xdebug", + "environment", + "hhvm" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/environment/issues", + "source": "https://github.com/sebastianbergmann/environment/tree/5.1.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:03:51+00:00" + }, + { + "name": "sebastian/exporter", + "version": "4.0.6", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/exporter.git", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/exporter/zipball/78c00df8f170e02473b682df15bfcdacc3d32d72", + "reference": "78c00df8f170e02473b682df15bfcdacc3d32d72", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-mbstring": "*", + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Volker Dusch", + "email": "github@wallbash.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + }, + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Provides the functionality to export PHP variables for visualization", + "homepage": "https://www.github.com/sebastianbergmann/exporter", + "keywords": [ + "export", + "exporter" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/exporter/issues", + "source": "https://github.com/sebastianbergmann/exporter/tree/4.0.6" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:33:00+00:00" + }, + { + "name": "sebastian/global-state", + "version": "5.0.7", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/global-state.git", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/global-state/zipball/bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "reference": "bca7df1f32ee6fe93b4d4a9abbf69e13a4ada2c9", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "ext-dom": "*", + "phpunit/phpunit": "^9.3" + }, + "suggest": { + "ext-uopz": "*" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Snapshotting of global state", + "homepage": "http://www.github.com/sebastianbergmann/global-state", + "keywords": [ + "global state" + ], + "support": { + "issues": "https://github.com/sebastianbergmann/global-state/issues", + "source": "https://github.com/sebastianbergmann/global-state/tree/5.0.7" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-02T06:35:11+00:00" + }, + { + "name": "sebastian/lines-of-code", + "version": "1.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/lines-of-code.git", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/lines-of-code/zipball/e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "reference": "e1e4a170560925c26d424b6a03aed157e7dcc5c5", + "shasum": "" + }, + "require": { + "nikic/php-parser": "^4.18 || ^5.0", + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library for counting the lines of code in PHP source code", + "homepage": "https://github.com/sebastianbergmann/lines-of-code", + "support": { + "issues": "https://github.com/sebastianbergmann/lines-of-code/issues", + "source": "https://github.com/sebastianbergmann/lines-of-code/tree/1.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-12-22T06:20:34+00:00" + }, + { + "name": "sebastian/object-enumerator", + "version": "4.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-enumerator.git", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-enumerator/zipball/5c9eeac41b290a3712d88851518825ad78f45c71", + "reference": "5c9eeac41b290a3712d88851518825ad78f45c71", + "shasum": "" + }, + "require": { + "php": ">=7.3", + "sebastian/object-reflector": "^2.0", + "sebastian/recursion-context": "^4.0" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Traverses array structures and object graphs to enumerate all referenced objects", + "homepage": "https://github.com/sebastianbergmann/object-enumerator/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-enumerator/issues", + "source": "https://github.com/sebastianbergmann/object-enumerator/tree/4.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:12:34+00:00" + }, + { + "name": "sebastian/object-reflector", + "version": "2.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/object-reflector.git", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/object-reflector/zipball/b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "reference": "b4f479ebdbf63ac605d183ece17d8d7fe49c15c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Allows reflection of object attributes, including inherited and non-public ones", + "homepage": "https://github.com/sebastianbergmann/object-reflector/", + "support": { + "issues": "https://github.com/sebastianbergmann/object-reflector/issues", + "source": "https://github.com/sebastianbergmann/object-reflector/tree/2.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-10-26T13:14:26+00:00" + }, + { + "name": "sebastian/recursion-context", + "version": "4.0.5", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/recursion-context.git", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/recursion-context/zipball/e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "reference": "e75bd0f07204fec2a0af9b0f3cfe97d05f92efc1", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + }, + { + "name": "Jeff Welch", + "email": "whatthejeff@gmail.com" + }, + { + "name": "Adam Harvey", + "email": "aharvey@php.net" + } + ], + "description": "Provides functionality to recursively process PHP variables", + "homepage": "https://github.com/sebastianbergmann/recursion-context", + "support": { + "issues": "https://github.com/sebastianbergmann/recursion-context/issues", + "source": "https://github.com/sebastianbergmann/recursion-context/tree/4.0.5" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:07:39+00:00" + }, + { + "name": "sebastian/resource-operations", + "version": "3.0.4", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/resource-operations.git", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/resource-operations/zipball/05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "reference": "05d5692a7993ecccd56a03e40cd7e5b09b1d404e", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de" + } + ], + "description": "Provides a list of PHP built-in functions that operate on resources", + "homepage": "https://www.github.com/sebastianbergmann/resource-operations", + "support": { + "source": "https://github.com/sebastianbergmann/resource-operations/tree/3.0.4" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2024-03-14T16:00:52+00:00" + }, + { + "name": "sebastian/type", + "version": "3.2.1", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/type.git", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/type/zipball/75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "reference": "75e2c2a32f5e0b3aef905b9ed0b179b953b3d7c7", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.2-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Collection of value objects that represent the types of the PHP type system", + "homepage": "https://github.com/sebastianbergmann/type", + "support": { + "issues": "https://github.com/sebastianbergmann/type/issues", + "source": "https://github.com/sebastianbergmann/type/tree/3.2.1" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2023-02-03T06:13:03+00:00" + }, + { + "name": "sebastian/version", + "version": "3.0.2", + "source": { + "type": "git", + "url": "https://github.com/sebastianbergmann/version.git", + "reference": "c6c1022351a901512170118436c764e473f6de8c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/sebastianbergmann/version/zipball/c6c1022351a901512170118436c764e473f6de8c", + "reference": "c6c1022351a901512170118436c764e473f6de8c", + "shasum": "" + }, + "require": { + "php": ">=7.3" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.0-dev" + } + }, + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Sebastian Bergmann", + "email": "sebastian@phpunit.de", + "role": "lead" + } + ], + "description": "Library that helps with managing the version number of Git-hosted PHP projects", + "homepage": "https://github.com/sebastianbergmann/version", + "support": { + "issues": "https://github.com/sebastianbergmann/version/issues", + "source": "https://github.com/sebastianbergmann/version/tree/3.0.2" + }, + "funding": [ + { + "url": "https://github.com/sebastianbergmann", + "type": "github" + } + ], + "time": "2020-09-28T06:39:44+00:00" + }, + { + "name": "squizlabs/php_codesniffer", + "version": "3.10.3", + "source": { + "type": "git", + "url": "https://github.com/PHPCSStandards/PHP_CodeSniffer.git", + "reference": "62d32998e820bddc40f99f8251958aed187a5c9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/PHPCSStandards/PHP_CodeSniffer/zipball/62d32998e820bddc40f99f8251958aed187a5c9c", + "reference": "62d32998e820bddc40f99f8251958aed187a5c9c", + "shasum": "" + }, + "require": { + "ext-simplexml": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4.0 || ^5.0 || ^6.0 || ^7.0 || ^8.0 || ^9.3.4" + }, + "bin": [ + "bin/phpcbf", + "bin/phpcs" + ], + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Greg Sherwood", + "role": "Former lead" + }, + { + "name": "Juliette Reinders Folmer", + "role": "Current lead" + }, + { + "name": "Contributors", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer/graphs/contributors" + } + ], + "description": "PHP_CodeSniffer tokenizes PHP, JavaScript and CSS files and detects violations of a defined set of coding standards.", + "homepage": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "keywords": [ + "phpcs", + "standards", + "static analysis" + ], + "support": { + "issues": "https://github.com/PHPCSStandards/PHP_CodeSniffer/issues", + "security": "https://github.com/PHPCSStandards/PHP_CodeSniffer/security/policy", + "source": "https://github.com/PHPCSStandards/PHP_CodeSniffer", + "wiki": "https://github.com/PHPCSStandards/PHP_CodeSniffer/wiki" + }, + "funding": [ + { + "url": "https://github.com/PHPCSStandards", + "type": "github" + }, + { + "url": "https://github.com/jrfnl", + "type": "github" + }, + { + "url": "https://opencollective.com/php_codesniffer", + "type": "open_collective" + } + ], + "time": "2024-09-18T10:38:58+00:00" + }, + { + "name": "theseer/tokenizer", + "version": "1.2.3", + "source": { + "type": "git", + "url": "https://github.com/theseer/tokenizer.git", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/theseer/tokenizer/zipball/737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "reference": "737eda637ed5e28c3413cb1ebe8bb52cbf1ca7a2", + "shasum": "" + }, + "require": { + "ext-dom": "*", + "ext-tokenizer": "*", + "ext-xmlwriter": "*", + "php": "^7.2 || ^8.0" + }, + "type": "library", + "autoload": { + "classmap": [ + "src/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "BSD-3-Clause" + ], + "authors": [ + { + "name": "Arne Blankerts", + "email": "arne@blankerts.de", + "role": "Developer" + } + ], + "description": "A small library for converting tokenized PHP source code into XML and potentially other formats", + "support": { + "issues": "https://github.com/theseer/tokenizer/issues", + "source": "https://github.com/theseer/tokenizer/tree/1.2.3" + }, + "funding": [ + { + "url": "https://github.com/theseer", + "type": "github" + } + ], + "time": "2024-03-03T12:36:25+00:00" + } + ], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": [], + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=7.2" + }, + "platform-dev": [], + "plugin-api-version": "2.3.0" +} diff --git a/vendor/jjgrainger/posttypes/docs/Getting-started.md b/vendor/jjgrainger/posttypes/docs/Getting-started.md new file mode 100644 index 0000000..628a53e --- /dev/null +++ b/vendor/jjgrainger/posttypes/docs/Getting-started.md @@ -0,0 +1,70 @@ +# Getting Started + +## Requirements + +* PHP >=7.2 +* [Composer](https://getcomposer.org/) +* [WordPress](https://wordpress.org) >=5.1 + +## Installation + +#### Install with composer + +Run the following in your terminal to install PostTypes with [Composer](https://getcomposer.org/). + +``` +$ composer require jjgrainger/posttypes +``` + +PostTypes uses [PSR-4](https://www.php-fig.org/psr/psr-4/) autoloading and can be used with the Composer's autoloader. Below is a basic example of getting started, though your setup may be different depending on how you are using Composer. + +```php +require __DIR__ . '/vendor/autoload.php'; + +use PostTypes\PostType; + +$books = new PostType( 'book' ); + +$books->register(); +``` + +See Composer's [basic usage](https://getcomposer.org/doc/01-basic-usage.md#autoloading) guide for details on working with Composer and autoloading. + +## Basic Usage + +Below is a basic example of setting up a simple book post type with a genre taxonomy. + +```php +// Require the Composer autoloader. +require __DIR__ . '/vendor/autoload.php'; + +// Import PostTypes. +use PostTypes\PostType; +use PostTypes\Taxonomy; + +// Create a book post type. +$books = new PostType( 'book' ); + +// Attach the genre taxonomy (which is created below). +$books->taxonomy( 'genre' ); + +// Hide the date and author columns. +$books->columns()->hide( [ 'date', 'author' ] ); + +// Set the Books menu icon. +$books->icon( 'dashicons-book-alt' ); + +// Register the post type to WordPress. +$books->register(); + +// Create a genre taxonomy. +$genres = new Taxonomy( 'genre' ); + +// Set options for the taxonomy. +$genres->options( [ + 'hierarchical' => false, +] ); + +// Register the taxonomy to WordPress. +$genres->register(); +``` diff --git a/vendor/jjgrainger/posttypes/docs/Notes.md b/vendor/jjgrainger/posttypes/docs/Notes.md new file mode 100644 index 0000000..0eac9fb --- /dev/null +++ b/vendor/jjgrainger/posttypes/docs/Notes.md @@ -0,0 +1,28 @@ +# Notes + +## Translations + +Since 2.0 the `translation()` method has been removed. You can translate any labels and names when you assign them to the PostType or Taxonomy. It was removed to provide more control to the developer while encouraging best practices around internationalizing plugins and themes set out by [WordPress](https://developer.wordpress.org/plugins/internationalization/how-to-internationalize-your-plugin/). + +```php +// Translating the post types plural and singular names. +$books = new PostType( [ + 'name' => 'book', + 'singular' => __( 'Book', 'YOUR_TEXTDOMAIN' ), + 'plural' => __( 'Books', 'YOUR_TEXTDOMAIN' ), + 'slug' => 'books', +] ); + +// Translating labels. +$books->labels( [ + 'add_new_item' => __( 'Add new Book', 'YOUR_TEXTDOMAIN' ), +] ); +``` + +## Custom Fields + +The class has no methods for making custom fields for post types, use [Advanced Custom Fields](https://advancedcustomfields.com). + +## Examples + +The books example used in the README.md can be found in [examples/books.php](https://github.com/jjgrainger/posttypes/blob/master/examples/books.php). diff --git a/vendor/jjgrainger/posttypes/docs/SUMMARY.md b/vendor/jjgrainger/posttypes/docs/SUMMARY.md new file mode 100644 index 0000000..0ce1fb5 --- /dev/null +++ b/vendor/jjgrainger/posttypes/docs/SUMMARY.md @@ -0,0 +1,18 @@ +# Table of Contents + +* [PostTypes v2.2.1](../README.md) +* [Getting Started](Getting-started.md) +* [PostTypes](post-types/README.md) + * [Create a Post Type](post-types/Create-a-post-type.md) + * [Add Taxonomies](post-types/Add-taxonomies.md) + * [Filters](post-types/Filters.md) + * [Columns](post-types/Columns.md) + * [Menu Icons](post-types/Menu-icons.md) + * [Flush Rewrite Rules](post-types/Flush-rewrite-rules.md) +* [Taxonomies](taxonomies/README.md) + * [Create a Taxonomy](taxonomies/Create-a-taxonomy.md) + * [Add to Post Type](taxonomies/Add-to-post-type.md) + * [Columns](taxonomies/Columns.md) +* [Notes](Notes.md) +* [Contributing](../CONTRIBUTING.md) +* [Changelog](../Changelog.md) diff --git a/vendor/jjgrainger/posttypes/docs/post-types/Add-taxonomies.md b/vendor/jjgrainger/posttypes/docs/post-types/Add-taxonomies.md new file mode 100644 index 0000000..87a060f --- /dev/null +++ b/vendor/jjgrainger/posttypes/docs/post-types/Add-taxonomies.md @@ -0,0 +1,21 @@ +# Add Taxonomies + +You can add new and existing taxonomies to a post type by passing the taxonomy name to the `taxonomy()` method. + +```php +// Create a book post type. +$books = new PostType( 'book' ); + +// Add the genre taxonomy to the book post type. +$books->taxonomy( 'genre' ); + +// Add the default category taxonomy. +$books->taxonomy( 'category' ); + +// Register the post type to WordPress. +$books->register(); +``` + +This method only attaches the taxonomy to the post type, to _create_ a taxonomy see the [documentation](../taxonomies/Create-a-taxonomy.md) on creating a new taxonomy. + +Taxonomies and post types can be created in any order. diff --git a/vendor/jjgrainger/posttypes/docs/post-types/Columns.md b/vendor/jjgrainger/posttypes/docs/post-types/Columns.md new file mode 100644 index 0000000..638dbd1 --- /dev/null +++ b/vendor/jjgrainger/posttypes/docs/post-types/Columns.md @@ -0,0 +1,76 @@ +# Columns + +To modify a post types admin columns use the `column()` manager. It has a variety of methods to help fine tune admin table columns. + +#### Add Columns + +To add columns to the admin edit screen pass an array of column slugs and labels to the `add()` method. + +```php +// Add multiple columns and set their labels. +$books->columns()->add( [ + 'rating' => __( 'Rating' ), + 'price' => __( 'Price' ), +] ); +``` + +#### Hide Columns + +To hide columns pass the column slug to the `hide()` method. For multiple columns pass an array of column slugs. + +```php +$books->columns()->hide( 'author' ); + +$books->columns()->hide( [ 'author', 'date' ] ); +``` + +#### Column Order + +To rearrange columns pass an array of column slugs and position to the `order()` method. Only columns you want to reorder need to be set, not all columns. Positions are based on a zero based index. + +```php +$books->columns()->order( [ + 'rating' => 2, + 'genre' => 4, +] ); +``` + +#### Set Columns + +To set all columns to display pass an array of the column slugs and labels to the `set()` method. This overrides any other configuration set by the methods above. + +```php +$books->columns()->set( [ + 'cb' => '', + 'title' => __( 'Title' ), + 'genre' => __( 'Genres' ), + 'rating' => __( 'Rating' ), + 'date' => __( 'Date' ), +] ); +``` + +#### Populate Columns + +To populate any column use the `populate()` method, by passing the column slug and a callback function. + +```php +$books->columns()->populate( 'rating', function ( $column, $post_id ) { + echo get_post_meta( $post_id, 'rating', true ) . '/10'; +} ); +``` + +#### Sortable Columns + +To define which custom columns are sortable use the `sortable()` method. This method accepts an array of column slugs and an array of sorting options. + +The first option is the `meta_key` to sort the columns by. + +The second option is how the items are ordered, either numerically (`true`) or alphabetically (`false`) by default. + +```php +// Make both the price and rating columns sortable and ordered numerically. +$books->columns()->sortable( [ + 'price' => [ 'price', true ], + 'rating' => [ 'rating', true ], +] ); +``` diff --git a/vendor/jjgrainger/posttypes/docs/post-types/Create-a-post-type.md b/vendor/jjgrainger/posttypes/docs/post-types/Create-a-post-type.md new file mode 100644 index 0000000..97aa021 --- /dev/null +++ b/vendor/jjgrainger/posttypes/docs/post-types/Create-a-post-type.md @@ -0,0 +1,119 @@ +# Create a Post Type + +You can use PostTypes to create a new post type, or work with an [existing post type](#work-with-existing-posttypes). PostTypes can be included in your theme or plugins. + +## Create a new Post Type + +To create a new post type pass the post types name to the class constructor. In order to apply changes to WordPress you must call the `register()` method. + +```php +use PostTypes\PostType; + +// Create a book post type. +$books = new PostType( 'book' ); + +// Register the post type to WordPress. +$books->register(); +``` + +{% hint style="info" %} +The `register()` method hooks into WordPress and sets up the different actions and filters to create your custom post type. You do not need to add any of your PostTypes code in actions/filters. Doing so may lead to unexpected results. +{% endhint %} + +### Set names + +The post type labels and slugs are automatically generated from the post type name, however, you can set these manually by passing an array of names to the class constructor. + +```php +$names = [ + 'name' => 'book', + 'singular' => 'Book', + 'plural' => 'Books', + 'slug' => 'books', +]; + +$books = new PostType( $names ); + +$books->register(); +``` + +The following names are accepted. + +| Key | Description | Example | +| --- | --- | --- | +| `name` | is the post type name | *required*, singular, lowercase, underscores | +| `singular` | is the singular label for the post type | e.g 'Book', 'Person' | +| `plural` | is the plural label for the post type | e.g 'Books', 'People' | +| `slug` | is the post type slug used in the permalinks | plural, lowercase, hyphens | + +The only required field is the post type's `name`, all others are optional. + +### Set options + +Options for the post type are set by passing an array as the second argument in the class constructor. + +```php +$options = [ + 'has_archive' => false, +]; + +$books = new PostType( 'book', $options ); + +$books->register(); +``` + +Alternatively, you can set options using the `options()` method. + +```php +$books = new PostType( 'book' ); + +$books->options( [ + 'has_archive' => false, +] ); + +$books->register(); +``` + +The options match the arguments passed to the `register_post_type()` WordPress function. All available options are on the [WordPress Codex](https://codex.wordpress.org/Function_Reference/register_post_type#Parameters) + +### Set labels + +You can set the labels for the post type by passing an array as the third argument in the class constructor. + +```php +$labels = [ + 'add_new_item' => __( 'Add new Book' ), +]; + +$books = new PostType( 'book', $options, $labels ); + +$books->register(); +``` + +Alternatively, you can use the `labels()` method to set the labels for the post type. + +```php +$books = new PostType( 'books' ); + +$books->labels( [ + 'add_new_item' => __( 'Add new Book' ), +] ); + +$books->register(); +``` + +All available labels are on the [WordPress Codex](https://codex.wordpress.org/Function_Reference/register_post_type#labels) + +## Work with existing Post Types + +To work with existing post types pass the post type name into the constructor. Be careful and avoid using global variables (e.g `$post`) which can lead to unwanted results. + +```php +// Create a PostType object for an existing post type in WordPress. +$blog = new PostType( 'post' ); + +// Make changes to the post type... + +// You still need to register the changes to WordPress. +$blog->register(); +``` diff --git a/vendor/jjgrainger/posttypes/docs/post-types/Filters.md b/vendor/jjgrainger/posttypes/docs/post-types/Filters.md new file mode 100644 index 0000000..9e4d96d --- /dev/null +++ b/vendor/jjgrainger/posttypes/docs/post-types/Filters.md @@ -0,0 +1,21 @@ +# Filters + +You can set what dropdown filters appear on the post type admin edit screen by passing an array of taxonomy names to the `filters()` method. + +```php +$books->filters( [ 'genre', 'category' ] ); +``` + +The order the filters appear are set by the order of the items in the array. + +```php +// Display the category dropdown first. +$books->filters( [ 'category', 'genre' ] ); +``` + +An empty array will remove all dropdown filters from the admin edit screen. + +```php +// Don't display filters on the admin edit screen. +$books->filters( [] ); +``` diff --git a/vendor/jjgrainger/posttypes/docs/post-types/Flush-rewrite-rules.md b/vendor/jjgrainger/posttypes/docs/post-types/Flush-rewrite-rules.md new file mode 100644 index 0000000..cfd0786 --- /dev/null +++ b/vendor/jjgrainger/posttypes/docs/post-types/Flush-rewrite-rules.md @@ -0,0 +1,9 @@ + +# Flush Rewrite Rules + +You can programmatically recreate the sites rewrite rules with the `flush()` method. +This is an expensive operation and should be used with caution, see [codex](https://codex.wordpress.org/Function_Reference/flush_rewrite_rules) for more. + +```php +$books->flush(); +``` diff --git a/vendor/jjgrainger/posttypes/docs/post-types/Menu-icons.md b/vendor/jjgrainger/posttypes/docs/post-types/Menu-icons.md new file mode 100644 index 0000000..6a8125e --- /dev/null +++ b/vendor/jjgrainger/posttypes/docs/post-types/Menu-icons.md @@ -0,0 +1,10 @@ +# Menu Icons + +WordPress 3.8 has [Dashicons](https://developer.wordpress.org/resource/dashicons/), an icon font you can use with your custom post types. + +To set the post type icon pass the dashicon icon slug to the `icon()` method. + +```php +$books->icon( 'dashicons-book-alt' ); +``` +A list of available icons can be found on the [WordPress codex](https://developer.wordpress.org/resource/dashicons/) diff --git a/vendor/jjgrainger/posttypes/docs/post-types/README.md b/vendor/jjgrainger/posttypes/docs/post-types/README.md new file mode 100644 index 0000000..380a23c --- /dev/null +++ b/vendor/jjgrainger/posttypes/docs/post-types/README.md @@ -0,0 +1,10 @@ +# PostTypes + +The following section contains information on creating and working with post types. + +* [Create a Post Type](Create-a-post-type.md) +* [Add Taxonomies](Add-taxonomies.md) +* [Filters](Filters.md) +* [Columns](Columns.md) +* [Menu Icons](Menu-icons.md) +* [Flush Rewrite Rules](Flush-rewrite-rules.md) diff --git a/vendor/jjgrainger/posttypes/docs/taxonomies/Add-to-post-type.md b/vendor/jjgrainger/posttypes/docs/taxonomies/Add-to-post-type.md new file mode 100644 index 0000000..95fdd11 --- /dev/null +++ b/vendor/jjgrainger/posttypes/docs/taxonomies/Add-to-post-type.md @@ -0,0 +1,16 @@ +## Add to post type + +You can add a taxonomy to any post type by passing the post type name to the `posttype()` method. + +```php +// Create the genre taxonomy. +$genres = new Taxonomy( 'genre' ); + +// Attach to the book post type. +$genres->posttype( 'books' ); + +// Register changes to WordPress. +$genres->register(); +``` + +Alternatively, you can attach a taxonomy to a post type when creating a post type using its [`taxonomy()`](../post-types/Add-taxonomies.md) method. diff --git a/vendor/jjgrainger/posttypes/docs/taxonomies/Columns.md b/vendor/jjgrainger/posttypes/docs/taxonomies/Columns.md new file mode 100644 index 0000000..c7bfa45 --- /dev/null +++ b/vendor/jjgrainger/posttypes/docs/taxonomies/Columns.md @@ -0,0 +1,89 @@ +## Columns + +You can now modify `Taxonomy` columns using the same methods as you would for a `PostType`. For example: + +```php +use PostTypes\Taxonomy; + +// Create a taxonomy. +$genres = new Taxonomy( 'genre' ); + +// Add a column to the taxonomy admin table. +$genres->columns()->add( [ + 'popularity' => __( 'Popularity' ), +] ); + +// Register the taxonomy to WordPress. +$genres->register(); +``` + +#### Add Columns + +To add columns to the admin edit screen pass an array of column slugs and labels to the `add()` method. + +```php +// Add columns and set their labels. +$genres->columns()->add( [ + 'popularity' => __( 'Popularity' ), +] ); +``` + +#### Hide Columns + +To hide columns pass the column slug to the `hide()` method. For multiple columns pass an array of column slugs. + +```php +$genres->columns()->hide( 'description' ); +``` + +#### Column Order + +To rearrange columns pass an array of column slugs and position to the `order()` method. Only columns you want to reorder need to be set, not all columns. Positions are based on a zero based index. + +```php +$genres->columns()->order( [ + 'popularity' => 2, +] ); +``` + +#### Set Columns + +To set all columns to display pass an array of the column slugs and labels to the `set()` method. This overrides any other configuration set by the methods above. + +```php +$genres->columns()->set( [ + 'cb' => '', + 'name' => __( 'Name' ), + 'description' => __( 'Description' ), + 'slug' => __( 'Slug' ), + 'popularity' => __( 'Popularity' ), +] ); +``` + +#### Populate Columns + +To populate any column use the `populate()` method, by passing the column slug and a callback function. + +Taxonomy columns work differently to post type columns. The callback receives 3 arguments, the columns content, the column name and the term ID. Also, the [hook used](https://developer.wordpress.org/reference/hooks/manage_this-screen-taxonomy_custom_column/) is a filter, so the column value must be returned. + +```php +$genres->columns()->populate( 'popularity', function ( $content, $column, $term_id ) { + return get_term_meta( $term_id, 'popularity', true ); +} ); +``` + +#### Sortable Columns + +To define which custom columns are sortable use the `sortable()` method. This method accepts an array of column slugs and an array of sorting options. + +The first option is the term `meta_key` to sort the columns by. + +The second option is how the items are ordered, either numerically (`true`) or alphabetically (`false`) by default. + +```php +// Make both the price and rating columns sortable and ordered numerically. +$genres->columns()->sortable( [ + 'popularity' => [ 'popularity', true ], +] ); +``` + diff --git a/vendor/jjgrainger/posttypes/docs/taxonomies/Create-a-taxonomy.md b/vendor/jjgrainger/posttypes/docs/taxonomies/Create-a-taxonomy.md new file mode 100644 index 0000000..b5edfc3 --- /dev/null +++ b/vendor/jjgrainger/posttypes/docs/taxonomies/Create-a-taxonomy.md @@ -0,0 +1,113 @@ +# Taxonomies + +Taxonomies are created using the `Taxonomy` class. This works identically to the `PostType` class and holds similar methods. + +## Create a new taxonomy + +To create a new taxonomy pass the taxonomy name to the class constructor. Labels and the slug are generated from the taxonomy name. + +```php +use PostTypes\Taxonomy; + +// Create a new taxonomy +$genres = new Taxonomy( 'genre' ); + +// Register the taxonomy to WordPress +$genres->register(); +``` + +#### Set names + +You can define names by passing an array as the first argument. Only `name` is required. + +```php +$names = [ + 'name' => 'genre', + 'singular' => 'Genre', + 'plural' => 'Genres', + 'slug' => 'genres' +]; + +$genres = new Taxonomy( $names ); + +$genres->register(); +``` + +The following names are accepted. + +| Key | Description | Example | +| --- | --- | --- | +| `name` | is the taxonomy name | *required*, singular, lowercase, underscores | +| `singular` | is the singular label for the taxonomy | e.g 'Genre', 'Category' | +| `plural` | is the plural label for the taxonomy | e.g 'Genres', 'Categories' | +| `slug` | is the taxonomy slug used in the permalinks | plural, lowercase, hyphens | + +#### Add options + +You can further customise taxonomies by passing an array of options as the second argument in the constructor. + +```php +$options = [ + 'hierarchical' => false, +]; + +$genres = new Taxonomy( 'genre', $options ); + +$genres->register(); +``` + +Alternatively, you can set options using the `options()` method. + +```php +$genres = new Taxonomy( 'genre' ); + +$genres->options( [ + 'hierarchical' => false, +] ); + +$genres->register(); +``` + +The options match the arguments passed to the `register_taxonomy()` WordPress function. All available options are on the [WordPress Codex](https://codex.wordpress.org/Function_Reference/register_taxonomy#Arguments). + +#### Add labels + +You can define the labels for a taxonomy by passing an array as the third argument in the class constructor. + +```php +$labels = [ + 'add_new_item' => __( 'Add new Genre' ), +]; + +$genres = new Taxonomy( 'genres', $options, $labels ); + +$genres->register(); +``` + +Alternatively, you can use the `labels()` method to set the labels for the taxonomy. + +```php +$genres = new Taxonomy( 'genre' ); + +$genres->labels( [ + 'add_new_item' => __( 'Add new Genre' ), +] ); + +$genres->register(); +``` + +All available labels are on the [WordPress Codex](https://codex.wordpress.org/Function_Reference/register_taxonomy) + +## Work with existing Taxonomies + +You can work with existing taxonomies by passing the taxonomy name to the Taxonoy constructor. Once you have made your changes you need to register them to WordPress using the `register()` method. + +```php +// Create a new Taxonomy object for an existing taxonomy. +$tags = new Taxonomy( 'post_tag' ); + +// Modify the taxonomy... + +// Regsiter changes to WordPress. +$tags->register(); +``` diff --git a/vendor/jjgrainger/posttypes/docs/taxonomies/README.md b/vendor/jjgrainger/posttypes/docs/taxonomies/README.md new file mode 100644 index 0000000..af22a96 --- /dev/null +++ b/vendor/jjgrainger/posttypes/docs/taxonomies/README.md @@ -0,0 +1,7 @@ +# Taxonomies + +The following section contains information on creating and working with taxonomies. + +* [Create a Taxonomy](Create-a-taxonomy.md) +* [Add to Post Type](Add-to-post-type.md) +* [Columns](Columns.md) diff --git a/vendor/jjgrainger/posttypes/phpunit.xml b/vendor/jjgrainger/posttypes/phpunit.xml new file mode 100644 index 0000000..9e45b7a --- /dev/null +++ b/vendor/jjgrainger/posttypes/phpunit.xml @@ -0,0 +1,17 @@ + + + + + src + + + + + + + + tests + + + + diff --git a/vendor/jjgrainger/posttypes/src/Columns.php b/vendor/jjgrainger/posttypes/src/Columns.php new file mode 100644 index 0000000..14ac23d --- /dev/null +++ b/vendor/jjgrainger/posttypes/src/Columns.php @@ -0,0 +1,240 @@ +items = $columns; + } + + /** + * Add a new column + * @param string $column the slug of the column + * @param string $label the label for the column + */ + public function add($columns, $label = null) + { + + if (!is_array($columns)) { + $columns = [$columns => $label]; + } + + foreach ($columns as $column => $label) { + if (is_null($label)) { + $label = str_replace(['_', '-'], ' ', ucfirst($column)); + } + + $this->add[$column] = $label; + } + + return $this; + } + + /** + * Add a column to hide + * @param string $column the slug of the column to hdie + */ + public function hide($columns) + { + if (!is_array($columns)) { + $columns = [$columns]; + } + + foreach ($columns as $column) { + $this->hide[] = $column; + } + + return $this; + } + + /** + * Set a custom callback to populate a column + * @param string $column the column slug + * @param mixed $callback callback function + */ + public function populate($column, $callback) + { + $this->populate[$column] = $callback; + + return $this; + } + + /** + * Define the postion for a columns + * @param string $columns an array of columns + */ + public function order($columns) + { + foreach ($columns as $column => $position) { + $this->positions[$column] = $position; + } + + return $this; + } + + /** + * Set columns that are sortable + * @param string $column the slug of the column + * @param string $meta_value the meta_value to orderby + * @param boolean $is_num whether to order by string/number + */ + public function sortable($sortable) + { + foreach ($sortable as $column => $options) { + $this->sortable[$column] = $options; + } + + return $this; + } + + /** + * Check if an orderby field is a custom sort option. + * @param string $orderby the orderby value from query params + */ + public function isSortable($orderby) + { + if (is_string($orderby) && array_key_exists($orderby, $this->sortable)) { + return true; + } + + foreach ($this->sortable as $column => $options) { + if (is_string($options) && $options === $orderby) { + return true; + } + if (is_array($options) && isset($options[0]) && $options[0] === $orderby) { + return true; + } + } + + return false; + } + + /** + * Get meta key for an orderby. + * @param string $orderby the orderby value from query params + */ + public function sortableMeta($orderby) + { + if (array_key_exists($orderby, $this->sortable)) { + return $this->sortable[$orderby]; + } + + foreach ($this->sortable as $column => $options) { + if (is_string($options) && $options === $orderby) { + return $options; + } + if (is_array($options) && isset($options[0]) && $options[0] === $orderby) { + return $options; + } + } + + return ''; + } + + /** + * Modify the columns for the object + * @param array $columns WordPress default columns + * @return array The modified columns + */ + public function modifyColumns($columns) + { + // if user defined set columns, return those + if (!empty($this->items)) { + return $this->items; + } + + // add additional columns + if (!empty($this->add)) { + foreach ($this->add as $key => $label) { + $columns[$key] = $label; + } + } + + // unset hidden columns + if (!empty($this->hide)) { + foreach ($this->hide as $key) { + unset($columns[$key]); + } + } + + // if user has made added custom columns + if (!empty($this->positions)) { + foreach ($this->positions as $key => $position) { + // find index of the element in the array + $index = array_search($key, array_keys($columns)); + // retrieve the element in the array of columns + $item = array_slice($columns, $index, 1); + // remove item from the array + unset($columns[$key]); + + // split columns array into two at the desired position + $start = array_slice($columns, 0, $position, true); + $end = array_slice($columns, $position, count($columns) - 1, true); + + // insert column into position + $columns = $start + $item + $end; + } + } + + return $columns; + } +} diff --git a/vendor/jjgrainger/posttypes/src/PostType.php b/vendor/jjgrainger/posttypes/src/PostType.php new file mode 100644 index 0000000..1ba321d --- /dev/null +++ b/vendor/jjgrainger/posttypes/src/PostType.php @@ -0,0 +1,543 @@ +names($names); + + // assign custom options to the PostType + $this->options($options); + + // assign labels to the PostType + $this->labels($labels); + } + + /** + * Set the names for the PostType + * @param mixed $names A string for the name, or an array of names + * @return $this + */ + public function names($names) + { + // only the post type name is passed + if (is_string($names)) { + $names = ['name' => $names]; + } + + // set the names array + $this->names = $names; + + // create names for the PostType + $this->createNames(); + + return $this; + } + + /** + * Set the options for the PostType + * @param array $options An array of options for the PostType + * @return $this + */ + public function options(array $options) + { + $this->options = $options; + + return $this; + } + + /** + * Set the labels for the PostType + * @param array $labels An array of labels for the PostType + * @return $this + */ + public function labels(array $labels) + { + $this->labels = $labels; + + return $this; + } + + /** + * Add a Taxonomy to the PostType + * @param mixed $taxonomies The Taxonomy name(s) to add + * @return $this + */ + public function taxonomy($taxonomies) + { + $taxonomies = is_string($taxonomies) ? [$taxonomies] : $taxonomies; + + foreach ($taxonomies as $taxonomy) { + $this->taxonomies[] = $taxonomy; + } + + return $this; + } + + /** + * Add filters to the PostType + * @param array $filters An array of Taxonomy filters + * @return $this + */ + public function filters(array $filters) + { + $this->filters = $filters; + + return $this; + } + + /** + * Set the menu icon for the PostType + * @param string $icon A dashicon class for the menu icon + * @return $this + */ + public function icon($icon) + { + $this->icon = $icon; + + return $this; + } + + /** + * Flush rewrite rules + * @link https://codex.wordpress.org/Function_Reference/flush_rewrite_rules + * @param boolean $hard + * @return void + */ + public function flush($hard = true) + { + flush_rewrite_rules($hard); + } + + /** + * Get the Column Manager for the PostType + * @return Columns + */ + public function columns() + { + if (!isset($this->columns)) { + $this->columns = new Columns; + } + + return $this->columns; + } + + /** + * Register the PostType to WordPress + * @return void + */ + public function register() + { + // register the PostType + if (!post_type_exists($this->name)) { + add_action('init', [$this, 'registerPostType']); + } else { + add_filter('register_post_type_args', [$this, 'modifyPostType'], 10, 2); + } + + // register Taxonomies to the PostType + add_action('init', [$this, 'registerTaxonomies']); + + // modify filters on the admin edit screen + add_action('restrict_manage_posts', [$this, 'modifyFilters']); + + if (isset($this->columns)) { + // modify the admin edit columns. + add_filter("manage_{$this->name}_posts_columns", [$this, 'modifyColumns'], 10, 1); + + // populate custom columns + add_filter("manage_{$this->name}_posts_custom_column", [$this, 'populateColumns'], 10, 2); + + // run filter to make columns sortable. + add_filter('manage_edit-'.$this->name.'_sortable_columns', [$this, 'setSortableColumns']); + + // run action that sorts columns on request. + add_action('pre_get_posts', [$this, 'sortSortableColumns']); + } + } + + /** + * Register the PostType + * @return void + */ + public function registerPostType() + { + // create options for the PostType + $options = $this->createOptions(); + + // check that the post type doesn't already exist + if (!post_type_exists($this->name)) { + // register the post type + register_post_type($this->name, $options); + } + } + + /** + * Modify the existing Post Type. + * + * @return array + */ + public function modifyPostType(array $args, string $posttype) + { + if ($posttype !== $this->name) { + return $args; + } + + // create options for the PostType + $options = $this->createOptions(); + + $args = array_replace_recursive($args, $options); + + return $args; + } + + /** + * Create the required names for the PostType + * @return void + */ + public function createNames() + { + // names required for the PostType + $required = [ + 'name', + 'singular', + 'plural', + 'slug', + ]; + + foreach ($required as $key) { + // if the name is set, assign it + if (isset($this->names[$key])) { + $this->$key = $this->names[$key]; + continue; + } + + // if the key is not set and is singular or plural + if (in_array($key, ['singular', 'plural'])) { + // create a human friendly name + $name = ucwords(strtolower(str_replace(['-', '_'], ' ', $this->names['name']))); + } + + if ($key === 'slug') { + // create a slug friendly name + $name = strtolower(str_replace([' ', '_'], '-', $this->names['name'])); + } + + // if is plural or slug, append an 's' + if (in_array($key, ['plural', 'slug'])) { + if (substr($name, strlen($name) - 1, 1) == "y") { + $name = substr($name, 0, strlen($name) - 1) . "ies"; + } else { + $name .= 's'; + } + } + + // asign the name to the PostType property + $this->$key = $name; + } + } + + /** + * Create options for PostType + * @return array Options to pass to register_post_type + */ + public function createOptions() + { + // default options + $options = [ + 'public' => true, + 'rewrite' => [ + 'slug' => $this->slug + ] + ]; + + // replace defaults with the options passed + $options = array_replace_recursive($options, $this->options); + + // create and set labels + if (!isset($options['labels'])) { + $options['labels'] = $this->createLabels(); + } + + // set the menu icon + if (!isset($options['menu_icon']) && isset($this->icon)) { + $options['menu_icon'] = $this->icon; + } + + return $options; + } + + /** + * Create the labels for the PostType + * @return array + */ + public function createLabels() + { + // default labels + $labels = [ + 'name' => $this->plural, + 'singular_name' => $this->singular, + 'menu_name' => $this->plural, + 'all_items' => $this->plural, + 'add_new' => "Add New", + 'add_new_item' => "Add New {$this->singular}", + 'edit_item' => "Edit {$this->singular}", + 'new_item' => "New {$this->singular}", + 'view_item' => "View {$this->singular}", + 'search_items' => "Search {$this->plural}", + 'not_found' => "No {$this->plural} found", + 'not_found_in_trash' => "No {$this->plural} found in Trash", + 'parent_item_colon' => "Parent {$this->singular}:", + ]; + + return array_replace_recursive($labels, $this->labels); + } + + /** + * Register Taxonomies to the PostType + * @return void + */ + public function registerTaxonomies() + { + if (!empty($this->taxonomies)) { + foreach ($this->taxonomies as $taxonomy) { + register_taxonomy_for_object_type($taxonomy, $this->name); + } + } + } + + /** + * Modify and display filters on the admin edit screen + * @param string $posttype The current screen post type + * @return void + */ + public function modifyFilters($posttype) + { + // first check we are working with the this PostType + if ($posttype === $this->name) { + // calculate what filters to add + $filters = $this->getFilters(); + + foreach ($filters as $taxonomy) { + // if the taxonomy doesn't exist, ignore it + if (!taxonomy_exists($taxonomy)) { + continue; + } + + // If the taxonomy is not registered to the post type, continue. + if (!is_object_in_taxonomy($this->name, $taxonomy)) { + continue; + } + + // get the taxonomy object + $tax = get_taxonomy($taxonomy); + + // start the html for the filter dropdown + $selected = null; + + if (isset($_GET[$taxonomy])) { + $selected = sanitize_title($_GET[$taxonomy]); + } + + $dropdown_args = [ + 'name' => $taxonomy, + 'value_field' => 'slug', + 'taxonomy' => $tax->name, + 'show_option_all' => $tax->labels->all_items, + 'hierarchical' => $tax->hierarchical, + 'selected' => $selected, + 'orderby' => 'name', + 'hide_empty' => 0, + 'show_count' => 0, + ]; + + // Output screen reader label. + echo ''; + + // Output dropdown for taxonomy. + wp_dropdown_categories($dropdown_args); + } + } + } + + /** + * Calculate the filters for the PostType + * @return array + */ + public function getFilters() + { + // default filters are empty + $filters = []; + + // if custom filters have been set, use them + if (!is_null($this->filters)) { + return $this->filters; + } + + // if no custom filters have been set, and there are + // Taxonomies assigned to the PostType + if (is_null($this->filters) && !empty($this->taxonomies)) { + // create filters for each taxonomy assigned to the PostType + return $this->taxonomies; + } + + return $filters; + } + + /** + * Modify the columns for the PostType + * @param array $columns Default WordPress columns + * @return array The modified columns + */ + public function modifyColumns($columns) + { + $columns = $this->columns->modifyColumns($columns); + + return $columns; + } + + /** + * Populate custom columns for the PostType + * @param string $column The column slug + * @param int $post_id The post ID + */ + public function populateColumns($column, $post_id) + { + if (isset($this->columns->populate[$column])) { + call_user_func_array($this->columns()->populate[$column], [$column, $post_id]); + } + } + + /** + * Make custom columns sortable + * @param array $columns Default WordPress sortable columns + */ + public function setSortableColumns($columns) + { + if (!empty($this->columns()->sortable)) { + $columns = array_merge($columns, $this->columns()->sortable); + } + + return $columns; + } + + /** + * Set query to sort custom columns + * @param WP_Query $query + */ + public function sortSortableColumns($query) + { + // don't modify the query if we're not in the post type admin + if (!is_admin() || $query->get('post_type') !== $this->name) { + return; + } + + $orderby = $query->get('orderby'); + + // if the sorting a custom column + if ($this->columns()->isSortable($orderby)) { + // get the custom column options + $meta = $this->columns()->sortableMeta($orderby); + + // determine type of ordering + if (is_string($meta) or !$meta[1]) { + $meta_key = $meta; + $meta_value = 'meta_value'; + } else { + $meta_key = $meta[0]; + $meta_value = 'meta_value_num'; + } + + // set the custom order + $query->set('meta_key', $meta_key); + $query->set('orderby', $meta_value); + } + } +} diff --git a/vendor/jjgrainger/posttypes/src/Taxonomy.php b/vendor/jjgrainger/posttypes/src/Taxonomy.php new file mode 100644 index 0000000..1e27f74 --- /dev/null +++ b/vendor/jjgrainger/posttypes/src/Taxonomy.php @@ -0,0 +1,384 @@ +names($names); + + $this->options($options); + + $this->labels($labels); + } + + /** + * Set the names for the Taxonomy + * @param mixed $names The name(s) for the Taxonomy + * @return $this + */ + public function names($names) + { + if (is_string($names)) { + $names = ['name' => $names]; + } + + $this->names = $names; + + // create names for the Taxonomy + $this->createNames(); + + return $this; + } + + /** + * Set options for the Taxonomy + * @param array $options + * @return $this + */ + public function options(array $options = []) + { + $this->options = $options; + + return $this; + } + + /** + * Set the Taxonomy labels + * @param array $labels + * @return $this + */ + public function labels(array $labels = []) + { + $this->labels = $labels; + + return $this; + } + + /** + * Assign a PostType to register the Taxonomy to + * @param mixed $posttypes + * @return $this + */ + public function posttype($posttypes) + { + $posttypes = is_string($posttypes) ? [$posttypes] : $posttypes; + + foreach ($posttypes as $posttype) { + $this->posttypes[] = $posttype; + } + + return $this; + } + + /** + * Get the Column Manager for the Taxonomy + * @return Columns + */ + public function columns() + { + if (!isset($this->columns)) { + $this->columns = new Columns; + } + + return $this->columns; + } + + /** + * Register the Taxonomy to WordPress + * @return void + */ + public function register() + { + // register the taxonomy, set priority to 9 + // so taxonomies are registered before PostTypes + add_action('init', [$this, 'registerTaxonomy'], 9); + + // assign taxonomy to post type objects + add_action('init', [$this, 'registerTaxonomyToObjects']); + + if (isset($this->columns)) { + // modify the columns for the Taxonomy + add_filter("manage_edit-{$this->name}_columns", [$this, 'modifyColumns']); + + // populate the columns for the Taxonomy + add_filter("manage_{$this->name}_custom_column", [$this, 'populateColumns'], 10, 3); + + // set custom sortable columns + add_filter("manage_edit-{$this->name}_sortable_columns", [$this, 'setSortableColumns']); + + // run action that sorts columns on request + add_action('parse_term_query', [$this, 'sortSortableColumns']); + } + } + + /** + * Register the Taxonomy to WordPress + * @return void + */ + public function registerTaxonomy() + { + // Get the existing taxonomy options if it exists. + $options = (taxonomy_exists($this->name)) ? (array) get_taxonomy($this->name) : []; + + // create options for the Taxonomy. + $options = array_replace_recursive($options, $this->createOptions()); + + // register the Taxonomy with WordPress. + register_taxonomy($this->name, null, $options); + } + + /** + * Register the Taxonomy to PostTypes + * @return void + */ + public function registerTaxonomyToObjects() + { + // register Taxonomy to each of the PostTypes assigned + if (!empty($this->posttypes)) { + foreach ($this->posttypes as $posttype) { + register_taxonomy_for_object_type($this->name, $posttype); + } + } + } + + /** + * Create names for the Taxonomy + * @return void + */ + public function createNames() + { + $required = [ + 'name', + 'singular', + 'plural', + 'slug', + ]; + + foreach ($required as $key) { + // if the name is set, assign it + if (isset($this->names[$key])) { + $this->$key = $this->names[$key]; + continue; + } + + // if the key is not set and is singular or plural + if (in_array($key, ['singular', 'plural'])) { + // create a human friendly name + $name = ucwords(strtolower(str_replace(['-', '_'], ' ', $this->names['name']))); + } + + if ($key === 'slug') { + // create a slug friendly name + $name = strtolower(str_replace([' ', '_'], '-', $this->names['name'])); + } + + // if is plural or slug, append an 's' + if (in_array($key, ['plural', 'slug'])) { + $name .= 's'; + } + + // asign the name to the PostType property + $this->$key = $name; + } + } + + /** + * Create options for Taxonomy + * @return array Options to pass to register_taxonomy + */ + public function createOptions() + { + // default options + $options = [ + 'hierarchical' => true, + 'show_admin_column' => true, + 'rewrite' => [ + 'slug' => $this->slug, + ], + ]; + + // replace defaults with the options passed + $options = array_replace_recursive($options, $this->options); + + // create and set labels + if (!isset($options['labels'])) { + $options['labels'] = $this->createLabels(); + } + + return $options; + } + + /** + * Create labels for the Taxonomy + * @return array + */ + public function createLabels() + { + // default labels + $labels = [ + 'name' => $this->plural, + 'singular_name' => $this->singular, + 'menu_name' => $this->plural, + 'all_items' => "All {$this->plural}", + 'edit_item' => "Edit {$this->singular}", + 'view_item' => "View {$this->singular}", + 'update_item' => "Update {$this->singular}", + 'add_new_item' => "Add New {$this->singular}", + 'new_item_name' => "New {$this->singular} Name", + 'parent_item' => "Parent {$this->plural}", + 'parent_item_colon' => "Parent {$this->plural}:", + 'search_items' => "Search {$this->plural}", + 'popular_items' => "Popular {$this->plural}", + 'separate_items_with_commas' => "Seperate {$this->plural} with commas", + 'add_or_remove_items' => "Add or remove {$this->plural}", + 'choose_from_most_used' => "Choose from most used {$this->plural}", + 'not_found' => "No {$this->plural} found", + ]; + + return array_replace($labels, $this->labels); + } + + /** + * Modify the columns for the Taxonomy + * @param array $columns The WordPress default columns + * @return array + */ + public function modifyColumns($columns) + { + $columns = $this->columns->modifyColumns($columns); + + return $columns; + } + + /** + * Populate custom columns for the Taxonomy + * @param string $content + * @param string $column + * @param int $term_id + */ + public function populateColumns($content, $column, $term_id) + { + if (isset($this->columns->populate[$column])) { + $content = call_user_func_array($this->columns()->populate[$column], [$content, $column, $term_id]); + } + + return $content; + } + + /** + * Make custom columns sortable + * @param array $columns Default WordPress sortable columns + */ + public function setSortableColumns($columns) + { + if (!empty($this->columns()->sortable)) { + $columns = array_merge($columns, $this->columns()->sortable); + } + + return $columns; + } + + /** + * Set query to sort custom columns + * @param WP_Term_Query $query + */ + public function sortSortableColumns($query) + { + // don't modify the query if we're not in the post type admin + if (!is_admin() || !in_array($this->name, $query->query_vars['taxonomy'] ?? [])) { + return; + } + + // check the orderby is a custom ordering + if (isset($_GET['orderby']) && array_key_exists($_GET['orderby'], $this->columns()->sortable)) { + // get the custom sorting options + $meta = $this->columns()->sortable[$_GET['orderby']]; + + // check ordering is not numeric + if (is_string($meta)) { + $meta_key = $meta; + $orderby = 'meta_value'; + } else { + $meta_key = $meta[0]; + $orderby = 'meta_value_num'; + } + + // set the sort order + $query->query_vars['orderby'] = $orderby; + $query->query_vars['meta_key'] = $meta_key; + } + } +} diff --git a/vendor/jjgrainger/posttypes/tests/ColumnsTest.php b/vendor/jjgrainger/posttypes/tests/ColumnsTest.php new file mode 100644 index 0000000..9959b67 --- /dev/null +++ b/vendor/jjgrainger/posttypes/tests/ColumnsTest.php @@ -0,0 +1,212 @@ +columns = new Columns; + } + + /** @test */ + public function canCreateColumns() + { + $this->assertInstanceOf(Columns::class, $this->columns); + } + + /** @test */ + public function canSetColumns() + { + $columns = [ + 'title' => 'Title', + 'date' => 'Date', + ]; + + $this->columns->set($columns); + + $this->assertEquals($this->columns->items, $columns); + } + + /** @test */ + public function canAddColumns() + { + $columns = [ + 'genre' => 'Genre' + ]; + + $this->columns->add($columns); + + $this->assertEquals($this->columns->add, $columns); + } + + /** @test */ + public function canHideColumns() + { + $columns = [ + 'date' + ]; + + $this->columns->hide($columns); + + $this->assertEquals($this->columns->hide, $columns); + } + + /** @test */ + public function canPopulateColumns() + { + $callable = function($column, $post_id) { + echo $post_id; + }; + + $this->columns->populate('post_id', $callable); + + $this->assertEquals($this->columns->populate['post_id'], $callable); + } + + /** @test */ + public function canOrderColumns() + { + $columns = [ + 'date' => 3, + 'genre' => 2 + ]; + + $this->columns->order($columns); + + $this->assertEquals($this->columns->positions, $columns); + } + + /** @test */ + public function canSortColumns() + { + $columns = [ + 'rating' => ['_rating', true] + ]; + + $this->columns->sortable($columns); + + $this->assertEquals($this->columns->sortable, $columns); + } + + /** @test */ + public function usesSetColumnsOverDefaults() + { + $defaults = [ + 'title' => 'Title', + 'author' => 'Author', + 'comments' => 'Comments', + 'date' => 'Date' + ]; + + $columns = [ + 'title' => 'Title', + 'author' => 'Author', + 'date' => 'Date' + ]; + + $this->columns->set($columns); + + $output = $this->columns->modifyColumns($defaults); + + $this->assertEquals($output, $columns); + } + + /** @test */ + public function addsColumnsToDefaults() + { + $columns = [ + 'title' => 'Title', + 'author' => 'Author', + 'comments' => 'Comments', + 'date' => 'Date' + ]; + + $this->columns->add(['genre' => 'Genres']); + + $output = $this->columns->modifyColumns($columns); + + $columns['genre'] = 'Genres'; + + $this->assertEquals($output, $columns); + } + + /** @test */ + public function hideColumnsFromDefaults() + { + $columns = [ + 'title' => 'Title', + 'author' => 'Author', + 'comments' => 'Comments', + 'date' => 'Date' + ]; + + $this->columns->hide('comments'); + + $output = $this->columns->modifyColumns($columns); + + unset($columns['comments']); + + $this->assertEquals($output, $columns); + } + + /** @test */ + public function setOrderOfDefaultColumns() + { + $columns = [ + 'title' => 'Title', + 'author' => 'Author', + 'comments' => 'Comments', + 'date' => 'Date' + ]; + + $this->columns->order([ + 'date' => 1, + 'title' => 3 + ]); + + $output = $this->columns->modifyColumns($columns); + + $expected = [ + 'date' => 'Date', + 'author' => 'Author', + 'title' => 'Title', + 'comments' => 'Comments', + ]; + + $this->assertEquals($output, $expected); + } + + /** @test */ + public function canModifyColumns() + { + $defaults = [ + 'title' => 'Title', + 'author' => 'Author', + 'comments' => 'Comments', + 'date' => 'Date' + ]; + + $expected = [ + 'title' => 'Title', + 'genre' => 'Genre', + 'author' => 'Author', + 'date' => 'Date' + ]; + + $this->columns->hide('comments'); + + $this->columns->add(['genre' => 'Genre']); + + $this->columns->order([ + 'genre' => 2, + ]); + + $output = $this->columns->modifyColumns($defaults); + + $this->assertEquals($output, $expected); + } +} diff --git a/vendor/jjgrainger/posttypes/tests/PostTypeTest.php b/vendor/jjgrainger/posttypes/tests/PostTypeTest.php new file mode 100644 index 0000000..1769bcc --- /dev/null +++ b/vendor/jjgrainger/posttypes/tests/PostTypeTest.php @@ -0,0 +1,265 @@ +books = new PostType('book'); + } + + /** @test */ + public function canCreatePostType() + { + $this->assertInstanceOf(PostType::class, $this->books); + } + + /** @test */ + public function hasNameOnInstantiation() + { + $this->assertEquals($this->books->names['name'], 'book'); + } + + /** @test */ + public function hasNamesOnInstantiation() + { + $names = [ + 'name' => 'book', + 'singular' => 'Book', + 'plural' => 'Books', + 'slug' => 'books' + ]; + + $books = new PostType($names); + + $this->assertEquals($books->names, $names); + } + + /** @test */ + public function hasOptionsOnInstantiation() + { + $this->assertEquals($this->books->options, []); + } + + /** @test */ + public function hasCustomOptionsOnInstantiation() + { + $options = [ + 'public' => true + ]; + + $books = new PostType('books', $options); + + $this->assertEquals($books->options, $options); + } + + /** @test */ + public function hasLabelsOnInstantiation() + { + $this->assertEquals($this->books->labels, []); + } + + /** @test */ + public function hasCustomLabelsOnInstantiation() + { + $labels = [ + 'name' => 'Books', + 'add_new' => 'Add New Book' + ]; + + $books = new PostType('books', [], $labels); + + $this->assertEquals($books->labels, $labels); + } + + /** @test */ + public function taxonomiesEmptyOnInstantiation() + { + $this->assertEquals($this->books->taxonomies, []); + } + + /** @test */ + public function hasCustomTaxonomiesWhenPassed() + { + $books = $this->books; + + $books->taxonomy('genre'); + + $this->assertEquals($books->taxonomies, ['genre']); + } + + /** @test */ + public function canAddMultipleTaxonomies() + { + $books = $this->books; + + $books->taxonomy(['genre', 'publisher']); + + $this->assertEquals($books->taxonomies, ['genre', 'publisher']); + } + + /** @test */ + public function filtersNullOnInstantiation() + { + $this->assertNull($this->books->filters); + } + + /** @test */ + public function hasFiltersWhenAdded() + { + $books = $this->books; + + $books->filters(['genre']); + + $this->assertEquals($books->filters, ['genre']); + } + + /** @test */ + public function iconNullOnInstantiation() + { + $this->assertNull($this->books->icon); + } + + /** @test */ + public function hasIconWhenSet() + { + $books = $this->books; + + $books->icon('dashicon-book-alt'); + + $this->assertEquals($books->icon, 'dashicon-book-alt'); + } + + /** @test */ + public function columnsIsNullOnInstantiation() + { + $this->assertEquals($this->books->columns, null); + } + + /** @test */ + public function columnsReturnsInstanceOfColumns() + { + $this->assertInstanceOf(Columns::class, $this->books->columns()); + } + + /** @test */ + public function namesCreatedFromName() + { + $this->books->createNames(); + + $this->assertEquals($this->books->name, 'book'); + $this->assertEquals($this->books->singular, 'Book'); + $this->assertEquals($this->books->plural, 'Books'); + $this->assertEquals($this->books->slug, 'books'); + } + + /** @test */ + public function passedNamesAreUsed() + { + $names = [ + 'name' => 'book', + 'singular' => 'Single Book', + 'plural' => 'Multiple Books', + 'slug' => 'slug_books', + ]; + + $this->books->names($names); + + $this->books->createNames(); + + $this->assertEquals($this->books->name, 'book'); + $this->assertEquals($this->books->singular, 'Single Book'); + $this->assertEquals($this->books->plural, 'Multiple Books'); + $this->assertEquals($this->books->slug, 'slug_books'); + } + + /** @test */ + public function defaultOptionsUsedIfNotSet() + { + // generated options + $options = $this->books->createOptions(); + + // expected options + $defaults = [ + 'public' => true, + 'labels' => $this->books->createLabels(), + 'rewrite' => [ + 'slug' => $this->books->slug + ] + ]; + + $this->assertEquals($options, $defaults); + } + + /** @test */ + public function defaultLabelsAreGenerated() + { + $labels = $this->books->createLabels(); + + $defaults = [ + 'name' => $this->books->plural, + 'singular_name' => $this->books->singular, + 'menu_name' => $this->books->plural, + 'all_items' => $this->books->plural, + 'add_new' => "Add New", + 'add_new_item' => "Add New {$this->books->singular}", + 'edit_item' => "Edit {$this->books->singular}", + 'new_item' => "New {$this->books->singular}", + 'view_item' => "View {$this->books->singular}", + 'search_items' => "Search {$this->books->plural}", + 'not_found' => "No {$this->books->plural} found", + 'not_found_in_trash' => "No {$this->books->plural} found in Trash", + 'parent_item_colon' => "Parent {$this->books->singular}:", + ]; + + $this->assertEquals($labels, $defaults); + } + + /** @test */ + public function filtersAreEmptyIfNotSetAndNoTaxonomies() + { + $filters = $this->books->getFilters(); + + $this->assertEquals($filters, []); + } + + /** @test */ + public function filtersAreSameAsTaxonomyIfNotSet() + { + $this->books->taxonomy('genre'); + + $filters = $this->books->getFilters(); + + $this->assertEquals($filters, ['genre']); + } + + /** @test */ + public function filtersAreWhatAssignedIfPassed() + { + $this->books->filters(['genre', 'published']); + + $this->books->taxonomy('genre'); + + $filters = $this->books->getFilters(); + + $this->assertEquals($filters, ['genre', 'published']); + } + + /** @test */ + public function filtersAreEmptyIfSetWithEmptyArray() + { + $this->books->filters([]); + + $this->books->taxonomy('genre'); + + $filters = $this->books->getFilters(); + + $this->assertEquals($filters, []); + } +} diff --git a/vendor/jjgrainger/posttypes/tests/TaxonomyTest.php b/vendor/jjgrainger/posttypes/tests/TaxonomyTest.php new file mode 100644 index 0000000..2883c19 --- /dev/null +++ b/vendor/jjgrainger/posttypes/tests/TaxonomyTest.php @@ -0,0 +1,167 @@ +genres = new Taxonomy('genre'); + } + + /** @test */ + public function canCreateTaxonomy() + { + $this->assertInstanceOf(Taxonomy::class, $this->genres); + } + + /** @test */ + public function hasNameOnInstantiation() + { + $this->assertEquals('genre', $this->genres->names['name']); + } + + /** @test */ + public function hasNamesOnInstantiation() + { + $names = [ + 'name' => 'genre', + 'singular' => 'Genre', + 'plural' => 'Genres', + 'slug' => 'genres' + ]; + + $genres = new Taxonomy($names); + + $this->assertEquals($genres->names, $names); + } + + /** @test */ + public function hasOptionsOnInstantiation() + { + $this->assertEquals($this->genres->options, []); + } + + /** @test */ + public function hasCustomOptionsOnInstantiation() + { + $options = [ + 'public' => true, + ]; + + $genres = new Taxonomy('genre', $options); + + $this->assertEquals($genres->options, $options); + } + + /** @test */ + public function hasLabelsOnInstatiation() + { + $this->assertEquals($this->genres->labels, []); + } + + /** @test */ + public function hasCustomLabelsOnInstantiation() + { + $labels = [ + 'name' => 'Genres', + 'add_new' => 'Add New Genre' + ]; + + $genres = new Taxonomy('genre', [], $labels); + + $this->assertEquals($genres->labels, $labels); + } + + /** @test */ + public function posttypesEmptyOnInstantiation() + { + $this->assertEquals($this->genres->posttypes, []); + } + + /** @test */ + public function hasCustomPosttypesWhenAssigned() + { + $genres = new Taxonomy('genre'); + + $genres->posttype('books'); + + $this->assertEquals($genres->posttypes, ['books']); + } + + /** @test */ + public function canAddMultiplePostTypes() + { + $genres = new Taxonomy('genre'); + + $genres->posttype(['books', 'films']); + + $this->assertEquals($genres->posttypes, ['books', 'films']); + } + + /** @test */ + public function namesCreatedFromName() + { + $this->genres->createNames(); + + $this->assertEquals($this->genres->name, 'genre'); + $this->assertEquals($this->genres->singular, 'Genre'); + $this->assertEquals($this->genres->plural, 'Genres'); + $this->assertEquals($this->genres->slug, 'genres'); + } + + /** @test */ + public function passedNamesAreUsed() + { + $names = [ + 'name' => 'genre', + 'singular' => 'Single Genre', + 'plural' => 'Multiple Genres', + 'slug' => 'slug-genres', + ]; + + $this->genres->names($names); + + $this->genres->createNames(); + + $this->assertEquals($this->genres->name, 'genre'); + $this->assertEquals($this->genres->singular, 'Single Genre'); + $this->assertEquals($this->genres->plural, 'Multiple Genres'); + $this->assertEquals($this->genres->slug, 'slug-genres'); + } + + /** @test */ + public function defaultOptionsUsedIfNotSet() + { + // generated options + $options = $this->genres->createOptions(); + + // expected options + $defaults = [ + 'hierarchical' => true, + 'show_admin_column' => true, + 'labels' => $this->genres->createLabels(), + 'rewrite' => [ + 'slug' => $this->genres->slug, + ], + ]; + + $this->assertEquals($options, $defaults); + } + + /** @test */ + public function columnsIsNullOnInstantiation() + { + $this->assertEquals($this->genres->columns, null); + } + + /** @test */ + public function columnsReturnsInstanceOfColumns() + { + $this->assertInstanceOf(Columns::class, $this->genres->columns()); + } +} diff --git a/vendor/open-function-computers-llc/rad-theme-engine/.gitignore b/vendor/open-function-computers-llc/rad-theme-engine/.gitignore new file mode 100644 index 0000000..4cad2ad --- /dev/null +++ b/vendor/open-function-computers-llc/rad-theme-engine/.gitignore @@ -0,0 +1,4 @@ +vendor/ +composer.lock +.php.result.cache +.phpunit.result.cache diff --git a/vendor/open-function-computers-llc/rad-theme-engine/LICENSE b/vendor/open-function-computers-llc/rad-theme-engine/LICENSE new file mode 100644 index 0000000..4a448df --- /dev/null +++ b/vendor/open-function-computers-llc/rad-theme-engine/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2021 Open Function Computers, LLC + +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. diff --git a/vendor/open-function-computers-llc/rad-theme-engine/README.md b/vendor/open-function-computers-llc/rad-theme-engine/README.md new file mode 100644 index 0000000..482bcdf --- /dev/null +++ b/vendor/open-function-computers-llc/rad-theme-engine/README.md @@ -0,0 +1,41 @@ +

+ofc-logo +

+A suite of utilities to deliver a faster and more consistent WordPress theme development experience. +

+ +[![Latest Stable Version](https://poser.pugx.org/open-function-computers-llc/rad-theme-engine/v/stable.svg)](https://packagist.org/packages/open-function-computers-llc/rad-theme-engine) [![Downloads](https://poser.pugx.org/open-function-computers-llc/rad-theme-engine/d/total.svg)](https://packagist.org/packages/open-function-computers-llc/rad-theme-engine)
+📦  [View on Packagist](https://packagist.org/packages/open-function-computers-llc/rad-theme-engine)
+📃  [Read the Docs](https://rad-theme-engine.ofco.cloud/) +
+ +## About + +The purpose of this package is to enable developers to use the familiar model-view-controller pattern in the creation of WordPress themes. This is accomplished by keeping HTML and PHP code as seperated as possible and adding convenient methods to organize data before it’s sent to the view controllers. Querying for posts, rendering menus, handling taxonomies and all the other essential parts of developing a WordPress theme are now easier than ever with the __RAD Theme Engine__. + + +## Quick Start +Inside of your site's `wp-content/themes` folder, run the following command to create a new __Rad Theme Engine__ project. + +``` +composer create-project open-function-computers-llc/wp-theme +``` + +Next, enter your new theme's folder and run `npm install` to get dependencies. +``` +cd +npm install +``` + +And that's it! Read about advanced installations and asset bundling on [the docs](https://rad-theme-engine.ofco.cloud/). + +## Example Projects +- [Shirt Store](https://github.com/open-function-computers-llc/rad-theme-engine-example-theme) – Demonstrates custom post types, taxonomies, handlebars, and more. + +## Authors +- Kurtis Holsapple – [@lapubell](https://github.com/lapubell) +- Escher Wright-Dykhouse – [@escherwd](https://github.com/escherwd) +- Gabriel Johnson - [@gabriel-johnson](https://github.com/gabriel-johnson) + +## License +Licensed under the MIT license, see [LICENSE](https://github.com/open-function-computers-llc/rad-theme-engine/blob/main/LICENSE) diff --git a/vendor/open-function-computers-llc/rad-theme-engine/bin/getIcon b/vendor/open-function-computers-llc/rad-theme-engine/bin/getIcon new file mode 100755 index 0000000..ef427d9 --- /dev/null +++ b/vendor/open-function-computers-llc/rad-theme-engine/bin/getIcon @@ -0,0 +1,37 @@ +#!/usr/bin/env php +\n"); + exit(1); +} + +$icon = trim(strtolower($argv[1])); + +try { + IconGetter::get($icon); +} catch (Exception $e) { + fwrite(STDERR, "Error: ".$e->getMessage().PHP_EOL); + exit(1); +} diff --git a/vendor/open-function-computers-llc/rad-theme-engine/composer.json b/vendor/open-function-computers-llc/rad-theme-engine/composer.json new file mode 100644 index 0000000..2aed46e --- /dev/null +++ b/vendor/open-function-computers-llc/rad-theme-engine/composer.json @@ -0,0 +1,30 @@ +{ + "name": "open-function-computers-llc/rad-theme-engine", + "description": "A suite of classes to make WordPress theme development cleaner", + "require": { + "php": ">=7.4", + "jjgrainger/posttypes": "^2.1", + "salesforce/handlebars-php": "^2.3" + }, + "require-dev": { + "phpunit/phpunit": "^9.5" + }, + "license": "MIT", + "keywords": [ + "wordpress", + "handlebars", + "theme" + ], + "minimum-stability": "stable", + "autoload": { + "psr-4": { + "ofc\\": "src/" + } + }, + "scripts": { + "post-create-project-cmd": "ofc\\RadThemeEngine::setup" + }, + "bin": [ + "bin/getIcon" + ] +} diff --git a/vendor/open-function-computers-llc/rad-theme-engine/config.example.php b/vendor/open-function-computers-llc/rad-theme-engine/config.example.php new file mode 100644 index 0000000..82bcb5e --- /dev/null +++ b/vendor/open-function-computers-llc/rad-theme-engine/config.example.php @@ -0,0 +1,93 @@ + 100, + + /** + * guest-class + * if you want wordpress to automatically append a class to the body_class + * list when users are not authenticated, put that class name here. it + * defaults to "guest" + * + * to disable, set this to null + */ + "guest-class" => "null", + + /** + * menu-locations + * register your individual menu locations here + */ + "menu-locations" => [ + "main-nav" => "Main Navigation", + "footer-nav" => "Footer Navigation", + ], + + /** + * custom-post-types + * here is where you can define your custom post types easily + * + * icons are powered by dashicons, choose one from here: + * https://developer.wordpress.org/resource/dashicons + * + * additional options are enabled in the cpt options key + * if you override "supports", be sure to include 'title' and 'editor' in + * the list for standard wordpress functionality + */ + "custom-post-types" => [ + [ + "slug" => "thing", + "icon" => "dashicons-tide", + "options" => [ + "supports" => ['title', 'editor', 'thumbnail', 'comments'] + ] + ], + ], + + /** + * handlebars + * + * We use handlebars templating extensivly in this theme and code pattern. + * You can adjust the defaults for many attributes here. + * + * Set this to `false` to disable handlebars functionality completely + */ + "handlebars" => [ + /** + * additional-helpers + * if you need to register additional Handlebars Helpers, register them here + * + * the key is the name that you will use in your templates, and the value is + * the callback function that is run on the template side + */ + "additional-helpers" => [], + + /** + * template-extension + * + * The default extention for your templates is .tpl + * If you'd like to change that, set the vaule here, without the dot + */ + // "template-extension" => "tpl", + ], + + /** + * enable + * enable individual wordpress features here + */ + "enable" => [ + "post-thumbnails", + "menus", + ], + + /** + * disable + * disable individual wordpress features here + */ + "disable" => [ + "editor", + ], +]; diff --git a/vendor/open-function-computers-llc/rad-theme-engine/logo.png b/vendor/open-function-computers-llc/rad-theme-engine/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..94a66483ea77d041e162de0f8c85b47b61225c85 GIT binary patch literal 89459 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 RJa@2<%5!yv8i@JZ{{x0zw%7mw literal 0 HcmV?d00001 diff --git a/vendor/open-function-computers-llc/rad-theme-engine/phpunit.xml b/vendor/open-function-computers-llc/rad-theme-engine/phpunit.xml new file mode 100644 index 0000000..0374b3f --- /dev/null +++ b/vendor/open-function-computers-llc/rad-theme-engine/phpunit.xml @@ -0,0 +1,18 @@ + + + + + ./tests + + + + + ./src + + + diff --git a/vendor/open-function-computers-llc/rad-theme-engine/src/FieldHTML.php b/vendor/open-function-computers-llc/rad-theme-engine/src/FieldHTML.php new file mode 100644 index 0000000..21b2db5 --- /dev/null +++ b/vendor/open-function-computers-llc/rad-theme-engine/src/FieldHTML.php @@ -0,0 +1,849 @@ + 'post_text', + 'default_editor' => 'TinyMce', + ); + $wpEditor = wp_editor($meta, "rad_".$field['name']."_wysiwyg", $settings); + + return << + + + + + +
+ + HTML; + + + } + + public static function text($meta, $postID, $field) + { + return << + +

+ + HTML; + // {{ template }} + } + + public static function number($meta, $postID, $field) + { + return << + +

+ + HTML; + } + + public static function textarea($meta, $postID, $field) + { + return << + +

+ + HTML; + } + + public static function repeater($meta, $postID, $field) + { + return << + +

+ +
+ {{#raw}} + + +
+

No elements

+
+
+
{{ i+1 }}
+
+ + + + Choose Media +
+
+ + +
+ Add Row +
+ {{/raw}} +
+ + HTML; + } + + public static function image($meta, $postID, $field) + { + return << + +
+ + + + + +
+ + + Choose Image + +
+

+ + + + HTML; + } + + + public static function file($meta, $postID, $field) + { + return << + +
+ + + + + +
+ + + Choose File + +
+

+ + + HTML; + } + + + public static function flexRepeater() + { + return << + +
+ {{#raw}} + + +
+

You don't have any content variations. Start adding some with the "Add Variation" button below.

+
+ +
+
+
+
+

{{ v.name }}

+
+
+ + + +
+
+
+ + + + + + + +
+ + + + + + + + + + +
ID:{{ chosenMediaParse(f.value).id }}
Size:{{ chosenMediaParse(f.value).filesizeHumanReadable }}
Dimensions:{{ chosenMediaParse(f.value).width }}x{{ chosenMediaParse(f.value).height }}
URL:{{ chosenMediaParse(f.value).url }}
+
No media chosen
+ Choose Media +
+ + +
+ +
    +
  • {{ r.title }}
  • +
+

{{ f.value.url }}

+
+
+
+
+
+
+
+ +
+

Type:

+ + Add + Cancel +
+ Add Variation + + {{/raw}} +
+ + + HTML; + } + + public static function metaBoxToggler($hidden) + { + // die(var_dump($hidden)); + return <<#{{group-name}} {display: none;} +
+ + HTML; + + } +} diff --git a/vendor/open-function-computers-llc/rad-theme-engine/src/IconGetter.php b/vendor/open-function-computers-llc/rad-theme-engine/src/IconGetter.php new file mode 100644 index 0000000..05b2a1e --- /dev/null +++ b/vendor/open-function-computers-llc/rad-theme-engine/src/IconGetter.php @@ -0,0 +1,2115 @@ +getMessage(); + return; + } + echo "Downloaded $name and saved it as $name.svg into the assets directory!".PHP_EOL; + } +} diff --git a/vendor/open-function-computers-llc/rad-theme-engine/src/RadField.php b/vendor/open-function-computers-llc/rad-theme-engine/src/RadField.php new file mode 100644 index 0000000..b7bf2e0 --- /dev/null +++ b/vendor/open-function-computers-llc/rad-theme-engine/src/RadField.php @@ -0,0 +1,84 @@ + "image", + "label" => $label, + "name" => $name, + "store" => $store, + ]; + } + + public static function text($label, $name = null) : array + { + if (is_null($name)) { + $name = Util::snakeify($label); + } + + return [ + "type" => "text", + "label" => $label, + "name" => $name, + ]; + } + + public static function textarea($label, $name = null) : array + { + if (is_null($name)) { + $name = Util::snakeify($label); + } + + return [ + "type" => "textarea", + "label" => $label, + "name" => $name, + ]; + } + + public static function file($label, $name = null) : array + { + if (is_null($name)) { + $name = Util::snakeify($label); + } + + return [ + "type" => "file", + "label" => $label, + "name" => $name, + ]; + } + + public static function wysiwyg($label, $name = null) : array + { + if (is_null($name)) { + $name = Util::snakeify($label); + } + + return [ + "type" => "wysiwyg", + "label" => $label, + "name" => $name, + ]; + } + + public static function getFields($fields): array + { + $tpl_fields = []; + + foreach($fields as $field){ + $tpl_fields[] = 'rad.'.$field['name']; + } + + return $tpl_fields; + } + +} diff --git a/vendor/open-function-computers-llc/rad-theme-engine/src/RadThemeEngine.php b/vendor/open-function-computers-llc/rad-theme-engine/src/RadThemeEngine.php new file mode 100644 index 0000000..996b294 --- /dev/null +++ b/vendor/open-function-computers-llc/rad-theme-engine/src/RadThemeEngine.php @@ -0,0 +1,109 @@ +get($args)); + }; + } + + public static function jsonAccess() + { + return function ($template, $context, $args, $source) { + $parts = explode(".", $args); + if (count($parts) != 2) { + return "Invalid use of json-access"; + } + $data = json_decode($context->get($parts[0]), true); + return $data[$parts[1]]; + }; + } + + public static function processFlex() + { + return function ($template, $context, $args, $source) { + $output = ""; + + if (!is_iterable($context->get($args))) { + return "Sorry, the item you passed to the flex helper is not iterable."; + } + + $groups = $context->get($args); + foreach ($groups as $g) { + if (!is_array($g)) { + $output .= "Sorry, one of your items is not compatible with the flex helper. Here is the details:

".print_r($g, true); + continue; + } + + if (!isset($g["acf_fc_layout"])) { + $output .= "Sorry, one of your items is missing the `acf_fc_layout` key:

".print_r($g, true); + continue; + } + + $output .= site()->render(site()->getFlexFilePrefix().$g["acf_fc_layout"], $g); + } + return $output; + }; + } + + public static function nl2br() + { + return function ($template, $context, $args, $source) { + return nl2br($context->get($args)); + }; + } + + public static function assetURL() + { + return function ($template, $context, $args, $source) { + return site()->getAssetURL($args); + }; + } + + public static function assetContents() + { + return function ($template, $context, $args, $source) { + return site()->getAssetContents($args); + }; + } + + private static function getFromBuffer($func) + { + ob_start(); + $func(); + $output = ob_get_clean(); + return $output; + } +} diff --git a/vendor/open-function-computers-llc/rad-theme-engine/src/Site.php b/vendor/open-function-computers-llc/rad-theme-engine/src/Site.php new file mode 100644 index 0000000..4a6ef8b --- /dev/null +++ b/vendor/open-function-computers-llc/rad-theme-engine/src/Site.php @@ -0,0 +1,1431 @@ +bootstrap(); + } + return self::$instance; + } + + private function __construct(array $config) + { + if ($config == [] && file_exists(get_template_directory() . "/config.php")) { + $config = include(get_template_directory() . "/config.php"); + } + + $this->config = $config; + } + + private function bootstrap() + { + $this->checkfavicons(); + + // wordpress added this style for us, but we don't want it + add_action('wp_enqueue_scripts', function () { + wp_dequeue_style('classic-theme-styles'); + }, 20); + + if (isset($this->config["excerpt-more-text"])) { + add_filter('excerpt_more', fn ($more) => $this->config["excerpt-more-text"]); + } + + // disable various things + if (isset($this->config["disable"])) { + $this->disable($this->config["disable"]); + } + + // enable various things, starting with TinyMCE + if (isset($this->config["tinyMCEAdditions"]) || isset($this->config["tiny-mce-additions"])) { + $this->addEditorStyles(); + } + if (isset($this->config["enable"])) { + $this->enable($this->config["enable"]); + } + + // adjust wordpress filters + $this->processFilters(); + + // create wordpress menu locations + $this->registerMenuLocations(); + + // initialize handlebars + $this->setUpHandlebars(); + + // register custom post types + $this->registerCPTs(); + + // register custom hook callbacks + $this->processHooks(); + + // add custom shortcodes + $this->registerShortcodes(); + + // add mix static assets + $this->includeManifestFiles(); + + // register ACF options pages + $this->addOptionsPages(); + + // register custom fields that aren't through ACF + $this->processCustomFields(); + + // register any ajax callbacks + $this->processAdminAJAX(); + $this->processGuestAJAX(); + } + + public function getFlexFilePrefix(): string + { + if (!isset($this->config["flex-file-prefix"])) { + return ""; + } + return $this->config["flex-file-prefix"]."_"; + } + + private function processGuestAJAX() + { + if (!isset($this->config["guest-ajax"])) { + return; + } + if (!is_array($this->config["guest-ajax"])) { + return; + } + foreach ($this->config["guest-ajax"] as $hook => $callback) { + // guest ajax methos work both for guests and authed users + add_action("wp_ajax_nopriv_$hook", function () use ($callback) { + echo json_encode($callback()); + wp_die(); + }); + add_action("wp_ajax_$hook", function () use ($callback) { + echo json_encode($callback()); + wp_die(); + }); + } + } + + private function processAdminAJAX() + { + if (!isset($this->config["admin-ajax"])) { + return; + } + if (!is_array($this->config["admin-ajax"])) { + return; + } + foreach ($this->config["admin-ajax"] as $hook => $callback) { + add_action("wp_ajax_$hook", function () use ($callback) { + echo json_encode($callback()); + wp_die(); + }); + } + } + + private function addEditorStyles() + { + $formats = []; + + if (isset($this->config["tinyMCEAdditions"])) { + $formats = $this->config["tinyMCEAdditions"]; + } + + if (isset($this->config["tiny-mce-additions"])) { + $formats = $this->config["tiny-mce-additions"]; + } + + $defaults = [ + [ + 'title' => 'Headings', + 'items' => [ + [ + 'title' => 'Heading 1', + 'format' => 'h1', + ], + [ + 'title' => 'Heading 2', + 'format' => 'h2', + ], + [ + 'title' => 'Heading 3', + 'format' => 'h3', + ], + [ + 'title' => 'Heading 4', + 'format' => 'h4', + ], + [ + 'title' => 'Heading 5', + 'format' => 'h5', + ], + [ + 'title' => 'Heading 6', + 'format' => 'h6', + ], + ], + ], + [ + 'title' => 'Inline', + 'items' => [ + [ + 'title' => 'Bold', + 'format' => 'bold', + 'icon' => 'bold', + ], + [ + 'title' => 'Italic', + 'format' => 'italic', + 'icon' => 'italic', + ], + [ + 'title' => 'Underline', + 'format' => 'underline', + 'icon' => 'underline', + ], + [ + 'title' => 'Strikethrough', + 'format' => 'strikethrough', + 'icon' => 'strikethrough', + ], + [ + 'title' => 'Superscript', + 'format' => 'superscript', + 'icon' => 'superscript', + ], + [ + 'title' => 'Subscript', + 'format' => 'subscript', + 'icon' => 'subscript', + ], + [ + 'title' => 'Code', + 'format' => 'code', + 'icon' => 'code', + ], + ], + ], + [ + 'title' => 'Blocks', + 'items' => [ + [ + 'title' => 'Paragraph', + 'format' => 'p', + ], + [ + 'title' => 'Blockquote', + 'format' => 'blockquote', + ], + [ + 'title' => 'Div', + 'format' => 'div', + ], + [ + 'title' => 'Pre', + 'format' => 'pre', + ], + ], + ], + [ + 'title' => 'Alignment', + 'items' => [ + [ + 'title' => 'Left', + 'format' => 'alignleft', + 'icon' => 'alignleft', + ], + [ + 'title' => 'Center', + 'format' => 'aligncenter', + 'icon' => 'aligncenter', + ], + [ + 'title' => 'Right', + 'format' => 'alignright', + 'icon' => 'alignright', + ], + [ + 'title' => 'Justify', + 'format' => 'alignjustify', + 'icon' => 'alignjustify', + ], + ], + ], + ]; + + add_filter('tiny_mce_before_init', function ($settings) use ($formats, $defaults) { + $settings['style_formats'] = json_encode(array_merge($defaults, [ + [ + "title" => "Custom", + "items" => $formats + ] + ])); + return $settings; + }); + } + + private function includeManifestFiles() + { + $manifestFile = get_template_directory() . "/dist/mix-manifest.json"; + if (!file_exists($manifestFile)) { + return; + } + + $items = json_decode(file_get_contents($manifestFile), true); + foreach ($items as $file => $version) { + $extension = end(explode(".", $file)); + $tag = $this->stringify($file); + if ($extension === "js") { + add_action('wp_enqueue_scripts', function () use ($version, $tag) { + wp_register_script($tag, get_template_directory_uri() . '/dist' . $version, [], '', true); + wp_enqueue_script($tag); + }); + continue; + } + + if ($extension === "css" && $file != "/inline.css") { + add_action('wp_enqueue_scripts', function () use ($version, $tag) { + wp_enqueue_style($tag, get_template_directory_uri() . '/dist' . $version); + }); + continue; + } + + if ($file == "/inline.css") { + add_action('wp_head', function () use ($file) { + $css = file_get_contents(get_template_directory() . "/dist" . $file); + echo ""; + }); + } + } + } + + private function registerShortcodes() + { + if (!array_key_exists('shortcodes', $this->config)) { + return; + } + + if (!is_array($this->config["shortcodes"])) { + return; + } + + foreach ($this->config["shortcodes"] as $name => $callable) { + add_shortcode($name, $callable); + } + } + + private function registerCPTs() + { + if (!array_key_exists('custom-post-types', $this->config)) { + return; + } + + $cptTaxonomies = []; + foreach ($this->config['custom-post-types'] as $cpt) { + if (!isset($cpt['slug'])) { + $this->adminError("To register a new custom post type, you must set the `slug` key."); + continue; + } + + // for convenience access + $this->cptSlugs[] = $cpt["slug"]; + + $options = $cpt['options'] ?? []; + if (isset($cpt["archive"]) && $cpt["archive"]) { + $options["has_archive"] = Util::slugify($this->humanize($cpt["slug"], true)); + } + $names = $this->generateLabels($cpt['slug']); + + $newCpt = new PostType($cpt['slug'], $options, $names); + + if (isset($cpt['icon'])) { + $newCpt->icon($cpt['icon']); + } + + if (isset($cpt["taxonomies"])) { + foreach ($cpt["taxonomies"] as $customTaxonomy) { + $cptTaxonomies[] = $customTaxonomy; + $newCpt->taxonomy($customTaxonomy); + } + } + $newCpt->register(); + + // disable post type things here + if (isset($cpt["disable"]) && is_array($cpt["disable"])) { + foreach ($cpt["disable"] as $feature) { + if (strtolower($feature) === "yoast") { + add_action('add_meta_boxes', fn () => remove_meta_box('wpseo_meta', $cpt['slug'], 'normal'), 100); + continue; + } + } + } + + // set up any ACF CPT options pages here + if (isset($cpt["options-pages"])) { + if (!function_exists("acf_add_options_page")) { + $this->adminError("You can't register options pages without the Pro version of Advanced Custom Fields."); + continue; + } + if (is_string($cpt["options-pages"])) { + $cpt["options-pages"] = [$cpt["options-pages"]]; + } + foreach ($cpt["options-pages"] as $optionsPage) { + if (is_string($optionsPage)) { + acf_add_options_page([ + "page_title" => $optionsPage, + "menu_title" => $optionsPage, + "menu_slug" => $this->stringify($optionsPage), + 'capability' => 'edit_posts', + "position" => 100, + "parent_slug" => "edit.php?post_type=" . $cpt["slug"] + ]); + continue; + } + + if (is_array($optionsPage) && isset($optionsPage["name"]) && isset($optionsPage["parent_slug"])) { + acf_add_options_page([ + "page_title" => $optionsPage["name"], + "menu_title" => $optionsPage["name"], + "menu_slug" => $this->stringify($optionsPage["name"]), + 'capability' => 'edit_posts', + "position" => 100, + "parent_slug" => $optionsPage["parent_slug"], + ]); + } + } + } + } + + if (count($cptTaxonomies)) { + foreach ($cptTaxonomies as $customTaxonomy) { + $tax = new Taxonomy($customTaxonomy); + $tax->options([ + 'hierarchical' => false, + ]); + $tax->register(); + } + } + } + + private function disable(array $keys) + { + foreach ($keys as $key) { + if ($key === "editor") { + define('DISALLOW_FILE_EDIT', true); + continue; + } + if ($key === "gutenberg") { + add_filter('use_block_editor_for_post', '__return_false', 10); + add_action('wp_enqueue_scripts', function () { + wp_dequeue_style('wp-block-library'); + wp_dequeue_style('wp-block-library-theme'); + wp_dequeue_style('wc-blocks-style'); // Remove WooCommerce block CSS + wp_dequeue_style('global-styles'); + }, 100); + continue; + } + if ($key === "patterns") { + remove_theme_support('core-block-patterns'); + add_action('admin_init', function () { + remove_submenu_page('themes.php', 'edit.php?post_type=wp_block'); + remove_submenu_page('themes.php', 'site-editor.php?p=/pattern'); + remove_submenu_page('themes.php', 'site-editor.php?p=/patterns'); + }); + continue; + } + if ($key === "meta-generator") { + remove_action('wp_head', 'wp_generator'); + add_filter('the_generator', '__return_null'); + continue; + } + if ($key === "emojis") { + remove_action('wp_head', 'print_emoji_detection_script', 7); + remove_action('wp_print_styles', 'print_emoji_styles'); + continue; + } + if (substr($key, 0, 12) === "woocommerce." && class_exists('WooCommerce')) { + $key = str_replace("woocommerce.", "", $key); + + if ($key === "breadcrumb") { + add_action('init', fn () => remove_action('woocommerce_before_main_content', 'woocommerce_breadcrumb', 20)); + continue; + } + if ($key === "sidebar") { + add_action('init', fn () => remove_action('woocommerce_sidebar', 'woocommerce_get_sidebar', 10)); + continue; + } + if ($key === "result_count") { + add_action('init', fn () => remove_action('woocommerce_before_shop_loop', 'woocommerce_result_count', 20)); + add_action('init', fn () => remove_action('woocommerce_before_shop_loop', 'woocommerce_catalog_ordering', 30)); + continue; + } + if ($key === "page_title") { + add_action('init', fn () => add_filter('woocommerce_show_page_title', '__return_false')); + continue; + } + + continue; + } + if ($key === "customizer") { + add_action('init', function () { + add_filter('map_meta_cap', function ($capabilities = [], $c = '', $user_id = 0, $args = []) { + if ($c == 'customize') { + return ['nope']; + } + return $capabilities; + }, 10, 4); + }, 10); + + add_action('admin_init', function () { + remove_action('plugins_loaded', '_wp_customize_include', 10); + remove_action('admin_enqueue_scripts', '_wp_customize_loader_settings', 11); + + add_action('load-customize.php', function () { + wp_die("The customizer is disabled via your current theme configuration."); + }); + }, 10); + continue; + } + } + } + + private function addOptionsPages() + { + if (!array_key_exists('options-pages', $this->config)) { + return; + } + + if (!function_exists("acf_add_options_page")) { + $this->adminError("You can't register options pages without the Pro version of Advanced Custom Fields."); + } + + $i = 100; + foreach ($this->config["options-pages"] as $pageTitle) { + acf_add_options_page([ + "page_title" => $pageTitle, + "menu_title" => $pageTitle, + "menu_slug" => $this->stringify($pageTitle), + 'capability' => 'edit_posts', + "position" => $i, + ]); + $i++; + } + } + + private function enable(array $keys) + { + foreach ($keys as $key) { + if ($key === "post-thumbnails") { + add_theme_support('post-thumbnails'); + continue; + } + if ($key === "menus") { + add_theme_support('menus'); + continue; + } + if ($key === "styleselect") { + add_filter('mce_buttons_2', function ($buttons) { + return array_merge(['styleselect'], $buttons); + }); + continue; + } + if ($key === "svg") { + add_filter('upload_mimes', function ($file_types) { + $file_types['svg'] = 'image/svg+xml'; + return $file_types; + }); + continue; + } + if ($key === "woocommerce") { + add_theme_support('woocommerce'); + continue; + } + + $this->adminError("Couldn't enable feature `$key`"); + } + } + + private function processFilters() + { + // handle "guest" html body class + $guestClass = "guest"; + if (array_key_exists("guest-class", $this->config)) { + $guestClass = $this->config["guest-class"]; + } + if (!is_null($guestClass)) { + add_filter('body_class', function ($classes) use ($guestClass) { + return in_array('logged-in', $classes) ? $classes : [$guestClass, ...$classes]; + }); + } + + // change excerpt langth + if (array_key_exists("excerpt-length", $this->config)) { + add_filter("excerpt_length", fn () => (int) $this->config["excerpt-length"], 999); + } + if (array_key_exists("excerpt_length", $this->config)) { + add_filter("excerpt_length", fn () => (int) $this->config["excerpt_length"], 999); + } + } + + private function registerMenuLocations() + { + if (!array_key_exists("menu-locations", $this->config)) { + return; + } + + if (!is_array($this->config["menu-locations"])) { + // TODO: show a helpful error message that notifies the developer this is set up wrong + return; + } + + $menus = $this->config["menu-locations"]; + add_action('init', function () use ($menus) { + register_nav_menus($menus); + }); + } + + private function setUpHandlebars() + { + if ($this->config["handlebars"] === false) { + return; + } + + $this->fileExtension = "tpl"; + if (is_array($this->config["handlebars"]) && + array_key_exists("template-extension", $this->config["handlebars"]) + ) { + $this->fileExtension = $this->config["handlebars"]["template-extension"]; + } + + $this->templateDirectory = "tpl"; + if (is_array($this->config["handlebars"]) && + array_key_exists("template-directory", $this->config["handlebars"]) + ) { + $this->templateDirectory = $this->config["handlebars"]["template-directory"]; + } + + $this->partialsDir = get_template_directory()."/".$this->templateDirectory; + if (!file_exists($this->partialsDir) && !is_dir($this->partialsDir)) { + // check for child theme? + $this->partialsDir = get_stylesheet_directory()."/".$this->templateDirectory; + + if (!file_exists($this->partialsDir) && !is_dir($this->partialsDir)) { + $this->adminError("Your Handlebars directory is not setup correctly or doesn't exist."); + return; + } + $this->adminError("Your Handlebars directory is not setup correctly or doesn't exist."); + return; + } + $partialsLoader = new FilesystemLoader($this->partialsDir, ["extension" => $this->fileExtension]); + + $this->hb = new Handlebars([ + "loader" => $partialsLoader, + "partials_loader" => $partialsLoader, + "enableDataVariables" => true, + ]); + + // built in helpers + $helpers = [ + "wp-header" => \ofc\RadThemeEngine::wpHeader(), + "wp-footer" => \ofc\RadThemeEngine::wpFooter(), + "wp-title" => \ofc\RadThemeEngine::wpTitle(), + "body-classes" => \ofc\RadThemeEngine::bodyClasses(), + "json-encode" => \ofc\RadThemeEngine::jsonEncode(), + "json-access" => \ofc\RadThemeEngine::jsonAccess(), + "flex" => \ofc\RadThemeEngine::processFlex(), + "nl2br" => \ofc\RadThemeEngine::nl2br(), + "assetURL" => \ofc\RadThemeEngine::assetURL(), + "assetUrl" => \ofc\RadThemeEngine::assetURL(), + "assetContents" => \ofc\RadThemeEngine::assetContents(), + ]; + foreach ($helpers as $name => $callback) { + $this->hb->addHelper($name, $callback); + } + + // additional helpers defined in the config file + if (isset($this->config["handlebars"]["additional-helpers"])) { + foreach ($this->config["handlebars"]["additional-helpers"] as $name => $callback) { + $this->hb->addHelper($name, $callback); + } + } + } + + /** + * render + * See $this->view() + * + * @param string $fileName + * @param array $data + * @return string + */ + public function render(string $fileName, array $data = []) : string + { + return $this->view($fileName, $data); + } + + /** + * view + * Invoke handlebar rendering engine for a given template file and data array + * + * @param string $fileName + * @param array $data + * @return string + */ + public function view(string $fileName, array $data = []) : string + { + $filePath = $this->partialsDir."/".$fileName.".".$this->fileExtension; + if (!file_exists($filePath)) { + if (isset($this->config["debug"]) && $this->config["debug"] === true) { + return "
View {$fileName}.{$this->fileExtension} does not exist.\nData:\n"
+                    .print_r($data, true)
+                    ."
"; + } + return ""; + } + return $this->hb->render($fileName, $data); + } + + /** + * view + * Invoke handlebar rendering engine for a given template file and data array + * + * @param string $fileName + * @param array $data + * @return string + */ + public function renderTemplate(string $template, array $data = []) : string + { + $hb = new Handlebars(); + $hb->addHelper("json-encode", \ofc\RadThemeEngine::jsonEncode()); + return $hb->render($template, $data); + } + + public function getCurrentPost($fields = []) + { + global $post; + return $this->getPost($post, $fields); + } + + public function getPost($idOrPost, $fields = []) + { + if (is_numeric($idOrPost)) { + $p = get_post($idOrPost); + } elseif ($idOrPost instanceof WP_Post) { + $p = $idOrPost; + } else { + return [ + "error" => "You must pass an ID or WP_Post to this method" + ]; + } + + if ($fields == []) { + return [ + 'post' => $p, + 'meta' => get_post_meta($p->ID), + ]; + } + + $output = []; + $categories = []; + $taxonomies = []; + + foreach ($fields as $key) { + // handle url/permalink + if ($key === "url" || $key === "permalink") { + $output[$key] = get_permalink($p->ID); + continue; + } + + // handle post content + if ($key === "content") { + $output[$key] = apply_filters('the_content', get_the_content(null, false, $p->ID)); + continue; + } + + // handle post excerpt + if ($key === "excerpt") { + $output[$key] = apply_filters("the_content", get_the_excerpt($p->ID)); + continue; + } + + // handle adjacent posts + if ($key === "nextPost") { + $output[$key] = get_next_post(); + continue; + } + if ($key === "previousPost") { + $output[$key] = get_previous_post(); + continue; + } + + // handle adjacent post attributes + if (substr($key, 0, 9) === "nextPost.") { + $fields = explode(",", substr($key, 9)); + $output[substr($key, 0, 8)] = $this->getPost(get_next_post(), $fields); + continue; + } + if (substr($key, 0, 13) === "previousPost.") { + $fields = explode(",", substr($key, 13)); + $output[substr($key, 0, 12)] = $this->getPost(get_previous_post(), $fields); + continue; + } + + if (substr($key, 0, 7) === "parent.") { + if ($p->post_parent == 0) { + $output[substr($key, 0, 6)] = []; + continue; + } + $fields = explode(",", substr($key, 7)); + $output[substr($key, 0, 6)] = $this->getPost($p->post_parent, $fields); + continue; + } + + // handle meta keys + if (substr($key, 0, 5) === "meta.") { + $output[substr($key, 5)] = get_post_meta($p->ID, substr($key, 5), true); + continue; + } + + // handle better wordpress fields + if (substr($key, 0, 4) === "rad.") { + if (substr($key, -5) === "-JSON") { + $key = substr($key, 0, strlen($key) - 5); + $output[substr($key, 4)] = json_decode(get_post_meta($p->ID, str_replace("rad.", "rad_", $key), true)); + continue; + } + $output[substr($key, 4)] = get_post_meta($p->ID, str_replace("rad.", "rad_", $key), true); + continue; + } + + if (substr($key, 0, 4) === "acf.") { + $output[substr($key, 4)] = get_field(substr($key, 4), $p->ID); + continue; + } + + if (substr($key, 0, 11) === "categories.") { + if (count($categories) == 0) { + $categories = wp_get_post_categories($p->ID, ["fields" => "all"]); + $attrs = explode(",", substr($key, 11)); + + foreach ($categories as $cat) { + $dataToAppend = []; + foreach ($attrs as $key) { + $oldKey = $key; + if ($key == "id") { + $key = "term_id"; + } + if (isset($cat->$key)) { + $dataToAppend[$oldKey] = $cat->$key; + } + } + $output["categories"][] = $dataToAppend; + } + } + continue; + } + + if (substr($key, 0, 9) === "taxonomy.") { + $taxonomyKey = $this->parseTaxKey($key); + $values = explode(",", $this->parseTaxValues($key)); + if (!isset($taxonomies[$taxonomyKey])) { + $taxonomies[$taxonomyKey] = $this->getPostTaxonomy($p, $taxonomyKey); + $output[$taxonomyKey] = []; + } + + if (!is_array($taxonomies[$taxonomyKey])) { + continue; + } + + foreach ($taxonomies[$taxonomyKey] as $tax) { + $taxonomyDTO = []; + foreach ($values as $val) { + if ($val === "id" || $val === "term_id") { + $taxonomyDTO["id"] = $tax->term_id; + continue; + } + + if ($val === "link") { + $taxonomyDTO["link"] = get_term_link($tax); + continue; + } + + if ($val === "url") { + $taxonomyDTO["url"] = get_term_link($tax); + continue; + } + + if ($val === "permalink") { + $taxonomyDTO["permalink"] = get_term_link($tax); + continue; + } + + if ($val === "name") { + $taxonomyDTO["name"] = $tax->name; + continue; + } + + if ($val === "title") { + $taxonomyDTO["title"] = $tax->name; + continue; + } + + if ($val === "slug") { + $taxonomyDTO["slug"] = $tax->slug; + continue; + } + + if ($val === "description") { + $taxonomyDTO["description"] = $tax->description; + continue; + } + } + $output[$taxonomyKey][] = $taxonomyDTO; + } + continue; + } + + // woocommerce + if (substr($key, 0, 12) === "woocommerce.") { + $product = wc_get_product($p->ID); + + // reset key + $key = str_replace("woocommerce.", "", $key); + + // check if we're diving into the attributes + if (substr($key, 0, 10) === "attribute.") { + $key = str_replace("attribute.", "", $key); + $output[$key] = $product->get_attribute($key); + continue; + } + + if ($key === "price") { + $output[$key] = $product->get_price(); + continue; + } + if ($key === "attributes") { + $output[$key] = $product->get_attributes(); + continue; + } + if ($key === "sku") { + $output[$key] = $product->get_sku(); + continue; + } + if ($key === "cart_url" || $key === "cartUrl") { + $output[$key] = $product->add_to_cart_url(); + continue; + } + continue; + } + + // let's keep our sanity here... + // the following keys are here for convienance. WP names things so weirdly! + if ($key === "id") { + $output[$key] = $p->ID; + continue; + } + if ($key === "title" || $key === "name") { + $output[$key] = $p->post_title; + continue; + } + if (in_array($key, ["published", "publishedat", "publishedon", "published_at", "published_on"])) { + $output[$key] = $p->post_date; + continue; + } + if ($key === "thumbnail") { + $output[$key] = get_the_post_thumbnail_url($p->ID); + continue; + } + + $output[$key] = $p->$key; + } + return $output; + } + + public function getPosts($args = [], $fields = []) + { + $args = $this->processArgs($args); + $posts = get_posts($args); + + if ($fields == []) { + return [ + 'posts' => $posts, + ]; + } + + $output = []; + foreach ($posts as $p) { + $output[] = $this->getPost($p, $fields); + } + return $output; + } + + /** + * getCurrentPosts + * see getDefaultPosts + * + * @deprecated 1.0.15 + * + * @param array $fields + * @return array + */ + public function getCurrentPosts($fields = []) : array + { + return $this->getDefaultPosts($fields); + } + + /** + * getDefaultPosts + * get all the posts for the current page as defined by wordpress' weird rules for archive pages + * + * @param array $fields + * @return array + */ + public function getDefaultPosts($fields = []) : array + { + $output = []; + if (!have_posts()) { + return $output; + } + while (have_posts()) { + the_post(); + global $post; + $output[] = $this->getPost($post, $fields); + } + return $output; + } + + public function getTerm($slug, $fields = []) + { + $args = [ + 'taxonomy' => $slug, + 'hide_empty' => false, + 'suppress_filter' => true, + ]; + $results = get_terms($args); + + if ($fields == []) { + return $results; + } + + $output = []; + foreach ($results as $term) { + $append = []; + foreach ($fields as $key) { + $oldKey = $key; + if ($key == "id") { + $key = "term_id"; + } + if ($key == "title") { + $key = "name"; + } + + if ($oldKey != $key) { + $append[$oldKey] = $term->$key; + continue; + } + + if ($key === "url" || $key === "permalink") { + $append[$key] = get_term_link($term); + continue; + } + $append[$key] = $term->$key; + } + $output[] = $append; + } + return $output; + } + + private function processArgs(array $args) : array + { + // wordpress default + $args = array_merge( + [ + 'numberposts' => 5, + 'category' => 0, + 'orderby' => 'date', + 'order' => 'DESC', + 'include' => array(), + 'exclude' => array(), + 'meta_key' => '', + 'meta_value' => '', + 'post_type' => 'post', + 'suppress_filters' => true, + ], + $args + ); + + if (isset($args["type"])) { + $args["post_type"] = $args["type"]; + } + + if (isset($args["title"])) { + $args["title"] = urldecode($args["title"]); + } + + if (isset($args["s"])) { + $args["s"] = urldecode($args["s"]); + } + + // process custom taxonomy + $taxQuery = []; + foreach ($args as $paramKey => $paramValue) { + if (!(substr($paramKey, 0, 4) === "tax." || substr($paramKey, 0, 9) === "taxonomy.")) { + continue; + } + + if (substr($paramKey, 0, 4) === "tax.") { + $tax = substr($paramKey, 4); + } + + if (substr($paramKey, 0, 9) === "taxonomy.") { + $tax = substr($paramKey, 9); + } + + $field = "slug"; + $values = explode(",", $paramValue); + $allValuesAreNumeric = false; + foreach ($values as $v) { + if (is_numeric($v)) { + $allValuesAreNumeric = true; + } + } + + if ($allValuesAreNumeric) { + $field = "term_id"; + } + + $taxQuery[] = [ + "taxonomy" => $tax, + "field" => $field, + "terms" => $values, + ]; + } + if ($taxQuery != []) { + $args['tax_query'] = $taxQuery; + } + + return $args; + } + + private function parseTaxKey(string $paramater) : string + { + $parts = explode(".", $paramater); + if (count($parts) != 3) { + return $paramater; + } + return $parts[1]; + } + + private function parseTaxValues(string $paramater) : string + { + $parts = explode(".", $paramater); + if (count($parts) != 3) { + return $paramater; + } + return $parts[2]; + } + + public function getPostTaxonomy($post, $taxonomyKey) + { + return get_the_terms($post->ID, $taxonomyKey); + } + + public function setPostMeta($postID, $data) + { + foreach ($data as $metaKey => $metaValue) { + update_post_meta($postID, $metaKey, $metaValue); + } + } + + /** + * add an error to the wordpress backend + * + * @param string $message + */ + private function adminError(string $message) + { + $key = $this->stringify($message); + add_action('admin_notices', function ($messages) use ($message, $key) { + add_settings_error($key, '', "OFC Site Error: $message", 'error'); + settings_errors($key); + return $messages; + }); + } + + public function renderMenu($menuLocation) + { + return wp_nav_menu([ + "theme_location" => $menuLocation, + "echo" => false, + ]); + } + + public function menuArray($menuLocation) + { + $locations = get_nav_menu_locations(); + $output = []; + if (!isset($locations[$menuLocation])) { + return $output; + } + + foreach (wp_get_nav_menu_items($locations[$menuLocation]) as $menuItem) { + if ($menuItem->menu_item_parent === "0") { + $output[$menuItem->ID] = [ + "id" => $menuItem->ID, + "title" => $menuItem->title, + "url" => $menuItem->url, + "hasChildren" => false, + "children" => [], + ]; + continue; + } + $output = $this->addMenuItemToChildren($output, $menuItem); + } + return $output; + } + + private function addMenuItemToChildren(array $items, $childItem) + { + foreach ($items as $id => $menuItem) { + if ($id == $childItem->menu_item_parent) { + $items[$id]["hasChildren"] = true; + $items[$id]["children"][$childItem->ID] = [ + "id" => $childItem->ID, + "title" => $childItem->title, + "url" => $childItem->url, + "hasChildren" => false, + "children" => [], + ]; + return $items; + } + } + + foreach ($items as $id => $parent) { + foreach ($parent["children"] as $childID => $menuItem) { + $items[$id]["children"] = $this->addMenuItemToChildren($parent["children"], $childItem); + } + } + return $items; + } + + private function stringify(string $thing) : string + { + $bad = [" ", "/"]; + $good = ["_", ""]; + return strtolower(str_replace($bad, $good, $thing)); + } + + public function getAssetURL(string $filename) : string + { + if (!file_exists(get_template_directory()."/assets/$filename")) { + $this->adminError("Requested asset $filename doesn't exist."); + return ""; + } + + return get_template_directory_uri()."/assets/$filename"; + } + + public function getAssetContents(string $filename) : string + { + if (!file_exists(get_template_directory()."/assets/$filename")) { + return "Asset doesn't exist: ".get_template_directory()."/assets/$filename"; + } + + return file_get_contents(get_template_directory()."/assets/$filename"); + } + + private function generateLabels(string|array $slug) : array + { + if (is_array($slug)) { + return $slug; + } + + return [ + 'name' => $this->humanize($slug, true), + 'singular_name' => $this->humanize($slug, false), + 'menu_name' => $this->humanize($slug, true), + 'all_items' => "All " . $this->humanize($slug, true), + 'add_new' => "Add New {$this->humanize($slug, false)}", + 'add_new_item' => "Add New {$this->humanize($slug, false)}", + 'edit_item' => "Edit {$this->humanize($slug, false)}", + 'new_item' => "New {$this->humanize($slug, false)}", + 'view_item' => "View {$this->humanize($slug, false)}", + 'search_items' => "Search {$this->humanize($slug, true)}", + 'not_found' => "No {$this->humanize($slug, true)} found", + 'not_found_in_trash' => "No {$this->humanize($slug, true)} found in Trash", + 'parent_item_colon' => "Parent {$this->humanize($slug, false)}:", + ]; + } + + private function humanize(string $word, bool $makePlural = false) : string + { + $humanized = ucwords(strtolower(str_replace(['-', '_'], ' ', $word))); + + if (!$makePlural) { + return $humanized; + } + + if (strtolower(substr($humanized, strlen($humanized)-1, 1)) == "s") { + return $humanized . "es"; + } + if (strtolower(substr($humanized, strlen($humanized)-1, 1)) == "y") { + return substr($humanized, 0, strlen($humanized)-1) . "ies"; + } + return $humanized . "s"; + } + + public function getPaginationLinks() : array + { + global $wp_query; + + $output = [ + "older" => false, + "newer" => false, + "totalPages" => 0, + "currentPage" => 0, + ]; + + if (is_singular()) { + return $output; + } + + $max_num_pages = (int) $wp_query->max_num_pages; + $paged = get_query_var('paged'); + if (($paged + 1) < $max_num_pages) { + $output["older"] = next_posts(0, false); + } + + if ($max_num_pages > 1 && $paged <= $max_num_pages && $paged > 0) { + $output["newer"] = previous_posts(false); + } + + $output["totalPages"] = $max_num_pages; + $output["currentPage"] = $paged; + + return $output; + } + + private function processCustomFields() + { + $templateFields = []; + $tplFileContents; + + $theme = wp_get_theme(); + $templates = $theme->get_page_templates(); + foreach ($templates as $filename => $templateName) { + $tplFileContents = file_get_contents(get_theme_file_path($filename)); + $fields = explode("\$fields", $tplFileContents); + if (count($fields) < 2) { + continue; + } + $fields = explode(";", $fields[1]); + + $fieldArray = eval("use ofc\RadField; return " . preg_replace('/=/', "", $fields[0], 1) . ";"); + $templateFields = [...$templateFields, ...$fieldArray]; + + //add template name to first element of name so we can grab it in Util.php + //it will be removed when processing each field + array_unshift($templateFields, $templateName); + } + + + // some default admin ajax hooks for field processing + $existingCPTSlugs = $this->cptSlugs; + add_action('wp_ajax_rad_theme_engine_related', function () use ($existingCPTSlugs) { + $args = [ + "type" => array_merge(["page", "post"], $existingCPTSlugs), + "limit" => 5, + "order" => "asc", + "orderby" => "title", + "s" => $_POST["q"] ?? "", + ]; + + $results = site()->getPosts($args, ["title", "id", "url"]); + if (count($results) < 1) { + $results = [ + [ + "title" => "No results", + "id" => 0, + "url" => "#" + ] + ]; + } + + echo json_encode($results); + wp_die(); + }); + + Util::processFieldGroup($templateFields); + } + + private function checkfavicons() + { + if (!is_dir(get_template_directory() . "/assets")) { + return; + } + + if (file_exists(get_template_directory() . "/assets/favicon.ico")) { + add_action('wp_head', function () { + echo "".PHP_EOL; + }); + } + + if (file_exists(get_template_directory() . "/assets/favicon-16x16.png")) { + add_action('wp_head', function () { + echo "".PHP_EOL; + }); + } + + if (file_exists(get_template_directory() . "/assets/favicon-32x32.png")) { + add_action('wp_head', function () { + echo "".PHP_EOL; + }); + } + + if (file_exists(get_template_directory() . "/assets/apple-touch-icon.png")) { + add_action('wp_head', function () { + echo "".PHP_EOL; + }); + } + + if (file_exists(get_template_directory() . "/assets/site.webmanifest")) { + add_action('wp_head', function () { + echo "".PHP_EOL; + }); + } + } + + private function processHooks() + { + if (!isset($this->config["hooks"]) || !is_array($this->config["hooks"])) { + return; + } + + $defaultPriorities = [ + 'woocommerce_before_main_content' => 5, + 'woocommerce_after_main_content' => 50, + ]; + foreach ($this->config["hooks"] as $hookName => $callback) { + $priority = $defaultPriorities[$hookName] ?? 99; + add_action($hookName, $callback, $priority); + } + } +} diff --git a/vendor/open-function-computers-llc/rad-theme-engine/src/Util.php b/vendor/open-function-computers-llc/rad-theme-engine/src/Util.php new file mode 100644 index 0000000..31196c7 --- /dev/null +++ b/vendor/open-function-computers-llc/rad-theme-engine/src/Util.php @@ -0,0 +1,103 @@ +renderTemplate(FieldHTML::metaBoxToggler(["WYSIWYG"]), [ + "group-name" => self::slugify($fieldGroup[0]), + "for" => "page", + "hidden" => ["WYSIWYG"], + ]); + } + }); + + add_action('add_meta_boxes', function () use ($fieldGroup) { + if (count($fieldGroup) < 1) { + return; + } + + $name = $fieldGroup[0]; + array_shift($fieldGroup); + foreach ($fieldGroup as $group) { + // conditionally show/hide the box + $slugName = self::slugify($name); + + add_meta_box( + $slugName, + $name, + function ($post) use ($fieldGroup, $group) { + foreach ($fieldGroup as $field) { + // sanatize media fields + if ($field["type"] === "image") { + if (!isset($field["store"])) { + $field["store"] = "json"; + } + } + + echo site()->renderTemplate(FieldHTML::template($field["type"], get_post_meta($post->ID, "rad_".$field['name'], true), $post->ID, $field), [ + "value" => get_post_meta($post->ID, "rad_".$field['name'], true), + "id" => $post->ID, + "field" => $field, + ])."
"; + } + }, + 'page', + 'advanced', + ); + } + }); + + add_action('save_post', function ($post_id) use ($fieldGroup) { + if (!isset($fieldGroup['fields'])) { + return; + } + foreach ($fieldGroup['fields'] as $field) { + if (!isset($_POST['rad_'.$field['name']])) { + continue; + } + update_post_meta($post_id, 'rad_'.$field['name'], wp_kses_post($_POST['rad_'.$field['name']])); + } + }); + } +} diff --git a/vendor/open-function-computers-llc/rad-theme-engine/tests/UtilTest.php b/vendor/open-function-computers-llc/rad-theme-engine/tests/UtilTest.php new file mode 100644 index 0000000..53b45ed --- /dev/null +++ b/vendor/open-function-computers-llc/rad-theme-engine/tests/UtilTest.php @@ -0,0 +1,22 @@ + "this-is-a-string", + "String with nÓn ASCII chars & stuff!" => "string-with-non-ascii-chars-and-stuff", + ]; + + foreach ($cases as $input => $expected) { + $this->assertEquals($expected, Util::slugify($input)); + } + } +} diff --git a/vendor/salesforce/handlebars-php/.gitignore b/vendor/salesforce/handlebars-php/.gitignore new file mode 100644 index 0000000..fbc0d5d --- /dev/null +++ b/vendor/salesforce/handlebars-php/.gitignore @@ -0,0 +1,7 @@ +vendor +*.swp +*.swo +composer.phar +composer.lock +*.iml +.idea \ No newline at end of file diff --git a/vendor/salesforce/handlebars-php/.scrutinizer.yml b/vendor/salesforce/handlebars-php/.scrutinizer.yml new file mode 100644 index 0000000..0584385 --- /dev/null +++ b/vendor/salesforce/handlebars-php/.scrutinizer.yml @@ -0,0 +1,3 @@ +inherit: true +tools: + php_code_coverage: true \ No newline at end of file diff --git a/vendor/salesforce/handlebars-php/.travis.yml b/vendor/salesforce/handlebars-php/.travis.yml new file mode 100644 index 0000000..6fe4c20 --- /dev/null +++ b/vendor/salesforce/handlebars-php/.travis.yml @@ -0,0 +1,4 @@ +language: php +php: + - 5.4 + - 5.5 diff --git a/vendor/salesforce/handlebars-php/CODE_OF_CONDUCT.md b/vendor/salesforce/handlebars-php/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..b672471 --- /dev/null +++ b/vendor/salesforce/handlebars-php/CODE_OF_CONDUCT.md @@ -0,0 +1,105 @@ +# Salesforce Open Source Community Code of Conduct + +## About the Code of Conduct + +Equality is a core value at Salesforce. We believe a diverse and inclusive +community fosters innovation and creativity, and are committed to building a +culture where everyone feels included. + +Salesforce open-source projects are committed to providing a friendly, safe, and +welcoming environment for all, regardless of gender identity and expression, +sexual orientation, disability, physical appearance, body size, ethnicity, nationality, +race, age, religion, level of experience, education, socioeconomic status, or +other similar personal characteristics. + +The goal of this code of conduct is to specify a baseline standard of behavior so +that people with different social values and communication styles can work +together effectively, productively, and respectfully in our open source community. +It also establishes a mechanism for reporting issues and resolving conflicts. + +All questions and reports of abusive, harassing, or otherwise unacceptable behavior +in a Salesforce open-source project may be reported by contacting the Salesforce +Open Source Conduct Committee at ossconduct@salesforce.com. + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of gender +identity and expression, sexual orientation, disability, physical appearance, +body size, ethnicity, nationality, race, age, religion, level of experience, education, +socioeconomic status, or other similar personal characteristics. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy toward other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Personal attacks, insulting/derogatory comments, or trolling +* Public or private harassment +* Publishing, or threatening to publish, others' private information—such as +a physical or electronic address—without explicit permission +* Other conduct which could reasonably be considered inappropriate in a +professional setting +* Advocating for or encouraging any of the above behaviors + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned with this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project email +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the Salesforce Open Source Conduct Committee +at ossconduct@salesforce.com. All complaints will be reviewed and investigated +and will result in a response that is deemed necessary and appropriate to the +circumstances. The committee is obligated to maintain confidentiality with +regard to the reporter of an incident. Further details of specific enforcement +policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership and the Salesforce Open Source Conduct +Committee. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][contributor-covenant-home], +version 1.4, available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html. +It includes adaptions and additions from [Go Community Code of Conduct][golang-coc], +[CNCF Code of Conduct][cncf-coc], and [Microsoft Open Source Code of Conduct][microsoft-coc]. + +This Code of Conduct is licensed under the [Creative Commons Attribution 3.0 License][cc-by-3-us]. + +[contributor-covenant-home]: https://www.contributor-covenant.org (https://www.contributor-covenant.org/) +[golang-coc]: https://golang.org/conduct +[cncf-coc]: https://github.com/cncf/foundation/blob/master/code-of-conduct.md +[microsoft-coc]: https://opensource.microsoft.com/codeofconduct/ +[cc-by-3-us]: https://creativecommons.org/licenses/by/3.0/us/ diff --git a/vendor/salesforce/handlebars-php/Contributors.md b/vendor/salesforce/handlebars-php/Contributors.md new file mode 100644 index 0000000..76baf7c --- /dev/null +++ b/vendor/salesforce/handlebars-php/Contributors.md @@ -0,0 +1 @@ +[Joey Rivera](https://github.com/joeyrivera) \ No newline at end of file diff --git a/vendor/salesforce/handlebars-php/LICENSE b/vendor/salesforce/handlebars-php/LICENSE new file mode 100644 index 0000000..a8823f6 --- /dev/null +++ b/vendor/salesforce/handlebars-php/LICENSE @@ -0,0 +1,8 @@ +Copyright (C) 2012-2013 Xamin Project and contributors +Copyright (c) 2019 Salesforce.com + +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. \ No newline at end of file diff --git a/vendor/salesforce/handlebars-php/README.md b/vendor/salesforce/handlebars-php/README.md new file mode 100644 index 0000000..ccd0f48 --- /dev/null +++ b/vendor/salesforce/handlebars-php/README.md @@ -0,0 +1,769 @@ +--- + +#handlebars-php + +--- + +#### A simple, logic-less, yet powerful templating engine for PHP + +--- + +Name: **handlebars-php** + +License: MIT + +Requirements: PHP >= 5.4 + +--- + + +## About Handlebars + +Handlebars provides the power necessary to let you build semantic templates effectively with no frustration, +that keep the view and the code separated like we all know they should be. + + +Fork of: [Handlebars.php by XaminProject](https://github.com/mardix/Handlebars) + +Handlebars, is the PHP port of [Handlebars.js](http://handlebarsjs.com/) + +--- + +## Install Handlebars + + +You can just download Handlebars.php as is, or with Composer. + +To install with composer, add the following in the require key in your **composer.json** file + +`"salesforce/handlebars-php": "1.*"` + +composer.json + +```json +{ + "name": "myapp/name", + "description": "My awesome app name", + "require": { + "salesforce/handlebars-php": "1.*" + } +} +``` + +----- + +## Getting Started + +At the minimum, we are required to have an array model and a template string. Alternatively we can have a file containing handlebars (or html, text, etc) expression. + + + +#### Template + +Handlebars templates look like regular HTML, with embedded handlebars expressions. + +Handlebars HTML-escapes values returned by a {{expression}}. + +```html +
+

{{title}}

+
+ Hello, my name is {{name}} +
+
+``` + +The string above can be used as is in your PHP file, or be put in a file (ie: */templates/main.tpl*), to be called upon rendering. + +#### PHP file + +Now the we've created our template file, in a php file (index.php) we'll create the data to passed to the model. The model is a key/value array. + +Below we are going to create the Handlebars object, set the partials loader, and put some data in the model. + +**/index.php** + +```php + "html" + ] +); + +# We'll use $handlebars throughout this the examples, assuming the will be all set this way +$handlebars = new Handlebars([ + "loader" => $partialsLoader, + "partials_loader" => $partialsLoader +]); + +# Will render the model to the templates/main.tpl template +$model = [...]; +echo $handlebars->render("main", $model); +``` + +#### Assign Data + +The simplest way to assign data is to create an Array model. The model will contain all the data that will be passed to the template. +```php + "Yolo Baggins", + "title" => "I'm Title", + "permalink" => "blog/", + "foo" => "bar", + "article" => [ + "title" => "My Article Title" + ], + "posts" => [ + [ + "title" => "Post #1", + "id" => 1, + "content" => "Content" + ], + [ + "title" => "Post 2", + "id" => 2, + "content" => "Content" + ] + ] +]; +``` + +#### Render Template + +Use the method `Handlebars\Handlebars::render($template, $model)` to render you template once everything is created. + +***$template*** : Template can be the name of the file or a string containing the handlebars/html. + +***$model*** : Is the array that we will pass into the template + +The code below will render the model to the *templates/main.tpl* template + +```php +echo $handlebars->render("main", $model); +``` + + +Alternatively you can use $handlebars itself without invoking the render method + +```php +echo $handlebars("main", $model); +``` + +--- + +## Expressions + +Let's use this simple model for the following examples, assuming everything is already set like above. + +```php + "I'm Title", + "permalink" => "/blog/", + "foo" => "bar", + "article" => [ + "title" => "My Article Title" + ], + "posts" => [ + [ + "title" => "Post #1", + "id" => 1, + "content" => "Content" + ], + [ + "title" => "Post 2", + "id" => 2, + "content" => "Content" + ] + ] +]; +``` + +Let's work with the template. + +Handlebars expressions are the basic unit of a Handlebars template. You can use them alone in a {{mustache}}, pass them to a Handlebars helper, or use them as values in hash arguments. + + +The simplest Handlebars expression is a simple identifier: + +```html +{{title}} + +-> I'm Title +``` + +Handlebars nested expressions which are dot-separated paths. + +```html +{{article.title}} + +-> My Article Title +``` + +Handlebars nested expressions in an array. + +```html +{{posts.0.title}} + +-> Post #1 +``` + +Handlebars also allows for name conflict resolution between helpers and data fields via a this reference: + +```html +{{./name}} or {{this/name}} or {{this.name}} +``` + +Handlebars expressions with a helper. In this case we're using the upper helper + +```html +{{#upper title}} + +-> I'M TITLE +``` + +Nested handlebars paths can also include ../ segments, which evaluate their paths against a parent context. + +```html +{{#each posts}} + {{title}} + {{content}} +{{/each}} +``` + +Handlebars HTML-escapes values returned by a {{expression}}. If you don't want Handlebars to escape a value, use the "triple-stash", {{{ }}} + +```html +{{{foo}}} +``` + +--- + + +## Control Structures + +`if/else` and `unless` control structures are implemented as regular Handlebars helpers + +### IF/ELSE + +You can use the if helper to conditionally render a block. If its argument returns false, null, "" or [] (a "falsy" value), Handlebars will not render the block. + +**Example** + +```html +{{#if isActive}} + This part will be shown if it is active +{{else}} + This part will not show if isActive is true +{{/if}} +``` + +```php + true +]; + +echo $handlebars->render($template, $model); +``` + +### UNLESS + +You can use the unless helper as the inverse of the if helper. Its block will be rendered if the expression returns a falsy value. + +```html +{{#unless isActive}} + This part will not show if isActive is true +{{/unless}} +``` + +--- +##Iterators: EACH + +You can iterate over a list using the built-in each helper. Inside the block, you can use {{this}} or {{.}} to reference the element being iterated over. + +**Example** + +```html +

All genres:

+{{#each genres}} + {{.}} +{{/each}} + + +{{#each cars}} +

{{category}}

+ Total: {{count}} +
    + {{#each list}} + {{.}} + {{/each}} +
+{{/each}} +``` + +```php + [ + "Hip-Hop", + "Rap", + "Techno", + "Country" + ], + "cars" => [ + "category" => "Foreign", + "count" => 4, + "list" => [ + "Toyota", + "Kia", + "Honda", + "Mazda" + ], + "category" => "WTF", + "count" => 1, + "list" => [ + "Fiat" + ], + "category" => "Luxury", + "count" => 2, + "list" => [ + "Mercedes Benz", + "BMW" + ] + ], +]; + + echo $engine->render($template, $model); +``` + +### EACH/ELSE + +You can optionally provide an {{else}} section which will display only when the list is empty. + +```html +

All genres:

+{{#each genres}} + {{.}} +{{else}} + No genres found! +{{/each}} +``` + +### Slice EACH Array[start:end] + +The #each helper (php only) also has the ability to slice the data + + * {{#each Array[start:end]}} = starts at start through end -1 + * {{#each Array[start:]}} = Starts at start though the rest of the array + * {{#each Array[:end]}} = Starts at the beginning through end -1 + * {{#each Array[:]}} = A copy of the whole array + * {{#each Array[-1]}} + * {{#each Array[-2:]}} = Last two items + * {{#each Array[:-2]}} = Everything except last two items + +```html +

All genres:

+{{#each genres[0:10]}} + {{.}} +{{else}} + No genres found! +{{/each}} +``` + +#### {{@INDEX}} and {{@KEY}} + +When looping through items in each, you can optionally reference the current loop index via {{@index}} + +```html +{{#each array}} + {{@index}}: {{this}} +{{/each}} + + +{{#each object}} + {{@key}}: {{this}} +{{/each}} +``` + +--- + +## Change Context: WITH + +You can shift the context for a section of a template by using the built-in with block helper. + +```php + [ + "Hip-Hop", + "Rap", + "Techno", + "Country" + ], + "other_genres" => [ + "genres" => [ + "Hip-Hop", + "Rap", + "Techno", + "Country" + ] +] +]; +``` + +```html +

All genres:

+{{#with other_genres}} +{{#each genres}} + {{.}} +{{/each}} +{{/with}} +``` + +--- + +## Handlebars Built-in Helpers + +### If +```html +{{#if isActive}} + This part will be shown if it is active +{{else}} + This part will not show if isActive is true +{{/if}} +``` + +### Unless +```html +{{#unless isActive}} + This part will show when isActive is false +{{else}} + Otherwise this one will show +{{/unless}} +``` + +### Each +```html +{{#each genres[0:10]}} + {{.}} +{{else}} + No genres found! +{{/each}} +``` + +### With +```html +{{#with other_genres}} +{{#each genres}} + {{.}} +{{/each}} +{{/with}} +``` + +--- + +## Other Helpers + +#### For convenience, Voodoo\Handlebars added some extra helpers. + +--- + +### Upper + +To format string to uppercase +```html +{{#upper title}} +``` + +### Lower + +To format string to lowercase +```html +{{#lower title}} +``` + + +### Capitalize + +To capitalize the first letter +```html +{{#capitalize title}} +``` + +### Capitalize_Words + +To capitalize each words in a string +```html +{{#capitalize_words title}} +``` + +### Reverse + +To reverse the order of string +```html +{{#reverse title}} +``` + +### Format_Date + +To format date: `{{#format_date date '$format'}}` +```html +{{#format_date date 'Y-m-d H:i:s'}} +``` + +### Inflect + +To singularize or plurialize words based on count `{{#inflect count $singular $plurial}}` +```html +{{#inflect count '%d book' '%d books'}} +``` + +### Truncate + +To truncate a string: `{{#truncate title $length $ellipsis}}` +```html +{{#truncate title 21 '...'}} +``` + +### Default + +To use a default value if the string is empty: `{{#default title $defaultValue}}` +```html +{{#default title 'No title'}} +``` + +### Raw + +This helper return handlebars expression as is. The expression will not be parsed +```html +{{#raw}} + {{#each cars}} + {{model}} + {{/each}} +{{/raw}} + +-> + +{{#each cars}} + {{model}} +{{/each}} +``` + + +### Repeat + +To truncate a string: `{{#repeat $count}}{{/repeat}}` +```html +{{#repeat 5}} + Hello World! +{{/repeat}} +``` + +Variable and blocks can still be used +```html +{{#repeat 5}} + Hello {{name}}! +{{/repeat}} +``` + + +### Define/Invoke + +Allow to define a block of content and use it later. It helps follow the DRY (Don't repeat yourself) principle. + + +Define +```html +{{#define $definedName}} + content +{{/define}} +``` + +Invoke +```html +{{#invoke $definedName}} +``` + + +Example: +```html +{{#define hello}} + Hello World! How do you do? +{{/define}} + +{{#invoke hello}} + +-> + +Hello World! How do you do? +``` + +--- + +### Template Comments +You can use comments in your handlebars code just as you would in your code. Since there is generally some level of logic, this is a good practice. + +```html +{{!-- only output this author names if an author exists --}} +``` + +--- + +### Partials + +Partials are other templates you can include inside of the main template. + +To do so: + +```html +{{> my_partial}} +``` + +which is a file under /templates/my_partial.html + +--- + +## Writing your own helpers + +Block helpers make it possible to define custom iterators and other helpers that can invoke the passed block with a new context. + +To create your own helper, use the method: `Handlebars::addHelper($name, $callback)` + +The following helper will UPPERCASE a string + +```php +$handlebars->addHelper("upper", + function($template, $context, $args, $source){ + return strtoupper($context->get($args)); + } +); +``` + +And now we can use the helper like this: + +```html +{{#upper title}} +``` + +--- + +## Data Variables for #each + +In Handlebars JS v1.1, data variables `@first` and `@last` were added for the #each helper. Due to the these variables +not being backwards compatible, these data variables are disabled by default and must be enabled manually. + +To enable the new data variables, set the `enableDataVariables` option to `true` when instantiating the Handlebars +instance. + +```php +$handlebars = new Handlebars([ + "loader" => $partialsLoader, + "partials_loader" => $partialsLoader, + "enableDataVariables" => true +]); +``` + +Given the following template and data: +``` +{{#each data}}{{#if @first}}FIRST: {{/if}}{{this}}
{{/each}} +``` +```php +'data' => ['apple', 'banana', 'carrot', 'zucchini'] +``` +The output will be +```html +FIRST: apple
banana
carrot
zucchini
+``` + +Given the following template and the data above: +``` +{{#each data}}{{@first}}: {{this}}
{{/each}} +``` +The output will be +```html +true: apple
banana
carrot
zucchini
+``` + +Data variables also support relative referencing within multiple #each statements. +Given +``` +{{#each data}}{{#each this}}outer: {{@../first}},inner: {{@first}};{{/each}}{{/each}} +``` +```php +'data' => [['apple', 'banana'], ['carrot', 'zucchini']] +``` +The output will be +``` +outer: true,inner: true;outer: true,inner: false;outer: false,inner: true;outer: false,inner: false; +``` + +Be aware that when data variables are enabled, variables starting with `@` are considered restricted and will override +values specified in the data. + +For example, given the following template and the following data, the output will be different depending on if data +variables are enabled. + +``` +{{#each objects}}{{@first}}, {{@last}}, {{@index}}, {{@unknown}}{{/each}} +``` + +```php +$object = new stdClass; +$object->{'@first'} = 'apple'; +$object->{'@last'} = 'banana'; +$object->{'@index'} = 'carrot'; +$object->{'@unknown'} = 'zucchini'; +$data = ['objects' => [$object]]; + +$engine = new \Handlebars\Handlebars(array( + 'loader' => new \Handlebars\Loader\StringLoader(), + 'helpers' => new \Handlebars\Helpers(), + 'enableDataVariables'=> $enabled, +)); +$engine->render($template, $data) +``` + +When `enableDataVariables` is `false`, existing behavior is not changed where some variables will be return. + +``` +apple, banana, 0, zucchini +``` + + +When `enableDataVariables` is `true`, the behavior matches HandlebarsJS 1.1 behavior, where all data variables replace +variables defined in the data and any data variable prefixed with `@` that is unknown will be blank. + +``` +true, true, 0, +``` + + +#### Credits + +* Fork of [Handlebars.php by XaminProject](https://github.com/XaminProject/handlebars.php) +* The documentation was edited by [Mardix](http://github.com/mardix). + +#### Contribution + +Contributions are more than welcome! \ No newline at end of file diff --git a/vendor/salesforce/handlebars-php/composer.json b/vendor/salesforce/handlebars-php/composer.json new file mode 100644 index 0000000..b5e775c --- /dev/null +++ b/vendor/salesforce/handlebars-php/composer.json @@ -0,0 +1,33 @@ +{ + "name": "salesforce/handlebars-php", + "description": "Handlebars processor for php", + "homepage": "http://www.github.com/salesforce/handlebars-php", + "keywords": ["templating", "mustache", "handlebars"], + "type": "library", + "license": "MIT", + "authors": [ + { + "name": "fzerorubigd", + "email": "fzerorubigd@gmail.com" + }, + { + "name": "Behrooz Shabani (everplays)", + "email": "everplays@gmail.com" + }, + { + "name": "Mardix", + "homepage": "https://github.com/mardix" + } + ], + "require": { + "php": ">=5.4.0" + }, + "require-dev": { + "phpunit/phpunit": "^4" + }, + "autoload": { + "psr-0": { + "Handlebars": "src/" + } + } +} diff --git a/vendor/salesforce/handlebars-php/phpunit.xml.dist b/vendor/salesforce/handlebars-php/phpunit.xml.dist new file mode 100644 index 0000000..e2d5750 --- /dev/null +++ b/vendor/salesforce/handlebars-php/phpunit.xml.dist @@ -0,0 +1,15 @@ + + + + + + tests/Handlebars/ + + + + + + src/ + + + diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/Autoloader.php b/vendor/salesforce/handlebars-php/src/Handlebars/Autoloader.php new file mode 100755 index 0000000..a4583b7 --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/Autoloader.php @@ -0,0 +1,77 @@ + + * @author Behrooz Shabani + * @copyright 2012 (c) ParsPooyesh Co + * @copyright 2013 (c) Behrooz Shabani + * @copyright 2014 (c) Mardix + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + +namespace Handlebars; + +class Autoloader +{ + + private $_baseDir; + + /** + * Autoloader constructor. + * + * @param string $baseDir Handlebars library base directory default is + * __DIR__.'/..' + */ + protected function __construct($baseDir = null) + { + if ($baseDir === null) { + $this->_baseDir = realpath(__DIR__ . '/..'); + } else { + $this->_baseDir = rtrim($baseDir, '/'); + } + } + + /** + * Register a new instance as an SPL autoloader. + * + * @param string $baseDir Handlebars library base directory, default is + * __DIR__.'/..' + * + * @return \Handlebars\Autoloader Registered Autoloader instance + */ + public static function register($baseDir = null) + { + $loader = new self($baseDir); + spl_autoload_register(array($loader, 'autoload')); + + return $loader; + } + + /** + * Autoload Handlebars classes. + * + * @param string $class class to load + * + * @return void + */ + public function autoload($class) + { + if ($class[0] === '\\') { + $class = substr($class, 1); + } + + if (strpos($class, 'Handlebars') !== 0) { + return; + } + + $file = sprintf('%s/%s.php', $this->_baseDir, str_replace('\\', '/', $class)); + + if (is_file($file)) { + include $file; + } + } + +} diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/Cache.php b/vendor/salesforce/handlebars-php/src/Handlebars/Cache.php new file mode 100755 index 0000000..140832d --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/Cache.php @@ -0,0 +1,49 @@ + + * @author Behrooz Shabani + * @copyright 2012 (c) ParsPooyesh Co + * @copyright 2013 (c) Behrooz Shabani + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + + +namespace Handlebars; + +interface Cache +{ + + /** + * Get cache for $name if exist. + * + * @param string $name Cache id + * + * @return mixed data on hit, boolean false on cache not found + */ + public function get($name); + + /** + * Set a cache + * + * @param string $name cache id + * @param mixed $value data to store + * + * @return void + */ + public function set($name, $value); + + /** + * Remove cache + * + * @param string $name Cache id + * + * @return void + */ + public function remove($name); + +} \ No newline at end of file diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/Cache/APC.php b/vendor/salesforce/handlebars-php/src/Handlebars/Cache/APC.php new file mode 100755 index 0000000..9f207f8 --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/Cache/APC.php @@ -0,0 +1,60 @@ + + * @author Behrooz Shabani + * @copyright 2013 (c) Meraki, LLP + * @copyright 2013 (c) Behrooz Shabani + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + +namespace Handlebars\Cache; +use Handlebars\Cache; + +class APC implements Cache +{ + + /** + * Get cache for $name if exist. + * + * @param string $name Cache id + * + * @return mixed data on hit, boolean false on cache not found + */ + public function get($name) + { + if (apc_exists($name)) { + return apc_fetch($name); + } + return false; + } + + /** + * Set a cache + * + * @param string $name cache id + * @param mixed $value data to store + * + * @return void + */ + public function set($name, $value) + { + apc_store($name, $value); + } + + /** + * Remove cache + * + * @param string $name Cache id + * + * @return void + */ + public function remove($name) + { + apc_delete($name); + } + +} diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/Cache/Disk.php b/vendor/salesforce/handlebars-php/src/Handlebars/Cache/Disk.php new file mode 100644 index 0000000..ecdc219 --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/Cache/Disk.php @@ -0,0 +1,115 @@ + + * @author Behrooz Shabani + * @author Mardix + * @copyright 2013 (c) Brokerloop, Inc. + * @copyright 2013 (c) Behrooz Shabani + * @copyright 2013 (c) Mardix + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + +namespace Handlebars\Cache; +use Handlebars\Cache; +use InvalidArgumentException; +use RuntimeException; + +class Disk implements Cache +{ + + private $path = ''; + private $prefix = ''; + private $suffix = ''; + + /** + * Construct the disk cache. + * + * @param string $path Filesystem path to the disk cache location + * @param string $prefix optional file prefix, defaults to empty string + * @param string $suffix optional file extension, defaults to empty string + * + * @throws \RuntimeException + * @throws \InvalidArgumentException + */ + public function __construct($path, $prefix = '', $suffix = '') + { + if (empty($path)) { + throw new InvalidArgumentException('Must specify disk cache path'); + } elseif (!is_dir($path)) { + @mkdir($path, 0777, true); + + if (!is_dir($path)) { + throw new RuntimeException('Could not create cache file path'); + } + } + + $this->path = $path; + $this->prefix = $prefix; + $this->suffix = $suffix; + } + + /** + * Gets the full disk path for a given cache item's file, + * taking into account the cache path, optional prefix, + * and optional extension. + * + * @param string $name Name of the cache item + * + * @return string full disk path of cached item + */ + private function getPath($name) + { + return $this->path . DIRECTORY_SEPARATOR . + $this->prefix . $name . $this->suffix; + } + + /** + * Get cache for $name if it exists. + * + * @param string $name Cache id + * + * @return mixed data on hit, boolean false on cache not found + */ + public function get($name) + { + $path = $this->getPath($name); + + return (file_exists($path)) ? + unserialize(file_get_contents($path)) : false; + } + + /** + * Set a cache + * + * @param string $name cache id + * @param mixed $value data to store + * + * @return void + */ + public function set($name, $value) + { + $path = $this->getPath($name); + + file_put_contents($path, serialize($value)); + } + + /** + * Remove cache + * + * @param string $name Cache id + * + * @return void + */ + public function remove($name) + { + $path = $this->getPath($name); + + unlink($path); + } + +} diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/Cache/Dummy.php b/vendor/salesforce/handlebars-php/src/Handlebars/Cache/Dummy.php new file mode 100755 index 0000000..da677bb --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/Cache/Dummy.php @@ -0,0 +1,62 @@ + + * @author Behrooz Shabani + * @copyright 2012 (c) ParsPooyesh Co + * @copyright 2013 (c) Behrooz Shabani + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + +namespace Handlebars\Cache; +use Handlebars\Cache; + +class Dummy implements Cache +{ + private $cache = []; + + /** + * Get cache for $name if exist. + * + * @param string $name Cache id + * + * @return mixed data on hit, boolean false on cache not found + */ + public function get($name) + { + if (array_key_exists($name, $this->cache)) { + return $this->cache[$name]; + } + return false; + } + + /** + * Set a cache + * + * @param string $name cache id + * @param mixed $value data to store + * + * @return void + */ + public function set($name, $value) + { + $this->cache[$name] = $value; + } + + /** + * Remove cache + * + * @param string $name Cache id + * + * @return void + */ + public function remove($name) + { + unset($this->cache[$name]); + } + +} \ No newline at end of file diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/Context.php b/vendor/salesforce/handlebars-php/src/Handlebars/Context.php new file mode 100755 index 0000000..091e84f --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/Context.php @@ -0,0 +1,382 @@ + + * @author Behrooz Shabani + * @author Mardix + * @copyright 2012 (c) ParsPooyesh Co + * @copyright 2013 (c) Behrooz Shabani + * @copyright 2013 (c) Mardix + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + +namespace Handlebars; + +use InvalidArgumentException; +use LogicException; + +class Context +{ + const DATA_KEY = 'key'; + const DATA_INDEX = 'index'; + const DATA_FIRST = 'first'; + const DATA_LAST = 'last'; + + /** + * @var array stack for context only top stack is available + */ + protected $stack = []; + + /** + * @var array index stack for sections + */ + protected $index = []; + + /** + * @var array dataStack stack for data within sections + */ + protected $dataStack = []; + + /** + * @var array key stack for objects + */ + protected $key = []; + + /** + * @var bool enableDataVariables true if @data variables should be used. + */ + protected $enableDataVariables = false; + + /** + * Mustache rendering Context constructor. + * + * @param mixed $context Default rendering context (default: null) + * @param array $options Options for the context. It may contain the following: (default: empty array) + * enableDataVariables => Boolean, Enables @data variables (default: false) + * + * @throws InvalidArgumentException when calling this method when enableDataVariables is not a boolean. + */ + public function __construct($context = null, $options = []) + { + if ($context !== null) { + $this->stack = [$context]; + } + + if (isset($options[Handlebars::OPTION_ENABLE_DATA_VARIABLES])) { + if (!is_bool($options[Handlebars::OPTION_ENABLE_DATA_VARIABLES])) { + throw new InvalidArgumentException( + 'Context Constructor "' . Handlebars::OPTION_ENABLE_DATA_VARIABLES . '" option must be a boolean' + ); + } + $this->enableDataVariables = $options[Handlebars::OPTION_ENABLE_DATA_VARIABLES]; + } + } + + /** + * Push a new Context frame onto the stack. + * + * @param mixed $value Object or array to use for context + * + * @return void + */ + public function push($value) + { + array_push($this->stack, $value); + } + + /** + * Push an Index onto the index stack + * + * @param integer $index Index of the current section item. + * + * @return void + */ + public function pushIndex($index) + { + array_push($this->index, $index); + } + + /** + * Pushes data variables onto the stack. This is used to support @data variables. + * @param array $data Associative array where key is the name of the @data variable and value is the value. + * @throws LogicException when calling this method without having enableDataVariables. + */ + public function pushData($data) + { + if (!$this->enableDataVariables) { + throw new LogicException('Data variables are not supported due to the enableDataVariables configuration. Remove the call to data variables or change the setting.'); + } + array_push($this->dataStack, $data); + } + + /** + * Push a Key onto the key stack + * + * @param string $key Key of the current object property. + * + * @return void + */ + public function pushKey($key) + { + array_push($this->key, $key); + } + + /** + * Pop the last Context frame from the stack. + * + * @return mixed Last Context frame (object or array) + */ + public function pop() + { + return array_pop($this->stack); + } + + /** + * Pop the last index from the stack. + * + * @return int Last index + */ + public function popIndex() + { + return array_pop($this->index); + } + + /** + * Pop the last section data from the stack. + * + * @return array Last data + * @throws LogicException when calling this method without having enableDataVariables. + */ + public function popData() + { + if (!$this->enableDataVariables) { + throw new LogicException('Data variables are not supported due to the enableDataVariables configuration. Remove the call to data variables or change the setting.'); + } + return array_pop($this->dataStack); + } + + /** + * Pop the last key from the stack. + * + * @return string Last key + */ + public function popKey() + { + return array_pop($this->key); + } + + /** + * Get the last Context frame. + * + * @return mixed Last Context frame (object or array) + */ + public function last() + { + return end($this->stack); + } + + /** + * Get the index of current section item. + * + * @return mixed Last index + */ + public function lastIndex() + { + return end($this->index); + } + + /** + * Get the key of current object property. + * + * @return mixed Last key + */ + public function lastKey() + { + return end($this->key); + } + + /** + * Change the current context to one of current context members + * + * @param string $variableName name of variable or a callable on current context + * + * @return mixed actual value + */ + public function with($variableName) + { + $value = $this->get($variableName); + $this->push($value); + + return $value; + } + + /** + * Get a avariable from current context + * Supported types : + * variable , ../variable , variable.variable , . + * + * @param string $variableName variavle name to get from current context + * @param boolean $strict strict search? if not found then throw exception + * + * @throws InvalidArgumentException in strict mode and variable not found + * @return mixed + */ + public function get($variableName, $strict = false) + { + //Need to clean up + $variableName = trim($variableName); + + //Handle data variables (@index, @first, @last, etc) + if ($this->enableDataVariables && substr($variableName, 0, 1) == '@') { + return $this->getDataVariable($variableName, $strict); + } + + $level = 0; + while (substr($variableName, 0, 3) == '../') { + $variableName = trim(substr($variableName, 3)); + $level++; + } + if (count($this->stack) < $level) { + if ($strict) { + throw new InvalidArgumentException( + 'can not find variable in context' + ); + } + + return ''; + } + end($this->stack); + while ($level) { + prev($this->stack); + $level--; + } + $current = current($this->stack); + if (!$variableName) { + if ($strict) { + throw new InvalidArgumentException( + 'can not find variable in context' + ); + } + return ''; + } elseif ($variableName == '.' || $variableName == 'this') { + return $current; + } else { + $chunks = explode('.', $variableName); + foreach ($chunks as $chunk) { + if (is_string($current) and $current == '') { + return $current; + } + $current = $this->findVariableInContext($current, $chunk, $strict); + } + } + return $current; + } + + /** + * Given a data variable, retrieves the value associated. + * + * @param $variableName + * @param bool $strict + * @return mixed + * @throws LogicException when calling this method without having enableDataVariables. + */ + public function getDataVariable($variableName, $strict = false) + { + if (!$this->enableDataVariables) { + throw new LogicException('Data variables are not supported due to the enableDataVariables configuration. Remove the call to data variables or change the setting.'); + } + + $variableName = trim($variableName); + + // make sure we get an at-symbol prefix + if (substr($variableName, 0, 1) != '@') { + if ($strict) { + throw new InvalidArgumentException( + 'Can not find variable in context' + ); + } + return ''; + } + + // Remove the at-symbol prefix + $variableName = substr($variableName, 1); + + // determine the level of relative @data variables + $level = 0; + while (substr($variableName, 0, 3) == '../') { + $variableName = trim(substr($variableName, 3)); + $level++; + } + + // make sure the stack actually has the specified number of levels + if (count($this->dataStack) < $level) { + if ($strict) { + throw new InvalidArgumentException( + 'Can not find variable in context' + ); + } + + return ''; + } + + // going from the top of the stack to the bottom, traverse the number of levels specified + end($this->dataStack); + while ($level) { + prev($this->dataStack); + $level--; + } + + /** @var array $current */ + $current = current($this->dataStack); + + if (!array_key_exists($variableName, $current)) { + if ($strict) { + throw new InvalidArgumentException( + 'Can not find variable in context' + ); + } + + return ''; + } + + return $current[$variableName]; + } + + /** + * Check if $variable->$inside is available + * + * @param mixed $variable variable to check + * @param string $inside property/method to check + * @param boolean $strict strict search? if not found then throw exception + * + * @throws \InvalidArgumentException in strict mode and variable not found + * @return boolean true if exist + */ + private function findVariableInContext($variable, $inside, $strict = false) + { + $value = ''; + if (($inside !== '0' && empty($inside)) || ($inside == 'this')) { + return $variable; + } elseif (is_array($variable)) { + if (isset($variable[$inside])) { + $value = $variable[$inside]; + } + } elseif (is_object($variable)) { + if (isset($variable->$inside)) { + $value = $variable->$inside; + } elseif (is_callable(array($variable, $inside))) { + $value = call_user_func(array($variable, $inside)); + } + } elseif ($inside === '.') { + $value = $variable; + } elseif ($strict) { + throw new InvalidArgumentException('can not find variable in context'); + } + return $value; + } +} diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/Handlebars.php b/vendor/salesforce/handlebars-php/src/Handlebars/Handlebars.php new file mode 100755 index 0000000..b07bd6b --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/Handlebars.php @@ -0,0 +1,533 @@ + + * @author Behrooz Shabani + * @author Mardix + * @copyright 2012 (c) ParsPooyesh Co + * @copyright 2013 (c) Behrooz Shabani + * @copyright 2014 (c) Mardix + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + +namespace Handlebars; +use Handlebars\Loader\StringLoader; +use Handlebars\Cache\Dummy; +use InvalidArgumentException; + + +class Handlebars +{ + private static $instance = null; + const VERSION = '2.2'; + + const OPTION_ENABLE_DATA_VARIABLES = 'enableDataVariables'; + + /** + * factory method + * + * @param array $options see __construct's options parameter + * + * @return Handlebars + */ + public static function factory($options = array()) + { + if (! self::$instance) { + self::$instance = new self($options); + } + + return self::$instance; + } + + /** + * @var Tokenizer + */ + private $tokenizer; + + /** + * @var Parser + */ + private $parser; + + /** + * @var Helpers + */ + private $helpers; + + /** + * @var Loader + */ + private $loader; + + /** + * @var Loader + */ + private $partialsLoader; + + /** + * @var Cache + */ + private $cache; + + /** + * @var callable escape function to use + */ + private $escape = 'htmlspecialchars'; + + /** + * @var array parametes to pass to escape function + */ + private $escapeArgs = array( + ENT_COMPAT, + 'UTF-8' + ); + + private $aliases = array(); + + /** + * @var bool Enable @data variables + */ + private $enableDataVariables = false; + + /** + * Handlebars engine constructor + * $options array can contain : + * helpers => Helpers object + * escape => a callable function to escape values + * escapeArgs => array to pass as extra parameter to escape function + * loader => Loader object + * partials_loader => Loader object + * cache => Cache object + * enableDataVariables => boolean. Enables @data variables (default: false) + * + * @param array $options array of options to set + * + * @throws \InvalidArgumentException + */ + public function __construct(Array $options = []) + { + if (isset($options['helpers'])) { + $this->setHelpers($options['helpers']); + } + + if (isset($options['loader'])) { + $this->setLoader($options['loader']); + } + + if (isset($options['partials_loader'])) { + $this->setPartialsLoader($options['partials_loader']); + } + + if (isset($options['cache'])) { + $this->setCache($options['cache']); + } + + if (isset($options['escape'])) { + if (!is_callable($options['escape'])) { + throw new InvalidArgumentException( + 'Handlebars Constructor "escape" option must be callable' + ); + } + $this->escape = $options['escape']; + } + + if (isset($options['escapeArgs'])) { + if (!is_array($options['escapeArgs'])) { + $options['escapeArgs'] = array($options['escapeArgs']); + } + $this->escapeArgs = $options['escapeArgs']; + } + + if (isset($options['partials_alias']) + && is_array($options['partials_alias']) + ) { + $this->aliases = $options['partials_alias']; + } + + if (isset($options[self::OPTION_ENABLE_DATA_VARIABLES])) { + if (!is_bool($options[self::OPTION_ENABLE_DATA_VARIABLES])) { + throw new InvalidArgumentException( + 'Handlebars Constructor "' . self::OPTION_ENABLE_DATA_VARIABLES . '" option must be a boolean' + ); + } + $this->enableDataVariables = $options[self::OPTION_ENABLE_DATA_VARIABLES]; + } + } + + + + /** + * Shortcut 'render' invocation. + * + * Equivalent to calling `$handlebars->loadTemplate($template)->render($data);` + * + * @param string $template template name + * @param mixed $data data to use as context + * @return string Rendered template + */ + public function render($template, $data) + { + return $this->loadTemplate($template)->render($data); + } + /** + * To invoke when this object is called as a function + * + * @param string $template template name + * @param mixed $data data to use as context + * @return string Rendered template + */ + public function __invoke($template, $data) + { + return $this->render($template, $data); + } + + /** + * Set helpers for current enfine + * + * @param Helpers $helpers handlebars helper + * + * @return void + */ + public function setHelpers(Helpers $helpers) + { + $this->helpers = $helpers; + } + + /** + * Get helpers, or create new one if ther is no helper + * + * @return Helpers + */ + public function getHelpers() + { + if (!isset($this->helpers)) { + $this->helpers = new Helpers(); + } + return $this->helpers; + } + + /** + * Add a new helper. + * + * @param string $name helper name + * @param mixed $helper helper callable + * + * @return void + */ + public function addHelper($name, $helper) + { + $this->getHelpers()->add($name, $helper); + } + + /** + * Get a helper by name. + * + * @param string $name helper name + * @return callable Helper + */ + public function getHelper($name) + { + return $this->getHelpers()->__get($name); + } + + /** + * Check whether this instance has a helper. + * + * @param string $name helper name + * @return boolean True if the helper is present + */ + public function hasHelper($name) + { + return $this->getHelpers()->has($name); + } + + /** + * Remove a helper by name. + * + * @param string $name helper name + * @return void + */ + public function removeHelper($name) + { + $this->getHelpers()->remove($name); + } + + /** + * Set current loader + * + * @param Loader $loader handlebars loader + * @return void + */ + public function setLoader(Loader $loader) + { + $this->loader = $loader; + } + + /** + * get current loader + * + * @return Loader + */ + public function getLoader() + { + if (! isset($this->loader)) { + $this->loader = new StringLoader(); + } + return $this->loader; + } + + /** + * Set current partials loader + * + * @param Loader $loader handlebars loader + * @return void + */ + public function setPartialsLoader(Loader $loader) + { + $this->partialsLoader = $loader; + } + + /** + * get current partials loader + * + * @return Loader + */ + public function getPartialsLoader() + { + if (!isset($this->partialsLoader)) { + $this->partialsLoader = new StringLoader(); + } + return $this->partialsLoader; + } + + /** + * Set cache for current engine + * + * @param Cache $cache handlebars cache + * @return void + */ + public function setCache(Cache $cache) + { + $this->cache = $cache; + } + + /** + * Get cache + * + * @return Cache + */ + public function getCache() + { + if (!isset($this->cache)) { + $this->cache = new Dummy(); + } + return $this->cache; + } + + /** + * Get current escape function + * + * @return callable + */ + public function getEscape() + { + return $this->escape; + } + + /** + * Set current escape function + * + * @param callable $escape function + * @throws \InvalidArgumentException + * @return void + */ + public function setEscape($escape) + { + if (!is_callable($escape)) { + throw new InvalidArgumentException( + 'Escape function must be a callable' + ); + } + $this->escape = $escape; + } + + /** + * Get current escape function + * + * @return array + */ + public function getEscapeArgs() + { + return $this->escapeArgs; + } + + /** + * Set current escape function + * + * @param array $escapeArgs arguments to pass as extra arg to function + * @return void + */ + public function setEscapeArgs($escapeArgs) + { + if (! is_array($escapeArgs)) { + $escapeArgs = array($escapeArgs); + } + $this->escapeArgs = $escapeArgs; + } + + + /** + * Set the Handlebars Tokenizer instance. + * + * @param Tokenizer $tokenizer tokenizer + * @return void + */ + public function setTokenizer(Tokenizer $tokenizer) + { + $this->tokenizer = $tokenizer; + } + + /** + * Get the current Handlebars Tokenizer instance. + * + * If no Tokenizer instance has been explicitly specified, this method will + * instantiate and return a new one. + * + * @return Tokenizer + */ + public function getTokenizer() + { + if (! isset($this->tokenizer)) { + $this->tokenizer = new Tokenizer(); + } + + return $this->tokenizer; + } + + /** + * Set the Handlebars Parser instance. + * + * @param Parser $parser parser object + * @return void + */ + public function setParser(Parser $parser) + { + $this->parser = $parser; + } + + /** + * Get the current Handlebars Parser instance. + * + * If no Parser instance has been explicitly specified, this method will + * instantiate and return a new one. + * + * @return Parser + */ + public function getParser() + { + if (! isset($this->parser)) { + $this->parser = new Parser(); + } + return $this->parser; + } + + /** + * Determines if the @data variables are enabled. + * @return bool + */ + public function isDataVariablesEnabled() + { + return $this->enableDataVariables; + } + + /** + * Load a template by name with current template loader + * + * @param string $name template name + * + * @return Template + */ + public function loadTemplate($name) + { + $source = $this->getLoader()->load($name); + $tree = $this->tokenize($source); + return new Template($this, $tree, $source); + } + + /** + * Load a partial by name with current partial loader + * + * @param string $name partial name + * + * @return Template + */ + public function loadPartial($name) + { + if (isset($this->aliases[$name])) { + $name = $this->aliases[$name]; + } + $source = $this->getPartialsLoader()->load($name); + $tree = $this->tokenize($source); + return new Template($this, $tree, $source); + } + + /** + * Register partial alias + * + * @param string $alias Partial alias + * @param string $content The real value + * @return void + */ + public function registerPartial($alias, $content) + { + $this->aliases[$alias] = $content; + } + + /** + * Un-register partial alias + * + * @param string $alias Partial alias + * @return void + */ + public function unRegisterPartial($alias) + { + if (isset($this->aliases[$alias])) { + unset($this->aliases[$alias]); + } + } + + /** + * Load string into a template object + * + * @param string $source string to load + * @return Template + */ + public function loadString($source) + { + $tree = $this->tokenize($source); + return new Template($this, $tree, $source); + } + + /** + * try to tokenize source, or get them from cache if available + * + * @param string $source handlebars source code + * @return array handlebars parsed data into array + */ + private function tokenize($source) + { + $hash = md5(sprintf('version: %s, data : %s', self::VERSION, $source)); + $tree = $this->getCache()->get($hash); + if ($tree === false) { + $tokens = $this->getTokenizer()->scan($source); + $tree = $this->getParser()->parse($tokens); + $this->getCache()->set($hash, $tree); + } + return $tree; + } + +} \ No newline at end of file diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/HandlebarsString.php b/vendor/salesforce/handlebars-php/src/Handlebars/HandlebarsString.php new file mode 100644 index 0000000..9efc101 --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/HandlebarsString.php @@ -0,0 +1,65 @@ + + * @author Behrooz Shabani + * @author Mardix + * @copyright 2012 (c) ParsPooyesh Co + * @copyright 2013 (c) Behrooz Shabani + * @copyright 2013 (c) Mardix + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + +namespace Handlebars; + +class HandlebarsString +{ + private $string = ""; + + /** + * Create new string + * + * @param string $string input source + */ + public function __construct($string) + { + $this->setString($string); + } + + /** + * To String + * + * @return string + */ + public function __toString() + { + return $this->getString(); + } + + /** + * Get string + * + * @return string + */ + public function getString() + { + return $this->string; + } + + /** + * Create new string + * + * @param string $string input source + * + * @return void + */ + public function setString($string) + { + $this->string = $string; + } + +} \ No newline at end of file diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/Helpers.php b/vendor/salesforce/handlebars-php/src/Handlebars/Helpers.php new file mode 100755 index 0000000..f197a08 --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/Helpers.php @@ -0,0 +1,733 @@ + + * @author Behrooz Shabani + * @author Mardix + * @copyright 2012 (c) ParsPooyesh Co + * @copyright 2013 (c) Behrooz Shabani + * @copyright 2014 (c) Mardix + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + +namespace Handlebars; + +use DateTime; +use InvalidArgumentException; +use Traversable; +use LogicException; + +class Helpers +{ + /** + * @var array array of helpers + */ + protected $helpers = []; + private $tpl = []; + protected $builtinHelpers = [ + "if", + "each", + "with", + "unless", + "bindAttr", + "upper", // Put all chars in uppercase + "lower", // Put all chars in lowercase + "capitalize", // Capitalize just the first word + "capitalize_words", // Capitalize each words + "reverse", // Reverse a string + "format_date", // Format a date + "inflect", // Inflect the wording based on count ie. 1 album, 10 albums + "default", // If a variable is null, it will use the default instead + "truncate", // Truncate section + "raw", // Return the source as is without converting + "repeat", // Repeat a section + "define", // Define a block to be used using "invoke" + "invoke", // Invoke a block that was defined with "define" + ]; + + /** + * Create new helper container class + * + * @param array $helpers array of name=>$value helpers + * @throws \InvalidArgumentException when $helpers is not an array + * (or traversable) or helper is not a callable + */ + public function __construct($helpers = null) + { + foreach($this->builtinHelpers as $helper) { + $helperName = $this->underscoreToCamelCase($helper); + $this->add($helper, [$this, "helper{$helperName}"]); + } + + if ($helpers != null) { + if (!is_array($helpers) && !$helpers instanceof Traversable) { + throw new InvalidArgumentException( + 'HelperCollection constructor expects an array of helpers' + ); + } + foreach ($helpers as $name => $helper) { + $this->add($name, $helper); + } + } + } + + /** + * Add a new helper to helpers + * + * @param string $name helper name + * @param callable $helper a function as a helper + * + * @throws \InvalidArgumentException if $helper is not a callable + * @return void + */ + public function add($name, $helper) + { + if (!is_callable($helper)) { + throw new InvalidArgumentException("$name Helper is not a callable."); + } + $this->helpers[$name] = $helper; + } + + /** + * Check if $name helper is available + * + * @param string $name helper name + * + * @return boolean + */ + public function has($name) + { + return array_key_exists($name, $this->helpers); + } + + /** + * Get a helper. __magic__ method :) + * + * @param string $name helper name + * + * @throws \InvalidArgumentException if $name is not available + * @return callable helper function + */ + public function __get($name) + { + if (!$this->has($name)) { + throw new InvalidArgumentException('Unknown helper :' . $name); + } + return $this->helpers[$name]; + } + + /** + * Check if $name helper is available __magic__ method :) + * + * @param string $name helper name + * + * @return boolean + * @see Handlebras_Helpers::has + */ + public function __isset($name) + { + return $this->has($name); + } + + /** + * Add a new helper to helpers __magic__ method :) + * + * @param string $name helper name + * @param callable $helper a function as a helper + * + * @return void + */ + public function __set($name, $helper) + { + $this->add($name, $helper); + } + + + /** + * Unset a helper + * + * @param string $name helper name to remove + * @return void + */ + public function __unset($name) + { + unset($this->helpers[$name]); + } + + /** + * Check whether a given helper is present in the collection. + * + * @param string $name helper name + * @throws \InvalidArgumentException if the requested helper is not present. + * @return void + */ + public function remove($name) + { + if (!$this->has($name)) { + throw new InvalidArgumentException('Unknown helper: ' . $name); + } + unset($this->helpers[$name]); + } + + /** + * Clear the helper collection. + * + * Removes all helpers from this collection + * + * @return void + */ + public function clear() + { + $this->helpers = []; + } + + /** + * Check whether the helper collection is empty. + * + * @return boolean True if the collection is empty + */ + public function isEmpty() + { + return empty($this->helpers); + } + + /** + * Create handler for the 'if' helper. + * + * {{#if condition}} + * Something here + * {{else}} + * something else here + * {{/if}} + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return mixed + */ + public function helperIf($template, $context, $args, $source) + { + $tmp = $context->get($args); + if ($tmp) { + $template->setStopToken('else'); + $buffer = $template->render($context); + $template->setStopToken(false); + $template->discard(); + return $buffer; + } else { + return $this->renderElse($template, $context); + } + } + + + /** + * Create handler for the 'each' helper. + * example {{#each people}} {{name}} {{/each}} + * example with slice: {{#each people[0:10]}} {{name}} {{/each}} + * example with else + * {{#each Array}} + * {{.}} + * {{else}} + * Nothing found + * {{/each}} + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return mixed + */ + public function helperEach($template, $context, $args, $source) + { + list($keyname, $slice_start, $slice_end) = $this->extractSlice($args); + $tmp = $context->get($keyname); + + if (is_array($tmp) || $tmp instanceof Traversable) { + $tmp = array_slice($tmp, $slice_start, $slice_end); + $buffer = ''; + $islist = array_values($tmp) === $tmp; + + if (is_array($tmp) && ! count($tmp)) { + return $this->renderElse($template, $context); + } else { + + $itemCount = -1; + if ($islist) { + $itemCount = count($tmp); + } + + foreach ($tmp as $key => $var) { + $tpl = clone $template; + if ($islist) { + $context->pushIndex($key); + + // If data variables are enabled, push the data related to this #each context + if ($template->getEngine()->isDataVariablesEnabled()) { + $context->pushData([ + Context::DATA_KEY => $key, + Context::DATA_INDEX => $key, + Context::DATA_LAST => $key == ($itemCount - 1), + Context::DATA_FIRST => $key == 0, + ]); + } + } else { + $context->pushKey($key); + + // If data variables are enabled, push the data related to this #each context + if ($template->getEngine()->isDataVariablesEnabled()) { + $context->pushData([ + Context::DATA_KEY => $key, + ]); + } + } + $context->push($var); + $tpl->setStopToken('else'); + $buffer .= $tpl->render($context); + $context->pop(); + if ($islist) { + $context->popIndex(); + } else { + $context->popKey(); + } + + if ($template->getEngine()->isDataVariablesEnabled()) { + $context->popData(); + } + } + return $buffer; + } + } else { + return $this->renderElse($template, $context); + } + } + + /** + * Applying the DRY principle here. + * This method help us render {{else}} portion of a block + * @param \Handlebars\Template $template + * @param \Handlebars\Context $context + * @return string + */ + private function renderElse($template, $context) + { + $template->setStopToken('else'); + $template->discard(); + $template->setStopToken(false); + return $template->render($context); + } + + + /** + * Create handler for the 'unless' helper. + * {{#unless condition}} + * Something here + * {{else}} + * something else here + * {{/unless}} + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return mixed + */ + public function helperUnless($template, $context, $args, $source) + { + $tmp = $context->get($args); + if (!$tmp) { + $template->setStopToken('else'); + $buffer = $template->render($context); + $template->setStopToken(false); + $template->discard(); + return $buffer; + } else { + return $this->renderElse($template, $context); + } + } + + /** + * Create handler for the 'with' helper. + * Needed for compatibility with PHP 5.2 since it doesn't support anonymous + * functions. + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return mixed + */ + public function helperWith($template, $context, $args, $source) + { + $tmp = $context->get($args); + $context->push($tmp); + $buffer = $template->render($context); + $context->pop(); + + return $buffer; + } + + /** + * Create handler for the 'bindAttr' helper. + * Needed for compatibility with PHP 5.2 since it doesn't support anonymous + * functions. + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return mixed + */ + public function helperBindAttr($template, $context, $args, $source) + { + return $args; + } + + /** + * To uppercase string + * + * {{#upper data}} + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return string + */ + public function helperUpper($template, $context, $args, $source) + { + return strtoupper($context->get($args)); + } + + /** + * To lowercase string + * + * {{#lower data}} + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return string + */ + public function helperLower($template, $context, $args, $source) + { + return strtolower($context->get($args)); + } + + /** + * to capitalize first letter + * + * {{#capitalize}} + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return string + */ + public function helperCapitalize($template, $context, $args, $source) + { + return ucfirst($context->get($args)); + } + + /** + * To capitalize first letter in each word + * + * {{#capitalize_words data}} + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return string + */ + public function helperCapitalizeWords($template, $context, $args, $source) + { + return ucwords($context->get($args)); + } + + /** + * To reverse a string + * + * {{#reverse data}} + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return string + */ + public function helperReverse($template, $context, $args, $source) + { + return strrev($context->get($args)); + } + + /** + * Format a date + * + * {{#format_date date 'Y-m-d @h:i:s'}} + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return mixed + */ + public function helperFormatDate($template, $context, $args, $source) + { + preg_match("/(.*?)\s+(?:(?:\"|\')(.*?)(?:\"|\'))/", $args, $m); + $keyname = $m[1]; + $format = $m[2]; + + $date = $context->get($keyname); + if ($format) { + $dt = new DateTime; + if (is_numeric($date)) { + $dt = (new DateTime)->setTimestamp($date); + } else { + $dt = new DateTime($date); + } + return $dt->format($format); + } else { + return $date; + } + } + + /** + * {{inflect count 'album' 'albums'}} + * {{inflect count '%d album' '%d albums'}} + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return mixed + */ + public function helperInflect($template, $context, $args, $source) + { + preg_match("/(.*?)\s+(?:(?:\"|\')(.*?)(?:\"|\'))\s+(?:(?:\"|\')(.*?)(?:\"|\'))/", $args, $m); + $keyname = $m[1]; + $singular = $m[2]; + $plurial = $m[3]; + $value = $context->get($keyname); + $inflect = ($value <= 1) ? $singular : $plurial; + return sprintf($inflect, $value); + } + + /** + * Provide a default fallback + * + * {{default title "No title available"}} + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return string + */ + public function helperDefault($template, $context, $args, $source) + { + preg_match("/(.*?)\s+(?:(?:\"|\')(.*?)(?:\"|\'))/", trim($args), $m); + $keyname = $m[1]; + $default = $m[2]; + $value = $context->get($keyname); + return ($value) ?: $default; + } + + /** + * Truncate a string to a length, and append and ellipsis if provided + * {{#truncate content 5 "..."}} + * + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return string + */ + public function helperTruncate($template, $context, $args, $source) + { + preg_match("/(.*?)\s+(.*?)\s+(?:(?:\"|\')(.*?)(?:\"|\'))/", trim($args), $m); + $keyname = $m[1]; + $limit = $m[2]; + $ellipsis = $m[3]; + $value = substr($context->get($keyname), 0, $limit); + if ($ellipsis && strlen($context->get($keyname)) > $limit) { + $value .= $ellipsis; + } + return $value; + } + + /** + * Return the data source as is + * + * {{#raw}} {{/raw}} + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return mixed + */ + public function helperRaw($template, $context, $args, $source) + { + return $source; + } + + /** + * Repeat section $x times. + * + * {{#repeat 10}} + * This section will be repeated 10 times + * {{/repeat}} + * + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return string + */ + public function helperRepeat($template, $context, $args, $source) + { + $buffer = $template->render($context); + return str_repeat($buffer, intval($args)); + } + + + /** + * Define a section to be used later by using 'invoke' + * + * --> Define a section: hello + * {{#define hello}} + * Hello World! + * + * How is everything? + * {{/define}} + * + * --> This is how it is called + * {{#invoke hello}} + * + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return null + */ + public function helperDefine($template, $context, $args, $source) + { + $this->tpl["DEFINE"][$args] = clone($template); + } + + /** + * Invoke a section that was created using 'define' + * + * --> Define a section: hello + * {{#define hello}} + * Hello World! + * + * How is everything? + * {{/define}} + * + * --> This is how it is called + * {{#invoke hello}} + * + * + * @param \Handlebars\Template $template template that is being rendered + * @param \Handlebars\Context $context context object + * @param array $args passed arguments to helper + * @param string $source part of template that is wrapped + * within helper + * + * @return null + */ + public function helperInvoke($template, $context, $args, $source) + { + if (! isset($this->tpl["DEFINE"][$args])) { + throw new LogicException("Can't INVOKE '{$args}'. '{$args}' was not DEFINE "); + } + return $this->tpl["DEFINE"][$args]->render($context); + } + + + /** + * Change underscore helper name to CamelCase + * + * @param string $string + * @return string + */ + private function underscoreToCamelCase($string) + { + return str_replace(' ', '', ucwords(str_replace('_', ' ', $string))); + } + + /** + * slice + * Allow to split the data that will be returned + * #loop[start:end] => starts at start trhough end -1 + * #loop[start:] = Starts at start though the rest of the array + * #loop[:end] = Starts at the beginning through end -1 + * #loop[:] = A copy of the whole array + * + * #loop[-1] + * #loop[-2:] = Last two items + * #loop[:-2] = Everything except last two items + * + * @param string $string + * @return Array [tag_name, slice_start, slice_end] + */ + private function extractSlice($string) + { + preg_match("/^([\w\._\-]+)(?:\[([\-0-9]*?:[\-0-9]*?)\])?/i", $string, $m); + $slice_start = $slice_end = null; + if (isset($m[2])) { + list($slice_start, $slice_end) = explode(":", $m[2]); + $slice_start = (int) $slice_start; + $slice_end = $slice_end ? (int) $slice_end : null; + } + return [$m[1], $slice_start, $slice_end]; + } +} diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/Loader.php b/vendor/salesforce/handlebars-php/src/Handlebars/Loader.php new file mode 100755 index 0000000..91f71b9 --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/Loader.php @@ -0,0 +1,29 @@ + + * @author Behrooz Shabani + * @copyright 2012 (c) ParsPooyesh Co + * @copyright 2013 (c) Behrooz Shabani + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + +namespace Handlebars; + +interface Loader +{ + + /** + * Load a Template by name. + * + * @param string $name template name to load + * + * @return String + */ + public function load($name); + +} diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/Loader/FilesystemLoader.php b/vendor/salesforce/handlebars-php/src/Handlebars/Loader/FilesystemLoader.php new file mode 100755 index 0000000..22adb83 --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/Loader/FilesystemLoader.php @@ -0,0 +1,144 @@ + + * @author Behrooz Shabani + * @author Craig Bass + * @author ^^ + * @copyright 2012 (c) ParsPooyesh Co + * @copyright 2013 (c) Behrooz Shabani + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + +namespace Handlebars\Loader; +use Handlebars\Loader; +use Handlebars\HandlebarsString; + + +class FilesystemLoader implements Loader +{ + private $_baseDir; + private $_extension = '.handlebars'; + private $_prefix = ''; + private $_templates = array(); + + /** + * Handlebars filesystem Loader constructor. + * + * $options array allows overriding certain Loader options during instantiation: + * + * $options = array( + * // extension used for Handlebars templates. Defaults to '.handlebars' + * 'extension' => '.other', + * ); + * + * @param string|array $baseDirs A path contain template files or array of paths + * @param array $options Array of Loader options (default: array()) + * + * @throws \RuntimeException if $baseDir does not exist. + */ + public function __construct($baseDirs, Array $options = []) + { + if (is_string($baseDirs)) { + $baseDirs = array(rtrim(realpath($baseDirs), '/')); + } else { + foreach ($baseDirs as &$dir) { + $dir = rtrim(realpath($dir), '/'); + } unset( $dir ); + } + + $this->_baseDir = $baseDirs; + + foreach ($this->_baseDir as $dir) { + if (!is_dir($dir)) { + throw new \RuntimeException( + 'FilesystemLoader baseDir must be a directory: ' . $dir + ); + } + } + + if (isset($options['extension'])) { + $this->_extension = '.' . ltrim($options['extension'], '.'); + } + + if (isset($options['prefix'])) { + $this->_prefix = $options['prefix']; + } + } + + /** + * Load a Template by name. + * + * $loader = new FilesystemLoader(dirname(__FILE__).'/views'); + * // loads "./views/admin/dashboard.handlebars"; + * $loader->load('admin/dashboard'); + * + * @param string $name template name + * + * @return HandlebarsString Handlebars Template source + */ + public function load($name) + { + if (!isset($this->_templates[$name])) { + $this->_templates[$name] = $this->loadFile($name); + } + + return new HandlebarsString($this->_templates[$name]); + } + + /** + * Helper function for loading a Handlebars file by name. + * + * @param string $name template name + * + * @throws \InvalidArgumentException if a template file is not found. + * @return string Handlebars Template source + */ + protected function loadFile($name) + { + $fileName = $this->getFileName($name); + + if ($fileName === false) { + throw new \InvalidArgumentException('Template ' . $name . ' not found.'); + } + + return file_get_contents($fileName); + } + + /** + * Helper function for getting a Handlebars template file name. + * + * @param string $name template name + * + * @return string Template file name + */ + protected function getFileName($name) + { + foreach ($this->_baseDir as $baseDir) { + $fileName = $baseDir . '/'; + $fileParts = explode('/', $name); + $file = array_pop($fileParts); + + if (substr($file, strlen($this->_prefix)) !== $this->_prefix) { + $file = $this->_prefix . $file; + } + + $fileParts[] = $file; + $fileName .= implode('/', $fileParts); + $lastCharacters = substr($fileName, 0 - strlen($this->_extension)); + + if ($lastCharacters !== $this->_extension) { + $fileName .= $this->_extension; + } + if (file_exists($fileName)) { + return $fileName; + } + } + + return false; + } + +} diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/Loader/StringLoader.php b/vendor/salesforce/handlebars-php/src/Handlebars/Loader/StringLoader.php new file mode 100755 index 0000000..70dc369 --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/Loader/StringLoader.php @@ -0,0 +1,36 @@ + + * @author Behrooz Shabani + * @author Mardix + * @copyright 2012 (c) ParsPooyesh Co + * @copyright 2013 (c) Behrooz Shabani + * @copyright 2013 (c) Mardix + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + +namespace Handlebars\Loader; +use Handlebars\Loader; +use Handlebars\HandlebarsString; + +class StringLoader implements Loader +{ + + /** + * Load a Template by source. + * + * @param string $name Handlebars Template source + * + * @return HandlebarsString Handlebars Template source + */ + public function load($name) + { + return new HandlebarsString($name); + } + +} diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/Parser.php b/vendor/salesforce/handlebars-php/src/Handlebars/Parser.php new file mode 100755 index 0000000..a4cbf7e --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/Parser.php @@ -0,0 +1,94 @@ + + * @author Behrooz Shabani + * @author Mardix + * @copyright 2012 (c) ParsPooyesh Co + * @copyright 2013 (c) Behrooz Shabani + * @copyright 2013 (c) Mardix + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + +namespace Handlebars; +use ArrayIterator; +use LogicException; + +class Parser +{ + /** + * Process array of tokens and convert them into parse tree + * + * @param array $tokens Set of + * + * @return array Token parse tree + */ + public function parse(Array $tokens = []) + { + return $this->buildTree(new ArrayIterator($tokens)); + } + + /** + * Helper method for recursively building a parse tree. + * + * @param \ArrayIterator $tokens Stream of tokens + * + * @throws \LogicException when nesting errors or mismatched section tags + * are encountered. + * @return array Token parse tree + * + */ + private function buildTree(ArrayIterator $tokens) + { + $stack = []; + + do { + $token = $tokens->current(); + $tokens->next(); + + if ($token === null) { + continue; + } else { + switch ($token[Tokenizer::TYPE]) { + case Tokenizer::T_END_SECTION: + $newNodes = []; + do { + $result = array_pop($stack); + if ($result === null) { + throw new LogicException( + 'Unexpected closing tag: /' . $token[Tokenizer::NAME] + ); + } + + if (!array_key_exists(Tokenizer::NODES, $result) + && isset($result[Tokenizer::NAME]) + && $result[Tokenizer::NAME] == $token[Tokenizer::NAME] + ) { + $result[Tokenizer::NODES] = $newNodes; + $result[Tokenizer::END] = $token[Tokenizer::INDEX]; + array_push($stack, $result); + break 2; + } else { + array_unshift($newNodes, $result); + } + } while (true); + break; + default: + array_push($stack, $token); + } + } + + } while ($tokens->valid()); + + return $stack; + + } + +} diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/Template.php b/vendor/salesforce/handlebars-php/src/Handlebars/Template.php new file mode 100755 index 0000000..1c5c174 --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/Template.php @@ -0,0 +1,386 @@ + + * @author Behrooz Shabani + * @author Mardix + * @copyright 2012 (c) ParsPooyesh Co + * @copyright 2013 (c) Behrooz Shabani + * @copyright 2013 (c) Mardix + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + +namespace Handlebars; + +use InvalidArgumentException; +use RuntimeException; + +class Template +{ + /** + * @var Handlebars + */ + protected $handlebars; + + + protected $tree = []; + + protected $source = ''; + + /** + * @var array Run stack + */ + private $stack = []; + private $_stack = []; + + /** + * Handlebars template constructor + * + * @param Handlebars $engine handlebar engine + * @param array $tree Parsed tree + * @param string $source Handlebars source + */ + public function __construct(Handlebars $engine, $tree, $source) + { + $this->handlebars = $engine; + $this->tree = $tree; + $this->source = $source; + array_push($this->stack, [0, $this->getTree(), false]); + + } + + /** + * Get current tree + * + * @return array + */ + public function getTree() + { + return $this->tree; + } + + /** + * Get current source + * + * @return string + */ + public function getSource() + { + return $this->source; + } + + /** + * Get current engine associated with this object + * + * @return Handlebars + */ + public function getEngine() + { + return $this->handlebars; + } + + /** + * set stop token for render and discard method + * + * @param string $token token to set as stop token or false to remove + * + * @return void + */ + + public function setStopToken($token) + { + $this->_stack = $this->stack; + $topStack = array_pop($this->stack); + $topStack[2] = $token; + array_push($this->stack, $topStack); + } + + /** + * get current stop token + * + * @return string|bool + */ + + public function getStopToken() + { + return end($this->stack)[2]; + } + + /** + * Render top tree + * + * @param mixed $context current context + * + * @throws \RuntimeException + * @return string + */ + public function render($context) + { + if (!$context instanceof Context) { + $context = new Context($context, [ + 'enableDataVariables' => $this->handlebars->isDataVariablesEnabled(), + ]); + } + $topTree = end($this->stack); // never pop a value from stack + list($index, $tree, $stop) = $topTree; + + $buffer = ''; + while (array_key_exists($index, $tree)) { + $current = $tree[$index]; + $index++; + //if the section is exactly like waitFor + if (is_string($stop) + && $current[Tokenizer::TYPE] == Tokenizer::T_ESCAPED + && $current[Tokenizer::NAME] === $stop + ) { + break; + } + switch ($current[Tokenizer::TYPE]) { + case Tokenizer::T_SECTION : + $newStack = isset($current[Tokenizer::NODES]) + ? $current[Tokenizer::NODES] : []; + array_push($this->stack, [0, $newStack, false]); + $buffer .= $this->section($context, $current); + array_pop($this->stack); + break; + case Tokenizer::T_INVERTED : + $newStack = isset($current[Tokenizer::NODES]) ? + $current[Tokenizer::NODES] : []; + array_push($this->stack, [0, $newStack, false]); + $buffer .= $this->inverted($context, $current); + array_pop($this->stack); + break; + case Tokenizer::T_COMMENT : + $buffer .= ''; + break; + case Tokenizer::T_PARTIAL: + case Tokenizer::T_PARTIAL_2: + $buffer .= $this->partial($context, $current); + break; + case Tokenizer::T_UNESCAPED: + case Tokenizer::T_UNESCAPED_2: + $buffer .= $this->variables($context, $current, false); + break; + case Tokenizer::T_ESCAPED: + $buffer .= $this->variables($context, $current, true); + break; + case Tokenizer::T_TEXT: + $buffer .= $current[Tokenizer::VALUE]; + break; + default: + throw new RuntimeException( + 'Invalid node type : ' . json_encode($current) + ); + } + } + if ($stop) { + //Ok break here, the helper should be aware of this. + $newStack = array_pop($this->stack); + $newStack[0] = $index; + $newStack[2] = false; //No stop token from now on + array_push($this->stack, $newStack); + } + + return $buffer; + } + + /** + * Discard top tree + * + * @param mixed $context current context + * + * @return string + */ + public function discard() + { + $topTree = end($this->stack); //This method never pop a value from stack + list($index, $tree, $stop) = $topTree; + while (array_key_exists($index, $tree)) { + $current = $tree[$index]; + $index++; + //if the section is exactly like waitFor + if (is_string($stop) + && $current[Tokenizer::TYPE] == Tokenizer::T_ESCAPED + && $current[Tokenizer::NAME] === $stop + ) { + break; + } + } + if ($stop) { + //Ok break here, the helper should be aware of this. + $newStack = array_pop($this->stack); + $newStack[0] = $index; + $newStack[2] = false; + array_push($this->stack, $newStack); + } + + return ''; + } + + /** + * Process section nodes + * + * @param Context $context current context + * @param array $current section node data + * + * @throws \RuntimeException + * @return string the result + */ + private function section(Context $context, $current) + { + $helpers = $this->handlebars->getHelpers(); + $sectionName = $current[Tokenizer::NAME]; + if ($helpers->has($sectionName)) { + if (isset($current[Tokenizer::END])) { + $source = substr( + $this->getSource(), + $current[Tokenizer::INDEX], + $current[Tokenizer::END] - $current[Tokenizer::INDEX] + ); + } else { + $source = ''; + } + $params = [ + $this, //First argument is this template + $context, //Second is current context + $current[Tokenizer::ARGS], //Arguments + $source + ]; + + $return = call_user_func_array($helpers->$sectionName, $params); + if ($return instanceof String) { + return $this->handlebars->loadString($return)->render($context); + } else { + return $return; + } + } elseif (trim($current[Tokenizer::ARGS]) == '') { + // fallback to mustache style each/with/for just if there is + // no argument at all. + try { + $sectionVar = $context->get($sectionName, true); + } catch (InvalidArgumentException $e) { + throw new RuntimeException( + $sectionName . ' is not registered as a helper' + ); + } + $buffer = ''; + if (is_array($sectionVar) || $sectionVar instanceof \Traversable) { + foreach ($sectionVar as $index => $d) { + $context->pushIndex($index); + $context->push($d); + $buffer .= $this->render($context); + $context->pop(); + $context->popIndex(); + } + } elseif (is_object($sectionVar)) { + //Act like with + $context->push($sectionVar); + $buffer = $this->render($context); + $context->pop(); + } elseif ($sectionVar) { + $buffer = $this->render($context); + } + + return $buffer; + } else { + throw new RuntimeException( + $sectionName . ' is not registered as a helper' + ); + } + } + + /** + * Process inverted section + * + * @param Context $context current context + * @param array $current section node data + * + * @return string the result + */ + private function inverted(Context $context, $current) + { + $sectionName = $current[Tokenizer::NAME]; + $data = $context->get($sectionName); + if (!$data) { + return $this->render($context); + } else { + //No need to discard here, since it has no else + return ''; + } + } + + /** + * Process partial section + * + * @param Context $context current context + * @param array $current section node data + * + * @return string the result + */ + private function partial(Context $context, $current) + { + $partial = $this->handlebars->loadPartial($current[Tokenizer::NAME]); + + if ($current[Tokenizer::ARGS]) { + $context = $context->get($current[Tokenizer::ARGS]); + } + + return $partial->render($context); + } + + /** + * Process partial section + * + * @param Context $context current context + * @param array $current section node data + * @param boolean $escaped escape result or not + * + * @return string the result + */ + private function variables(Context $context, $current, $escaped) + { + $name = $current[Tokenizer::NAME]; + $value = $context->get($name); + + // If @data variables are enabled, use the more complex algorithm for handling the the variables otherwise + // use the previous version. + if ($this->handlebars->isDataVariablesEnabled()) { + if (substr(trim($name), 0, 1) == '@') { + $variable = $context->getDataVariable($name); + if (is_bool($variable)) { + return $variable ? 'true' : 'false'; + } + return $variable; + } + } else { + // If @data variables are not enabled, then revert back to legacy behavior + if ($name == '@index') { + return $context->lastIndex(); + } + if ($name == '@key') { + return $context->lastKey(); + } + } + + if ($escaped) { + $args = $this->handlebars->getEscapeArgs(); + array_unshift($args, $value); + $value = call_user_func_array( + $this->handlebars->getEscape(), + array_values($args) + ); + } + + return $value; + } + + public function __clone() + { + return $this; + } +} diff --git a/vendor/salesforce/handlebars-php/src/Handlebars/Tokenizer.php b/vendor/salesforce/handlebars-php/src/Handlebars/Tokenizer.php new file mode 100644 index 0000000..2a08ccb --- /dev/null +++ b/vendor/salesforce/handlebars-php/src/Handlebars/Tokenizer.php @@ -0,0 +1,353 @@ + + * @author fzerorubigd + * @author Behrooz Shabani + * @author Mardix + * @copyright 2012 (c) ParsPooyesh Co + * @copyright 2013 (c) Behrooz Shabani + * @copyright 2013 (c) Mardix + * @license MIT + * @link http://voodoophp.org/docs/handlebars + */ + +namespace Handlebars; + +class Tokenizer +{ + + // Finite state machine states + const IN_TEXT = 0; + const IN_TAG_TYPE = 1; + const IN_TAG = 2; + + // Token types + const T_SECTION = '#'; + const T_INVERTED = '^'; + const T_END_SECTION = '/'; + const T_COMMENT = '!'; + // XXX: remove partials support from tokenizer and make it a helper? + const T_PARTIAL = '>'; + const T_PARTIAL_2 = '<'; + const T_DELIM_CHANGE = '='; + const T_ESCAPED = '_v'; + const T_UNESCAPED = '{'; + const T_UNESCAPED_2 = '&'; + const T_TEXT = '_t'; + + // Valid token types + private $tagTypes = [ + self::T_SECTION => true, + self::T_INVERTED => true, + self::T_END_SECTION => true, + self::T_COMMENT => true, + self::T_PARTIAL => true, + self::T_PARTIAL_2 => true, + self::T_DELIM_CHANGE => true, + self::T_ESCAPED => true, + self::T_UNESCAPED => true, + self::T_UNESCAPED_2 => true, + ]; + + // Interpolated tags + private $interpolatedTags = [ + self::T_ESCAPED => true, + self::T_UNESCAPED => true, + self::T_UNESCAPED_2 => true, + ]; + + // Token properties + const TYPE = 'type'; + const NAME = 'name'; + const OTAG = 'otag'; + const CTAG = 'ctag'; + const INDEX = 'index'; + const END = 'end'; + const INDENT = 'indent'; + const NODES = 'nodes'; + const VALUE = 'value'; + const ARGS = 'args'; + + protected $state; + protected $tagType; + protected $tag; + protected $buffer; + protected $tokens; + protected $seenTag; + protected $lineStart; + protected $otag; + protected $ctag; + + /** + * Scan and tokenize template source. + * + * @param string $text Mustache template source to tokenize + * @param string $delimiters Optional, pass opening and closing delimiters + * + * @return array Set of Mustache tokens + */ + public function scan($text, $delimiters = null) + { + if ($text instanceof HandlebarsString) { + $text = $text->getString(); + } + + $this->reset(); + + if ($delimiters = trim($delimiters)) { + list($otag, $ctag) = explode(' ', $delimiters); + $this->otag = $otag; + $this->ctag = $ctag; + } + + $openingTagLength = strlen($this->otag); + $closingTagLength = strlen($this->ctag); + $firstOpeningTagCharacter = $this->otag[0]; + $firstClosingTagCharacter = $this->ctag[0]; + + $len = strlen($text); + + for ($i = 0; $i < $len; $i++) { + + $character = $text[$i]; + + switch ($this->state) { + + case self::IN_TEXT: + if ($character === $firstOpeningTagCharacter && $this->tagChange($this->otag, $text, $i, $openingTagLength) + ) { + $i--; + $this->flushBuffer(); + $this->state = self::IN_TAG_TYPE; + } else { + if ($character == "\n") { + $this->filterLine(); + } else { + $this->buffer .= $character; + } + } + break; + + case self::IN_TAG_TYPE: + + $i += $openingTagLength - 1; + if (isset($this->tagTypes[$text[$i + 1]])) { + $tag = $text[$i + 1]; + $this->tagType = $tag; + } else { + $tag = null; + $this->tagType = self::T_ESCAPED; + } + + if ($this->tagType === self::T_DELIM_CHANGE) { + $i = $this->changeDelimiters($text, $i); + $openingTagLength = strlen($this->otag); + $closingTagLength = strlen($this->ctag); + $firstOpeningTagCharacter = $this->otag[0]; + $firstClosingTagCharacter = $this->ctag[0]; + + $this->state = self::IN_TEXT; + } else { + if ($tag !== null) { + $i++; + } + $this->state = self::IN_TAG; + } + $this->seenTag = $i; + break; + + default: + if ($character === $firstClosingTagCharacter && $this->tagChange($this->ctag, $text, $i, $closingTagLength)) { + // Sections (Helpers) can accept parameters + // Same thing for Partials (little known fact) + if (in_array($this->tagType, [ + self::T_SECTION, + self::T_PARTIAL, + self::T_PARTIAL_2] + )) { + $newBuffer = explode(' ', trim($this->buffer), 2); + $args = ''; + if (count($newBuffer) == 2) { + $args = $newBuffer[1]; + } + $this->buffer = $newBuffer[0]; + } + $t = [ + self::TYPE => $this->tagType, + self::NAME => trim($this->buffer), + self::OTAG => $this->otag, + self::CTAG => $this->ctag, + self::INDEX => ($this->tagType == self::T_END_SECTION) ? + $this->seenTag - $openingTagLength : + $i + strlen($this->ctag), + ]; + if (isset($args)) { + $t[self::ARGS] = $args; + } + $this->tokens[] = $t; + unset($t); + unset($args); + $this->buffer = ''; + $i += strlen($this->ctag) - 1; + $this->state = self::IN_TEXT; + if ($this->tagType == self::T_UNESCAPED) { + if ($this->ctag == '}}') { + $i++; + } else { + // Clean up `{{{ tripleStache }}}` style tokens. + $lastIndex = count($this->tokens) - 1; + $lastName = $this->tokens[$lastIndex][self::NAME]; + if (substr($lastName, -1) === '}') { + $this->tokens[$lastIndex][self::NAME] = trim( + substr($lastName, 0, -1) + ); + } + } + } + } else { + $this->buffer .= $character; + } + break; + } + + } + + $this->filterLine(true); + + return $this->tokens; + } + + /** + * Helper function to reset tokenizer internal state. + * + * @return void + */ + protected function reset() + { + $this->state = self::IN_TEXT; + $this->tagType = null; + $this->tag = null; + $this->buffer = ''; + $this->tokens = []; + $this->seenTag = false; + $this->lineStart = 0; + $this->otag = '{{'; + $this->ctag = '}}'; + } + + /** + * Flush the current buffer to a token. + * + * @return void + */ + protected function flushBuffer() + { + if (!empty($this->buffer)) { + $this->tokens[] = [ + self::TYPE => self::T_TEXT, + self::VALUE => $this->buffer + ]; + $this->buffer = ''; + } + } + + /** + * Test whether the current line is entirely made up of whitespace. + * + * @return boolean True if the current line is all whitespace + */ + protected function lineIsWhitespace() + { + $tokensCount = count($this->tokens); + for ($j = $this->lineStart; $j < $tokensCount; $j++) { + $token = $this->tokens[$j]; + if (isset($this->tagTypes[$token[self::TYPE]])) { + if (isset($this->interpolatedTags[$token[self::TYPE]])) { + return false; + } + } elseif ($token[self::TYPE] == self::T_TEXT) { + if (preg_match('/\S/', $token[self::VALUE])) { + return false; + } + } + } + + return true; + } + + /** + * Filter out whitespace-only lines and store indent levels for partials. + * + * @param bool $noNewLine Suppress the newline? (default: false) + * + * @return void + */ + protected function filterLine($noNewLine = false) + { + $this->flushBuffer(); + if ($this->seenTag && $this->lineIsWhitespace()) { + $tokensCount = count($this->tokens); + for ($j = $this->lineStart; $j < $tokensCount; $j++) { + if ($this->tokens[$j][self::TYPE] == self::T_TEXT) { + if (isset($this->tokens[$j + 1]) + && $this->tokens[$j + 1][self::TYPE] == self::T_PARTIAL + ) { + $this->tokens[$j + 1][self::INDENT] + = $this->tokens[$j][self::VALUE]; + } + + $this->tokens[$j] = null; + } + } + } elseif (!$noNewLine) { + $this->tokens[] = [self::TYPE => self::T_TEXT, self::VALUE => "\n"]; + } + + $this->seenTag = false; + $this->lineStart = count($this->tokens); + } + + /** + * Change the current Mustache delimiters. Set new `otag` and `ctag` values. + * + * @param string $text Mustache template source + * @param int $index Current tokenizer index + * + * @return int New index value + */ + protected function changeDelimiters($text, $index) + { + $startIndex = strpos($text, '=', $index) + 1; + $close = '=' . $this->ctag; + $closeIndex = strpos($text, $close, $index); + + list($otag, $ctag) = explode( + ' ', + trim(substr($text, $startIndex, $closeIndex - $startIndex)) + ); + $this->otag = $otag; + $this->ctag = $ctag; + + return $closeIndex + strlen($close) - 1; + } + + /** + * Test whether it's time to change tags. + * + * @param string $tag Current tag name + * @param string $text Mustache template source + * @param int $index Current tokenizer index + * @param int $tagLength Length of the opening/closing tag string + * + * @return boolean True if this is a closing section tag + */ + protected function tagChange($tag, $text, $index, $tagLength) + { + return substr($text, $index, $tagLength) === $tag; + } + +} diff --git a/vendor/salesforce/handlebars-php/tests/Handlebars/HandlebarsTest.php b/vendor/salesforce/handlebars-php/tests/Handlebars/HandlebarsTest.php new file mode 100644 index 0000000..75253f6 --- /dev/null +++ b/vendor/salesforce/handlebars-php/tests/Handlebars/HandlebarsTest.php @@ -0,0 +1,448 @@ +assertTrue(class_exists('Handlebars\\Test')); + $this->assertTrue(class_exists('Handlebars\\Example\\Test')); + } + + /** + * Test basic tags + * + * @param string $src handlebars source + * @param array $data data + * @param string $result expected data + * + * @dataProvider simpleTagdataProvider + * + * @return void + */ + public function testBasicTags($src, $data, $result) + { + $loader = new \Handlebars\Loader\StringLoader(); + $engine = new \Handlebars\Handlebars(array('loader' => $loader)); + $this->assertEquals($result, $engine->render($src, $data)); + } + + /** + * Simple tag provider + * + * @return array + */ + public function simpleTagdataProvider() + { + return array( + array( + '{{! This is comment}}', + array(), + '' + ), + array( + '{{data}}', + array('data' => 'result'), + 'result' + ), + array( + '{{data.key}}', + array('data' => array('key' => 'result')), + 'result' + ), + ); + } + + + /** + * Test helpers (internal helpers) + * + * @param string $src handlebars source + * @param array $data data + * @param string $result expected data + * + * @dataProvider internalHelpersdataProvider + * + * @return void + */ + public function testSimpleHelpers($src, $data, $result) + { + $loader = new \Handlebars\Loader\StringLoader(); + $helpers = new \Handlebars\Helpers(); + $engine = new \Handlebars\Handlebars(array('loader' => $loader, 'helpers' => $helpers)); + + $this->assertEquals($result, $engine->render($src, $data)); + } + + /** + * Simple helpers provider + * + * @return array + */ + public function internalHelpersdataProvider() + { + return [ + [ + '{{#if data}}Yes{{/if}}', + ['data' => true], + 'Yes' + ], + [ + '{{#if data}}Yes{{/if}}', + ['data' => false], + '' + ], + [ + '{{#unless data}}OK{{/unless}}', + ['data' => false], + 'OK' + ], + [ + '{{#unless data}}OK {{else}}I believe{{/unless}}', + ['data' => true], + 'I believe' + ], + [ + '{{#with data}}{{key}}{{/with}}', + ['data' => ['key' => 'result']], + 'result' + ], + [ + '{{#each data}}{{this}}{{/each}}', + ['data' => [1, 2, 3, 4]], + '1234' + ], + [ + '{{#each data[0:2]}}{{this}}{{/each}}', + ['data' => [1, 2, 3, 4]], + '12' + ], + [ + '{{#each data[1:2]}}{{this}}{{/each}}', + ['data' => [1, 2, 3, 4]], + '23' + ], + [ + '{{#upper data}}', + ['data' => "hello"], + 'HELLO' + ], + [ + '{{#lower data}}', + ['data' => "HELlO"], + 'hello' + ], + [ + '{{#capitalize data}}', + ['data' => "hello"], + 'Hello' + ], + [ + '{{#capitalize_words data}}', + ['data' => "hello world"], + 'Hello World' + ], + [ + '{{#reverse data}}', + ['data' => "hello"], + 'olleh' + ], + [ + "{{#inflect count 'album' 'albums' }}", + ["count" => 1], + 'album' + ], + [ + "{{#inflect count 'album' 'albums' }}", + ["count" => 10], + 'albums' + ], + [ + "{{#inflect count '%d album' '%d albums' }}", + ["count" => 1], + '1 album' + ], + [ + "{{#inflect count '%d album' '%d albums' }}", + ["count" => 10], + '10 albums' + ], + [ + "{{#default data 'OK' }}", + ["data" => "hello"], + 'hello' + ], + [ + "{{#default data 'OK' }}", + [], + 'OK' + ], + [ + "{{#truncate data 8 '...'}}", + ["data" => "Hello World! How are you?"], + 'Hello Wo...' + ], + [ + "{{#raw}}I'm raw {{data}}{{/raw}}", + ["data" => "raw to be included, but won't :)"], + "I'm raw {{data}}" + ], + [ + "{{#repeat 3}}Yes {{/repeat}}", + [], + "Yes Yes Yes " + ], + [ + "{{#repeat 4}}Nice {{data}} {{/repeat}}", + ["data" => "Daddy!"], + "Nice Daddy! Nice Daddy! Nice Daddy! Nice Daddy! " + ], + [ + "{{#define test}}I'm Defined and Invoked{{/define}}{{#invoke test}}", + [], + "I'm Defined and Invoked" + ], + ]; + } + + /** + * @param string $src + * @param array $data + * @param string $result + * @param bool $enableDataVariables + * @dataProvider internalDataVariablesDataProvider + */ + public function testDataVariables($src, $data, $result, $enableDataVariables) + { + $loader = new \Handlebars\Loader\StringLoader(); + $helpers = new \Handlebars\Helpers(); + $engine = new \Handlebars\Handlebars(array( + 'loader' => $loader, + 'helpers' => $helpers, + 'enableDataVariables'=> $enableDataVariables, + )); + + $this->assertEquals($result, $engine->render($src, $data)); + } + + public function testDataVariables1() + { + $object = new stdClass; + $object->{'@first'} = 'apple'; + $object->{'@last'} = 'banana'; + $object->{'@index'} = 'carrot'; + $object->{'@unknown'} = 'zucchini'; + $data = ['data' => [$object]]; + $engine = new \Handlebars\Handlebars(array( + 'loader' => new \Handlebars\Loader\StringLoader(), + 'helpers' => new \Handlebars\Helpers(), + 'enableDataVariables'=> false, + )); + $template = "{{#each data}}{{@first}}, {{@last}}, {{@index}}, {{@unknown}}{{/each}}"; + + $this->assertEquals("", $engine->render($template, $data)); + } + + /** + * Data provider for data variables + * @return array + */ + public function internalDataVariablesDataProvider() + { + // Build a standard set of objects to test against + $keyPropertyName = '@key'; + $firstPropertyName = '@first'; + $lastPropertyName = '@last'; + $unknownPropertyName = '@unknown'; + $objects = []; + foreach (['apple', 'banana', 'carrot', 'zucchini'] as $itemValue) { + $object = new stdClass(); + $object->$keyPropertyName = $itemValue; + $object->$firstPropertyName = $itemValue; + $object->$lastPropertyName = $itemValue; + $object->$unknownPropertyName = $itemValue; + $objects[] = $object; + } + + // Build a list of scenarios. These will be used later to build fanned out scenarios that will be used against + // the test. Each entry represents two different tests: (1) when enableDataVariables is enabled and (2) not enabled. + $scenarios = [ + [ + 'src' => '{{#each data}}{{@index}}{{/each}}', + 'data' => ['data' => ['apple', 'banana', 'carrot', 'zucchini']], + // @index should work the same regardless of the feature flag + 'outputNotEnabled' => '0123', + 'outputEnabled' => '0123', + ], + [ + 'src' => '{{#each data}}{{@key}}{{/each}}', + 'data' => ['data' => ['apple', 'banana', 'carrot', 'zucchini']], + 'outputNotEnabled' => '', + 'outputEnabled' => '0123' + ], + [ + 'src' => '{{#each data}}{{#each this}}outer: {{@../key}},inner: {{@key}};{{/each}}{{/each}}', + 'data' => ['data' => [['apple', 'banana'], ['carrot', 'zucchini']]], + 'outputNotEnabled' => 'outer: ,inner: ;outer: ,inner: ;outer: ,inner: ;outer: ,inner: ;', + 'outputEnabled' => 'outer: 0,inner: 0;outer: 0,inner: 1;outer: 1,inner: 0;outer: 1,inner: 1;', + ], + [ + 'src' => '{{#each data}}{{#if @first}}true{{else}}false{{/if}}{{/each}}', + 'data' => ['data' => ['apple', 'banana', 'carrot', 'zucchini']], + 'outputNotEnabled' => 'falsefalsefalsefalse', + 'outputEnabled' => 'truefalsefalsefalse', + ], + [ + 'src' => '{{#each data}}{{@first}}{{/each}}', + 'data' => ['data' => ['apple', 'banana', 'carrot', 'zucchini']], + 'outputNotEnabled' => '', + 'outputEnabled' => 'truefalsefalsefalse', + ], + [ + 'src' => '{{#each data}}{{#each this}}outer: {{@../first}},inner: {{@first}};{{/each}}{{/each}}', + 'data' => ['data' => [['apple', 'banana'], ['carrot', 'zucchini']]], + 'outputNotEnabled' => 'outer: ,inner: ;outer: ,inner: ;outer: ,inner: ;outer: ,inner: ;', + 'outputEnabled' => 'outer: true,inner: true;outer: true,inner: false;outer: false,inner: true;outer: false,inner: false;', + ], + [ + 'src' => '{{#each data}}{{#if @last}}true{{else}}false{{/if}}{{/each}}', + 'data' => ['data' => ['apple', 'banana', 'carrot', 'zucchini']], + 'outputNotEnabled' => 'falsefalsefalsefalse', + 'outputEnabled' => 'falsefalsefalsetrue' + ], + [ + 'src' => '{{#each data}}{{@last}}{{/each}}', + 'data' => ['data' => ['apple', 'banana', 'carrot', 'zucchini']], + 'outputNotEnabled' => '', + 'outputEnabled' => 'falsefalsefalsetrue' + ], + [ + 'src' => '{{#each data}}{{#each this}}outer: {{@../last}},inner: {{@last}};{{/each}}{{/each}}', + 'data' => ['data' => [['apple', 'banana'], ['carrot', 'zucchini']]], + 'outputNotEnabled' => 'outer: ,inner: ;outer: ,inner: ;outer: ,inner: ;outer: ,inner: ;', + 'outputEnabled' => 'outer: false,inner: false;outer: false,inner: true;outer: true,inner: false;outer: true,inner: true;' + ], + [ + // @index variables are ignored and the data variable is used + 'src' => '{{#each data}}{{@index}}{{/each}}', + 'data' => ['data' => [['@index' => 'apple'], ['@index' => 'banana'], ['@index' => 'carrot'], ['@index' => 'zucchini']]], + 'outputNotEnabled' => '0123', + 'outputEnabled' => '0123' + ], + [ + // @key variables are ignored and the data variable is used + 'src' => '{{#each data}}{{@index}}{{/each}}', + 'data' => ['data' => $objects], + 'outputNotEnabled' => '0123', + 'outputEnabled' => '0123' + ], + [ + // @first variables are used when data variables are not enabled. + 'src' => '{{#each data}}{{@first}}{{/each}}', + 'data' => ['data' => $objects], + 'outputNotEnabled' => 'applebananacarrotzucchini', + 'outputEnabled' => 'truefalsefalsefalse' + ], + [ + // @last variables are used when data variables are not enabled. + 'src' => '{{#each data}}{{@last}}{{/each}}', + 'data' => ['data' => $objects], + 'outputNotEnabled' => 'applebananacarrotzucchini', + 'outputEnabled' => 'falsefalsefalsetrue' + ], + [ + // @unknown variables are used when data variables are not enabled however since "unknown" is not a valid + // value it should ignored. + 'src' => '{{#each data}}{{@unknown}}{{/each}}', + 'data' => ['data' => $objects], + 'outputNotEnabled' => 'applebananacarrotzucchini', + 'outputEnabled' => '' + ], + ]; + + // Build out a test case for when the enableDataVariables feature is enabled and when it's not + $fannedOutScenarios = []; + foreach ($scenarios as $scenario) { + $fannedOutScenarios['not enabled: ' . $scenario['src']] = [ + $scenario['src'], + $scenario['data'], + $scenario['outputNotEnabled'], + false, + ]; + $fannedOutScenarios['enabled: ' . $scenario['src']] = [ + $scenario['src'], + $scenario['data'], + $scenario['outputEnabled'], + true, + ]; + } + return $fannedOutScenarios; + } + + /** + * Management helpers + */ + public function testHelpersManagement() + { + $helpers = new \Handlebars\Helpers(array('test' => function () { + }), false); + $engine = new \Handlebars\Handlebars(array('helpers' => $helpers)); + $this->assertTrue(is_callable($engine->getHelper('test'))); + $this->assertTrue($engine->hasHelper('test')); + $engine->removeHelper('test'); + $this->assertFalse($engine->hasHelper('test')); + } + + /** + * Custom helper test + */ + public function testCustomHelper() + { + $loader = new \Handlebars\Loader\StringLoader(); + $engine = new \Handlebars\Handlebars(array('loader' => $loader)); + $engine->addHelper('test', function () { + return 'Test helper is called'; + }); + $this->assertEquals('Test helper is called', $engine->render('{{#test}}', [])); + } + + /** + * @param $dir + * + * @return bool + */ + private function delTree($dir) + { + $files = array_diff(scandir($dir), array('.', '..')); + foreach ($files as $file) { + (is_dir("$dir/$file")) ? delTree("$dir/$file") : unlink("$dir/$file"); + } + + return rmdir($dir); + } + + /** + * Its not a good test :) but ok + */ + public function testCacheSystem() + { + $path = sys_get_temp_dir() . '/__cache__handlebars'; + + @$this->delTree($path); + + $dummy = new \Handlebars\Cache\Disk($path); + $engine = new \Handlebars\Handlebars(array('cache' => $dummy)); + $this->assertEquals(0, count(glob($path . '/*'))); + $engine->render('test', array()); + $this->assertEquals(1, count(glob($path . '/*'))); + } +} \ No newline at end of file diff --git a/vendor/salesforce/handlebars-php/tests/bootstrap.php b/vendor/salesforce/handlebars-php/tests/bootstrap.php new file mode 100644 index 0000000..2f72e3d --- /dev/null +++ b/vendor/salesforce/handlebars-php/tests/bootstrap.php @@ -0,0 +1,4 @@ +