From 74c073bd7e72926b842fa28a5d0fe78515531a91 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 27 Apr 2026 17:57:24 +0300 Subject: [PATCH] 234 attempt to fix js error Uncaught SyntaxError: Unexpected identifier 'hidden' --- v1/Application.cfc | 2 +- v1/resources/catalog_service_ls.cfc | 10 +- v1/resources/catalog_service_param_ls.cfc | 12 +- v1/taffy/.github/release.yml | 14 - v1/taffy/.github/workflows/pr_tests.yml | 22 - v1/taffy/.github/workflows/release.yml | 86 - .../workflows/require-semver-label.yml | 19 - v1/taffy/.gitignore | 5 +- v1/taffy/.travis.yml | 28 - v1/taffy/CLAUDE.md | 40 + v1/taffy/ReadMe.md | 13 +- v1/taffy/bonus/AnythingToXmlSerializer.cfc | 18 +- v1/taffy/bonus/ILogAdapter.cfc | 13 +- v1/taffy/bonus/JSONUtil.cfc | 553 ---- v1/taffy/bonus/JsonUtilSerializer.cfc | 29 +- v1/taffy/bonus/LogToBugLogHQ.cfc | 96 +- v1/taffy/bonus/LogToBugsnag.cfc | 235 +- v1/taffy/bonus/LogToDevNull.cfc | 17 +- v1/taffy/bonus/LogToEmail.cfc | 94 +- v1/taffy/bonus/LogToHoth.cfc | 28 +- v1/taffy/bonus/LogToLog.cfc | 34 +- v1/taffy/bonus/LogToScreen.cfc | 31 +- v1/taffy/box.json | 142 +- v1/taffy/build.xml | 109 - v1/taffy/core/api.cfc | 2750 +++++++++-------- v1/taffy/core/baseDeserializer.cfc | 90 +- v1/taffy/core/baseSerializer.cfc | 350 ++- v1/taffy/core/factory.cfc | 340 +- v1/taffy/core/nativeJsonDeserializer.cfc | 33 +- v1/taffy/core/nativeJsonSerializer.cfc | 15 +- v1/taffy/core/openapi.cfc | 297 ++ v1/taffy/core/resource.cfc | 246 +- v1/taffy/dashboard/asset.cfm | 12 +- v1/taffy/dashboard/bootstrap.min.js | 6 - v1/taffy/dashboard/bootstrap.min.less | 9 - v1/taffy/dashboard/dash.css | 9 - v1/taffy/dashboard/dash.js | 732 +++-- v1/taffy/dashboard/dash.less | 228 -- v1/taffy/dashboard/dashboard.cfm | 967 +++--- v1/taffy/dashboard/dashboard.css | 853 +++++ v1/taffy/dashboard/docs.cfm | 406 ++- v1/taffy/dashboard/highlight-github.min.css | 39 +- v1/taffy/dashboard/highlight.min.js | 1242 +++++++- v1/taffy/dashboard/jquery.min.js | 4 - v1/taffy/dashboard/swagger.svg | 1 + v1/taffy/docs/0.1.0.md | 64 +- v1/taffy/docs/2.0.0.md | 40 +- v1/taffy/docs/2.0.1.md | 40 +- v1/taffy/docs/2.1.0.md | 46 +- v1/taffy/docs/2.2.0.md | 46 +- v1/taffy/docs/2.2.3.md | 44 +- v1/taffy/docs/2.2.4.md | 44 +- v1/taffy/docs/3.0.0.md | 54 +- v1/taffy/docs/3.1.0.md | 60 +- v1/taffy/docs/3.2.0.md | 64 +- v1/taffy/docs/3.3.0.md | 64 +- v1/taffy/docs/3.4.0.md | 64 +- v1/taffy/docs/3.5.0.md | 64 +- v1/taffy/docs/3.6.0.md | 64 +- v1/taffy/docs/3.7.0.md | 1254 ++++++++ v1/taffy/docs/3.7.1.md | 1254 ++++++++ v1/taffy/docs/4.0.0.md | 1387 +++++++++ v1/taffy/docs/@next.md | 219 +- v1/taffy/docs/_coverpage.md | 12 + v1/taffy/docs/index.html | 949 +++++- v1/taffy/docs/readme.md | 158 +- v1/taffy/lib/README.TXT | 3 - v1/taffy/lib/ant-contrib-1.0b3.jar | Bin 224277 -> 0 bytes v1/taffy/lib/mxunit-ant.jar | Bin 413684 -> 0 bytes v1/taffy/package.json | 31 +- v1/taffy/server-lucee5.json | 12 + v1/taffy/server-lucee6.json | 12 + v1/taffy/server-lucee7.json | 12 + v1/taffy/server.json | 5 - v1/taffy/tests/Application.cfc | 118 +- v1/taffy/tests/fixtures/SampleData.cfc | 55 + v1/taffy/tests/helpers/MetadataHelper.cfc | 18 + v1/taffy/tests/index.cfm | 0 v1/taffy/tests/lib/Hoth/HothReporter.cfc | 147 - v1/taffy/tests/lib/Hoth/HothTracker.cfc | 264 -- v1/taffy/tests/lib/Hoth/Report.cfc | 41 - v1/taffy/tests/lib/Hoth/config/HothConfig.cfc | 79 - v1/taffy/tests/lib/Hoth/db/.gitignore | 1 - v1/taffy/tests/lib/Hoth/db/readme.txt | 3 - .../lib/Hoth/extras/ColdBoxInterceptor.cfc | 98 - v1/taffy/tests/lib/Hoth/logs/readme.txt | 4 - v1/taffy/tests/lib/Hoth/object/CoreConfig.cfc | 74 - .../Hoth/object/HothApplicationManager.cfc | 118 - v1/taffy/tests/lib/Hoth/object/HothTime.cfc | 30 - .../tests/lib/Hoth/object/iHothConfig.cfc | 19 - v1/taffy/tests/lib/bugLog/bugLogListener.cfc | 457 --- v1/taffy/tests/lib/di1/ioc.cfc | 874 ------ v1/taffy/tests/resources/BasicAuth.cfc | 9 - v1/taffy/tests/resources/ConflictingURI.cfc | 11 - v1/taffy/tests/resources/EchoMember.cfc | 27 - .../resources/EchoMethodTunnelMember.cfc | 38 - v1/taffy/tests/resources/EchoRegexMember.cfc | 26 - v1/taffy/tests/resources/EchoURIAlias.cfc | 21 - .../resources/MockMultiTokenResource.cfc | 14 + .../tests/resources/MockSimpleResource.cfc | 18 + .../tests/resources/MockTokenResource.cfc | 24 + .../resources/MockVerbOverrideResource.cfc | 24 + v1/taffy/tests/resources/acceptFileUpload.cfc | 17 - .../tests/resources/customJsonSerializer.cfc | 22 - v1/taffy/tests/resources/dependency1.cfc | 1 - v1/taffy/tests/resources/dependency2.cfc | 1 - v1/taffy/tests/resources/exceptionMember.cfc | 7 - .../uriAliasDoesntBeginWithForwardSlash.cfc | 7 - v1/taffy/tests/resources/uriConflict.cfc | 7 - .../uriDoesntBeginWithForwardSlash.cfc | 7 - v1/taffy/tests/resourcesError/ErrorMember.cfc | 5 - v1/taffy/tests/runner.cfm | 23 + v1/taffy/tests/someFolder/someOtherFile.cfm | 1 - v1/taffy/tests/specs/e2e/EndToEndSpec.cfc | 173 ++ v1/taffy/tests/specs/e2e/OpenApiSpec.cfc | 84 + .../specs/integration/ConfigurationSpec.cfc | 228 ++ .../specs/integration/HTTPMethodsSpec.cfc | 220 ++ .../tests/specs/integration/HooksSpec.cfc | 239 ++ .../integration/ResponseHandlingSpec.cfc | 252 ++ .../specs/integration/URIMatchingSpec.cfc | 169 + .../tests/specs/unit/BaseDeserializerSpec.cfc | 80 + .../tests/specs/unit/BaseSerializerSpec.cfc | 325 ++ v1/taffy/tests/specs/unit/FactorySpec.cfc | 161 + .../specs/unit/NativeJsonDeserializerSpec.cfc | 149 + .../specs/unit/NativeJsonSerializerSpec.cfc | 205 ++ v1/taffy/tests/specs/unit/OpenApiSpec.cfc | 132 + v1/taffy/tests/specs/unit/ResourceSpec.cfc | 207 ++ v1/taffy/tests/testapi/Application.cfc | 27 + v1/taffy/tests/testapi/index.cfm | 1 + .../testapi/resources/EchoMemberResource.cfc | 17 + .../resources/EchoMultiTokenResource.cfc | 7 + .../tests/testapi/resources/EchoResource.cfc | 12 + v1/taffy/tests/tests/Application.cfc | 29 - v1/taffy/tests/tests/DirectoryTestSuite.cfc | 207 -- v1/taffy/tests/tests/HttpAntRunner.cfc | 92 - v1/taffy/tests/tests/RemoteFacade.cfc | 1 - v1/taffy/tests/tests/TestConflict.cfc | 22 - v1/taffy/tests/tests/TestCore.cfc | 645 ---- v1/taffy/tests/tests/TestDI1Factory.cfc | 94 - v1/taffy/tests/tests/TestFactory.cfc | 101 - v1/taffy/tests/tests/TestLoggers.cfc | 63 - v1/taffy/tests/tests/TestRepresentations.cfc | 40 - v1/taffy/tests/tests/TestResource.cfc | 50 - v1/taffy/tests/tests/base.cfc | 83 - v1/taffy/tests/tests/index.cfm | 10 - v1/taffy/tests/tests/list.cfm | 19 - v1/taffy/tests/tests/run.cfm | 46 - v1/taffy/tests/tests/upload.png | Bin 71315 -> 0 bytes v1/taffy/verify/index.cfm | 2 +- 149 files changed, 14361 insertions(+), 8886 deletions(-) delete mode 100644 v1/taffy/.github/release.yml delete mode 100644 v1/taffy/.github/workflows/pr_tests.yml delete mode 100644 v1/taffy/.github/workflows/release.yml delete mode 100644 v1/taffy/.github/workflows/require-semver-label.yml delete mode 100644 v1/taffy/.travis.yml create mode 100644 v1/taffy/CLAUDE.md delete mode 100644 v1/taffy/bonus/JSONUtil.cfc delete mode 100644 v1/taffy/build.xml create mode 100644 v1/taffy/core/openapi.cfc delete mode 100644 v1/taffy/dashboard/bootstrap.min.js delete mode 100644 v1/taffy/dashboard/bootstrap.min.less delete mode 100644 v1/taffy/dashboard/dash.css delete mode 100644 v1/taffy/dashboard/dash.less create mode 100644 v1/taffy/dashboard/dashboard.css delete mode 100644 v1/taffy/dashboard/jquery.min.js create mode 100644 v1/taffy/dashboard/swagger.svg create mode 100644 v1/taffy/docs/3.7.0.md create mode 100644 v1/taffy/docs/3.7.1.md create mode 100644 v1/taffy/docs/4.0.0.md create mode 100644 v1/taffy/docs/_coverpage.md delete mode 100644 v1/taffy/lib/README.TXT delete mode 100644 v1/taffy/lib/ant-contrib-1.0b3.jar delete mode 100644 v1/taffy/lib/mxunit-ant.jar create mode 100644 v1/taffy/server-lucee5.json create mode 100644 v1/taffy/server-lucee6.json create mode 100644 v1/taffy/server-lucee7.json delete mode 100644 v1/taffy/server.json create mode 100644 v1/taffy/tests/fixtures/SampleData.cfc create mode 100644 v1/taffy/tests/helpers/MetadataHelper.cfc delete mode 100644 v1/taffy/tests/index.cfm delete mode 100644 v1/taffy/tests/lib/Hoth/HothReporter.cfc delete mode 100644 v1/taffy/tests/lib/Hoth/HothTracker.cfc delete mode 100644 v1/taffy/tests/lib/Hoth/Report.cfc delete mode 100644 v1/taffy/tests/lib/Hoth/config/HothConfig.cfc delete mode 100644 v1/taffy/tests/lib/Hoth/db/.gitignore delete mode 100644 v1/taffy/tests/lib/Hoth/db/readme.txt delete mode 100644 v1/taffy/tests/lib/Hoth/extras/ColdBoxInterceptor.cfc delete mode 100644 v1/taffy/tests/lib/Hoth/logs/readme.txt delete mode 100644 v1/taffy/tests/lib/Hoth/object/CoreConfig.cfc delete mode 100644 v1/taffy/tests/lib/Hoth/object/HothApplicationManager.cfc delete mode 100644 v1/taffy/tests/lib/Hoth/object/HothTime.cfc delete mode 100644 v1/taffy/tests/lib/Hoth/object/iHothConfig.cfc delete mode 100644 v1/taffy/tests/lib/bugLog/bugLogListener.cfc delete mode 100644 v1/taffy/tests/lib/di1/ioc.cfc delete mode 100644 v1/taffy/tests/resources/BasicAuth.cfc delete mode 100644 v1/taffy/tests/resources/ConflictingURI.cfc delete mode 100644 v1/taffy/tests/resources/EchoMember.cfc delete mode 100644 v1/taffy/tests/resources/EchoMethodTunnelMember.cfc delete mode 100644 v1/taffy/tests/resources/EchoRegexMember.cfc delete mode 100644 v1/taffy/tests/resources/EchoURIAlias.cfc create mode 100644 v1/taffy/tests/resources/MockMultiTokenResource.cfc create mode 100644 v1/taffy/tests/resources/MockSimpleResource.cfc create mode 100644 v1/taffy/tests/resources/MockTokenResource.cfc create mode 100644 v1/taffy/tests/resources/MockVerbOverrideResource.cfc delete mode 100644 v1/taffy/tests/resources/acceptFileUpload.cfc delete mode 100644 v1/taffy/tests/resources/customJsonSerializer.cfc delete mode 100644 v1/taffy/tests/resources/dependency1.cfc delete mode 100644 v1/taffy/tests/resources/dependency2.cfc delete mode 100644 v1/taffy/tests/resources/exceptionMember.cfc delete mode 100644 v1/taffy/tests/resources/uriAliasDoesntBeginWithForwardSlash.cfc delete mode 100644 v1/taffy/tests/resources/uriConflict.cfc delete mode 100644 v1/taffy/tests/resources/uriDoesntBeginWithForwardSlash.cfc delete mode 100644 v1/taffy/tests/resourcesError/ErrorMember.cfc create mode 100644 v1/taffy/tests/runner.cfm delete mode 100644 v1/taffy/tests/someFolder/someOtherFile.cfm create mode 100644 v1/taffy/tests/specs/e2e/EndToEndSpec.cfc create mode 100644 v1/taffy/tests/specs/e2e/OpenApiSpec.cfc create mode 100644 v1/taffy/tests/specs/integration/ConfigurationSpec.cfc create mode 100644 v1/taffy/tests/specs/integration/HTTPMethodsSpec.cfc create mode 100644 v1/taffy/tests/specs/integration/HooksSpec.cfc create mode 100644 v1/taffy/tests/specs/integration/ResponseHandlingSpec.cfc create mode 100644 v1/taffy/tests/specs/integration/URIMatchingSpec.cfc create mode 100644 v1/taffy/tests/specs/unit/BaseDeserializerSpec.cfc create mode 100644 v1/taffy/tests/specs/unit/BaseSerializerSpec.cfc create mode 100644 v1/taffy/tests/specs/unit/FactorySpec.cfc create mode 100644 v1/taffy/tests/specs/unit/NativeJsonDeserializerSpec.cfc create mode 100644 v1/taffy/tests/specs/unit/NativeJsonSerializerSpec.cfc create mode 100644 v1/taffy/tests/specs/unit/OpenApiSpec.cfc create mode 100644 v1/taffy/tests/specs/unit/ResourceSpec.cfc create mode 100644 v1/taffy/tests/testapi/Application.cfc create mode 100644 v1/taffy/tests/testapi/index.cfm create mode 100644 v1/taffy/tests/testapi/resources/EchoMemberResource.cfc create mode 100644 v1/taffy/tests/testapi/resources/EchoMultiTokenResource.cfc create mode 100644 v1/taffy/tests/testapi/resources/EchoResource.cfc delete mode 100644 v1/taffy/tests/tests/Application.cfc delete mode 100644 v1/taffy/tests/tests/DirectoryTestSuite.cfc delete mode 100644 v1/taffy/tests/tests/HttpAntRunner.cfc delete mode 100644 v1/taffy/tests/tests/RemoteFacade.cfc delete mode 100644 v1/taffy/tests/tests/TestConflict.cfc delete mode 100644 v1/taffy/tests/tests/TestCore.cfc delete mode 100644 v1/taffy/tests/tests/TestDI1Factory.cfc delete mode 100644 v1/taffy/tests/tests/TestFactory.cfc delete mode 100644 v1/taffy/tests/tests/TestLoggers.cfc delete mode 100644 v1/taffy/tests/tests/TestRepresentations.cfc delete mode 100644 v1/taffy/tests/tests/TestResource.cfc delete mode 100644 v1/taffy/tests/tests/base.cfc delete mode 100644 v1/taffy/tests/tests/index.cfm delete mode 100644 v1/taffy/tests/tests/list.cfm delete mode 100644 v1/taffy/tests/tests/run.cfm delete mode 100644 v1/taffy/tests/tests/upload.png diff --git a/v1/Application.cfc b/v1/Application.cfc index 2228049..94f5371 100644 --- a/v1/Application.cfc +++ b/v1/Application.cfc @@ -57,7 +57,7 @@ //variables.framework.docs={}; variables.framework.docs.APIName="svc-api"; - variables.framework.docs.APIVersion="0.233"; /*$ git config --global --unset user.password*/ + variables.framework.docs.APIVersion="0.234"; /*$ git config --global --unset user.password*/ variables.framework.globalHeaders = structNew(); variables.framework.globalHeaders["Access-Control-Expose-Headers"] = "Location"; diff --git a/v1/resources/catalog_service_ls.cfc b/v1/resources/catalog_service_ls.cfc index ef27bbb..0658a52 100644 --- a/v1/resources/catalog_service_ls.cfc +++ b/v1/resources/catalog_service_ls.cfc @@ -112,11 +112,15 @@ limit #maxrows# - - + + + select count(*) as cnt + from service_catalog.service s + + @@ -124,7 +128,7 @@ - + diff --git a/v1/resources/catalog_service_param_ls.cfc b/v1/resources/catalog_service_param_ls.cfc index 138a506..ac18d18 100644 --- a/v1/resources/catalog_service_param_ls.cfc +++ b/v1/resources/catalog_service_param_ls.cfc @@ -141,11 +141,15 @@ limit #maxrows# - - - + + + select count(*) as cnt + from service_catalog.service_param p + join service_catalog.service s on (p.service_id=s.service_id) + + @@ -153,7 +157,7 @@ - + diff --git a/v1/taffy/.github/release.yml b/v1/taffy/.github/release.yml deleted file mode 100644 index c426d0e..0000000 --- a/v1/taffy/.github/release.yml +++ /dev/null @@ -1,14 +0,0 @@ -changelog: - exclude: - labels: - - release-ignore - categories: - - title: Breaking Changes ⚠️ - labels: - - Semver-Major - - title: New Features 🎉 - labels: - - Semver-Minor - - title: Bug Fixes 🐞 - labels: - - Semver-Patch diff --git a/v1/taffy/.github/workflows/pr_tests.yml b/v1/taffy/.github/workflows/pr_tests.yml deleted file mode 100644 index f655cba..0000000 --- a/v1/taffy/.github/workflows/pr_tests.yml +++ /dev/null @@ -1,22 +0,0 @@ -name: Run tests for all PRs -on: - push: - branches: - - feature/github-actions - -jobs: - test: - runs-on: ubuntu-20.04 - steps: - - - name: Checkout Code - id: git-checkout - uses: actions/checkout@v2 - - - name: Install dependencies - uses: pixl8/github-action-box-install@v2 - - - name: Run tests - uses: pixl8/github-action-box-test@v3 - with: - output_file: /tests/test-results.txt diff --git a/v1/taffy/.github/workflows/release.yml b/v1/taffy/.github/workflows/release.yml deleted file mode 100644 index 0d49a0e..0000000 --- a/v1/taffy/.github/workflows/release.yml +++ /dev/null @@ -1,86 +0,0 @@ -name: Release New Version - -# Based on: https://github.blog/2021-12-16-5-automations-every-developer-should-be-running/ - -on: - workflow_dispatch: - inputs: - version: - description: "Largest semver bump of new version (major / minor / patch)" - required: true - type: choice - options: - - patch - - minor - - major - -jobs: - bump-version: - runs-on: ubuntu-latest - - steps: - # Check out the content (source branch). Use a deploy key so that - # when we push changes, it will trigger the release workflow - # run that runs on: tag. (Using the GitHub token would - # not run the workflow to prevent infinite recursion.) - - name: Check out source - uses: actions/checkout@v2 - with: - ssh-key: ${{ secrets.DEPLOY_KEY }} - - - name: Setup Node.js - uses: actions/setup-node@v2 - with: - node-version: "16" - - - name: Setup Git - run: | - git config user.name 'release-bot' - git config user.email 'adamtuttlecodes@gmail.com' - - - name: bump version - run: npm version ${{ github.event.inputs.version }} - - - name: get-npm-version - id: package-version - uses: martinbeentjes/npm-get-version-action@master - - - name: Update version in api.cfc - run: | - cat core/api.cfc | sed 's/local\._taffy\.version = \"[0-9]\{1,\}\.[0-9]\{1,\}\.[0-9]\{1,\}\"/local._taffy.version = "${{ steps.package-version.outputs.current-version }}"/gi' > core/api.new.cfc - rm -f core/api.cfc - mv core/api.new.cfc core/api.cfc - git add core/api.cfc - git commit --amend --no-edit - - - name: Cut a docs file for the new release - run: | - cat docs/@next.md | sed 's/@version@/${{ steps.package-version.outputs.current-version }}/gi' > docs/${{ steps.package-version.outputs.current-version }}.md - git add docs/${{ steps.package-version.outputs.current-version }}.md - cat docs/readme.md | sed 's/\<\!--new_docs_links_here--\>/\<\!--new_docs_links_here--\>\n\n- \[\v${{ steps.package-version.outputs.current-version }}]\(${{ steps.package-version.outputs.current-version }}.md\)/g' > docs/readme-next.md - rm -f docs/readme.md - mv docs/readme-next.md docs/readme.md - git add docs/readme.md - git commit --amend --no-edit - - - name: Push latest version - run: git push origin main --follow-tags - - - name: Create Release Notes - uses: actions/github-script@v4.0.2 - with: - github-token: ${{secrets.GITHUB_TOKEN}} - script: | - await github.request(`POST /repos/${{ github.repository }}/releases`, { - tag_name: "v${{ steps.package-version.outputs.current-version }}", - generate_release_notes: true - }); - - - name: Tweet-trigger-publish-release - uses: mugi111/tweet-trigger-release@v1.1 - with: - consumer_key: ${{ secrets.TWITTER_CONSUMER_API_KEY }} - consumer_secret: ${{ secrets.TWITTER_CONSUMER_API_SECRET }} - access_token_key: ${{ secrets.TWITTER_ACCESS_TOKEN }} - access_token_secret: ${{ secrets.TWITTER_ACCESS_TOKEN_SECRET }} - tweet_body: "🍬 Taffy Version ${{steps.package-version.outputs.current-version}} was just released! https://github.com/atuttle/Taffy/releases/tag/v${{ steps.package-version.outputs.current-version }}" diff --git a/v1/taffy/.github/workflows/require-semver-label.yml b/v1/taffy/.github/workflows/require-semver-label.yml deleted file mode 100644 index 840aadb..0000000 --- a/v1/taffy/.github/workflows/require-semver-label.yml +++ /dev/null @@ -1,19 +0,0 @@ -name: Require Semver Label - -on: - pull_request: - types: [opened, reopened, labeled, unlabeled, ready_for_review, synchronize] - -jobs: - check_pr_labels: - runs-on: ubuntu-latest - name: Verify that the PR has a valid label - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Verify PR label action - uses: jesusvasquez333/verify-pr-label-action@v1.4.0 - with: - github-token: "${{ secrets.GITHUB_TOKEN }}" - valid-labels: 'Semver-Major, Semver-Minor, Semver-Patch' - pull-request-number: '${{ github.event.pull_request.number }}' diff --git a/v1/taffy/.gitignore b/v1/taffy/.gitignore index 2478d12..9404d25 100644 --- a/v1/taffy/.gitignore +++ b/v1/taffy/.gitignore @@ -47,5 +47,6 @@ out/ # generated by JIRA plugin atlassian-ide-plugin.xml -# generated by Crashlytics plugin (for Android Studio and Intellij) -com_crashlytics_export_strings.xml +# docs/etc that shouldn't be committed +.ralph +.ignore diff --git a/v1/taffy/.travis.yml b/v1/taffy/.travis.yml deleted file mode 100644 index 7914b92..0000000 --- a/v1/taffy/.travis.yml +++ /dev/null @@ -1,28 +0,0 @@ -language: java -sudo: false -jdk: -- openjdk8 -services: - - mysql -env: - global: - - TEST_RUNNER_URI=/tests/tests/run.cfm?reporter=text - - DB_USER=travis - - DB_PASS= - matrix: - - CFENGINE=lucee@4.5 - - CFENGINE=lucee@5 - - CFENGINE=adobe@10 - - CFENGINE=adobe@11 - - CFENGINE=adobe@2016 -before_install: -- git clone --depth 1 https://github.com/foundeo/cfmatrix.git cfmatrix -- mysql -e 'CREATE DATABASE IF NOT EXISTS buglog;' -install: -- bash ./cfmatrix/install.sh -- mysql buglog < tests/BugLogHQ/install/mysql.sql -before_script: -- cfmatrix/bin/box cfconfig cfmapping list -script: -- bash ./cfmatrix/run.sh -- cfmatrix/bin/box server log diff --git a/v1/taffy/CLAUDE.md b/v1/taffy/CLAUDE.md new file mode 100644 index 0000000..0bb21b3 --- /dev/null +++ b/v1/taffy/CLAUDE.md @@ -0,0 +1,40 @@ +# Taffy + +REST API framework for CFML + +## Running Tests + +You can check if box ("commandbox") cli is install by running `box version`. +You can install box by running `brew install commandbox`. + +Then install project dependencies: `box install` + +### Start servers + +box run-script start:all +box run-script start:lucee5 +box run-script start:lucee6 +box run-script start:lucee7 + +### Run tests + +box run-script test:all +box run-script test:lucee5 +box run-script test:lucee6 +box run-script test:lucee7 + +### Stop servers + +box run-script stop:all +box run-script stop:lucee5 +box run-script stop:lucee6 +box run-script stop:lucee7 + +## Documentation References + +- Taffy documentation: `./docs/` +- CFML Syntax docs + - cfdocs has cross-platform reference data in `.ignore/cfdocs/` + - Lucee docs are in `.ignore/lucee-docs/` +- Testbox docs: `.ignore/testbox-docs/` +- Commandbox docs: `.ignore/commandbox-docs/` diff --git a/v1/taffy/ReadMe.md b/v1/taffy/ReadMe.md index 08932bb..6d3e695 100644 --- a/v1/taffy/ReadMe.md +++ b/v1/taffy/ReadMe.md @@ -7,7 +7,7 @@ **PROBLEM:** Creating REST APIs with the native functionality in ColdFusion 10+ and Lucee is verbose, complex, and developer-hostile. Or maybe you're still on an older version of ColdFusion. -**SOLUTION:** A framework that focuses on Developer Experience and helps you "fall into a pit of success". **You've come to the right place.** Taffy is low friction, simple to get started, and compatible as far back as ColdFusion 8. CF8 was released in 2007! 😱 +**SOLUTION:** A framework that focuses on Developer Experience and helps you "fall into a pit of success". **You've come to the right place.** Taffy is low friction, and simple to get started. --- @@ -21,8 +21,8 @@ ## Currently Supported Versions -- Taffy 3.3.x+ -- Taffy 2.2.x +- Taffy 4.0.0+ +- Taffy 3.7.x+ If you file a bug or ask for support please indicate which version of Taffy you're using. If it's an older release, we usually ask you to upgrade. Officially, we promise to support the current and previous **minor** releases and the last **minor** release of the previous **major** release. To the best of our abilities Taffy follows the versioning guidelines defined in [semver](https://semver.org/). @@ -44,7 +44,7 @@ Features and bug fixes are coordinated via the [GitHub issues list](https://gith ## Community -The most active place where Taffy users and contributors gather is in the **#taffy** channel of the [CFML Slack][4]. It's a great place to ask for help. We also have [a mailing list][1], but it hasn't been used much since the CFML Slack came around. +The most active place where Taffy users and contributors gather is in the **#taffy** channel of the [CFML Slack][4]. It's a great place to ask for help. ## Need serious help? @@ -62,7 +62,6 @@ If your problem is too big or too private to ask for help in a chat room, [I am > > 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. -[1]: https://groups.google.com/forum/#!forum/taffy-users [3]: https://github.com/atuttle/Taffy/wiki -[4]: https://cfml-slack.herokuapp.com -[5]: https://twitter.com/adamtuttle +[4]: https://cfml-slack.net +[5]: https://bsky.app/profile/adamtuttle.codes diff --git a/v1/taffy/bonus/AnythingToXmlSerializer.cfc b/v1/taffy/bonus/AnythingToXmlSerializer.cfc index 6cac24c..cf22d57 100644 --- a/v1/taffy/bonus/AnythingToXmlSerializer.cfc +++ b/v1/taffy/bonus/AnythingToXmlSerializer.cfc @@ -1,15 +1,7 @@ - +component extends="taffy.core.baseSerializer" { - + public function getAsXML() output="false" taffy_mime="application/xml" taffy_default="true" { + return application.anythingToXml.toXml(variables.data); + } - - - - - +} diff --git a/v1/taffy/bonus/ILogAdapter.cfc b/v1/taffy/bonus/ILogAdapter.cfc index f4b57bd..642d43a 100644 --- a/v1/taffy/bonus/ILogAdapter.cfc +++ b/v1/taffy/bonus/ILogAdapter.cfc @@ -1,11 +1,6 @@ - +interface { - - - - - - - + public function init(config, tracker) hint="I accept a configuration structure to setup and return myself"; + public function saveLog(exception) hint="I log or otherwise notify you of an exception"; - \ No newline at end of file +} diff --git a/v1/taffy/bonus/JSONUtil.cfc b/v1/taffy/bonus/JSONUtil.cfc deleted file mode 100644 index ca46b31..0000000 --- a/v1/taffy/bonus/JSONUtil.cfc +++ /dev/null @@ -1,553 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/v1/taffy/bonus/JsonUtilSerializer.cfc b/v1/taffy/bonus/JsonUtilSerializer.cfc index 41a5165..ebebdd8 100644 --- a/v1/taffy/bonus/JsonUtilSerializer.cfc +++ b/v1/taffy/bonus/JsonUtilSerializer.cfc @@ -1,26 +1,9 @@ - +component extends="taffy.core.baseSerializer" { - - - - - + public function getAsJson() output="false" taffy_mime="application/json" taffy_default="true" { + return variables.jsonUtil.serialize(variables.data); + } - - - - - - +} diff --git a/v1/taffy/bonus/LogToBugLogHQ.cfc b/v1/taffy/bonus/LogToBugLogHQ.cfc index fa2bda7..0b2964c 100644 --- a/v1/taffy/bonus/LogToBugLogHQ.cfc +++ b/v1/taffy/bonus/LogToBugLogHQ.cfc @@ -1,62 +1,54 @@ - +component implements="taffy.bonus.ILogAdapter" { - - - + public function init(config, tracker="") { + if (structKeyExists(arguments, "tracker") && isObject(arguments.tracker)) { + // used to inject mocking object for testing + variables.blhq = arguments.tracker; + } else { + var svc = "bugLog.client.bugLogService"; + if (structKeyExists(arguments.config, "service")) { + svc = arguments.config.service; + } - - - - - - - - - + variables.blhq = createObject("component", svc); + variables.blhq.init(argumentCollection=arguments.config); + } - - - + param name="arguments.config.message" default="Exception trapped in API"; + variables.message = arguments.config.message; - - + return this; + } - - + public function saveLog(exception) { + var msg = ''; - - + if (structKeyExists(exception, 'rootcause') && structKeyExists(exception.rootcause, 'cause') && structKeyExists(exception.rootcause.cause, 'message')) { + msg = exception.rootcause.cause.message; + } else if (structKeyExists(exception, 'cause') && structKeyExists(exception.cause, 'message')) { + msg = exception.cause.message; + } else if (structKeyExists(exception, 'message')) { + msg = exception.message; + } else { + msg = variables.message; + } - + // You can use addDebugData() in resources to set this value + if (structKeyExists(request, "debugData") and !structKeyExists(exception, "extraInfo")) { + exception.extraInfo = request.debugData; + } - - - - - - - - - + var reqHeaders = getHTTPRequestData().headers; + var reqBody = getHTTPRequestData().content; + // on input with content-type "application/json" CF seems to expose it as binary data. Here we convert it back to plain text + if (isBinary(reqBody)) { + reqBody = charsetEncode(reqBody, "UTF-8"); + } + if (isJson(reqBody)) { + reqBody = deserializeJson(reqBody); + } - - - - + variables.blhq.notifyService(msg, arguments.exception, { request_body: reqBody, request_headers: reqHeaders }); + } - - - - - - - - - - - - - - +} diff --git a/v1/taffy/bonus/LogToBugsnag.cfc b/v1/taffy/bonus/LogToBugsnag.cfc index 935caa7..b9c3582 100644 --- a/v1/taffy/bonus/LogToBugsnag.cfc +++ b/v1/taffy/bonus/LogToBugsnag.cfc @@ -1,146 +1,131 @@ - - - - - - + /** + * Logs or notifies the specified exception + */ + public function saveLog(exception) hint="I log or otherwise notify you of an exception" { + var payload = {}; - - - + // Add Project API key to payload + payload["apiKey"] = variables.config.apiKey; - - + // Add notifier info to payload + payload["notifier"] = {}; + payload["notifier"]["name"] = "Taffy"; + payload["notifier"]["version"] = "1.0"; + payload["notifier"]["url"] = "https://github.com/atuttle/Taffy"; - - - + // Add exception details to payload + payload["events"] = []; + payload["events"][1] = {}; + payload["events"][1]["payloadVersion"] = "2"; + payload["events"][1]["exceptions"] = []; + payload["events"][1]["exceptions"][1] = convertException(arguments.exception); - - + // Add application details to payload + payload["events"][1]["app"] = {}; + payload["events"][1]["app"]["appVersion"] = variables.config.appVersion; + payload["events"][1]["app"]["releaseStage"] = variables.config.releaseStage; - - + // Add some metadata to payload + payload["events"][1]["metaData"] = {}; + payload["events"][1]["metaData"]["request"] = {}; + payload["events"][1]["metaData"]["request"]["remoteAddr"] = cgi.remote_addr; + payload["events"][1]["metaData"]["request"]["requestMethod"] = cgi.request_method; + payload["events"][1]["metaData"]["request"]["requestUrl"] = cgi.request_url; - - - - - + // Send log to Bugsnag + cfhttp(url="https://notify.bugsnag.com", method="post") { + cfhttpparam(type="header", name="Content-Type", value="application/json"); + cfhttpparam(type="body", value=serializeJSON(payload)); + } + } - - - - - - + /** + * Converts the specified exception to be added to the payload + */ + private struct function convertException(required struct exception) output="false" { + var root = ""; + var exceptionElement = {}; + var tagContextElement = ""; - - - - + // Get the root exception + if (structKeyExists(exception, "rootCause")) { + root = arguments.exception.rootCause; + } else { + root = arguments.exception; + } - - - - - - + // Add type and message to payload + exceptionElement["errorClass"] = root.type; + exceptionElement["message"] = root.message; - - - - - - + // Build stack trace + exceptionElement["stacktrace"] = []; + for (tagContextElement in root.TagContext) { + arrayAppend(exceptionElement["stacktrace"], convertTagContextElement(tagContextElement)); + } - - - + return exceptionElement; + } - - - - + /** + * Converts the specified Tag Context element to be included in the stack trace array + */ + private struct function convertTagContextElement(required struct tagContextElement) output="false" { + var stackTraceElement = {}; - - - - - - + // Add stack trace data + stackTraceElement["file"] = arguments.tagContextElement.template; + stackTraceElement["lineNumber"] = arguments.tagContextElement.line; + stackTraceElement["columnNumber"] = arguments.tagContextElement.column; + stackTraceElement["method"] = "Unknown function"; - - - + // Add code details + if (structKeyExists(arguments.tagContextElement, "codePrintPlain")) { + stackTraceElement["code"] = convertCodePrint(arguments.tagContextElement.codePrintPlain); + } - - - - - + return stackTraceElement; + } - - + /** + * Converts the specified code details to be included to the stack trace element + */ + private struct function convertCodePrint(required string codePrintText) output="false" { + var codeLines = {}; + var split = listToArray(arguments.codePrintText, chr(10)); + var line = ""; - - - + // Add code lines + for (line in split) { + structInsert(codeLines, listFirst(line, ":"), trim(listRest(line, ":"))); + } - - + return codeLines; + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file +} diff --git a/v1/taffy/bonus/LogToDevNull.cfc b/v1/taffy/bonus/LogToDevNull.cfc index b249a3d..8437cce 100644 --- a/v1/taffy/bonus/LogToDevNull.cfc +++ b/v1/taffy/bonus/LogToDevNull.cfc @@ -1,13 +1,10 @@ - +component implements="taffy.bonus.ILogAdapter" { - - - - - + public function init(config, tracker) { + return this; + } - - - + public function saveLog(exception) { + } - +} diff --git a/v1/taffy/bonus/LogToEmail.cfc b/v1/taffy/bonus/LogToEmail.cfc index 9bb6678..8846fdc 100644 --- a/v1/taffy/bonus/LogToEmail.cfc +++ b/v1/taffy/bonus/LogToEmail.cfc @@ -1,61 +1,53 @@ - +component implements="taffy.bonus.ILogAdapter" { - - - + public function init(config, tracker="") hint="unused tracker" { + variables.config = {}; + structAppend(variables.config, arguments.config, true); + return this; + } - - - + public function saveLog(exception) { + var local = {}; - - + variables.config = removeEmailPrefix(variables.config); - - + // to conform to the cfmail attribute name and be backward compatible with emailSubj + variables.config.subject = variables.config.subj; - + local.attributeCollection = variables.config; - + cfmail(attributeCollection=local.attributeCollection) { + if (variables.config.type eq "text") { + writeOutput("Exception Report - - +Exception Timestamp: #dateformat(now(), 'yyyy-mm-dd')# #timeformat(now(), 'HH:MM:SS tt')# - +"); + writeDump(var=arguments.exception, format="text"); + if (isDefined('request.debugData')) { + writeDump(var=request.debugData, label="debug data", format="text"); + } + } else { + writeOutput("

Exception Report

+

Exception Timestamp: #dateformat(now(), 'yyyy-mm-dd')# #timeformat(now(), 'HH:MM:SS tt')#

"); + writeDump(arguments.exception); + if (isDefined('request.debugData')) { + writeDump(var=request.debugData, label="debug data"); + } + } + } + } - - - Exception Report + private struct function removeEmailPrefix(required struct configAttributes) output="false" hint="removes all email prefix from the config attributes" { + var configAttributeName = ""; + var configAttributeValue = ""; + var newConfig = {}; + var configAttributeNameWithoutEmailPrefix = ""; + for (configAttributeName in arguments.configAttributes) { + configAttributeNameWithoutEmailPrefix = replaceNoCase(configAttributeName, "email", "", "one"); + newConfig[configAttributeNameWithoutEmailPrefix] = arguments.configAttributes[configAttributeName]; + } + return newConfig; + } - Exception Timestamp: #dateformat(now(), 'yyyy-mm-dd')# #timeformat(now(), 'HH:MM:SS tt')# - - - - - - -

Exception Report

-

Exception Timestamp: #dateformat(now(), 'yyyy-mm-dd')# #timeformat(now(), 'HH:MM:SS tt')#

- - - - -
-
-
- - - - - - - - - - - - - - - -
+} diff --git a/v1/taffy/bonus/LogToHoth.cfc b/v1/taffy/bonus/LogToHoth.cfc index 9b379ca..5c70428 100644 --- a/v1/taffy/bonus/LogToHoth.cfc +++ b/v1/taffy/bonus/LogToHoth.cfc @@ -1,19 +1,17 @@ - +component implements="taffy.bonus.ILogAdapter" { - - - - - - - + ); + return this; + } - - - - - + public function saveLog(exception) { + var local = {}; + local.result = variables.HothTracker.track(arguments.exception); + cfheader(name="X-HOTH-LOGGED-EXCEPTION", value=local.result); + } - \ No newline at end of file +} diff --git a/v1/taffy/bonus/LogToLog.cfc b/v1/taffy/bonus/LogToLog.cfc index 41c06dc..905ba05 100644 --- a/v1/taffy/bonus/LogToLog.cfc +++ b/v1/taffy/bonus/LogToLog.cfc @@ -1,23 +1,17 @@ - +component implements="taffy.bonus.ILogAdapter" { - - - + public function init(config, tracker="") hint="unused tracker" { + variables.config = {}; + structAppend(variables.config, arguments.config, true); + return this; + } - - - + public function saveLog(exception) { + var logdump = ""; + savecontent variable="logdump" { + writeDump(var=arguments.exception, format="text"); + } + writeLog(file=variables.config.logfile, text=logdump, type="Error"); + } - - - - - - - - - - - - - +} diff --git a/v1/taffy/bonus/LogToScreen.cfc b/v1/taffy/bonus/LogToScreen.cfc index 615bfa1..b61eed7 100644 --- a/v1/taffy/bonus/LogToScreen.cfc +++ b/v1/taffy/bonus/LogToScreen.cfc @@ -1,20 +1,17 @@ - +component implements="taffy.bonus.ILogAdapter" { - - - - - + public function init(config, tracker="") hint="unused tracker" { + return this; + } - - - - - - - - - - + public function saveLog(exception) { + cfcontent(type="text/html"); + cfheader(statuscode="500", statustext="Unhandled API Error"); + writeDump(arguments); + if (isDefined('request.debugData')) { + writeDump(var=request.debugData, label="debug data"); + } + abort; + } - +} diff --git a/v1/taffy/box.json b/v1/taffy/box.json index b483a52..960783f 100644 --- a/v1/taffy/box.json +++ b/v1/taffy/box.json @@ -1,64 +1,82 @@ { - "name":"Taffy", - "shortDescription":"REST Web Service framework for ColdFusion and Lucee", - "slug":"taffy", - "author":"Adam Tuttle", - "version":"3.3.0", - "homepage":"https://taffy.io/", - "documentation":"https://docs.taffy.io/", - "type":"mvc", - "repository":{ - "type":"git", - "url":"https://github.com/atuttle/Taffy.git" - }, - "bugs":"https://github.com/atuttle/Taffy/issues", - "license":[ - { - "type":"MIT", - "url":"https://raw.githubusercontent.com/atuttle/Taffy/main/LICENSE.TXT" - } - ], - "devDependencies":{ - "testbox":"^4.2.1+400", - "commandbox-cfconfig":"^1.0.2", - "di1":"git+https://github.com/framework-one/di1.git", - "hoth":"git+https://github.com/aarongreenlee/Hoth.git", - "BugLogHQ":"git+https://github.com/oarevalo/BugLogHQ.git" - }, - "installPaths":{ - "testbox":"tests/testbox/", - "di1":"tests/di1/", - "Hoth":"tests/Hoth/", - "BugLogHQ":"tests/BugLogHQ/" - }, - "engines":[ - { - "type":"lucee", - "version":">=4.5.x" - }, - { - "type":"adobe", - "version":">=8.0.0" - } - ], - "ignore":[ - "examples/", - "lib/", - "snippets/", - "tests/", - ".cfconfig.json", - ".gitignore", - ".travis.yml", - "CONTRIBUTING.md", - "build.xml", - "server.json" - ], - "testbox": { - "runner": [ - { - "default": "http://localhost/runner.cfm" - } - ], - "directory": "tests.specs" - } + "name": "Taffy", + "shortDescription": "REST Web Service framework for ColdFusion and Lucee", + "slug": "taffy", + "author": "Adam Tuttle", + "version": "4.0.0", + "homepage": "https://taffy.io/", + "documentation": "https://docs.taffy.io/", + "type": "mvc", + "repository": { + "type": "git", + "url": "https://github.com/atuttle/Taffy.git" + }, + "bugs": "https://github.com/atuttle/Taffy/issues", + "license": [ + { + "type": "MIT", + "url": "https://raw.githubusercontent.com/atuttle/Taffy/main/LICENSE.TXT" + } + ], + "devDependencies": { + "testbox": "^6.5.0", + "commandbox-cfconfig": "^1.0.2", + "di1": "git+https://github.com/framework-one/di1.git", + "hoth": "git+https://github.com/aarongreenlee/Hoth.git", + "BugLogHQ": "git+https://github.com/oarevalo/BugLogHQ.git" + }, + "installPaths": { + "testbox": "tests/testbox/", + "di1": "tests/di1/", + "Hoth": "tests/Hoth/", + "BugLogHQ": "tests/BugLogHQ/" + }, + "engines": [ + { + "type": "lucee", + "version": ">=5.x.x" + }, + { + "type": "adobe", + "version": ">=2016" + } + ], + "ignore": [ + "examples/", + "lib/", + "snippets/", + "tests/", + ".cfconfig.json", + ".gitignore", + ".travis.yml", + "CONTRIBUTING.md", + "build.xml", + "server.json" + ], + "testbox": { + "runner": [ + { + "default": "http://localhost:8080/tests/runner.cfm" + } + ], + "directory": "tests/specs", + "bundles": "", + "labels": "", + "excludes": "", + "verbose": true + }, + "scripts": { + "start:all": "server start serverConfigFile=server-lucee5.json && server start serverConfigFile=server-lucee6.json && server start serverConfigFile=server-lucee7.json", + "start:lucee5": "server start serverConfigFile=server-lucee5.json", + "start:lucee6": "server start serverConfigFile=server-lucee6.json", + "start:lucee7": "server start serverConfigFile=server-lucee7.json", + "stop:lucee5": "server stop name=taffy-lucee5", + "stop:lucee6": "server stop name=taffy-lucee6", + "stop:lucee7": "server stop name=taffy-lucee7", + "stop:all": "server stop --all", + "test:all": "testbox run runner=http://localhost:8085/tests/runner.cfm && testbox run runner=http://localhost:8086/tests/runner.cfm && testbox run runner=http://localhost:8087/tests/runner.cfm", + "test:lucee5": "testbox run runner=http://localhost:8085/tests/runner.cfm", + "test:lucee6": "testbox run runner=http://localhost:8086/tests/runner.cfm", + "test:lucee7": "testbox run runner=http://localhost:8087/tests/runner.cfm" + } } diff --git a/v1/taffy/build.xml b/v1/taffy/build.xml deleted file mode 100644 index dc06fe5..0000000 --- a/v1/taffy/build.xml +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/v1/taffy/core/api.cfc b/v1/taffy/core/api.cfc index 2ada13d..1cf0959 100644 --- a/v1/taffy/core/api.cfc +++ b/v1/taffy/core/api.cfc @@ -1,862 +1,857 @@ - +component hint="Your Application.cfc should extend this class" { - - + // this method is meant to be (optionally) overridden in your application.cfc + function getEnvironment() output="false" hint="override this function to define the current API environment" { + return ""; + } - - - - - - - - - - - + /** + * onTaffyRequest gives you the opportunity to inspect the request before it is sent to the service. + * If you override this function, you MUST either return TRUE or a representation object + * (eg either taffy.core.nativeJsonSerializer or your default representation class) + */ + function onTaffyRequest(verb, cfc, requestArguments, mimeExt, headers, methodMetadata, matchedURI) output="false" { + return true; + } - - - - - - - - - - - - - - + /** + * onTaffyRequestEnd gives you the opportunity to access the request after it has been processed by the service. + * If you override this function, you MUST either return TRUE or a representation object + * (eg either taffy.core.nativeJsonSerializer or your default representation class) + */ + function onTaffyRequestEnd(verb, cfc, requestArguments, mimeExt, headers, methodMetadata, matchedURI, parsedResponse, originalResponse, statusCode) output="false" { + return true; + } - - - - - - - - - - - - - - - - + // override these functions to implement caching hooks + function validCacheExists(cacheKey) output="false" { + return false; + } - - + function setCachedResponse(cacheKey, data) output="false" { + } - - - - - - - - - + function getCachedResponse(cacheKey) output="false" { + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + || application._taffy.settings.reloadOnEveryRequest == true + ) { + if (!local.reloadedInThisRequest && !isUnhandledPathRequest(arguments.targetPath)) { + // prevent double reloads + onApplicationStart(); + } + } - - - - - - - - - - + if (!isUnhandledPathRequest(arguments.targetPath)) { + // if browsing to root of api, show dashboard + local.path = replaceNoCase(cgi.path_info, cgi.script_name, ""); + if ( + !structKeyExists(url, application._taffy.settings.endpointURLParam) + && !structKeyExists(form, application._taffy.settings.endpointURLParam) + && len(local.path) <= 1 + && listFindNoCase(cgi.script_name, "index.cfm", "/") == listLen(cgi.script_name, "/") + ) { + handleDashboardRequest(); + } + } else { + // allow pass-thru for selected paths + structDelete(this, "onRequest"); + structDelete(variables, "onRequest"); + request.unhandled = true; + } - - + ); + logger.saveLog(exception); - - - + // return 500 no matter what + cfheader(statuscode=500, statustext="Error"); + cfcontent(reset=true); - - - - - + if (structKeyExists(exception, "rootCause")) { + root = exception.rootCause; + } else { + root = exception; + } - - - + if (structKeyExists(root, "TagContext")) { + data.stacktrace = root.tagContext; + } - - - - - - - - - - - - - - - #serializeJson(data)# - - - - - An unhandled exception occurred: #root.message##root# -- #root.detail# - - - - - + if (application._taffy.settings.returnExceptionsAsJson == true) { + // try to find the relevant details + if (structKeyExists(root, "message")) { + data.error = root.message; + } + if (structKeyExists(root, "detail")) { + data.detail = root.detail; + } + if (structKeyExists(root, "tagContext")) { + data.tagContext = root.tagContext[1].template & " [Line #root.tagContext[1].line#]"; + } + // MAKE IT LOOK GOOD! + setting showdebugoutput=false enablecfoutputonly=true; + cfcontent(type="application/json; charset=utf-8"); + writeOutput(serializeJson(data)); + } + } catch (any cfcatch) { + cfcontent(reset=true, type="text/plain; charset=utf-8"); + cfheader(statuscode=500, statustext="Error"); + var errorMsg = "An unhandled exception occurred: "; + if (isStruct(root) && structKeyExists(root, "message")) { + errorMsg &= root.message; + } else { + errorMsg &= root; + } + if (isStruct(root) && structKeyExists(root, "detail")) { + errorMsg &= " -- " & root.detail; + } + writeOutput(errorMsg); + writeDump(var=cfcatch, format="text", label="ERROR WHEN LOGGING EXCEPTION"); + writeDump(var=exception, format="text", label="ORIGINAL EXCEPTION"); + } + } - - + // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - - - + // short-circuit logic + function onRequest(required string targetPage) output="true" returntype="boolean" { + var _taffyRequest = {}; + var local = {}; + var m = ""; + var sampler = ""; + request._taffyRequest = _taffyRequest; + local.debug = false; - - - - - + _taffyRequest.metrics = {}; + m = _taffyRequest.metrics; + m.init = getTickCount(); - - - + // enable/disable debug output per settings + if (!structKeyExists(url, application._taffy.settings.debugKey)) { + setting showdebugoutput=false; + } - - - - + // display api dashboard if requested + if ( + !structKeyExists(url, application._taffy.settings.endpointURLParam) + && !structKeyExists(form, application._taffy.settings.endpointURLParam) + && len(cgi.path_info) <= 1 + && listFindNoCase(cgi.script_name, "index.cfm", "/") == listLen(cgi.script_name, "/") + ) { + handleDashboardRequest(); + } - - - - - - - - - - - - - - - - - - - - - + // get request details + m.beforeParse = getTickCount(); + local.parsed = parseRequest(); + m.afterParse = getTickCount(); + structAppend(_taffyRequest, local.parsed); + m.parseTime = m.afterParse - m.beforeParse; - - - - - - + // CORS headers (so that CORS can pass even if the resource throws an exception) + local.allowVerbs = uCase(structKeyList(_taffyRequest.matchDetails.methods)); + if ( + (application._taffy.settings.allowCrossDomain == true || len(application._taffy.settings.allowCrossDomain) > 0) + && listFindNoCase("PUT,PATCH,DELETE,OPTIONS", _taffyRequest.verb) + && !listFind(local.allowVerbs, "OPTIONS") + ) { + local.allowVerbs = listAppend(local.allowVerbs, "OPTIONS"); + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + if (structKeyExists(_taffyRequest.headers, "origin") && (application._taffy.settings.allowCrossDomain == true || len(application._taffy.settings.allowCrossDomain) > 0)) { + if (application._taffy.settings.allowCrossDomain == true) { + cfheader(name="Access-Control-Allow-Origin", value="*"); + } else { + // The Access-Control-Allow-Origin header can only have 1 value so we check to see if the Origin header is + // in the list of origins specified in the config setting and parrot back the Origin header if so. + // We also need to add the Access-Control-Allow-Credentials header and set it to true for those type requests + local.domains = listToArray(application._taffy.settings.allowCrossDomain, ", ;"); + if (structKeyExists(_taffyRequest.headers, "origin")) { + for (local.i = 1; local.i <= arrayLen(local.domains); local.i++) { + if (lcase(rereplace(_taffyRequest.headers.origin, "(http|https):\/\/", "", "all")) == lcase(rereplace(local.domains[local.i], "(http|https):\/\/", "", "all"))) { + cfheader(name="Access-Control-Allow-Origin", value=_taffyRequest.headers.origin); + cfheader(name="Access-Control-Allow-Credentials", value="true"); + break; + } + } + } + } + cfheader(name="Access-Control-Allow-Methods", value=local.allowVerbs); + // Why do we parrot back these headers? See: https://github.com/atuttle/Taffy/issues/144 + if (!structKeyExists(_taffyRequest.headers, "Access-Control-Request-Headers")) { + cfheader(name="Access-Control-Allow-Headers", value="Origin, Authorization, X-CSRF-Token, X-Requested-With, Content-Type, X-HTTP-Method-Override, Accept, Referrer, User-Agent"); + } else { + // parrot back all of the request headers to allow the request to continue (can we improve on this?) + local.allowedHeaders = {}; + for (local.h in listToArray("Origin,Authorization,X-CSRF-Token,X-Requested-With,Content-Type,X-HTTP-Method-Override,Accept,Referrer,User-Agent")) { + local.allowedHeaders[local.h] = 1; + } + local.requestedHeaders = _taffyRequest.headers["Access-Control-Request-Headers"]; + for (local.i in listToArray(local.requestedHeaders)) { + local.allowedHeaders[local.i] = 1; + } + cfheader(name="Access-Control-Allow-Headers", value=structKeyList(local.allowedHeaders)); + } + } - - + // global headers + addHeaders(getGlobalHeaders()); - + // Now we know everything we need to know to service the request. let's service it! - - - - - + // ...after we let the api developer know all of the request details first... + m.beforeOnTaffyRequest = getTickCount(); + _taffyRequest.continue = onTaffyRequest( + _taffyRequest.verb, + _taffyRequest.matchDetails.beanName, + _taffyRequest.requestArguments, + _taffyRequest.returnMimeExt, + _taffyRequest.headers, + _taffyRequest.methodMetadata, + local.parsed.matchDetails.srcUri + ); + m.afterOnTaffyRequest = getTickCount(); + m.otrTime = m.afterOnTaffyRequest - m.beforeOnTaffyRequest; - - - - + ); + } - - - - - - - + if (isObject(_taffyRequest.continue)) { + // inspection complete but request has been aborted by developer; return custom response + _taffyRequest.result = duplicate(_taffyRequest.continue); + structDelete(_taffyRequest, "continue"); + m.resourceTime = 0; + } else { + // inspection complete and request allowed by developer - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + ); + } + // If the type returned is not an instance of baseSerializer, wrap it with a call to rep(). + // This way we can directly return the object instead of a serializer from resource actions. + if (!isSerializerInstance(_taffyRequest.result)) { + _taffyRequest.result = rep(_taffyRequest.result); + } + if (ucase(_taffyRequest.verb) == "GET" && structKeyExists(local, "cacheKey")) { + m.cacheSaveStart = getTickCount(); + setCachedResponse(local.cacheKey, _taffyRequest.result); + m.cacheSaveTime = getTickCount() - m.cacheSaveStart; + } + } + } else if (!listFind(local.allowVerbs, _taffyRequest.verb)) { + // if the verb is not implemented, refuse the request + cfheader(name="ALLOW", value=local.allowVerbs); + throwError(405, "Method Not Allowed"); + } else { + // create dummy response for cross domain OPTIONS request + _taffyRequest.resultHeaders = {}; + _taffyRequest.statusArgs = {}; + _taffyRequest.statusArgs.statusCode = 200; + _taffyRequest.statusArgs.statusText = "OK"; + } + } + } - - - - - + // make sure the requested mime type is available + if (!mimeSupported(_taffyRequest.returnMimeExt)) { + throwError(400, "Requested format not available (#_taffyRequest.returnMimeExt#)"); + } - - - - - - - - + if (structKeyExists(_taffyRequest, "result")) { + // get status code + _taffyRequest.statusArgs = {}; + _taffyRequest.statusArgs.statusCode = _taffyRequest.result.getStatus(); + _taffyRequest.statusArgs.statusText = _taffyRequest.result.getStatusText(); + // get custom headers + _taffyRequest.resultHeaders = invoke(_taffyRequest.result, "getHeaders"); + } - - - + setting enablecfoutputonly=true; + cfcontent(reset=true, type="#getReturnMimeAsHeader(_taffyRequest.returnMimeExt)#; charset=utf-8"); + cfheader(statuscode=_taffyRequest.statusArgs.statusCode, statustext=_taffyRequest.statusArgs.statusText); - - + // headers + addHeaders(_taffyRequest.resultHeaders); - - + // add ALLOW header for current resource, which describes available verbs + cfheader(name="ALLOW", value=local.allowVerbs); - - - - - - - - - - - - - - - + // metrics headers that should always apply + addTaffyHeader("X-TIME-IN-PARSE", m.parseTime); + addTaffyHeader("X-TIME-IN-ONTAFFYREQUEST", m.otrTime); + if (structKeyExists(m, "resourceTime")) { + addTaffyHeader("X-TIME-IN-RESOURCE", m.resourceTime); + } + if (structKeyExists(m, "cacheCheckTime")) { + addTaffyHeader("X-TIME-IN-CACHE-CHECK", m.cacheCheckTime); + } + if (structKeyExists(m, "cacheGetTime")) { + addTaffyHeader("X-TIME-IN-CACHE-GET", m.cacheGetTime); + } + if (structKeyExists(m, "cacheSaveTime")) { + addTaffyHeader("X-TIME-IN-CACHE-SAVE", m.cacheSaveTime); + } - - - - - - - - - - - - - - - - + if (application._taffy.settings.exposeHeaders) { + local.exposeHeaderList = structKeyList(_taffyRequest.resultHeaders); + local.exposeHeaderValue = ""; + if (application._taffy.settings.useEtags && _taffyRequest.verb == "GET" && _taffyRequest.result.getType() == "textual") { + local.exposeHeaderList = listAppend(local.exposeHeaderList, "Etag"); + } + for (local.exposeHeader in listToArray(local.exposeHeaderList)) { + // filter out default simple response headers: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Access-Control-Expose-Headers + if (!listFindNoCase("Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma", local.exposeHeader)) { + local.exposeHeaderValue = listAppend(local.exposeHeaderValue, local.exposeHeader); + } + } + if (listLen(local.exposeHeaderValue) > 0) { + cfheader(name="Access-Control-Expose-Headers", value=local.exposeHeaderValue); + } + } - - - - + // result data + if (structKeyExists(_taffyRequest, "result")) { + _taffyRequest.resultType = _taffyRequest.result.getType(); + local.resultSerialized = ""; - - - - - - - + if (_taffyRequest.resultType == "textual") { + // serialize the representation's data into the requested mime type + _taffyRequest.metrics.beforeSerialize = getTickCount(); + _taffyRequest.resultSerialized = invoke( + _taffyRequest.result, + "getAs#_taffyRequest.returnMimeExt#" + ); + _taffyRequest.metrics.afterSerialize = getTickCount(); + m.serializeTime = m.afterSerialize - m.beforeSerialize; + addTaffyHeader("X-TIME-IN-SERIALIZE", m.serializeTime); - - - - + // apply jsonp wrapper if requested + if (structKeyExists(_taffyRequest, "jsonpCallback")) { + _taffyRequest.resultSerialized = _taffyRequest.jsonpCallback & "(" & _taffyRequest.resultSerialized & ");"; + } - - - - - - - - - - - + // don't return data if etags are enabled and the data hasn't changed + if (application._taffy.settings.useEtags && _taffyRequest.verb == "GET") { + // etag values are quoted per: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/ETag + if (structKeyExists(server, "lucee")) { + // hashCode() will not work for lucee, see issue #354 + _taffyRequest.serverEtag = '"' & hash(_taffyRequest.resultSerialized) & '"'; + } else { + _taffyRequest.serverEtag = '"' & _taffyRequest.result.getData().hashCode() & '"'; + } + if (structKeyExists(_taffyRequest.headers, "If-None-Match")) { + _taffyRequest.clientEtag = _taffyRequest.headers["If-None-Match"]; - - - - - - - - - - - + if (len(_taffyRequest.clientEtag) > 0 && _taffyRequest.clientEtag == _taffyRequest.serverEtag) { + cfheader(statuscode=304, statustext="Not Modified"); + cfcontent(reset=true, type="#application._taffy.settings.mimeExtensions[_taffyRequest.returnMimeExt]#; charset=utf-8"); + return true; + } else { + cfheader(name="Etag", value=_taffyRequest.serverEtag); + } + } else { + cfheader(name="Etag", value=_taffyRequest.serverEtag); + } + } - - - - - - + m.done = getTickCount(); + m.taffyTime = m.done - m.init - m.parseTime - m.otrTime - m.serializeTime; + if (structKeyExists(m, "resourceTime")) { + m.taffyTime -= m.resourceTime; + } + addTaffyHeader("X-TIME-IN-TAFFY", m.taffyTime); - - - - - - - - + cfcontent(reset=true, type="#application._taffy.settings.mimeExtensions[_taffyRequest.returnMimeExt]#; charset=utf-8"); + if (_taffyRequest.resultSerialized != ('"' & '"')) { + local.resultSerialized = _taffyRequest.resultSerialized; + } + // debug output + if (structKeyExists(url, application._taffy.settings.debugKey)) { + local.debug = true; + } - - - - - + } else if (_taffyRequest.resultType == "filename") { + m.done = getTickCount(); + m.taffyTime = m.done - m.init - m.parseTime - m.otrTime - m.resourceTime; + addTaffyHeader("X-TIME-IN-TAFFY", m.taffyTime); + cfcontent(reset=true, file=_taffyRequest.result.getFileName(), type=_taffyRequest.result.getFileMime(), deletefile=_taffyRequest.result.getDeleteFile()); - - - - - + } else if (_taffyRequest.resultType == "filedata") { + m.done = getTickCount(); + m.taffyTime = m.done - m.init - m.parseTime - m.otrTime - m.resourceTime; + addTaffyHeader("X-TIME-IN-TAFFY", m.taffyTime); + cfcontent(reset=true, variable=_taffyRequest.result.getFileData(), type=_taffyRequest.result.getFileMime()); - - - - - + } else if (_taffyRequest.resultType == "imagedata") { + m.done = getTickCount(); + m.taffyTime = m.done - m.init - m.parseTime - m.otrTime - m.resourceTime; + addTaffyHeader("X-TIME-IN-TAFFY", m.taffyTime); + cfcontent(reset=true, variable=_taffyRequest.result.getImageData(), type=_taffyRequest.result.getFileMime()); + } + } - - + local.resultSerialized = ""; + if (structKeyExists(_taffyRequest, "resultSerialized")) { + local.resultSerialized = _taffyRequest.resultSerialized; + } - - - - + local.result = {}; + if (structKeyExists(_taffyRequest, "result")) { + local.result = _taffyRequest.result.getData(); + } - - - - + // ...after the service has finished... + m.beforeOnTaffyRequestEnd = getTickCount(); + onTaffyRequestEnd( + _taffyRequest.verb, + _taffyRequest.matchDetails.beanName, + _taffyRequest.requestArguments, + _taffyRequest.returnMimeExt, + _taffyRequest.headers, + _taffyRequest.methodMetadata, + local.parsed.matchDetails.srcUri, + local.resultSerialized, + local.result, + _taffyRequest.statusArgs.statusCode + ); + m.otreTime = getTickCount() - m.beforeOnTaffyRequestEnd; + addTaffyHeader("X-TIME-IN-ONTAFFYREQUESTEND", m.otreTime); - - - - - + if (len(trim(local.resultSerialized))) { + writeOutput(local.resultSerialized); + } + // debug output + if (local.debug) { + writeOutput("

Request Details:

"); + writeDump(var=_taffyRequest); + } - - #local.resultSerialized# - - - -

Request Details:

-
+ return true; + } - -
+ // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + // :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: - - + // internal methods + private void function checkEngineSupport() output="false" { + application._taffy.compat = { + queryToStruct: "missing", + queryToArray: "missing" + }; + var funcs = getFunctionList(); + if (structKeyExists(funcs, "queryToStruct")) { + application._taffy.compat.queryToStruct = "exists"; + } + if (structKeyExists(funcs, "queryToArray")) { + application._taffy.compat.queryToArray = "exists"; + } + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + private void function setupFramework() output="false" { + var local = {}; + param name="variables.framework" default={}; + request.taffyReloaded = true; + local._taffy = {}; + local._taffy.version = "4.0.0"; + local._taffy.endpoints = {}; - - - - + // default settings + local.defaultConfig = {}; + local.defaultConfig.resourcesCFCPath = ""; + local.defaultConfig.docs = {}; + local.defaultConfig.docs.APIName = "Your API Name (variables.framework.docs.APIName)"; + local.defaultConfig.docs.APIVersion = "0.0.0 (variables.framework.docs.APIVersion)"; + local.defaultConfig.docsPath = "../dashboard/docs.cfm"; + local.defaultConfig.defaultMime = ""; + local.defaultConfig.debugKey = "debug"; + local.defaultConfig.reloadKey = "reload"; + local.defaultConfig.reloadPassword = "true"; + local.defaultConfig.reloadOnEveryRequest = false; + local.defaultConfig.simulateKey = "sampleResponse"; + local.defaultConfig.simulatePassword = "true"; + local.defaultConfig.endpointURLParam = "endpoint"; + local.defaultConfig.serializer = "taffy.core.nativeJsonSerializer"; + local.defaultConfig.deserializer = "taffy.core.nativeJsonDeserializer"; + local.defaultConfig.disableDashboard = false; + local.defaultConfig.disabledDashboardRedirect = ""; + local.defaultConfig.dashboardHeaders = {}; + local.defaultConfig.showDocsWhenDashboardDisabled = false; + local.defaultConfig.unhandledPaths = "/flex2gateway"; + local.defaultConfig.allowCrossDomain = false; + local.defaultConfig.useEtags = false; + local.defaultConfig.exposeHeaders = false; + local.defaultConfig.jsonp = false; + local.defaultConfig.noDataSends204NoContent = false; + local.defaultConfig.exposeTaffyHeaders = true; + local.defaultConfig.globalHeaders = {}; + local.defaultConfig.mimeTypes = {}; + local.defaultConfig.returnExceptionsAsJson = false; + local.defaultConfig.exceptionLogAdapter = "taffy.bonus.LogToDevNull"; + local.defaultConfig.exceptionLogAdapterConfig = {}; + local.defaultConfig.csrfToken = {}; + local.defaultConfig.csrfToken.cookieName = ""; + local.defaultConfig.csrfToken.headerName = ""; + local.defaultConfig.allowGoogleFonts = true; + // optional keys: description, contact, license, servers + local.defaultConfig.openapi = { "enabled": true }; - - + // status + local._taffy.status = {}; + local._taffy.status.internalBeanFactoryUsed = false; + local._taffy.status.externalBeanFactoryUsed = false; + local._taffy.uriMatchOrder = []; - - - - + // allow setting overrides + local._taffy.settings = {}; + structAppend(local._taffy.settings, local.defaultConfig, true); // initialize to default values + structAppend(local._taffy.settings, variables.framework, true); // update with user values - - - - + // allow environment-specific config + local.env = getEnvironment(); + if (len(local.env) > 0) { + param name="variables.framework" default={}; + param name="variables.framework.environments" default={}; + if (structKeyExists(variables.framework.environments, local.env) && isStruct(variables.framework.environments[local.env])) { + structAppend(local._taffy.settings, variables.framework.environments[local.env]); + } + } - - + // bean factory definition + if (structKeyExists(variables.framework, "beanFactory")) { + if (isSimpleValue(variables.framework.beanFactory) && len(variables.framework.beanFactory) == 0) { + // if the BF value is "" doing nothing with it + } else { + local._taffy.externalBeanFactory = variables.framework.beanFactory; + local._taffy.status.externalBeanFactoryUsed = true; + } + } - - + // translate unhandledPaths config to regex for easier matching (This is ripped off from FW/1. Thanks, Sean!) + local._taffy.settings.unhandledPathsRegex = replaceNoCase( + REReplace(local._taffy.settings.unhandledPaths, "(\+|\*|\?|\.|\[|\^|\$|\(|\)|\{|\||\\)", "\\\1", "all"), + ",", "|", "all" + ); - - - - + // if resources folder exists, use internal bean factory + local.resourcePath = guessResourcesFullPath(local._taffy.settings.resourcesCFCPath); + local.noResources = false; + if (directoryExists(local.resourcePath)) { + // setup internal bean factory + local._taffy.factory = createObject("component", "taffy.core.factory"); + if (structKeyExists(local._taffy, "externalBeanFactory")) { + local._taffy.factory.init(local._taffy.externalBeanFactory); + } else { + local._taffy.factory.init(); + } + local._taffy.factory.loadBeansFromPath(local.resourcePath, guessResourcesCFCPath(local._taffy.settings.resourcesCFCPath), local.resourcePath, true, local._taffy); + local._taffy.beanList = local._taffy.factory.getBeanList(); + local._taffy.endpoints = cacheBeanMetaData(local._taffy.factory, local._taffy.beanList, local._taffy); + local._taffy.status.internalBeanFactoryUsed = true; + } else if (local._taffy.status.externalBeanFactoryUsed) { + // only using external factory, so create a pointer to it + local._taffy.factory = local._taffy.externalBeanFactory; + // since external factory is only factory, check it for taffy resources + local.beanList = getBeanListFromExternalFactory(local._taffy.externalBeanFactory); + local._taffy.endpoints = cacheBeanMetaData(local._taffy.externalBeanFactory, local.beanList, local._taffy); + } else { + local.noResources = true; + } - - + if (!local.noResources) { + // sort URIs + local._taffy.URIMatchOrder = sortURIMatchOrder(local._taffy.endpoints); + // automatically introspect mime types from cfc metadata of default representation class + local.mimetypes = inspectMimeTypes(local._taffy.settings.serializer, local._taffy.factory); + structAppend(local._taffy.settings, local.mimeTypes); + // check to make sure a default mime type is set + if (local._taffy.settings.defaultMime == "") { + throwError(400, "You have not specified a default mime type!"); + } + } - - + // inspect the deserializer to find out what contentTypes are supported + local._taffy.contentTypes = getSupportedContentTypes( + local._taffy.settings.deserializer, + structKeyExists(local._taffy, "factory") ? local._taffy.factory : "" + ); + // hot-swap! + application._taffy = local._taffy; - - - - + // we must write the header *after* we have initialized our settings + addTaffyHeader("X-TAFFY-RELOADED", true); + } - - - - - + private struct function parseRequest() output="false" { + var requestObj = {}; + var tmp = 0; + var local = {}; - - - - - - - - - - - - - - - - - - - - - - + // Check for method tunnelling by clients unable to send PUT/DELETE requests (e.g. Flash Player); + // Actual desired method will be contained in a special header + var httpMethodOverride = "null"; + try { + httpMethodOverride = GetPageContext().getRequest().getHeader("X-HTTP-Method-Override"); + } catch (any e) { + } - - + requestObj.uri = getPath(); + if (!len(requestObj.uri)) { + if (structKeyExists(url, application._taffy.settings.endpointURLParam)) { + requestObj.uri = urlDecode(url[application._taffy.settings.endpointURLParam]); + } else if (structKeyExists(form, application._taffy.settings.endpointURLParam)) { + requestObj.uri = urlDecode(form[application._taffy.settings.endpointURLParam]); + } + } - - - - - - - - + ); + // include any deserialized body params + if (structKeyExists(requestObj, "bodyArgs")) { + structAppend(requestObj.requestArguments, requestObj.bodyArgs); + } + // also capture form POST data (higher priority that url variables of same name) + structAppend(requestObj.requestArguments, form); - - - - - - - + // if JSONP is enabled, capture the requested callback name + if (application._taffy.settings.jsonp != false) { + if (structKeyExists(requestObj.requestArguments, application._taffy.settings.jsonp)) { + local.cbName = requestObj.requestArguments[application._taffy.settings.jsonp]; + // validate callback name to prevent XSS via JSONP injection + if (reFindNoCase("^[a-zA-Z_$][a-zA-Z0-9_$.]*$", local.cbName)) { + requestObj.jsonpCallback = local.cbName; + } else { + throwError(400, "Invalid JSONP callback name"); + } + } + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + // use requested mime type or the default + requestObj.returnMimeExt = ""; + if (structKeyExists(requestObj.requestArguments, "_taffy_mime")) { + requestObj.returnMimeExt = requestObj.requestArguments._taffy_mime; + if (left(requestObj.returnMimeExt, 1) == ".") { + requestObj.returnMimeExt = right(requestObj.returnMimeExt, len(requestObj.returnMimeExt) - 1); + } + if (requestObj.returnMimeExt == "*/*") { + requestObj.returnMimeExt = application._taffy.settings.defaultMime; + } + if (!structKeyExists(application._taffy.settings.mimeExtensions, requestObj.returnMimeExt)) { + throwError(400, "Requested mime type is not supported (#requestObj.returnMimeExt#)"); + } + } else if (requestObj.uriFormat != "") { + requestObj.returnMimeExt = requestObj.uriFormat; + } else { + // run some checks on the default + if (application._taffy.settings.defaultMime == "") { + throwError(400, "You have not specified a default mime type"); + } else if (!structKeyExists(application._taffy.settings.mimeExtensions, application._taffy.settings.defaultMime)) { + throwError(400, "Your default mime type (#application._taffy.settings.defaultMime#) is not implemented"); + } + requestObj.returnMimeExt = application._taffy.settings.defaultMime; + } + structDelete(requestObj.requestArguments, "_taffy_mime"); - - - - - - - - - - + // get the method metadata (if any) for onTaffyRequest + if (requestObj.method != "") { + requestObj.methodMetadata = application._taffy.endpoints[requestObj.matchingRegex].metadata[requestObj.method]; + } else { + // method will be "" when un-implemented method is requested (e.g. OPTIONS) + requestObj.methodMetadata = {}; + } - - - + return requestObj; + } - - - - + private function formatFromURI(uri) output="false" { + var local = {}; + for (local.mime in application._taffy.settings.mimeExtensions) { + if (right(arguments.uri, len(local.mime) + 1) == "." & local.mime) { + return local.mime; + } + } + return ""; + } - - - - + */ - - - - - - - - - - - - - - - - - - - + for (local.chunk in local.uriChunks) { + if (left(local.chunk, 1) != "{" || right(local.chunk, 1) != "}") { + // not a token + local.uriMatcher = local.uriMatcher & "/" & local.chunk; + } else { + // strip {curly braces} + local.chunk = left(right(local.chunk, len(local.chunk) - 1), len(local.chunk) - 2); + // it's a token... but which kind? + if (find(":", local.chunk) != 0) { + local.pattern = "(" & listRest(local.chunk, ":") & ")"; // make sure we capture the value + local.tokenName = listFirst(local.chunk, ":"); + } else { + local.pattern = local.regexes.segment; + local.tokenName = local.chunk; + } + local.uriMatcher = local.uriMatcher & "/" & local.pattern; + arrayAppend(local.returnData.tokens, local.tokenName); + } + } - - - - - + // if uriRegex ends with a token, slip the format piece in there too... + local.uriRegex = "^" & local.uriMatcher; + if (right(local.uriRegex, 8) == local.regexes.segment) { + local.uriRegex = left(local.uriRegex, len(local.uriRegex) - 8) & local.regexes.segmentWithOptFormat; + } - - + // require the uri to terminate after specified content + local.uriRegex = local.uriRegex & local.regexes.optFormatWithOptSlash & "$"; - - - + local.returnData.uriRegex = local.uriRegex; + return local.returnData; + } - - - - - - + private function sortURIMatchOrder(endpoints) output="false" { + var URIMatchOrder = listToArray(structKeyList(arguments.endpoints, chr(10)), chr(10)); + arraySort(URIMatchOrder, "textnocase", "desc"); + return URIMatchOrder; + } - - - - - - - - - - - - - - + private string function matchURI(required string requestedURI) output="false" { + var local = {}; + local.uriCount = arrayLen(application._taffy.URIMatchOrder); + for (local.i = 1; local.i <= local.uriCount; local.i++) { + local.attempt = reMatchNoCase(application._taffy.URIMatchOrder[local.i], arguments.requestedURI); + if (arrayLen(local.attempt) > 0) { + // found our mapping + return application._taffy.URIMatchOrder[local.i]; + } + } + // nothing found + return ""; + } - - - - - - - - - + private function getRequestBody() output="false" hint="Gets request body data, which CF doesn't do automatically for some verbs" { + // Special thanks to Jason Dean (@JasonPDean) and Ray Camden (@ColdFusionJedi) who helped me figure out how to do this + var body = getHTTPRequestData().content; + // on input with content-type "application/json" CF seems to expose it as binary data. Here we convert it back to plain text + if (isBinary(body)) { + body = charsetEncode(body, "UTF-8"); + } + return body; + } - - - - - + private function contentTypeIsSupported(string contentType) output="false" { + var ct = listFirst(arguments.contentType, ";"); + return structKeyExists(application._taffy.contentTypes, ct); + } - - - - - - - - + private function getDeserialized(required body, required contentType) output="false" { + var ct = listFirst(arguments.contentType, ";"); + var fn = application._taffy.contentTypes[ct]; + var args = {}; + var result = {}; + var deserializer = ""; + args.body = arguments.body; - - - + if (application._taffy.factory.containsBean(application._taffy.settings.deserializer)) { + deserializer = application._taffy.factory.getBean(application._taffy.settings.deserializer); + } else { + deserializer = createObject("component", application._taffy.settings.deserializer); + } + result = invoke(deserializer, fn, args); + return result; + } - - - - + private function getSupportedContentTypes(deserializer, factory = "") output="false" { + if (isObject(arguments.factory) && arguments.factory.containsBean(arguments.deserializer)) { + return _recurse_getSupportedContentTypes(getMetadata(arguments.factory.getBean(arguments.deserializer))); + } else { + return _recurse_getSupportedContentTypes(getComponentMetadata(arguments.deserializer)); + } + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - + private function _recurse_getSupportedContentTypes(objMetaData) output="false" { + var local = {}; + local.response = {}; + // recurse into parents first so that children override parents + if (structKeyExists(arguments.objMetaData, "extends")) { + local.response = _recurse_getSupportedContentTypes(arguments.objMetaData.extends); + } + // then handle child settings + if (structKeyExists(arguments.objMetaData, "functions") && isArray(arguments.objMetaData.functions)) { + local.funcs = arguments.objMetaData.functions; + for (local.f = 1; local.f <= arrayLen(local.funcs); local.f++) { + // for every function whose name starts with "getFrom" *and* has a taffy_mime metadata attribute, count it + local.mime = ""; + if (structKeyExists(local.funcs[local.f], "taffy_mime")) { + local.mime = local.funcs[local.f].taffy_mime; + } else if (structKeyExists(local.funcs[local.f], "taffy:mime")) { + local.mime = local.funcs[local.f]["taffy:mime"]; + } + if (ucase(left(local.funcs[local.f].name, 7)) == "GETFROM" && len(local.mime)) { + for (local.m in listToArray(local.mime, ",;")) { + local.response[local.m] = local.funcs[local.f].name; + } + } + } + } + return local.response; + } - - - - - - + private struct function buildRequestArguments(required string regex, required array tokenNamesArray, required string uri, required string queryString, required struct headers) output="false" hint="regex that describes the request (including uri and query string parameters)" { + var local = {}; + var tmp = ""; + local.returnData = {}; // this will be used as an argumentCollection for the method that ultimately gets called - - - + // parse path_info data into key-value pairs + local.tokenValues = reFindNoSuck(arguments.regex, arguments.uri); + local.numTokenValues = arrayLen(local.tokenValues); + local.numTokenNames = arrayLen(arguments.tokenNamesArray); + if (local.numTokenNames > 0) { + for (local.t = 1; local.t <= local.numTokenNames; local.t++) { + local.returnData[arguments.tokenNamesArray[local.t]] = urlDecode(local.tokenValues[local.t]); + } + } + // query_string input is also key-value pairs + for (local.t in listToArray(arguments.queryString, "&")) { + local.qsKey = urlDecode(listFirst(local.t, "=")); + local.qsValue = ""; + if (listLen(local.t, "=") == 2) { + local.qsValue = urlDecode(listLast(local.t, "=")); + } + if ((len(local.qsKey) > 2) && (right(local.qsKey, 2) == "[]")) { + local.qsKey = left(local.qsKey, len(local.qsKey) - 2); + if (!structKeyExists(local.returnData, local.qsKey)) { + local.returnData[local.qsKey] = []; + } + arrayAppend(local.returnData[local.qsKey], local.qsValue); + } else { + local.returnData[local.qsKey] = local.qsValue; + } + } + // if a mime type is requested as part of the url ("whatever.json"), then extract that so taffy can use it + if (local.numTokenValues > local.numTokenNames) { + // when there is 1 more token value than name, that value (regex capture group) is the format + local.mime = local.tokenValues[local.numTokenValues]; + local.returnData["_taffy_mime"] = local.mime; + } else if (structKeyExists(arguments.headers, "Accept")) { + local.headerMatch = false; + for (tmp in listToArray(arguments.headers.accept)) { + // deal with that q=0 stuff (just ignore it) + if (listLen(tmp, ";") > 1) { + tmp = listFirst(tmp, ";"); + } + if (structKeyExists(application._taffy.settings.mimeTypes, tmp)) { + local.returnData["_taffy_mime"] = application._taffy.settings.mimeTypes[tmp]; + local.headerMatch = true; + break; // exit loop + } else if (trim(tmp) == "*/*") { + local.returnData["_taffy_mime"] = application._taffy.settings.defaultMime; + local.headerMatch = true; + break; // exit loop + } + } + // if a header is passed, but it didn't match any known mimes, and no mime was found via extension, just use whatever's in the header + if (local.headerMatch == false) { + local.returnData["_taffy_mime"] = listFirst(listFirst(arguments.headers.accept, ","), ";"); + } + } + return local.returnData; + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + private string function guessResourcesPath() output="false" hint="used to try and figure out the absolute path of the /resources folder even though this file may not be in the web root" { + var local = {}; + // if /resources has been explicitly defined in an server/application mapping, it should take precedence + if (directoryExists(expandPath("resources"))) { + return "resources"; + } else if (directoryExists(expandPath("/resources"))) { + return "/resources"; + } - - - - - - - + // if all else fails, fall through to guessing where /resources lives + local.indexcfmpath = cgi.script_name; + local.resourcesPath = listDeleteAt(local.indexcfmpath, listLen(local.indexcfmpath, "/"), "/") & "/resources"; - - - + if (GetContextRoot() != "") { + local.resourcesPath = ReReplace(local.resourcesPath, "^#GetContextRoot()#", ""); + } - - - + return local.resourcesPath; + } - - + private string function guessResourcesFullPath(string dottedPath = "") output="false" hint="dotted path to a resource folder to use" { + // when we have an explicit path, no need to make a guess, we just need to convert the dotted path to a file path + if (len(arguments.dottedPath)) { + return expandPath("/" & replace(arguments.dottedPath, ".", "/", "all")); + } - - - + return expandPath(guessResourcesPath()); + } - - - - - + private string function guessResourcesCFCPath(string dottedPath = "") output="false" hint="dotted path to a resource folder to use" { + var path = ""; + // when we have an explicit path, no need to make a guess + if (len(arguments.dottedPath)) { + return arguments.dottedPath; + } - - - - - - - - - + path = guessResourcesPath(); + if (left(path, 1) == "/") { + path = right(path, len(path) - 1); + } + return reReplace(path, "\/", ".", "all"); + } - - + private void function throwError(numeric statusCode = 500, required string msg, struct headers = {}) output="false" hint="message to return to api consumer" { + cfcontent(reset=true); + addHeaders(arguments.headers); + cfheader(statuscode=arguments.statusCode, statustext=arguments.msg); + abort; + } - - - - - - - - - - - - - - - - - - - - - - + private array function splitURIs(required string input) output="false" { + var inBracketCount = 0; + var output = []; + var s = createObject("java", "java.lang.StringBuffer").init(""); + var c = ""; + for (c in trim(input).toCharArray()) { + if (c == "{") { + inBracketCount += 1; + } else if (c == "}" && inBracketCount > 0) { + inBracketCount -= 1; + } + if (c == "," && inBracketCount == 0) { + arrayAppend(output, s.toString()); + s.setLength(0); + } else { + s.append(c); + } + } + if (s.length() > 0) { + arrayAppend(output, s.toString()); + } + return output; + } - - - + private void function throwExceptionIfURIDoesntBeginWithForwardSlash(required string uri, required string beanName) output="false" { + var uriDoesntBeginWithForwardSlash = left(arguments.uri, 1) != "/"; - - - - - - + ); + } + } - - - - - - - - - - - - - - - + private function cacheBeanMetaData(required factory, required string beanList, required any taffyRef) output="false" { + var local = {}; + local.endpoints = {}; + for (local.beanName in listToArray(arguments.beanList)) { + // get the cfc metadata that defines the uri for that cfc + local.cfcMetadata = getMetaData(arguments.factory.getBean(local.beanName)); + local.uriAttr = ""; + if (structKeyExists(local.cfcMetadata, "taffy_uri")) { + local.uriAttr = local.cfcMetadata["taffy_uri"]; + } else if (structKeyExists(local.cfcMetadata, "taffy:uri")) { + local.uriAttr = local.cfcMetadata["taffy:uri"]; + } - + local.uris = splitURIs(local.uriAttr); - - - - - - - + if (structKeyExists(local.cfcMetaData, "taffy:aopbean")) { + local.cachedBeanName = local.cfcMetaData["taffy:aopbean"]; + } else if (structKeyExists(local.cfcMetaData, "taffy_aopbean")) { + local.cachedBeanName = local.cfcMetaData["taffy_aopbean"]; + } else { + local.cachedBeanName = local.beanName; + } - - - - - - - - - + ); + } - + throwExceptionIfURIDoesntBeginWithForwardSlash(local.uri, local.beanName); - - - - - + local.endpoints[local.metaInfo.uriRegex] = { beanName = local.cachedBeanName, tokens = local.metaInfo.tokens, methods = {}, srcURI = local.uri }; + if (structKeyExists(local.cfcMetadata, "functions")) { + for (local.f in local.cfcMetadata.functions) { + if (local.f.name == "get" || local.f.name == "post" || local.f.name == "put" || local.f.name == "patch" || local.f.name == "delete" || local.f.name == "head" || local.f.name == "options") { + local.endpoints[local.metaInfo.uriRegex].methods[local.f.name] = local.f.name; - - - - - - + // also support future/misc verbs via metadata + } else if (structKeyExists(local.f, "taffy:verb")) { + local.endpoints[local.metaInfo.uriRegex].methods[local.f["taffy:verb"]] = local.f.name; + } else if (structKeyExists(local.f, "taffy_verb")) { + local.endpoints[local.metaInfo.uriRegex].methods[local.f["taffy_verb"]] = local.f.name; + } - - - - - - - - - - - - - - - - - - - - - - - - - - + // cache any extra function metadata for use in onTaffyRequest + local.extraMetadata = duplicate(local.f); + structDelete(local.extraMetadata, "name"); + structDelete(local.extraMetadata, "parameters"); + structDelete(local.extraMetadata, "hint"); + param name="local.endpoints['#local.metaInfo.uriRegex#'].metadata" default={}; + if (!structIsEmpty(local.extraMetadata)) { + local.endpoints[local.metaInfo.uriRegex].metadata[local.f.name] = local.extraMetadata; + } else { + local.endpoints[local.metaInfo.uriRegex].metadata[local.f.name] = {}; + } + } + } + } catch (any cfcatch) { + // skip cfc's with errors, but save info about them for display in the dashboard + local.err = {}; + local.err.resource = local.beanName; + local.err.exception = cfcatch; + arrayAppend(arguments.taffyRef.status.skippedResources, local.err); + } + } + } + } + return local.endpoints; + } - - - - - - - - - - - - - - - - - - + private string function getBeanListFromExternalFactory(required bf) output="false" { + var local = {}; + var beanFactoryMeta = getMetadata(arguments.bf); + if (lcase(left(beanFactoryMeta.name, 10)) == "coldspring") { + return getBeanListFromColdSpring(arguments.bf); + } else if (beanFactoryMeta.name contains "ioc") { + // this isn't a perfect test (contains "ioc") but it's all we can do for now... + local.beanInfo = arguments.bf.getBeanInfo().beanInfo; + local.beanList = ""; + for (local.beanName in local.beanInfo) { + if ( + structKeyExists(local.beanInfo[local.beanName], "name") + && local.beanName != local.beanInfo[local.beanName].name + && isInstanceOf(arguments.bf.getBean(local.beanName), "taffy.core.resource") + ) { + local.beanList = listAppend(local.beanList, local.beanName); + } + } + return local.beanList; + } + return ""; + } - - - - - - - - - - - - - - - + */ + if (local.beans[local.beanName].getBeanClass() != "") { + if (local.beans[local.beanName].instanceOf("taffy.core.resource")) { + local.beanList = listAppend(local.beanList, local.beanName); + } + } + } + return local.beanList; + } - - - - - - - - - + private function inspectMimeTypes(required string customClassDotPath, required factory) output="false" hint="dot-notation path of representation class" { + if (arguments.factory.containsBean(arguments.customClassDotPath)) { + return _recurse_inspectMimeTypes(getMetadata(arguments.factory.getBean(arguments.customClassDotPath))); + } else { + return _recurse_inspectMimeTypes(getComponentMetadata(arguments.customClassDotPath)); + } + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - var local = StructNew(); - local.awesome = arrayNew(1); - local.sucky = refindNoCase(arguments.pattern, arguments.data, arguments.startPos, true); - if (not isArray(local.sucky.len) or arrayLen(local.sucky.len) eq 0){return arrayNew(1);} //handle no match at all - for (local.i=1; local.i<= arrayLen(local.sucky.len); local.i++){ - //if there's a match with pos 0 & length 0, that means the mime type was not specified - if (local.sucky.len[local.i] gt 0 && local.sucky.pos[local.i] gt 0){ - //don't include the group that matches the entire pattern - local.matchBody = mid(arguments.data, local.sucky.pos[local.i], local.sucky.len[local.i]); - if (local.matchBody neq arguments.data){ - arrayAppend( local.awesome, local.matchBody ); + private function _recurse_inspectMimeTypes(required struct objMetaData, struct data = {}) output="false" { + var local = {}; + local.ext = ""; + param name="arguments.data.mimeTypes" default={}; + param name="arguments.data.mimeExtensions" default={}; + param name="arguments.data.defaultMime" default=""; + // recurse into parents first so that child defaults override parent defaults + if (structKeyExists(arguments.objMetaData, "extends")) { + arguments.data = _recurse_inspectMimeTypes(arguments.objMetaData.extends, arguments.data); + } + // then handle child settings + if (structKeyExists(arguments.objMetaData, "functions") && isArray(arguments.objMetaData.functions)) { + local.funcs = arguments.objMetaData.functions; + for (local.f = 1; local.f <= arrayLen(local.funcs); local.f++) { + // for every function whose name starts with "getAs" *and* has a taffy_mime metadata attribute, register the mime type + local.mime = ""; + if (structKeyExists(local.funcs[local.f], "taffy_mime")) { + local.mime = local.funcs[local.f].taffy_mime; + } else if (structKeyExists(local.funcs[local.f], "taffy:mime")) { + local.mime = local.funcs[local.f]["taffy:mime"]; + } + if (ucase(left(local.funcs[local.f].name, 5)) == "GETAS" && len(local.mime)) { + local.ext = lcase(right(local.funcs[local.f].name, len(local.funcs[local.f].name) - 5)); + local.mime = lcase(local.mime); + for (local.thisMime in listToArray(local.mime, ",;")) { + param name="arguments.data.mimeExtensions['#local.ext#']" default=local.thisMime; + arguments.data.mimeTypes[local.thisMime] = local.ext; + } + // check for taffy_default metadata to set the current mime as the default + if (structKeyExists(local.funcs[local.f], "taffy_default") && local.funcs[local.f].taffy_default) { + arguments.data.defaultMime = local.ext; + } else if (structKeyExists(local.funcs[local.f], "taffy:default") && local.funcs[local.f]["taffy:default"] == true) { + arguments.data.defaultMime = local.ext; } } } - return local.awesome; - - + } + return arguments.data; + } - - - - + private boolean function isSerializerInstance(required any obj) output="false" { + if (!isObject(arguments.obj)) return false; + var meta = getMetadata(arguments.obj); + while (structKeyExists(meta, "name")) { + if (listLast(meta.name, ".") == "baseSerializer") return true; + if (!structKeyExists(meta, "extends")) break; + meta = meta.extends; + } + return false; + } - - - + private boolean function mimeSupported(required string mimeExt) output="false" { + if (structKeyExists(application._taffy.settings.mimeExtensions, arguments.mimeExt)) { + return true; + } + if (structKeyExists(application._taffy.settings.mimeTypes, arguments.mimeExt)) { + return true; + } + return false; + } - - - - - - - - + private function getReturnMimeAsHeader(required string mimeExt) output="false" { + if (structKeyExists(application._taffy.settings.mimeExtensions, arguments.mimeExt)) { + return application._taffy.settings.mimeExtensions[arguments.mimeExt]; + } + if (structKeyExists(application._taffy.settings.mimeTypes, arguments.mimeExt)) { + return arguments.mimeExt; + } + } - - - + private function getReturnMimeAsExt(required string mimeExt) output="false" { + if (structKeyExists(application._taffy.settings.mimeExtensions, arguments.mimeExt)) { + return arguments.mimeExt; + } + if (structKeyExists(application._taffy.settings.mimeTypes, arguments.mimeExt)) { + return application._taffy.settings.mimeTypes[arguments.mimeExt]; + } + } - - - + private void function handleDashboardRequest() { + if (structKeyExists(url, "openapi") || structKeyExists(url, "swagger")) { + writeOpenApiSpec(); + abort; + } + if (!application._taffy.settings.disableDashboard) { + if (structKeyExists(url, "docs")) { + include "#application._taffy.settings.docsPath#"; + } else { + include "../dashboard/dashboard.cfm"; + } + abort; + } else { + if (len(application._taffy.settings.disabledDashboardRedirect)) { + location(url=application._taffy.settings.disabledDashboardRedirect, addtoken=false); + abort; + } else if (application._taffy.settings.showDocsWhenDashboardDisabled) { + include "#application._taffy.settings.docsPath#"; + abort; + } else { + throwError(403, "Forbidden"); + } + } + } - - - - + private void function writeOpenApiSpec() { + var openapiCfg = application._taffy.settings.openapi; + if (structKeyExists(openapiCfg, "enabled") && openapiCfg.enabled == false) { + throwError(403, "Forbidden"); + } + // cache the serialized spec — it's deterministic from application._taffy and only changes on framework reload, + // which replaces application._taffy wholesale (setupFramework), naturally invalidating this + if (!structKeyExists(application._taffy, "openapiSpec")) { + var generator = createObject("component", "taffy.core.openapi"); + application._taffy.openapiSpec = serializeJson(generator.generate()); + } + cfcontent(reset=true, type="application/json; charset=utf-8"); + cfheader(name="Access-Control-Allow-Origin", value="*"); + writeOutput(application._taffy.openapiSpec); + } - - - - + private boolean function isUnhandledPathRequest(targetPath) { + return REFindNoCase("^(" & application._taffy.settings.unhandledPathsRegex & ")", arguments.targetPath); + } - - - + private function reFindNoSuck(required string pattern, required string data, startPos = 1) output="false" hint="I wrote this wrapper for reFindNoCase because the way it returns matches is god awful." { + var local = {}; + local.awesome = []; + local.sucky = refindNoCase(arguments.pattern, arguments.data, arguments.startPos, true); + if (!isArray(local.sucky.len) || arrayLen(local.sucky.len) == 0) { + return []; + } // handle no match at all + for (local.i = 1; local.i <= arrayLen(local.sucky.len); local.i++) { + // if there's a match with pos 0 & length 0, that means the mime type was not specified + if (local.sucky.len[local.i] > 0 && local.sucky.pos[local.i] > 0) { + // don't include the group that matches the entire pattern + local.matchBody = mid(arguments.data, local.sucky.pos[local.i], local.sucky.len[local.i]); + if (local.matchBody != arguments.data) { + arrayAppend(local.awesome, local.matchBody); + } + } + } + return local.awesome; + } - - - - - - - + // helper methods: stuff used in Application.cfc + private function getBeanFactory() output="false" { + return application._taffy.factory; + } - - - - - - - + private function getExternalBeanFactory() output="false" { + return application._taffy.externalBeanFactory; + } - - - - - - - - - + private function newRepresentation() output="false" hint="private as of 3.0" { + var repClass = application._taffy.settings.serializer; + var rep = ""; + if (application._taffy.factory.containsBean(repClass)) { + rep = application._taffy.factory.getBean(repClass); + } else { + rep = createObject("component", repClass); + } + rep.setNoDataSends204NoContent(application._taffy.settings.noDataSends204NoContent); + return rep; + } - - - - - - - - - - - - - - + public function noData() output="false" { + return newRepresentation().noData(); + } - - - + public function noContent() output="false" { + return newRepresentation().noContent(); + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + public function representationOf(required data) output="false" { + return newRepresentation().setData(arguments.data); + } - + public function rep(required data) output="false" hint="alias for representationOf" { + return representationOf(arguments.data); + } -
+ private struct function getGlobalHeaders() output="false" { + return application._taffy.settings.globalHeaders; + } + + public string function getPath() output="false" hint="This method returns just the URI portion of the URL, and makes it easier to port Taffy to other platforms by subclassing this method to match the way the platform works. The default behavior is tested and works on Adobe ColdFusion 9.0.1." { + if (cgi.path_info == cgi.script_name) { + // WTF! I've only seen this on Win+IIS, seems fine on OSX+Apache... + return ""; + } + return cgi.path_info; + } + + public void function addHeaders(required struct headers) output="false" { + var h = ""; + if (!structIsEmpty(arguments.headers)) { + for (h in arguments.headers) { + cfheader(name=h, value=arguments.headers[h]); + } + } + } + + public struct function getBasicAuthCredentials() output="false" { + var local = {}; + local.credentials = {}; + local.credentials.username = ""; + local.credentials.password = ""; + try { + local.encodedCredentials = ListLast(GetPageContext().getRequest().getHeader("Authorization"), " "); + local.decodedCredentials = toString(toBinary(local.EncodedCredentials), "iso-8859-1"); + local.credentials.username = listFirst(local.decodedCredentials, ":"); + local.credentials.password = listRest(local.decodedCredentials, ":"); + } catch (any e) { + } + return local.credentials; + } + + function getHostname() { + // unceremoniously stolen from FW/1 + return createObject("java", "java.net.InetAddress").getLocalHost().getHostName(); + } + + function getHintsFromMetaData(required struct metadata) output="false" { + var result = {}; + var func = ""; + var f = 0; + var g = 0; + var foundFunc = false; + result.functions = []; + + // don't recurse if we've reached the base component + if (structKeyExists(metadata, "extends") && metadata.extends.fullname != "taffy.core.resource") { + result = getHintsFromMetaData(metadata.extends); + } + + // component attributes + if (structKeyExists(arguments.metadata, "hint")) { + // intentionally overwrite hint from any parent cfc's + result.hint = arguments.metadata.hint; + } + + // get uri + if (structKeyExists(arguments.metadata, "taffy_uri")) { + result.uri = arguments.metadata.taffy_uri; + } + if (structKeyExists(arguments.metadata, "taffy:uri")) { + result.uri = arguments.metadata["taffy:uri"]; + } + + // if there aren't any functions here to grab, return what we already have + if (!structKeyExists(metadata, "functions") || !isArray(metadata.functions) || !arrayLen(metadata.functions)) { + return result; + } + + for (f = 1; f <= arrayLen(metadata.functions); f++) { + func = metadata.functions[f]; + // ignore hidden methods, if access is not set, assume public + if (!structKeyExists(func, "access") || (func.access != "private" && func.access != "package")) { + // check to see if this function is already in the list. If so, overwrite, otherwise append + foundFunc = false; + for (g = 1; g <= arrayLen(result.functions); g++) { + if (result.functions[g].NAME == func.NAME) { + result.functions[g] = func; + foundFunc = true; + break; + } + } + if (!foundFunc) { + arrayAppend(result.functions, func); + } + } + } + + return result; + } + + function addTaffyHeader(required string name, required string value) { + if (application._taffy.settings.exposeTaffyHeaders) { + cfheader(name=arguments.name, value=arguments.value); + } + } + +} diff --git a/v1/taffy/core/baseDeserializer.cfc b/v1/taffy/core/baseDeserializer.cfc index 6e1c891..d4b90f0 100644 --- a/v1/taffy/core/baseDeserializer.cfc +++ b/v1/taffy/core/baseDeserializer.cfc @@ -1,57 +1,47 @@ - +component output="false" hint="a helper class to decode input data" { - - - - - - - - - - + public function getFromForm(body) output="false" taffy_mime="application/x-www-form-urlencoded" hint="get data from form post" { + var response = {}; + var pairs = listToArray(arguments.body, "&"); + var pair = ""; + var kv = []; + var ix = 0; + var k = ""; + var v = ""; - - + if (!find('=', arguments.body)) { + throwError(400, "You've indicated that you're sending form-encoded data but it doesn't appear to be valid. Aborting request."); + } - - - - + return response; + } - - - + private void function throwError(numeric statusCode=500, required string msg, struct headers={}) output="false" { + cfcontent(reset="true"); + addHeaders(arguments.headers); + cfheader(statuscode=arguments.statusCode, statustext=arguments.msg); + abort; + } - - - - - - - - - + private void function addHeaders(required struct headers) output="false" { + var h = ''; + if (!structIsEmpty(arguments.headers)) { + for (h in arguments.headers) { + cfheader(name=h, value=arguments.headers[h]); + } + } + } - - - - - - - - - - - +} diff --git a/v1/taffy/core/baseSerializer.cfc b/v1/taffy/core/baseSerializer.cfc index 6838417..3a025d4 100644 --- a/v1/taffy/core/baseSerializer.cfc +++ b/v1/taffy/core/baseSerializer.cfc @@ -1,199 +1,195 @@ - +component output="false" hint="a helper class to represent easily serializable data" { - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + variables.data = ""; + variables.fileName = ""; + variables.fileMime = ""; + variables.statusCode = 200; + variables.statusText = "OK"; + variables.miscHeaders = {}; + variables.deleteFile = false; + variables.noDataSends204NoContent = false; + // 1= textual, 2= filename, 3= file data + variables.type = 1; + variables.types = {}; + variables.types[1] = "textual"; + variables.types[2] = "filename"; + variables.types[3] = "filedata"; + variables.types[4] = "imagedata"; + variables.statusTexts = {}; + variables.statusTexts[100] = "Continue"; + variables.statusTexts[101] = "Switching Protocols"; + variables.statusTexts[102] = "Processing"; + variables.statusTexts[200] = "OK"; + variables.statusTexts[201] = "Created"; + variables.statusTexts[202] = "Accepted"; + variables.statusTexts[203] = "Non-authoritative Information"; + variables.statusTexts[204] = "No Content"; + variables.statusTexts[205] = "Reset Content"; + variables.statusTexts[206] = "Partial Content"; + variables.statusTexts[207] = "Multi-Status"; + variables.statusTexts[208] = "Already Reported"; + variables.statusTexts[226] = "IM Used"; + variables.statusTexts[300] = "Multiple Choices"; + variables.statusTexts[301] = "Moved Permanently"; + variables.statusTexts[302] = "Found"; + variables.statusTexts[303] = "See Other"; + variables.statusTexts[304] = "Not Modified"; + variables.statusTexts[305] = "Use Proxy"; + variables.statusTexts[307] = "Temporary Redirect"; + variables.statusTexts[308] = "Permanent Redirect"; + variables.statusTexts[400] = "Bad Request"; + variables.statusTexts[401] = "Unauthorized"; + variables.statusTexts[402] = "Payment Required"; + variables.statusTexts[403] = "Forbidden"; + variables.statusTexts[404] = "Not Found"; + variables.statusTexts[405] = "Method Not Allowed"; + variables.statusTexts[406] = "Not Acceptable"; + variables.statusTexts[407] = "Proxy Authentication Required"; + variables.statusTexts[408] = "Request Timeout"; + variables.statusTexts[409] = "Conflict"; + variables.statusTexts[410] = "Gone"; + variables.statusTexts[411] = "Length Required"; + variables.statusTexts[412] = "Precondition Failed"; + variables.statusTexts[413] = "Payload Too Large"; + variables.statusTexts[414] = "Request-URI Too Long"; + variables.statusTexts[415] = "Unsupported Media Type"; + variables.statusTexts[416] = "Requested Range Not Satisfiable"; + variables.statusTexts[417] = "Expectation Failed"; + variables.statusTexts[418] = "I'm a teapot"; + variables.statusTexts[421] = "Misdirected Request"; + variables.statusTexts[422] = "Unprocessable Entity"; + variables.statusTexts[423] = "Locked"; + variables.statusTexts[424] = "Failed Dependency"; + variables.statusTexts[426] = "Upgrade Required"; + variables.statusTexts[428] = "Precondition Required"; + variables.statusTexts[429] = "Too Many Requests"; + variables.statusTexts[431] = "Request Header Fields Too Large"; + variables.statusTexts[444] = "Connection Closed Without Response"; + variables.statusTexts[451] = "Unavailable For Legal Reasons"; + variables.statusTexts[499] = "Client Closed Request"; + variables.statusTexts[500] = "Internal Server Error"; + variables.statusTexts[501] = "Not Implemented"; + variables.statusTexts[502] = "Bad Gateway"; + variables.statusTexts[503] = "Service Unavailable"; + variables.statusTexts[504] = "Gateway Timeout"; + variables.statusTexts[505] = "HTTP Version Not Supported"; + variables.statusTexts[506] = "Variant Also Negotiates"; + variables.statusTexts[507] = "Insufficient Storage"; + variables.statusTexts[508] = "Loop Detected"; + variables.statusTexts[510] = "Not Extended"; + variables.statusTexts[511] = "Network Authentication Required"; + variables.statusTexts[599] = "Network Connect Timeout Error"; - - - + public function getType() output="false" { + return variables.types[variables.type]; + } - - - - - - + public function setData(required data) output="false" hint="setter for the data to be returned" { + variables.type = 1; + variables.data = arguments.data; + return this; + } - - - + public function getData() output="false" hint="mostly for testability, returns the native data embedded in the representation instance" { + return variables.data; + } - - - - - - - + public function setNoDataSends204NoContent(required boolean value) output="false" { + variables.noDataSends204NoContent = arguments.value; + return this; + } - - - - + public function noData() output="false" hint="returns empty representation instance" { + if (variables.noDataSends204NoContent) { + return this.noContent(); + } else { + return this; + } + } - - - - - - + public function noContent() output="false" hint="returns empty representation instance" { + // According to issue #365 https://github.com/atuttle/Taffy/issues/365 + // noContent() returns with HTTP status code 204 and Content-Type as text/plain (omitting this header is difficult and maybe not recommanded) + // noData() is kept 'as is' for backward compatibility with existing implementations + return this.withStatus(204).withHeaders({"Content-Type"="text/plain"}); + } - - - + public function setFileName(required string file) output="false" hint="Pass in a file-name (fully qualified, e.g. c:\temp\img.jpg) to have Taffy stream this file back to the client" { + variables.type = 2; + variables.fileName = arguments.file; + return this; + } - - - - - - + public function getFileName() output="false" { + return variables.fileName; + } - - - + public function setFileData(required data) output="false" hint="Pass in file data (eg a generated PDF object) - NOT a Filename! - to have Taffy stream the content back to the client" { + variables.type = 3; + variables.fileData = arguments.data; + return this; + } - - - - - - - - - + public function getFileData() output="false" { + return variables.fileData; + } - - - + public function setImageData(required data) output="false" hint="Pass in image data (eg a generated image object) - NOT a Filename! - to have Taffy stream the content back to the client" { + variables.type = 4; + if (!isBinary(arguments.data)) { + arguments.data = toBinary(toBase64(arguments.data)); + } + variables.fileData = arguments.data; + return this; + } - - - - - + public function getImageData() output="false" { + return getFileData(); + } - - - + public function withMime(required string mime) output="false" hint="Use this method in conjunction with streamFile and streamBinary in your resources to set the mime type of the file being returned. Ex: return streamFile('kittens/cuteness.jpg').withMime('image/jpeg');" { + variables.fileMime = arguments.mime; + return this; + } - - - - - - - - - - - + public function getFileMime() output="false" { + return variables.fileMime; + } - - - + public function withStatus(required numeric statusCode, string statusText="") output="false" hint="used to set the http response code for the response" { + variables.statusCode = arguments.statusCode; + if (len(arguments.statusText)) { + variables.statusText = arguments.statusText; + } else if (structKeyExists(variables.statusTexts, arguments.statusCode)) { + variables.statusText = variables.statusTexts[arguments.statusCode]; + } + return this; + } - - - + public numeric function getStatus() output="false" { + return variables.statusCode; + } - - - - - + public string function getStatusText() output="false" { + return variables.statusText; + } - - - + public function withHeaders(required struct headerStruct) output="false" hint="used to set custom headers for the response" { + variables.miscHeaders = arguments.headerStruct; + return this; + } - - - - - + public struct function getHeaders() output="false" { + return variables.miscHeaders; + } - - - + public function andDelete(required boolean doDeleteFile) output="false" hint="used to delete the streamed file" { + variables.deleteFile = arguments.doDeleteFile; + return this; + } - + public boolean function getDeleteFile() output="false" { + return variables.deleteFile; + } + +} diff --git a/v1/taffy/core/factory.cfc b/v1/taffy/core/factory.cfc index d814299..6f0ca24 100644 --- a/v1/taffy/core/factory.cfc +++ b/v1/taffy/core/factory.cfc @@ -1,159 +1,138 @@ - - - //bean cache - this.beans = structNew(); - this.transients = structNew(); - //functionality - +component output="false" { - - - - if (structKeyExists(arguments, "externalBeanFactory")) { - this.externalBeanFactory = arguments.externalBeanFactory; - } - return this; - - + // bean cache + this.beans = {}; + this.transients = {}; - - // Proxy to beanExists to provide similar interface to ColdSpring - function containsBean(beanName){ - return beanExists(arguments.beanName); + public function init(externalBeanFactory) { + if (structKeyExists(arguments, "externalBeanFactory")) { + this.externalBeanFactory = arguments.externalBeanFactory; } - function transientExists(beanName){ - return structKeyExists(this.transients, arguments.beanName); + return this; + } + + // Proxy to beanExists to provide similar interface to ColdSpring + public function containsBean(beanName) { + return beanExists(arguments.beanName); + } + + public function transientExists(beanName) { + return structKeyExists(this.transients, arguments.beanName); + } + + public function getBean(beanName) { + var b = 0; + var meta = 0; + if (beanExists(arguments.beanName, false, false)) { + return this.beans[arguments.beanName]; + } else if (transientExists(arguments.beanName)) { + b = createObject('component', this.transients[arguments.beanName]); + meta = getMetadata(b); + _recurse_ResolveDependencies(b, meta); + return b; + } else if (externalBeanExists(arguments.beanName)) { + return this.externalBeanFactory.getBean(arguments.beanName); + } else { + throwError(message="Bean name '#arguments.beanName#' not found.", type="Taffy.Factory.BeanNotFound"); } - function getBean(beanName){ - var b = 0; - var meta = 0; - if (beanExists(arguments.beanName, false, false)){ - return this.beans[arguments.beanName]; - }else if (transientExists(arguments.beanName)){ - b = createObject('component', this.transients[arguments.beanName]); - meta = getMetadata(b); - _recurse_ResolveDependencies(b, meta); - return b; - }else if (externalBeanExists(arguments.beanName)){ - return this.externalBeanFactory.getBean(arguments.beanName); - }else{ - throwError(message="Bean name '#arguments.beanName#' not found.", type="Taffy.Factory.BeanNotFound"); + } + + public function getBeanList() { + var combined = structKeyList(this.beans); + var trans = structKeyList(this.transients); + if (len(combined) and len(trans)) { + combined = combined & ","; + } + combined = combined & trans; + return combined; + } + + public function beanExists(required beanName, includeTransients=true, includeExternal=false) output="false" { + return structKeyExists(this.beans, arguments.beanName) or (arguments.includeTransients and transientExists(arguments.beanName)) or + (arguments.includeExternal and externalBeanExists(arguments.beanName)); + } + + private boolean function externalBeanExists(required beanName) output="false" { + return structKeyExists(this, "externalBeanFactory") and this.externalBeanFactory.containsBean(arguments.beanName); + } + + public void function loadBeansFromPath( + required string beanPath hint="Absolute path to folder containing beans", + string resourcesPath="resources", + string resourcesBasePath="", + boolean isFullReload=false, + taffyRef={} + ) output="false" { + var local = {}; + // cache all of the beans + if (isFullReload) { + this.beans = {}; + arguments.taffyRef.status.skippedResources = []; // empty out the array on factory reloads + arguments.taffyRef.beanList = ""; + } + // if the folder doesn't exist, do nothing + if (!directoryExists(arguments.beanPath)) { + return; + } + // get list of beans to load + local.beanQuery = directoryList(arguments.beanPath, true, "query", "*.cfc"); + for (var row in local.beanQuery) { + local.beanName = filePathToBeanName(row.directory, row.name, arguments.resourcesBasePath); + local.beanPath = filePathToBeanPath(row.directory, row.name, arguments.resourcesPath, arguments.resourcesBasePath); + try { + local.objBean = createObject("component", local.beanPath); + if (isSerializerInstance(local.objBean)) { + this.transients[local.beanName] = local.beanPath; + } else { + this.beans[local.beanName] = local.objBean; + } + } catch (any e) { + // skip cfc's with errors, but save info about them for display in the dashboard + local.err = {}; + local.err.resource = local.beanName; + local.err.exception = e; + arrayAppend(arguments.taffyRef.status.skippedResources, local.err); } } - function getBeanList(){ - var combined = structKeyList(this.beans); - var trans = structKeyList(this.transients); - if (len(combined) and len(trans)){ - combined = combined & ","; - } - combined = combined & trans; - return combined; + // resolve dependencies + for (local.b in this.beans) { + local.bean = this.beans[local.b]; + local.beanMeta = getMetadata(local.bean); + _recurse_ResolveDependencies(local.bean, local.beanMeta); } - - - - - - - return structKeyExists(this.beans, arguments.beanName) or (arguments.includeTransients and transientExists(arguments.beanName)) or - (arguments.includeExternal and externalBeanExists(arguments.beanName)); - - - - - - return structKeyExists(this, "externalBeanFactory") and this.externalBeanFactory.containsBean(arguments.beanName); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + } - - - - - - - - - - - - - - - - + ); + beanPath = replace(beanPath, "..", ".", "ALL"); + if (left(beanPath, 1) eq ".") { + beanPath = right(beanPath, len(beanPath)-1); + } + return beanPath; + } - - - - - - - - - + ); + } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + private function _recurse_ResolveDependencies(required bean, required struct metaData) { + var local = {}; + if (structKeyExists(arguments.metaData, "functions") and isArray(arguments.metaData.functions)) { + for (local.f = 1; local.f <= arrayLen(arguments.metaData.functions); local.f++) { + local.fname = arguments.metaData.functions[local.f].name; + if (len(local.fname) gt 3) { + local.propName = right(local.fname, len(local.fname)-3); + if (left(local.fname, 3) eq "set" and beanExists(local.propName, true, true)) { + invoke(arguments.bean, local.fname, [getBean(local.propName)]); + } + } + } + } + if (structKeyExists(arguments.metaData, "properties") and isArray(arguments.metaData.properties)) { + for (local.p = 1; local.p <= arrayLen(arguments.metaData.properties); local.p++) { + local.propName = arguments.metaData.properties[local.p].name; + if (beanExists(local.propName, true, true)) { + arguments.bean[local.propName] = getBean(local.propName); + } + } + } + if (structKeyExists(arguments.metaData, "extends") and isStruct(arguments.metaData.extends)) { + _recurse_ResolveDependencies(arguments.bean, arguments.metaData.extends); + } + } - + /** + * Walks the inheritance chain to check if obj extends baseSerializer. + * Replaces isInstanceOf() which fails on Lucee when extends resolves + * to a relative path instead of a mapping-prefixed path. + */ + private boolean function isSerializerInstance(required any obj) output="false" { + if (!isObject(arguments.obj)) return false; + var meta = getMetadata(arguments.obj); + while (structKeyExists(meta, "name")) { + if (listLast(meta.name, ".") == "baseSerializer") return true; + if (!structKeyExists(meta, "extends")) break; + meta = meta.extends; + } + return false; + } + + private function throwError() { + cfthrow(attributecollection=arguments); + } + +} diff --git a/v1/taffy/core/nativeJsonDeserializer.cfc b/v1/taffy/core/nativeJsonDeserializer.cfc index 0eb87ac..8a5084c 100644 --- a/v1/taffy/core/nativeJsonDeserializer.cfc +++ b/v1/taffy/core/nativeJsonDeserializer.cfc @@ -1,21 +1,20 @@ - +component extends="baseDeserializer" { - - - - + public function getFromJson(body) output="false" taffy_mime="application/json,text/json" hint="get data from json" { + var data = 0; + var response = {}; - - - - - - - - - + if (!isJson(arguments.body)) { + throwError(msg="Input JSON is not well formed", statusCode="400"); + } + data = deserializeJSON(arguments.body); + if (!isStruct(data)) { + response['_body'] = data; + } else { + response = data; + } - - + return response; + } - +} diff --git a/v1/taffy/core/nativeJsonSerializer.cfc b/v1/taffy/core/nativeJsonSerializer.cfc index f6a28be..89a74e6 100644 --- a/v1/taffy/core/nativeJsonSerializer.cfc +++ b/v1/taffy/core/nativeJsonSerializer.cfc @@ -1,12 +1,7 @@ - +component extends="baseSerializer" output="false" hint="Serializer that uses CFML server's json serialization functionality to return json data" { - - - + public function getAsJson() output="false" taffy_mime="application/json;text/json" taffy_default="true" hint="serializes data as JSON" { + return rereplace(replace(serializeJSON(variables.data), chr(2), '', 'ALL'), '"\\u0002', '"', 'ALL'); + } - +} diff --git a/v1/taffy/core/openapi.cfc b/v1/taffy/core/openapi.cfc new file mode 100644 index 0000000..f30e585 --- /dev/null +++ b/v1/taffy/core/openapi.cfc @@ -0,0 +1,297 @@ +component output="false" hint="Generates an OpenAPI 3.1 document from Taffy runtime metadata." { + + public struct function generate() + hint="Returns an OpenAPI 3.1 struct describing all registered resources." { + + var settings = application._taffy.settings; + var endpoints = application._taffy.endpoints; + var matchOrder = application._taffy.uriMatchOrder; + var openapiCfg = structKeyExists(settings, "openapi") ? settings.openapi : {}; + var mediaTypes = collectResponseMediaTypes(); + + var doc = { + "openapi": "3.1.0", + "info": buildInfo(settings, openapiCfg), + "paths": {} + }; + + var servers = buildServers(openapiCfg); + if (arrayLen(servers)) { + doc["servers"] = servers; + } + + for (var i = 1; i <= arrayLen(matchOrder); i++) { + var endpoint = endpoints[matchOrder[i]]; + var bean = application._taffy.factory.getBean(endpoint.beanName); + var beanMeta = getMetaData(bean); + + if (hasAnyKey(beanMeta, "taffy_docs_hide,taffy:docs:hide,taffy_dashboard_hide,taffy:dashboard:hide")) { + continue; + } + + var funcs = collectFunctions(beanMeta); + var pathItem = {}; + var validVerbs = "get,put,post,delete,options,head,patch,trace"; + + for (var verb in endpoint.methods) { + if (!listFindNoCase(validVerbs, verb)) continue; + var funcName = endpoint.methods[verb]; + if (!structKeyExists(funcs, funcName)) continue; + var func = funcs[funcName]; + if (hasAnyKey(func, "taffy_docs_hide,taffy:docs:hide,taffy_dashboard_hide,taffy:dashboard:hide")) continue; + pathItem[lcase(verb)] = buildOperation(verb, func, endpoint, beanMeta, mediaTypes); + } + + if (!structIsEmpty(pathItem)) { + doc.paths[normalizePathTemplate(endpoint.srcUri, endpoint.tokens)] = pathItem; + } + } + + return doc; + } + + private struct function buildInfo(required struct settings, required struct openapiCfg) { + var info = { + "title": arguments.settings.docs.APIName, + "version": arguments.settings.docs.APIVersion + }; + if (structKeyExists(arguments.openapiCfg, "description")) info["description"] = arguments.openapiCfg.description; + if (structKeyExists(arguments.openapiCfg, "contact")) info["contact"] = arguments.openapiCfg.contact; + if (structKeyExists(arguments.openapiCfg, "license")) info["license"] = arguments.openapiCfg.license; + return info; + } + + private array function buildServers(required struct openapiCfg) { + if (structKeyExists(arguments.openapiCfg, "servers") && isArray(arguments.openapiCfg.servers)) { + return arguments.openapiCfg.servers; + } + var host = cgi.http_host; + if (!len(host)) return []; + var isHttps = cgi.server_port == 443 || (structKeyExists(cgi, "https") && cgi.https == "on"); + var scheme = isHttps ? "https" : "http"; + var scriptDir = getDirectoryFromPath(cgi.script_name); + if (right(scriptDir, 1) == "/" && len(scriptDir) > 1) { + scriptDir = left(scriptDir, len(scriptDir) - 1); + } + return [ { "url": scheme & "://" & host & scriptDir } ]; + } + + private array function collectResponseMediaTypes() + hint="Unique MIME type strings Taffy can return, derived from registered serializers." { + var mimes = {}; + for (var ext in application._taffy.settings.mimeExtensions) { + for (var part in listToArray(application._taffy.settings.mimeExtensions[ext], ";")) { + mimes[trim(part)] = true; + } + } + var out = []; + for (var m in mimes) arrayAppend(out, m); + arraySort(out, "text"); + return out; + } + + private struct function collectFunctions(required struct metadata) + hint="Flatten the cfc's function metadata (including inherited) keyed by name. Child overrides parent." { + var result = {}; + if (structKeyExists(arguments.metadata, "extends") && arguments.metadata.extends.fullname != "taffy.core.resource") { + result = collectFunctions(arguments.metadata.extends); + } + if (!structKeyExists(arguments.metadata, "functions") || !isArray(arguments.metadata.functions)) { + return result; + } + for (var f = 1; f <= arrayLen(arguments.metadata.functions); f++) { + var func = arguments.metadata.functions[f]; + if (structKeyExists(func, "access") && (func.access == "private" || func.access == "package")) continue; + result[func.name] = func; + } + return result; + } + + private struct function buildOperation( + required string verb, + required struct func, + required struct endpoint, + required struct beanMeta, + required array mediaTypes + ) { + var op = { + "tags": [ getResourceTag(arguments.beanMeta, arguments.endpoint.beanName) ], + "operationId": arguments.endpoint.beanName & "_" & lcase(arguments.verb) + }; + + if (structKeyExists(arguments.beanMeta, "taffy:docs:name")) { + op["summary"] = arguments.beanMeta["taffy:docs:name"]; + } else if (structKeyExists(arguments.beanMeta, "taffy_docs_name")) { + op["summary"] = arguments.beanMeta["taffy_docs_name"]; + } + if (structKeyExists(arguments.func, "hint")) op["description"] = arguments.func.hint; + + var tokenLookup = {}; + for (var t = 1; t <= arrayLen(arguments.endpoint.tokens); t++) { + tokenLookup[lcase(arguments.endpoint.tokens[t])] = arguments.endpoint.tokens[t]; + } + + var parameters = []; + var bodyParams = []; + var declaredPathTokens = {}; + var params = structKeyExists(arguments.func, "parameters") ? arguments.func.parameters : []; + var isBodyVerb = listFindNoCase("post,put,patch", arguments.verb) > 0; + + for (var p = 1; p <= arrayLen(params); p++) { + var param = params[p]; + if (hasAnyKey(param, "taffy_docs_hide,taffy:docs:hide,taffy_dashboard_hide,taffy:dashboard:hide")) continue; + if (structKeyExists(tokenLookup, lcase(param.name))) { + // use the token's original casing so the parameter name matches the path template exactly + arrayAppend(parameters, buildParameter(param, "path", true, tokenLookup[lcase(param.name)])); + declaredPathTokens[lcase(param.name)] = true; + } else if (isBodyVerb) { + arrayAppend(bodyParams, param); + } else { + var required = structKeyExists(param, "required") && param.required; + arrayAppend(parameters, buildParameter(param, "query", required)); + } + } + + // backfill any path tokens the resource didn't declare as args — OpenAPI requires a parameter for every {token} + for (var t2 = 1; t2 <= arrayLen(arguments.endpoint.tokens); t2++) { + var tok = arguments.endpoint.tokens[t2]; + if (!structKeyExists(declaredPathTokens, lcase(tok))) { + arrayAppend(parameters, { + "name": tok, + "in": "path", + "required": true, + "schema": { "type": "string" } + }); + } + } + + if (arrayLen(parameters)) op["parameters"] = parameters; + if (isBodyVerb && arrayLen(bodyParams)) op["requestBody"] = buildRequestBody(bodyParams); + op["responses"] = buildResponses(arguments.mediaTypes); + + return op; + } + + private struct function buildParameter(required struct param, required string location, required boolean required, string nameOverride = "") { + var out = { + "name": len(arguments.nameOverride) ? arguments.nameOverride : arguments.param.name, + "in": arguments.location, + "required": arguments.required, + "schema": paramSchema(arguments.param) + }; + if (structKeyExists(arguments.param, "hint")) out["description"] = arguments.param.hint; + return out; + } + + private struct function buildRequestBody(required array bodyParams) { + var properties = {}; + var required = []; + for (var p = 1; p <= arrayLen(arguments.bodyParams); p++) { + var param = arguments.bodyParams[p]; + var schema = paramSchema(param); + if (structKeyExists(param, "hint")) schema["description"] = param.hint; + properties[param.name] = schema; + if (structKeyExists(param, "required") && param.required) arrayAppend(required, param.name); + } + var bodySchema = { "type": "object", "properties": properties }; + if (arrayLen(required)) bodySchema["required"] = required; + return { + "content": { + "application/json": { "schema": bodySchema }, + "application/x-www-form-urlencoded": { "schema": bodySchema } + } + }; + } + + private struct function buildResponses(required array mediaTypes) { + var content = {}; + for (var i = 1; i <= arrayLen(arguments.mediaTypes); i++) { + content[arguments.mediaTypes[i]] = {}; + } + var ok = { "description": "Successful response" }; + if (!structIsEmpty(content)) ok["content"] = content; + return { "200": ok, "default": { "description": "Unexpected error" } }; + } + + private struct function paramSchema(required struct param) { + var schema = cfmlTypeToSchema(structKeyExists(arguments.param, "type") ? arguments.param.type : ""); + if (structKeyExists(arguments.param, "default") && len(arguments.param.default)) { + schema["default"] = arguments.param.default; + } + return schema; + } + + private struct function cfmlTypeToSchema(required string type) { + switch (lcase(trim(arguments.type))) { + case "numeric": case "number": case "double": case "float": + return { "type": "number" }; + case "integer": + return { "type": "integer" }; + case "string": + return { "type": "string" }; + case "boolean": + return { "type": "boolean" }; + case "struct": + return { "type": "object" }; + case "array": + return { "type": "array" }; + case "date": case "datetime": + return { "type": "string", "format": "date-time" }; + case "uuid": case "guid": + return { "type": "string", "format": "uuid" }; + case "email": + return { "type": "string", "format": "email" }; + case "url": + return { "type": "string", "format": "uri" }; + case "": case "any": case "variablename": + return {}; + default: + return { "type": "string" }; + } + } + + private string function getResourceTag(required struct beanMeta, required string beanName) { + if (structKeyExists(arguments.beanMeta, "taffy:docs:name")) return arguments.beanMeta["taffy:docs:name"]; + if (structKeyExists(arguments.beanMeta, "taffy_docs_name")) return arguments.beanMeta["taffy_docs_name"]; + return arguments.beanName; + } + + private string function normalizePathTemplate(required string uri, required array tokens) + hint="Rebuild Taffy's URI as an OpenAPI path template: {name:regex} => {name}. Handles nested braces in token regexes." { + var out = ""; + var i = 1; + var tokenIdx = 1; + var n = len(arguments.uri); + while (i <= n) { + var ch = mid(arguments.uri, i, 1); + if (ch == "{") { + // find the matching close brace, honoring nesting + var depth = 1; + var j = i + 1; + while (j <= n && depth > 0) { + var c2 = mid(arguments.uri, j, 1); + if (c2 == "{") depth++; + else if (c2 == "}") depth--; + if (depth > 0) j++; + } + if (depth == 0 && tokenIdx <= arrayLen(arguments.tokens)) { + out &= "{" & arguments.tokens[tokenIdx] & "}"; + tokenIdx++; + i = j + 1; + continue; + } + } + out &= ch; + i++; + } + return out; + } + + private boolean function hasAnyKey(required struct target, required string keys) { + for (var k in listToArray(arguments.keys)) { + if (structKeyExists(arguments.target, k)) return true; + } + return false; + } + +} diff --git a/v1/taffy/core/resource.cfc b/v1/taffy/core/resource.cfc index b1c8c0b..b2d32b8 100644 --- a/v1/taffy/core/resource.cfc +++ b/v1/taffy/core/resource.cfc @@ -1,141 +1,137 @@ - +component hint="base class for taffy REST components" { - - - - + public function forceString(required data) hint="the data that is being forced to serialize as a string" { + return chr(2) & arguments.data; + } - - + variables.encode = {}; + variables.encode.string = forceString; - - - - - + public function representationOf(required data) output="false" hint="returns an object capable of serializing the data in a variety of formats" { + return getRepInstance().setData(arguments.data); + } - - - - + public function rep(required data) output="false" hint="alias for representationOf" { + return representationOf(arguments.data); + } - - - + private function noData() output="false" hint="use this function to return only headers to the consumer, no data" { + return getRepInstance().noData(); + } - - - + private function noContent() output="false" hint="use this function to return only headers to the consumer, no data" { + return getRepInstance().noContent(); + } - - - - + private function streamFile(required fileName) output="false" hint="Use this function to specify a file name (eg c:\tmp\kitten.jpg) to be streamed to the client. When you use this method it is *required* that you also use .withMime() to specify the mime type." { + return getRepInstance().setFileName(arguments.fileName); + } - - - - + private function streamBinary(required binaryData) output="false" hint="Use this function to stream binary data, like a generated PDF object, to the client. When you use this method it is *required* that you also use .withMime() to specify the mime type." { + return getRepInstance().setFileData(arguments.binaryData); + } - - - - + private function streamImage(required binaryData) output="false" hint="Use this function to stream binary data, like a generated PDF object, to the client. When you use this method it is *required* that you also use .withMime() to specify the mime type." { + return getRepInstance().setImageData(arguments.binaryData); + } - - - - - + public function saveLog(exception) { + var logger = createObject("component", application._taffy.settings.exceptionLogAdapter).init( + application._taffy.settings.exceptionLogAdapterConfig + ); + logger.saveLog(exception); + } - - - - - var local = {}; - if (structKeyExists(server, "railo") or structKeyExists(server, "lucee")) { - local.Columns = listToArray(arguments.q.getColumnList(false)); - } - else { - local.Columns = arguments.q.getMetaData().getColumnLabels(); - } - local.QueryArray = ArrayNew(1); - for (local.RowIndex = 1; local.RowIndex <= arguments.q.RecordCount; local.RowIndex++){ - local.Row = {}; - local.numCols = ArrayLen( local.Columns ); - for (local.ColumnIndex = 1; local.ColumnIndex <= local.numCols; local.ColumnIndex++){ - local.ColumnName = local.Columns[ local.ColumnIndex ]; - if( local.ColumnName NEQ "" ) { - local.Row[ local.ColumnName ] = arguments.q[ local.ColumnName ][ local.RowIndex ]; - } - } - if ( structKeyExists( arguments, "cb" ) ) { - local.Row = cb( local.Row ); - } - ArrayAppend( local.QueryArray, local.Row ); - } - return( local.QueryArray ); - - - - - - - - - - - - - - if (structKeyExists(server, "railo") or structKeyExists(server, "lucee")) { - local.Columns = listToArray(arguments.q.getColumnList(false)); - } - else { - local.Columns = arguments.q.getMetaData().getColumnLabels(); - } - - local.QueryStruct = {}; - local.numCols = ArrayLen( local.Columns ); - - for (local.ColumnIndex = 1; local.ColumnIndex <= local.numCols; local.ColumnIndex++){ - local.ColumnName = local.Columns[ local.ColumnIndex ]; - if( local.ColumnName NEQ "" ) { - if ( structKeyExists( arguments, "cb" ) ) { - local.QueryStruct[ local.ColumnName ] = cb( local.ColumnName, arguments.q[ local.ColumnName ][1] ); - } else { - local.QueryStruct[ local.ColumnName ] = arguments.q[ local.ColumnName ][1]; - } + private array function qToArray(required query q, cb) output="false" { + var local = {}; + if (structKeyExists(server, "lucee")) { + local.Columns = listToArray(arguments.q.getColumnList(false)); + } else { + local.Columns = arguments.q.getMetaData().getColumnLabels(); + } + local.QueryArray = []; + for (local.RowIndex = 1; local.RowIndex <= arguments.q.RecordCount; local.RowIndex++) { + local.Row = {}; + local.numCols = arrayLen(local.Columns); + for (local.ColumnIndex = 1; local.ColumnIndex <= local.numCols; local.ColumnIndex++) { + local.ColumnName = local.Columns[local.ColumnIndex]; + if (local.ColumnName != "") { + local.Row[local.ColumnName] = arguments.q[local.ColumnName][local.RowIndex]; } } + if (structKeyExists(arguments, "cb")) { + local.Row = cb(local.Row); + } + arrayAppend(local.QueryArray, local.Row); + } + return local.QueryArray; + } - return( local.QueryStruct ); - - + variables.funcs = getFunctionList(); + if (!structKeyExists(variables.funcs, "queryToArray")) { + private array function queryToArray(required query q, cb) output="false" { + return qToArray(arguments.q, arguments.cb); + } + } - - - - - - - - - - - - - - - - - + private struct function qToStruct(required query q, cb) output="false" { + var local = {}; - + if (q.recordcount gt 1) { + throw(message="Unable to convert query resultset with more than one record to a simple struct, use queryToArray() instead"); + } + + if (structKeyExists(server, "lucee")) { + local.Columns = listToArray(arguments.q.getColumnList(false)); + } else { + local.Columns = arguments.q.getMetaData().getColumnLabels(); + } + + local.QueryStruct = {}; + local.numCols = arrayLen(local.Columns); + + for (local.ColumnIndex = 1; local.ColumnIndex <= local.numCols; local.ColumnIndex++) { + local.ColumnName = local.Columns[local.ColumnIndex]; + if (local.ColumnName != "") { + if (structKeyExists(arguments, "cb")) { + local.QueryStruct[local.ColumnName] = cb(local.ColumnName, arguments.q[local.ColumnName][1]); + } else { + local.QueryStruct[local.ColumnName] = arguments.q[local.ColumnName][1]; + } + } + } + + return local.QueryStruct; + } + + if (!structKeyExists(variables.funcs, "queryToStruct")) { + private struct function queryToStruct(required query q, cb) output="false" { + return qToStruct(arguments.q, arguments.cb); + } + } + + /** + * function that gets the representation class instance + * -- if the argument is blank, we use the default from taffy settings + * -- if the argument is a beanName, the bean is returned from the factory; + * -- otherwise it is assumed to be a cfc path and that cfc instance is returned + */ + private function getRepInstance(string repClass="") output="false" { + var rep = ""; + if (repClass eq "") { + // recursion not the most efficient path here, but it's damn readable + return getRepInstance(application._taffy.settings.serializer); + } else if (application._taffy.factory.containsBean(arguments.repClass)) { + rep = application._taffy.factory.getBean(arguments.repClass); + } else { + rep = createObject("component", arguments.repClass); + } + rep.setNoDataSends204NoContent(application._taffy.settings.noDataSends204NoContent); + return rep; + } + + package function addDebugData(data) output="false" { + request.debugData = arguments.data; + } + +} diff --git a/v1/taffy/dashboard/asset.cfm b/v1/taffy/dashboard/asset.cfm index 02b916c..64a102e 100644 --- a/v1/taffy/dashboard/asset.cfm +++ b/v1/taffy/dashboard/asset.cfm @@ -7,20 +7,12 @@ - - - - - - - - - - + + diff --git a/v1/taffy/dashboard/bootstrap.min.js b/v1/taffy/dashboard/bootstrap.min.js deleted file mode 100644 index 1765631..0000000 --- a/v1/taffy/dashboard/bootstrap.min.js +++ /dev/null @@ -1,6 +0,0 @@ -/** -* bootstrap.js v3.0.0 by @fat and @mdo -* Copyright 2013 Twitter Inc. -* http://www.apache.org/licenses/LICENSE-2.0 -*/ -if(!jQuery)throw new Error("Bootstrap requires jQuery");+function(a){"use strict";function b(){var a=document.createElement("bootstrap"),b={WebkitTransition:"webkitTransitionEnd",MozTransition:"transitionend",OTransition:"oTransitionEnd otransitionend",transition:"transitionend"};for(var c in b)if(void 0!==a.style[c])return{end:b[c]}}a.fn.emulateTransitionEnd=function(b){var c=!1,d=this;a(this).one(a.support.transition.end,function(){c=!0});var e=function(){c||a(d).trigger(a.support.transition.end)};return setTimeout(e,b),this},a(function(){a.support.transition=b()})}(window.jQuery),+function(a){"use strict";var b='[data-dismiss="alert"]',c=function(c){a(c).on("click",b,this.close)};c.prototype.close=function(b){function c(){f.trigger("closed.bs.alert").remove()}var d=a(this),e=d.attr("data-target");e||(e=d.attr("href"),e=e&&e.replace(/.*(?=#[^\s]*$)/,""));var f=a(e);b&&b.preventDefault(),f.length||(f=d.hasClass("alert")?d:d.parent()),f.trigger(b=a.Event("close.bs.alert")),b.isDefaultPrevented()||(f.removeClass("in"),a.support.transition&&f.hasClass("fade")?f.one(a.support.transition.end,c).emulateTransitionEnd(150):c())};var d=a.fn.alert;a.fn.alert=function(b){return this.each(function(){var d=a(this),e=d.data("bs.alert");e||d.data("bs.alert",e=new c(this)),"string"==typeof b&&e[b].call(d)})},a.fn.alert.Constructor=c,a.fn.alert.noConflict=function(){return a.fn.alert=d,this},a(document).on("click.bs.alert.data-api",b,c.prototype.close)}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d)};b.DEFAULTS={loadingText:"loading..."},b.prototype.setState=function(a){var b="disabled",c=this.$element,d=c.is("input")?"val":"html",e=c.data();a+="Text",e.resetText||c.data("resetText",c[d]()),c[d](e[a]||this.options[a]),setTimeout(function(){"loadingText"==a?c.addClass(b).attr(b,b):c.removeClass(b).removeAttr(b)},0)},b.prototype.toggle=function(){var a=this.$element.closest('[data-toggle="buttons"]');if(a.length){var b=this.$element.find("input").prop("checked",!this.$element.hasClass("active")).trigger("change");"radio"===b.prop("type")&&a.find(".active").removeClass("active")}this.$element.toggleClass("active")};var c=a.fn.button;a.fn.button=function(c){return this.each(function(){var d=a(this),e=d.data("bs.button"),f="object"==typeof c&&c;e||d.data("bs.button",e=new b(this,f)),"toggle"==c?e.toggle():c&&e.setState(c)})},a.fn.button.Constructor=b,a.fn.button.noConflict=function(){return a.fn.button=c,this},a(document).on("click.bs.button.data-api","[data-toggle^=button]",function(b){var c=a(b.target);c.hasClass("btn")||(c=c.closest(".btn")),c.button("toggle"),b.preventDefault()})}(window.jQuery),+function(a){"use strict";var b=function(b,c){this.$element=a(b),this.$indicators=this.$element.find(".carousel-indicators"),this.options=c,this.paused=this.sliding=this.interval=this.$active=this.$items=null,"hover"==this.options.pause&&this.$element.on("mouseenter",a.proxy(this.pause,this)).on("mouseleave",a.proxy(this.cycle,this))};b.DEFAULTS={interval:5e3,pause:"hover",wrap:!0},b.prototype.cycle=function(b){return b||(this.paused=!1),this.interval&&clearInterval(this.interval),this.options.interval&&!this.paused&&(this.interval=setInterval(a.proxy(this.next,this),this.options.interval)),this},b.prototype.getActiveIndex=function(){return this.$active=this.$element.find(".item.active"),this.$items=this.$active.parent().children(),this.$items.index(this.$active)},b.prototype.to=function(b){var c=this,d=this.getActiveIndex();return b>this.$items.length-1||0>b?void 0:this.sliding?this.$element.one("slid",function(){c.to(b)}):d==b?this.pause().cycle():this.slide(b>d?"next":"prev",a(this.$items[b]))},b.prototype.pause=function(b){return b||(this.paused=!0),this.$element.find(".next, .prev").length&&a.support.transition.end&&(this.$element.trigger(a.support.transition.end),this.cycle(!0)),this.interval=clearInterval(this.interval),this},b.prototype.next=function(){return this.sliding?void 0:this.slide("next")},b.prototype.prev=function(){return this.sliding?void 0:this.slide("prev")},b.prototype.slide=function(b,c){var d=this.$element.find(".item.active"),e=c||d[b](),f=this.interval,g="next"==b?"left":"right",h="next"==b?"first":"last",i=this;if(!e.length){if(!this.options.wrap)return;e=this.$element.find(".item")[h]()}this.sliding=!0,f&&this.pause();var j=a.Event("slide.bs.carousel",{relatedTarget:e[0],direction:g});if(!e.hasClass("active")){if(this.$indicators.length&&(this.$indicators.find(".active").removeClass("active"),this.$element.one("slid",function(){var b=a(i.$indicators.children()[i.getActiveIndex()]);b&&b.addClass("active")})),a.support.transition&&this.$element.hasClass("slide")){if(this.$element.trigger(j),j.isDefaultPrevented())return;e.addClass(b),e[0].offsetWidth,d.addClass(g),e.addClass(g),d.one(a.support.transition.end,function(){e.removeClass([b,g].join(" ")).addClass("active"),d.removeClass(["active",g].join(" ")),i.sliding=!1,setTimeout(function(){i.$element.trigger("slid")},0)}).emulateTransitionEnd(600)}else{if(this.$element.trigger(j),j.isDefaultPrevented())return;d.removeClass("active"),e.addClass("active"),this.sliding=!1,this.$element.trigger("slid")}return f&&this.cycle(),this}};var c=a.fn.carousel;a.fn.carousel=function(c){return this.each(function(){var d=a(this),e=d.data("bs.carousel"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c),g="string"==typeof c?c:f.slide;e||d.data("bs.carousel",e=new b(this,f)),"number"==typeof c?e.to(c):g?e[g]():f.interval&&e.pause().cycle()})},a.fn.carousel.Constructor=b,a.fn.carousel.noConflict=function(){return a.fn.carousel=c,this},a(document).on("click.bs.carousel.data-api","[data-slide], [data-slide-to]",function(b){var c,d=a(this),e=a(d.attr("data-target")||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,"")),f=a.extend({},e.data(),d.data()),g=d.attr("data-slide-to");g&&(f.interval=!1),e.carousel(f),(g=d.attr("data-slide-to"))&&e.data("bs.carousel").to(g),b.preventDefault()}),a(window).on("load",function(){a('[data-ride="carousel"]').each(function(){var b=a(this);b.carousel(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.$element=a(c),this.options=a.extend({},b.DEFAULTS,d),this.transitioning=null,this.options.parent&&(this.$parent=a(this.options.parent)),this.options.toggle&&this.toggle()};b.DEFAULTS={toggle:!0},b.prototype.dimension=function(){var a=this.$element.hasClass("width");return a?"width":"height"},b.prototype.show=function(){if(!this.transitioning&&!this.$element.hasClass("in")){var b=a.Event("show.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.$parent&&this.$parent.find("> .panel > .in");if(c&&c.length){var d=c.data("bs.collapse");if(d&&d.transitioning)return;c.collapse("hide"),d||c.data("bs.collapse",null)}var e=this.dimension();this.$element.removeClass("collapse").addClass("collapsing")[e](0),this.transitioning=1;var f=function(){this.$element.removeClass("collapsing").addClass("in")[e]("auto"),this.transitioning=0,this.$element.trigger("shown.bs.collapse")};if(!a.support.transition)return f.call(this);var g=a.camelCase(["scroll",e].join("-"));this.$element.one(a.support.transition.end,a.proxy(f,this)).emulateTransitionEnd(350)[e](this.$element[0][g])}}},b.prototype.hide=function(){if(!this.transitioning&&this.$element.hasClass("in")){var b=a.Event("hide.bs.collapse");if(this.$element.trigger(b),!b.isDefaultPrevented()){var c=this.dimension();this.$element[c](this.$element[c]())[0].offsetHeight,this.$element.addClass("collapsing").removeClass("collapse").removeClass("in"),this.transitioning=1;var d=function(){this.transitioning=0,this.$element.trigger("hidden.bs.collapse").removeClass("collapsing").addClass("collapse")};return a.support.transition?(this.$element[c](0).one(a.support.transition.end,a.proxy(d,this)).emulateTransitionEnd(350),void 0):d.call(this)}}},b.prototype.toggle=function(){this[this.$element.hasClass("in")?"hide":"show"]()};var c=a.fn.collapse;a.fn.collapse=function(c){return this.each(function(){var d=a(this),e=d.data("bs.collapse"),f=a.extend({},b.DEFAULTS,d.data(),"object"==typeof c&&c);e||d.data("bs.collapse",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.collapse.Constructor=b,a.fn.collapse.noConflict=function(){return a.fn.collapse=c,this},a(document).on("click.bs.collapse.data-api","[data-toggle=collapse]",function(b){var c,d=a(this),e=d.attr("data-target")||b.preventDefault()||(c=d.attr("href"))&&c.replace(/.*(?=#[^\s]+$)/,""),f=a(e),g=f.data("bs.collapse"),h=g?"toggle":d.data(),i=d.attr("data-parent"),j=i&&a(i);g&&g.transitioning||(j&&j.find('[data-toggle=collapse][data-parent="'+i+'"]').not(d).addClass("collapsed"),d[f.hasClass("in")?"addClass":"removeClass"]("collapsed")),f.collapse(h)})}(window.jQuery),+function(a){"use strict";function b(){a(d).remove(),a(e).each(function(b){var d=c(a(this));d.hasClass("open")&&(d.trigger(b=a.Event("hide.bs.dropdown")),b.isDefaultPrevented()||d.removeClass("open").trigger("hidden.bs.dropdown"))})}function c(b){var c=b.attr("data-target");c||(c=b.attr("href"),c=c&&/#/.test(c)&&c.replace(/.*(?=#[^\s]*$)/,""));var d=c&&a(c);return d&&d.length?d:b.parent()}var d=".dropdown-backdrop",e="[data-toggle=dropdown]",f=function(b){a(b).on("click.bs.dropdown",this.toggle)};f.prototype.toggle=function(d){var e=a(this);if(!e.is(".disabled, :disabled")){var f=c(e),g=f.hasClass("open");if(b(),!g){if("ontouchstart"in document.documentElement&&!f.closest(".navbar-nav").length&&a(''}),b.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),b.prototype.constructor=b,b.prototype.getDefaults=function(){return b.DEFAULTS},b.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content")[this.options.html?"html":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},b.prototype.hasContent=function(){return this.getTitle()||this.getContent()},b.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},b.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")},b.prototype.tip=function(){return this.$tip||(this.$tip=a(this.options.template)),this.$tip};var c=a.fn.popover;a.fn.popover=function(c){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof c&&c;e||d.data("bs.popover",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.popover.Constructor=b,a.fn.popover.noConflict=function(){return a.fn.popover=c,this}}(window.jQuery),+function(a){"use strict";function b(c,d){var e,f=a.proxy(this.process,this);this.$element=a(c).is("body")?a(window):a(c),this.$body=a("body"),this.$scrollElement=this.$element.on("scroll.bs.scroll-spy.data-api",f),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||(e=a(c).attr("href"))&&e.replace(/.*(?=#[^\s]+$)/,"")||"")+" .nav li > a",this.offsets=a([]),this.targets=a([]),this.activeTarget=null,this.refresh(),this.process()}b.DEFAULTS={offset:10},b.prototype.refresh=function(){var b=this.$element[0]==window?"offset":"position";this.offsets=a([]),this.targets=a([]);var c=this;this.$body.find(this.selector).map(function(){var d=a(this),e=d.data("target")||d.attr("href"),f=/^#\w/.test(e)&&a(e);return f&&f.length&&[[f[b]().top+(!a.isWindow(c.$scrollElement.get(0))&&c.$scrollElement.scrollTop()),e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){c.offsets.push(this[0]),c.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.$scrollElement[0].scrollHeight||this.$body[0].scrollHeight,d=c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(b>=d)return g!=(a=f.last()[0])&&this.activate(a);for(a=e.length;a--;)g!=f[a]&&b>=e[a]&&(!e[a+1]||b<=e[a+1])&&this.activate(f[a])},b.prototype.activate=function(b){this.activeTarget=b,a(this.selector).parents(".active").removeClass("active");var c=this.selector+'[data-target="'+b+'"],'+this.selector+'[href="'+b+'"]',d=a(c).parents("li").addClass("active");d.parent(".dropdown-menu").length&&(d=d.closest("li.dropdown").addClass("active")),d.trigger("activate")};var c=a.fn.scrollspy;a.fn.scrollspy=function(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.scrollspy.Constructor=b,a.fn.scrollspy.noConflict=function(){return a.fn.scrollspy=c,this},a(window).on("load",function(){a('[data-spy="scroll"]').each(function(){var b=a(this);b.scrollspy(b.data())})})}(window.jQuery),+function(a){"use strict";var b=function(b){this.element=a(b)};b.prototype.show=function(){var b=this.element,c=b.closest("ul:not(.dropdown-menu)"),d=b.attr("data-target");if(d||(d=b.attr("href"),d=d&&d.replace(/.*(?=#[^\s]*$)/,"")),!b.parent("li").hasClass("active")){var e=c.find(".active:last a")[0],f=a.Event("show.bs.tab",{relatedTarget:e});if(b.trigger(f),!f.isDefaultPrevented()){var g=a(d);this.activate(b.parent("li"),c),this.activate(g,g.parent(),function(){b.trigger({type:"shown.bs.tab",relatedTarget:e})})}}},b.prototype.activate=function(b,c,d){function e(){f.removeClass("active").find("> .dropdown-menu > .active").removeClass("active"),b.addClass("active"),g?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu")&&b.closest("li.dropdown").addClass("active"),d&&d()}var f=c.find("> .active"),g=d&&a.support.transition&&f.hasClass("fade");g?f.one(a.support.transition.end,e).emulateTransitionEnd(150):e(),f.removeClass("in")};var c=a.fn.tab;a.fn.tab=function(c){return this.each(function(){var d=a(this),e=d.data("bs.tab");e||d.data("bs.tab",e=new b(this)),"string"==typeof c&&e[c]()})},a.fn.tab.Constructor=b,a.fn.tab.noConflict=function(){return a.fn.tab=c,this},a(document).on("click.bs.tab.data-api",'[data-toggle="tab"], [data-toggle="pill"]',function(b){b.preventDefault(),a(this).tab("show")})}(window.jQuery),+function(a){"use strict";var b=function(c,d){this.options=a.extend({},b.DEFAULTS,d),this.$window=a(window).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(c),this.affixed=this.unpin=null,this.checkPosition()};b.RESET="affix affix-top affix-bottom",b.DEFAULTS={offset:0},b.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},b.prototype.checkPosition=function(){if(this.$element.is(":visible")){var c=a(document).height(),d=this.$window.scrollTop(),e=this.$element.offset(),f=this.options.offset,g=f.top,h=f.bottom;"object"!=typeof f&&(h=g=f),"function"==typeof g&&(g=f.top()),"function"==typeof h&&(h=f.bottom());var i=null!=this.unpin&&d+this.unpin<=e.top?!1:null!=h&&e.top+this.$element.height()>=c-h?"bottom":null!=g&&g>=d?"top":!1;this.affixed!==i&&(this.unpin&&this.$element.css("top",""),this.affixed=i,this.unpin="bottom"==i?e.top-d:null,this.$element.removeClass(b.RESET).addClass("affix"+(i?"-"+i:"")),"bottom"==i&&this.$element.offset({top:document.body.offsetHeight-h-this.$element.height()}))}};var c=a.fn.affix;a.fn.affix=function(c){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof c&&c;e||d.data("bs.affix",e=new b(this,f)),"string"==typeof c&&e[c]()})},a.fn.affix.Constructor=b,a.fn.affix.noConflict=function(){return a.fn.affix=c,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var b=a(this),c=b.data();c.offset=c.offset||{},c.offsetBottom&&(c.offset.bottom=c.offsetBottom),c.offsetTop&&(c.offset.top=c.offsetTop),b.affix(c)})})}(window.jQuery); \ No newline at end of file diff --git a/v1/taffy/dashboard/bootstrap.min.less b/v1/taffy/dashboard/bootstrap.min.less deleted file mode 100644 index a553c4f..0000000 --- a/v1/taffy/dashboard/bootstrap.min.less +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v3.0.0 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - *//*! normalize.css v2.1.0 | MIT License | git.io/normalize */article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio,canvas,video{display:inline-block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:focus{outline:thin dotted}a:active,a:hover{outline:0}h1{margin:.67em 0;font-size:2em}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}pre{white-space:pre-wrap}q{quotes:"\201C" "\201D" "\2018" "\2019"}small{font-size:80%}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:0}fieldset{padding:.35em .625em .75em;margin:0 2px;border:1px solid #c0c0c0}legend{padding:0;border:0}button,input,select,textarea{margin:0;font-family:inherit;font-size:100%}button,input{line-height:normal}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type="checkbox"],input[type="radio"]{padding:0;box-sizing:border-box}input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{*{color:#000!important;text-shadow:none!important;background:transparent!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}pre,blockquote{border:1px solid #999;page-break-inside:avoid}thead{display:table-header-group}tr,img{page-break-inside:avoid}img{max-width:100%!important}@page{margin:2cm .5cm}p,h2,h3{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered th,.table-bordered td{border:1px solid #ddd!important}}*,*:before,*:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:rgba(0,0,0,0)}body{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:14px;line-height:1.428571429;color:#333;background-color:#fff}input,button,select,textarea{font-family:inherit;font-size:inherit;line-height:inherit}button,input,select[multiple],textarea{background-image:none}a{color:#428bca;text-decoration:none}a:hover,a:focus{color:#2a6496;text-decoration:underline}a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}img{vertical-align:middle}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{display:inline-block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border:0;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);border:0}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16.099999999999998px;font-weight:200;line-height:1.4}@media(min-width:768px){.lead{font-size:21px}}small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-warning{color:#c09853}.text-danger{color:#b94a48}.text-success{color:#468847}.text-info{color:#3a87ad}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}h1,h2,h3,h4,h5,h6,.h1,.h2,.h3,.h4,.h5,.h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small,.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small{font-weight:normal;line-height:1;color:#999}h1,h2,h3{margin-top:20px;margin-bottom:10px}h4,h5,h6{margin-top:10px;margin-bottom:10px}h1,.h1{font-size:36px}h2,.h2{font-size:30px}h3,.h3{font-size:24px}h4,.h4{font-size:18px}h5,.h5{font-size:14px}h6,.h6{font-size:12px}h1 small,.h1 small{font-size:24px}h2 small,.h2 small{font-size:18px}h3 small,.h3 small,h4 small,.h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}ul,ol{margin-top:0;margin-bottom:10px}ul ul,ol ul,ul ol,ol ol{margin-bottom:0}.list-unstyled{padding-left:0;list-style:none}.list-inline{padding-left:0;list-style:none}.list-inline>li{display:inline-block;padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dt,dd{line-height:1.428571429}dt{font-weight:bold}dd{margin-left:0}@media(min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}.dl-horizontal dd:before,.dl-horizontal dd:after{display:table;content:" "}.dl-horizontal dd:after{clear:both}}abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote p:last-child{margin-bottom:0}blockquote small{display:block;line-height:1.428571429;color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right p,blockquote.pull-right small{text-align:right}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}q:before,q:after,blockquote:before,blockquote:after{content:""}address{display:block;margin-bottom:20px;font-style:normal;line-height:1.428571429}code,pre{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{display:block;padding:9.5px;margin:0 0 10px;font-size:13px;line-height:1.428571429;color:#333;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}pre.prettyprint{margin-bottom:20px}pre code{padding:0;font-size:inherit;color:inherit;white-space:pre-wrap;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.container:before,.container:after{display:table;content:" "}.container:after{clear:both}.row{margin-right:-15px;margin-left:-15px}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12,.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11,.col-sm-12,.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12,.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11{float:left}.col-xs-1{width:8.333333333333332%}.col-xs-2{width:16.666666666666664%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333333333%}.col-xs-5{width:41.66666666666667%}.col-xs-6{width:50%}.col-xs-7{width:58.333333333333336%}.col-xs-8{width:66.66666666666666%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333333334%}.col-xs-11{width:91.66666666666666%}.col-xs-12{width:100%}@media(min-width:768px){.container{max-width:750px}.col-sm-1,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-sm-10,.col-sm-11{float:left}.col-sm-1{width:8.333333333333332%}.col-sm-2{width:16.666666666666664%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333333333%}.col-sm-5{width:41.66666666666667%}.col-sm-6{width:50%}.col-sm-7{width:58.333333333333336%}.col-sm-8{width:66.66666666666666%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333333334%}.col-sm-11{width:91.66666666666666%}.col-sm-12{width:100%}.col-sm-push-1{left:8.333333333333332%}.col-sm-push-2{left:16.666666666666664%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333333333%}.col-sm-push-5{left:41.66666666666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.333333333333336%}.col-sm-push-8{left:66.66666666666666%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333333334%}.col-sm-push-11{left:91.66666666666666%}.col-sm-pull-1{right:8.333333333333332%}.col-sm-pull-2{right:16.666666666666664%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333333333%}.col-sm-pull-5{right:41.66666666666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.333333333333336%}.col-sm-pull-8{right:66.66666666666666%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333333334%}.col-sm-pull-11{right:91.66666666666666%}.col-sm-offset-1{margin-left:8.333333333333332%}.col-sm-offset-2{margin-left:16.666666666666664%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333333333%}.col-sm-offset-5{margin-left:41.66666666666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.333333333333336%}.col-sm-offset-8{margin-left:66.66666666666666%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333333334%}.col-sm-offset-11{margin-left:91.66666666666666%}}@media(min-width:992px){.container{max-width:970px}.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11{float:left}.col-md-1{width:8.333333333333332%}.col-md-2{width:16.666666666666664%}.col-md-3{width:25%}.col-md-4{width:33.33333333333333%}.col-md-5{width:41.66666666666667%}.col-md-6{width:50%}.col-md-7{width:58.333333333333336%}.col-md-8{width:66.66666666666666%}.col-md-9{width:75%}.col-md-10{width:83.33333333333334%}.col-md-11{width:91.66666666666666%}.col-md-12{width:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.333333333333332%}.col-md-push-2{left:16.666666666666664%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333333333%}.col-md-push-5{left:41.66666666666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.333333333333336%}.col-md-push-8{left:66.66666666666666%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333333334%}.col-md-push-11{left:91.66666666666666%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.333333333333332%}.col-md-pull-2{right:16.666666666666664%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333333333%}.col-md-pull-5{right:41.66666666666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.333333333333336%}.col-md-pull-8{right:66.66666666666666%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333333334%}.col-md-pull-11{right:91.66666666666666%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.333333333333332%}.col-md-offset-2{margin-left:16.666666666666664%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333333333%}.col-md-offset-5{margin-left:41.66666666666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.333333333333336%}.col-md-offset-8{margin-left:66.66666666666666%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333333334%}.col-md-offset-11{margin-left:91.66666666666666%}}@media(min-width:1200px){.container{max-width:1170px}.col-lg-1,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-lg-10,.col-lg-11{float:left}.col-lg-1{width:8.333333333333332%}.col-lg-2{width:16.666666666666664%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333333333%}.col-lg-5{width:41.66666666666667%}.col-lg-6{width:50%}.col-lg-7{width:58.333333333333336%}.col-lg-8{width:66.66666666666666%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333333334%}.col-lg-11{width:91.66666666666666%}.col-lg-12{width:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.333333333333332%}.col-lg-push-2{left:16.666666666666664%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333333333%}.col-lg-push-5{left:41.66666666666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.333333333333336%}.col-lg-push-8{left:66.66666666666666%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333333334%}.col-lg-push-11{left:91.66666666666666%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.333333333333332%}.col-lg-pull-2{right:16.666666666666664%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333333333%}.col-lg-pull-5{right:41.66666666666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.333333333333336%}.col-lg-pull-8{right:66.66666666666666%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333333334%}.col-lg-pull-11{right:91.66666666666666%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.333333333333332%}.col-lg-offset-2{margin-left:16.666666666666664%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333333333%}.col-lg-offset-5{margin-left:41.66666666666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.333333333333336%}.col-lg-offset-8{margin-left:66.66666666666666%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333333334%}.col-lg-offset-11{margin-left:91.66666666666666%}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%;margin-bottom:20px}.table thead>tr>th,.table tbody>tr>th,.table tfoot>tr>th,.table thead>tr>td,.table tbody>tr>td,.table tfoot>tr>td{padding:8px;line-height:1.428571429;vertical-align:top;border-top:1px solid #ddd}.table thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table caption+thead tr:first-child th,.table colgroup+thead tr:first-child th,.table thead:first-child tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child td{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed thead>tr>th,.table-condensed tbody>tr>th,.table-condensed tfoot>tr>th,.table-condensed thead>tr>td,.table-condensed tbody>tr>td,.table-condensed tfoot>tr>td{padding:5px}.table-bordered{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>tbody>tr>td,.table-bordered>tfoot>tr>td{border:1px solid #ddd}.table-bordered>thead>tr>th,.table-bordered>thead>tr>td{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th{background-color:#f5f5f5}table col[class*="col-"]{display:table-column;float:none}table td[class*="col-"],table th[class*="col-"]{display:table-cell;float:none}.table>thead>tr>td.active,.table>tbody>tr>td.active,.table>tfoot>tr>td.active,.table>thead>tr>th.active,.table>tbody>tr>th.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>tbody>tr.active>td,.table>tfoot>tr.active>td,.table>thead>tr.active>th,.table>tbody>tr.active>th,.table>tfoot>tr.active>th{background-color:#f5f5f5}.table>thead>tr>td.success,.table>tbody>tr>td.success,.table>tfoot>tr>td.success,.table>thead>tr>th.success,.table>tbody>tr>th.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>tbody>tr.success>td,.table>tfoot>tr.success>td,.table>thead>tr.success>th,.table>tbody>tr.success>th,.table>tfoot>tr.success>th{background-color:#dff0d8;border-color:#d6e9c6}.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover,.table-hover>tbody>tr.success:hover>td{background-color:#d0e9c6;border-color:#c9e2b3}.table>thead>tr>td.danger,.table>tbody>tr>td.danger,.table>tfoot>tr>td.danger,.table>thead>tr>th.danger,.table>tbody>tr>th.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>tbody>tr.danger>td,.table>tfoot>tr.danger>td,.table>thead>tr.danger>th,.table>tbody>tr.danger>th,.table>tfoot>tr.danger>th{background-color:#f2dede;border-color:#eed3d7}.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover,.table-hover>tbody>tr.danger:hover>td{background-color:#ebcccc;border-color:#e6c1c7}.table>thead>tr>td.warning,.table>tbody>tr>td.warning,.table>tfoot>tr>td.warning,.table>thead>tr>th.warning,.table>tbody>tr>th.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>tbody>tr.warning>td,.table>tfoot>tr.warning>td,.table>thead>tr.warning>th,.table>tbody>tr.warning>th,.table>tfoot>tr.warning>th{background-color:#fcf8e3;border-color:#fbeed5}.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover,.table-hover>tbody>tr.warning:hover>td{background-color:#faf2cc;border-color:#f8e5be}@media(max-width:768px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0;background-color:#fff}.table-responsive>.table>thead>tr>th,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tfoot>tr>td{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>thead>tr>th:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child{border-left:0}.table-responsive>.table-bordered>thead>tr>th:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child{border-right:0}.table-responsive>.table-bordered>thead>tr:last-child>th,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>thead>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>td{border-bottom:0}}fieldset{padding:0;margin:0;border:0}legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:21px;line-height:inherit;color:#333;border:0;border-bottom:1px solid #e5e5e5}label{display:inline-block;margin-bottom:5px;font-weight:bold}input[type="search"]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type="radio"],input[type="checkbox"]{margin:4px 0 0;margin-top:1px \9;line-height:normal}input[type="file"]{display:block}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}input[type="number"]::-webkit-outer-spin-button,input[type="number"]::-webkit-inner-spin-button{height:auto}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control{display:block;width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.428571429;color:#555;vertical-align:middle;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 8px rgba(102,175,233,0.6)}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.radio,.checkbox{display:block;min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.radio label,.checkbox label{display:inline;margin-bottom:0;font-weight:normal;cursor:pointer}.radio input[type="radio"],.radio-inline input[type="radio"],.checkbox input[type="checkbox"],.checkbox-inline input[type="checkbox"]{float:left;margin-left:-20px}.radio+.radio,.checkbox+.checkbox{margin-top:-5px}.radio-inline,.checkbox-inline{display:inline-block;padding-left:20px;margin-bottom:0;font-weight:normal;vertical-align:middle;cursor:pointer}.radio-inline+.radio-inline,.checkbox-inline+.checkbox-inline{margin-top:0;margin-left:10px}input[type="radio"][disabled],input[type="checkbox"][disabled],.radio[disabled],.radio-inline[disabled],.checkbox[disabled],.checkbox-inline[disabled],fieldset[disabled] input[type="radio"],fieldset[disabled] input[type="checkbox"],fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}textarea.input-sm{height:auto}.input-lg{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-lg{height:45px;line-height:45px}textarea.input-lg{height:auto}.has-warning .help-block,.has-warning .control-label{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.has-error .help-block,.has-error .control-label{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.has-success .help-block,.has-success .control-label{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075);box-shadow:inset 0 1px 1px rgba(0,0,0,0.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,0.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}.form-control-static{padding-top:7px;margin-bottom:0}.help-block{display:block;margin-top:5px;margin-bottom:10px;color:#737373}@media(min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline .radio,.form-inline .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:none;margin-left:0}}.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .checkbox,.form-horizontal .radio-inline,.form-horizontal .checkbox-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}.form-horizontal .form-group:before,.form-horizontal .form-group:after{display:table;content:" "}.form-horizontal .form-group:after{clear:both}@media(min-width:768px){.form-horizontal .control-label{text-align:right}}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;font-weight:normal;line-height:1.428571429;text-align:center;white-space:nowrap;vertical-align:middle;cursor:pointer;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px}.btn:hover,.btn:focus{color:#333;text-decoration:none}.btn:active,.btn.active{background-image:none;outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default:hover,.btn-default:focus,.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default:active,.btn-default.active,.open .dropdown-toggle.btn-default{background-image:none}.btn-default.disabled,.btn-default[disabled],fieldset[disabled] .btn-default,.btn-default.disabled:hover,.btn-default[disabled]:hover,fieldset[disabled] .btn-default:hover,.btn-default.disabled:focus,.btn-default[disabled]:focus,fieldset[disabled] .btn-default:focus,.btn-default.disabled:active,.btn-default[disabled]:active,fieldset[disabled] .btn-default:active,.btn-default.disabled.active,.btn-default[disabled].active,fieldset[disabled] .btn-default.active{background-color:#fff;border-color:#ccc}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary:active,.btn-primary.active,.open .dropdown-toggle.btn-primary{background-image:none}.btn-primary.disabled,.btn-primary[disabled],fieldset[disabled] .btn-primary,.btn-primary.disabled:hover,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary:hover,.btn-primary.disabled:focus,.btn-primary[disabled]:focus,fieldset[disabled] .btn-primary:focus,.btn-primary.disabled:active,.btn-primary[disabled]:active,fieldset[disabled] .btn-primary:active,.btn-primary.disabled.active,.btn-primary[disabled].active,fieldset[disabled] .btn-primary.active{background-color:#428bca;border-color:#357ebd}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning:active,.btn-warning.active,.open .dropdown-toggle.btn-warning{background-image:none}.btn-warning.disabled,.btn-warning[disabled],fieldset[disabled] .btn-warning,.btn-warning.disabled:hover,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning:hover,.btn-warning.disabled:focus,.btn-warning[disabled]:focus,fieldset[disabled] .btn-warning:focus,.btn-warning.disabled:active,.btn-warning[disabled]:active,fieldset[disabled] .btn-warning:active,.btn-warning.disabled.active,.btn-warning[disabled].active,fieldset[disabled] .btn-warning.active{background-color:#f0ad4e;border-color:#eea236}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger:active,.btn-danger.active,.open .dropdown-toggle.btn-danger{background-image:none}.btn-danger.disabled,.btn-danger[disabled],fieldset[disabled] .btn-danger,.btn-danger.disabled:hover,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger:hover,.btn-danger.disabled:focus,.btn-danger[disabled]:focus,fieldset[disabled] .btn-danger:focus,.btn-danger.disabled:active,.btn-danger[disabled]:active,fieldset[disabled] .btn-danger:active,.btn-danger.disabled.active,.btn-danger[disabled].active,fieldset[disabled] .btn-danger.active{background-color:#d9534f;border-color:#d43f3a}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success:active,.btn-success.active,.open .dropdown-toggle.btn-success{background-image:none}.btn-success.disabled,.btn-success[disabled],fieldset[disabled] .btn-success,.btn-success.disabled:hover,.btn-success[disabled]:hover,fieldset[disabled] .btn-success:hover,.btn-success.disabled:focus,.btn-success[disabled]:focus,fieldset[disabled] .btn-success:focus,.btn-success.disabled:active,.btn-success[disabled]:active,fieldset[disabled] .btn-success:active,.btn-success.disabled.active,.btn-success[disabled].active,fieldset[disabled] .btn-success.active{background-color:#5cb85c;border-color:#4cae4c}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info:active,.btn-info.active,.open .dropdown-toggle.btn-info{background-image:none}.btn-info.disabled,.btn-info[disabled],fieldset[disabled] .btn-info,.btn-info.disabled:hover,.btn-info[disabled]:hover,fieldset[disabled] .btn-info:hover,.btn-info.disabled:focus,.btn-info[disabled]:focus,fieldset[disabled] .btn-info:focus,.btn-info.disabled:active,.btn-info[disabled]:active,fieldset[disabled] .btn-info:active,.btn-info.disabled.active,.btn-info[disabled].active,fieldset[disabled] .btn-info.active{background-color:#5bc0de;border-color:#46b8da}.btn-link{font-weight:normal;color:#428bca;cursor:pointer;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:hover,.btn-link:focus,.btn-link:active{border-color:transparent}.btn-link:hover,.btn-link:focus{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:hover,fieldset[disabled] .btn-link:hover,.btn-link[disabled]:focus,fieldset[disabled] .btn-link:focus{color:#999;text-decoration:none}.btn-lg{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-sm,.btn-xs{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px}.btn-block{display:block;width:100%;padding-right:0;padding-left:0}.btn-block+.btn-block{margin-top:5px}input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.collapsing{position:relative;height:0;overflow:hidden;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url('../fonts/glyphicons-halflings-regular.eot');src:url('../fonts/glyphicons-halflings-regular.eot?#iefix') format('embedded-opentype'),url('../fonts/glyphicons-halflings-regular.woff') format('woff'),url('../fonts/glyphicons-halflings-regular.ttf') format('truetype'),url('../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular') format('svg')}.glyphicon{position:relative;top:1px;display:inline-block;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:normal;line-height:1}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-print:before{content:"\e045"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-briefcase:before{content:"\1f4bc"}.glyphicon-calendar:before{content:"\1f4c5"}.glyphicon-pushpin:before{content:"\1f4cc"}.glyphicon-paperclip:before{content:"\1f4ce"}.glyphicon-camera:before{content:"\1f4f7"}.glyphicon-lock:before{content:"\1f512"}.glyphicon-bell:before{content:"\1f514"}.glyphicon-bookmark:before{content:"\1f516"}.glyphicon-fire:before{content:"\1f525"}.glyphicon-wrench:before{content:"\1f527"}.caret{display:inline-block;width:0;height:0;margin-left:2px;vertical-align:middle;border-top:4px solid #000;border-right:4px solid transparent;border-bottom:0 dotted;border-left:4px solid transparent;content:""}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,0.175);box-shadow:0 6px 12px rgba(0,0,0,0.175);background-clip:padding-box}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:1.428571429;color:#333;white-space:nowrap}.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus{color:#fff;text-decoration:none;background-color:#428bca}.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999}.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;cursor:not-allowed;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{display:block;padding:3px 20px;font-size:12px;line-height:1.428571429;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.pull-right>.dropdown-menu{right:0;left:auto}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0 dotted;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}@media(min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}}.btn-default .caret{border-top-color:#333}.btn-primary .caret,.btn-success .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret{border-top-color:#fff}.dropup .btn-default .caret{border-bottom-color:#333}.dropup .btn-primary .caret,.dropup .btn-success .caret,.dropup .btn-warning .caret,.dropup .btn-danger .caret,.dropup .btn-info .caret{border-bottom-color:#fff}.btn-group,.btn-group-vertical{position:relative;display:inline-block;vertical-align:middle}.btn-group>.btn,.btn-group-vertical>.btn{position:relative;float:left}.btn-group>.btn:hover,.btn-group-vertical>.btn:hover,.btn-group>.btn:focus,.btn-group-vertical>.btn:focus,.btn-group>.btn:active,.btn-group-vertical>.btn:active,.btn-group>.btn.active,.btn-group-vertical>.btn.active{z-index:2}.btn-group>.btn:focus,.btn-group-vertical>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar:before,.btn-toolbar:after{display:table;content:" "}.btn-toolbar:after{clear:both}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle{border-top-right-radius:0;border-bottom-right-radius:0}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:5px 10px;padding:1px 5px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-sm>.btn{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,0.125);box-shadow:inset 0 3px 5px rgba(0,0,0,0.125)}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0;border-bottom-width:0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group:before,.btn-group-vertical>.btn-group:after{display:table;content:" "}.btn-group-vertical>.btn-group:after{clear:both}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified .btn{display:table-cell;float:none;width:1%}[data-toggle="buttons"]>.btn>input[type="radio"],[data-toggle="buttons"]>.btn>input[type="checkbox"]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group.col{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group-addon,.input-group-btn,.input-group .form-control{display:table-cell}.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child),.input-group .form-control:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:normal;line-height:1;text-align:center;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type="radio"],.input-group-addon input[type="checkbox"]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle,.input-group-btn:first-child>.btn:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.input-group-btn>.btn:hover,.input-group-btn>.btn:active{z-index:2}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav:before,.nav:after{display:table;content:" "}.nav:after{clear:both}.nav>li{position:relative;display:block}.nav>li>a{position:relative;display:block;padding:10px 15px}.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:hover,.nav>li.disabled>a:focus{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:hover,.nav .open>a:focus{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;overflow:hidden;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.428571429;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:hover,.nav-tabs>li.active>a:focus{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{text-align:center}@media(min-width:768px){.nav-tabs.nav-justified>li{display:table-cell;width:1%}}.nav-tabs.nav-justified>li>a{margin-right:0;border-bottom:1px solid #ddd}.nav-tabs.nav-justified>.active>a{border-bottom-color:#fff}.nav-pills>li{float:left}.nav-pills>li>a{border-radius:5px}.nav-pills>li+li{margin-left:2px}.nav-pills>li.active>a,.nav-pills>li.active>a:hover,.nav-pills>li.active>a:focus{color:#fff;background-color:#428bca}.nav-stacked>li{float:none}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}.nav-justified>li{float:none}.nav-justified>li>a{text-align:center}@media(min-width:768px){.nav-justified>li{display:table-cell;width:1%}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-bottom:1px solid #ddd}.nav-tabs-justified>.active>a{border-bottom-color:#fff}.tabbable:before,.tabbable:after{display:table;content:" "}.tabbable:after{clear:both}.tabbable:before,.tabbable:after{display:table;content:" "}.tabbable:after{clear:both}.tab-content>.tab-pane,.pill-content>.pill-pane{display:none}.tab-content>.active,.pill-content>.active{display:block}.nav .caret{border-top-color:#428bca;border-bottom-color:#428bca}.nav a:hover .caret{border-top-color:#2a6496;border-bottom-color:#2a6496}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;z-index:1000;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}.navbar:before,.navbar:after{display:table;content:" "}.navbar:after{clear:both}@media(min-width:768px){.navbar{border-radius:4px}}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}.navbar-header:before,.navbar-header:after{display:table;content:" "}.navbar-header:after{clear:both}@media(min-width:768px){.navbar-header{float:left}}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,0.1);-webkit-overflow-scrolling:touch}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse:before,.navbar-collapse:after{display:table;content:" "}.navbar-collapse:after{clear:both}.navbar-collapse.in{overflow-y:auto}@media(min-width:768px){.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-collapse .navbar-nav.navbar-left:first-child{margin-left:-15px}.navbar-collapse .navbar-nav.navbar-right:last-child{margin-right:-15px}.navbar-collapse .navbar-text:last-child{margin-right:0}}.container>.navbar-header,.container>.navbar-collapse{margin-right:-15px;margin-left:-15px}@media(min-width:768px){.container>.navbar-header,.container>.navbar-collapse{margin-right:0;margin-left:0}}.navbar-static-top{border-width:0 0 1px}@media(min-width:768px){.navbar-static-top{border-radius:0}}.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;border-width:0 0 1px}@media(min-width:768px){.navbar-fixed-top,.navbar-fixed-bottom{border-radius:0}}.navbar-fixed-top{top:0;z-index:1030}.navbar-fixed-bottom{bottom:0;margin-bottom:0}.navbar-brand{float:left;padding:15px 15px;font-size:18px;line-height:20px}.navbar-brand:hover,.navbar-brand:focus{text-decoration:none}@media(min-width:768px){.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}@media(min-width:768px){.navbar-toggle{display:none}}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media(max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu>li>a,.navbar-nav .open .dropdown-menu .dropdown-header{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:hover,.navbar-nav .open .dropdown-menu>li>a:focus{background-image:none}}@media(min-width:768px){.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}}@media(min-width:768px){.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;margin-top:8px;margin-right:-15px;margin-bottom:8px;margin-left:-15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}@media(min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form .radio,.navbar-form .checkbox{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .radio input[type="radio"],.navbar-form .checkbox input[type="checkbox"]{float:none;margin-left:0}}@media(max-width:767px){.navbar-form .form-group{margin-bottom:5px}}@media(min-width:768px){.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right{right:0;left:auto}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-text{float:left;margin-top:15px;margin-bottom:15px}@media(min-width:768px){.navbar-text{margin-right:15px;margin-left:15px}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:hover,.navbar-default .navbar-brand:focus{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a{color:#777}.navbar-default .navbar-nav>li>a:hover,.navbar-default .navbar-nav>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:hover,.navbar-default .navbar-nav>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:hover,.navbar-default .navbar-nav>.disabled>a:focus{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:hover,.navbar-default .navbar-toggle:focus{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e6e6e6}.navbar-default .navbar-nav>.dropdown>a:hover .caret,.navbar-default .navbar-nav>.dropdown>a:focus .caret{border-top-color:#333;border-bottom-color:#333}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:hover,.navbar-default .navbar-nav>.open>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.open>a .caret,.navbar-default .navbar-nav>.open>a:hover .caret,.navbar-default .navbar-nav>.open>a:focus .caret{border-top-color:#555;border-bottom-color:#555}.navbar-default .navbar-nav>.dropdown>a .caret{border-top-color:#777;border-bottom-color:#777}@media(max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:hover,.navbar-inverse .navbar-brand:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a{color:#999}.navbar-inverse .navbar-nav>li>a:hover,.navbar-inverse .navbar-nav>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:hover,.navbar-inverse .navbar-nav>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:hover,.navbar-inverse .navbar-nav>.disabled>a:focus{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:hover,.navbar-inverse .navbar-toggle:focus{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:hover,.navbar-inverse .navbar-nav>.open>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.dropdown>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-nav>.dropdown>a .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .navbar-nav>.open>a .caret,.navbar-inverse .navbar-nav>.open>a:hover .caret,.navbar-inverse .navbar-nav>.open>a:focus .caret{border-top-color:#fff;border-bottom-color:#fff}@media(max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5;border-radius:4px}.breadcrumb>li{display:inline-block}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{display:inline-block;padding-left:0;margin:20px 0;border-radius:4px}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.428571429;text-decoration:none;background-color:#fff;border:1px solid #ddd}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:hover,.pagination>li>span:hover,.pagination>li>a:focus,.pagination>li>span:focus{background-color:#eee}.pagination>.active>a,.pagination>.active>span,.pagination>.active>a:hover,.pagination>.active>span:hover,.pagination>.active>a:focus,.pagination>.active>span:focus{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>span,.pagination>.disabled>a,.pagination>.disabled>a:hover,.pagination>.disabled>a:focus{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager:before,.pager:after{display:table;content:" "}.pager:after{clear:both}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#eee}.pager .next>a,.pager .next>span{float:right}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25em}.label[href]:hover,.label[href]:focus{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.label-default{background-color:#999}.label-default[href]:hover,.label-default[href]:focus{background-color:#808080}.label-primary{background-color:#428bca}.label-primary[href]:hover,.label-primary[href]:focus{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:hover,.label-success[href]:focus{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:hover,.label-info[href]:focus{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:hover,.label-warning[href]:focus{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:hover,.label-danger[href]:focus{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;font-size:12px;font-weight:bold;line-height:1;color:#fff;text-align:center;white-space:nowrap;vertical-align:baseline;background-color:#999;border-radius:10px}.badge:empty{display:none}a.badge:hover,a.badge:focus{color:#fff;text-decoration:none;cursor:pointer}.btn .badge{position:relative;top:-1px}a.list-group-item.active>.badge,.nav-pills>.active>a>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.1428571435;color:inherit;background-color:#eee}.jumbotron h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1{font-size:63px}}.thumbnail{display:inline-block;display:block;height:auto;max-width:100%;padding:4px;line-height:1.428571429;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img{display:block;height:auto;max-width:100%}a.thumbnail:hover,a.thumbnail:focus{border-color:#428bca}.thumbnail>img{margin-right:auto;margin-left:auto}.thumbnail .caption{padding:9px;color:#333}.alert{padding:15px;margin-bottom:20px;border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert .alert-link{font-weight:bold}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;margin-bottom:20px;overflow:hidden;background-color:#f5f5f5;border-radius:4px;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,0.1);box-shadow:inset 0 1px 2px rgba(0,0,0,0.1)}.progress-bar{float:left;width:0;height:100%;font-size:12px;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,0.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-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-image:-moz-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-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:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-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-image:-moz-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-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)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-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-image:-moz-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-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)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-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-image:-moz-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-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)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(0.25,rgba(255,255,255,0.15)),color-stop(0.25,transparent),color-stop(0.5,transparent),color-stop(0.5,rgba(255,255,255,0.15)),color-stop(0.75,rgba(255,255,255,0.15)),color-stop(0.75,transparent),to(transparent));background-image:-webkit-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-image:-moz-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-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)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge{float:right}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:hover,a.list-group-item:focus{text-decoration:none;background-color:#f5f5f5}.list-group-item.active,.list-group-item.active:hover,.list-group-item.active:focus{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:hover .list-group-item-text,.list-group-item.active:focus .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.05);box-shadow:0 1px 1px rgba(0,0,0,0.05)}.panel-body{padding:15px}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel-body:before,.panel-body:after{display:table;content:" "}.panel-body:after{clear:both}.panel>.list-group{margin-bottom:0}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel>.table{margin-bottom:0}.panel>.panel-body+.table{border-top:1px solid #ddd}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-title{margin-top:0;margin-bottom:0;font-size:16px}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-top:1px solid #ddd;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{margin-bottom:0;overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-heading+.panel-collapse .panel-body{border-top:1px solid #ddd}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#fbeed5}.panel-warning>.panel-heading{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#fbeed5}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#fbeed5}.panel-danger{border-color:#eed3d7}.panel-danger>.panel-heading{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#eed3d7}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#eed3d7}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,0.05);box-shadow:inset 0 1px 1px rgba(0,0,0,0.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,0.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{float:right;font-size:21px;font-weight:bold;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:hover,.close:focus{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none}.modal-open{overflow:hidden}body.modal-open,.modal-open .navbar-fixed-top,.modal-open .navbar-fixed-bottom{margin-right:15px}.modal{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{z-index:1050;width:auto;padding:10px;margin-right:auto;margin-left:auto}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,0.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,0.5);box-shadow:0 3px 9px rgba(0,0,0,0.5);background-clip:padding-box}.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.428571429px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.428571429}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;text-align:right;border-top:1px solid #e5e5e5}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer:before,.modal-footer:after{display:table;content:" "}.modal-footer:after{clear:both}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{right:auto;left:50%;width:600px;padding-top:30px;padding-bottom:30px}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,0.5);box-shadow:0 5px 15px rgba(0,0,0,0.5)}}.tooltip{position:absolute;z-index:1030;display:block;font-size:12px;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-left .tooltip-arrow{bottom:0;left:5px;border-top-color:#000;border-width:5px 5px 0}.tooltip.top-right .tooltip-arrow{right:5px;bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-left .tooltip-arrow{top:0;left:5px;border-bottom-color:#000;border-width:0 5px 5px}.tooltip.bottom-right .tooltip-arrow{top:0;right:5px;border-bottom-color:#000;border-width:0 5px 5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,0.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,0.2);box-shadow:0 5px 10px rgba(0,0,0,0.2);background-clip:padding-box}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,0.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,0.25);border-left-width:0}.popover.right .arrow:after{bottom:-10px;left:1px;border-right-color:#fff;border-left-width:0;content:" "}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,0.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,0.25);border-right-width:0}.popover.left .arrow:after{right:1px;bottom:-10px;border-left-color:#fff;border-right-width:0;content:" "}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6);opacity:.5;filter:alpha(opacity=50)}.carousel-control.left{background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.5)),to(rgba(0,0,0,0.0001)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.5) 0),color-stop(rgba(0,0,0,0.0001) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.5) 0,rgba(0,0,0,0.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000',endColorstr='#00000000',GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,0.0001)),to(rgba(0,0,0,0.5)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,0.0001) 0),color-stop(rgba(0,0,0,0.5) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,0.0001) 0,rgba(0,0,0,0.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000',endColorstr='#80000000',GradientType=1)}.carousel-control:hover,.carousel-control:focus{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .icon-prev,.carousel-control .icon-next,.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right{position:absolute;top:50%;left:50%;z-index:5;display:inline-block}.carousel-control .icon-prev,.carousel-control .icon-next{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,0.6)}.carousel-caption .btn{text-shadow:none}@media screen and (min-width:768px){.carousel-control .icon-prev,.carousel-control .icon-next{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:before,.clearfix:after{display:table;content:" "}.clearfix:after{clear:both}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media screen and (max-width:400px){@-ms-viewport{width:320px}}.hidden{display:none!important;visibility:hidden!important}.visible-xs{display:none!important}tr.visible-xs{display:none!important}th.visible-xs,td.visible-xs{display:none!important}@media(max-width:767px){.visible-xs{display:block!important}tr.visible-xs{display:table-row!important}th.visible-xs,td.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}tr.visible-xs.visible-sm{display:table-row!important}th.visible-xs.visible-sm,td.visible-xs.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}tr.visible-xs.visible-md{display:table-row!important}th.visible-xs.visible-md,td.visible-xs.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-xs.visible-lg{display:block!important}tr.visible-xs.visible-lg{display:table-row!important}th.visible-xs.visible-lg,td.visible-xs.visible-lg{display:table-cell!important}}.visible-sm{display:none!important}tr.visible-sm{display:none!important}th.visible-sm,td.visible-sm{display:none!important}@media(max-width:767px){.visible-sm.visible-xs{display:block!important}tr.visible-sm.visible-xs{display:table-row!important}th.visible-sm.visible-xs,td.visible-sm.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-sm{display:block!important}tr.visible-sm{display:table-row!important}th.visible-sm,td.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}tr.visible-sm.visible-md{display:table-row!important}th.visible-sm.visible-md,td.visible-sm.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-sm.visible-lg{display:block!important}tr.visible-sm.visible-lg{display:table-row!important}th.visible-sm.visible-lg,td.visible-sm.visible-lg{display:table-cell!important}}.visible-md{display:none!important}tr.visible-md{display:none!important}th.visible-md,td.visible-md{display:none!important}@media(max-width:767px){.visible-md.visible-xs{display:block!important}tr.visible-md.visible-xs{display:table-row!important}th.visible-md.visible-xs,td.visible-md.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}tr.visible-md.visible-sm{display:table-row!important}th.visible-md.visible-sm,td.visible-md.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-md{display:block!important}tr.visible-md{display:table-row!important}th.visible-md,td.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-md.visible-lg{display:block!important}tr.visible-md.visible-lg{display:table-row!important}th.visible-md.visible-lg,td.visible-md.visible-lg{display:table-cell!important}}.visible-lg{display:none!important}tr.visible-lg{display:none!important}th.visible-lg,td.visible-lg{display:none!important}@media(max-width:767px){.visible-lg.visible-xs{display:block!important}tr.visible-lg.visible-xs{display:table-row!important}th.visible-lg.visible-xs,td.visible-lg.visible-xs{display:table-cell!important}}@media(min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}tr.visible-lg.visible-sm{display:table-row!important}th.visible-lg.visible-sm,td.visible-lg.visible-sm{display:table-cell!important}}@media(min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}tr.visible-lg.visible-md{display:table-row!important}th.visible-lg.visible-md,td.visible-lg.visible-md{display:table-cell!important}}@media(min-width:1200px){.visible-lg{display:block!important}tr.visible-lg{display:table-row!important}th.visible-lg,td.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}tr.hidden-xs{display:table-row!important}th.hidden-xs,td.hidden-xs{display:table-cell!important}@media(max-width:767px){.hidden-xs{display:none!important}tr.hidden-xs{display:none!important}th.hidden-xs,td.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm{display:none!important}tr.hidden-xs.hidden-sm{display:none!important}th.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md{display:none!important}tr.hidden-xs.hidden-md{display:none!important}th.hidden-xs.hidden-md,td.hidden-xs.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-xs.hidden-lg{display:none!important}tr.hidden-xs.hidden-lg{display:none!important}th.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}tr.hidden-sm{display:table-row!important}th.hidden-sm,td.hidden-sm{display:table-cell!important}@media(max-width:767px){.hidden-sm.hidden-xs{display:none!important}tr.hidden-sm.hidden-xs{display:none!important}th.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-sm{display:none!important}tr.hidden-sm{display:none!important}th.hidden-sm,td.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md{display:none!important}tr.hidden-sm.hidden-md{display:none!important}th.hidden-sm.hidden-md,td.hidden-sm.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-sm.hidden-lg{display:none!important}tr.hidden-sm.hidden-lg{display:none!important}th.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}tr.hidden-md{display:table-row!important}th.hidden-md,td.hidden-md{display:table-cell!important}@media(max-width:767px){.hidden-md.hidden-xs{display:none!important}tr.hidden-md.hidden-xs{display:none!important}th.hidden-md.hidden-xs,td.hidden-md.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-md.hidden-sm{display:none!important}tr.hidden-md.hidden-sm{display:none!important}th.hidden-md.hidden-sm,td.hidden-md.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-md{display:none!important}tr.hidden-md{display:none!important}th.hidden-md,td.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-md.hidden-lg{display:none!important}tr.hidden-md.hidden-lg{display:none!important}th.hidden-md.hidden-lg,td.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}tr.hidden-lg{display:table-row!important}th.hidden-lg,td.hidden-lg{display:table-cell!important}@media(max-width:767px){.hidden-lg.hidden-xs{display:none!important}tr.hidden-lg.hidden-xs{display:none!important}th.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs{display:none!important}}@media(min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm{display:none!important}tr.hidden-lg.hidden-sm{display:none!important}th.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm{display:none!important}}@media(min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md{display:none!important}tr.hidden-lg.hidden-md{display:none!important}th.hidden-lg.hidden-md,td.hidden-lg.hidden-md{display:none!important}}@media(min-width:1200px){.hidden-lg{display:none!important}tr.hidden-lg{display:none!important}th.hidden-lg,td.hidden-lg{display:none!important}}.visible-print{display:none!important}tr.visible-print{display:none!important}th.visible-print,td.visible-print{display:none!important}@media print{.visible-print{display:block!important}tr.visible-print{display:table-row!important}th.visible-print,td.visible-print{display:table-cell!important}.hidden-print{display:none!important}tr.hidden-print{display:none!important}th.hidden-print,td.hidden-print{display:none!important}} \ No newline at end of file diff --git a/v1/taffy/dashboard/dash.css b/v1/taffy/dashboard/dash.css deleted file mode 100644 index 9579a54..0000000 --- a/v1/taffy/dashboard/dash.css +++ /dev/null @@ -1,9 +0,0 @@ -/*! - * Bootstrap v3.0.0 - * - * Copyright 2013 Twitter, Inc - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Designed and built with all the love in the world by @mdo and @fat. - */.img-thumbnail,.list-inline>li,audio,canvas,label,video{display:inline-block}pre,pre code{white-space:pre-wrap}.collapsing,.dropdown-menu .divider,.nav .nav-divider,.sr-only,svg:not(:root){overflow:hidden}hr,img{border:0}body,legend,pre{color:#333}.btn-danger.active,.btn-danger:active,.btn-default.active,.btn-default:active,.btn-info.active,.btn-info:active,.btn-primary.active,.btn-primary:active,.btn-success.active,.btn-success:active,.btn-warning.active,.btn-warning:active,.btn.active,.btn:active,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover,.open .dropdown-toggle.btn-danger,.open .dropdown-toggle.btn-default,.open .dropdown-toggle.btn-info,.open .dropdown-toggle.btn-primary,.open .dropdown-toggle.btn-success,.open .dropdown-toggle.btn-warning,button,input,select[multiple],textarea{background-image:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}audio:not([controls]){display:none;height:0}[hidden]{display:none}html{font-family:sans-serif;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}a:active,a:hover{outline:0}h1{margin:.67em 0}b,strong{font-weight:700}dfn{font-style:italic}hr{height:0;-moz-box-sizing:content-box;box-sizing:content-box}mark{color:#000;background:#ff0}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em}q{quotes:"\201C" "\201D" "\2018" "\2019"}sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}img{vertical-align:middle}figure{margin:0}button,select{text-transform:none}button,html input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button}button[disabled],html input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0}textarea{overflow:auto;vertical-align:top}table{border-collapse:collapse;border-spacing:0}@media print{blockquote,img,pre,tr{page-break-inside:avoid}*{color:#000!important;text-shadow:none!important;background:0 0!important;box-shadow:none!important}a,a:visited{text-decoration:underline}a[href]:after{content:" (" attr(href) ")"}abbr[title]:after{content:" (" attr(title) ")"}.ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:""}blockquote,pre{border:1px solid #999}thead{display:table-header-group}img{max-width:100%!important}@page{margin:2cm .5cm}h2,h3,p{orphans:3;widows:3}h2,h3{page-break-after:avoid}.navbar{display:none}.table td,.table th{background-color:#fff!important}.btn>.caret,.dropup>.btn>.caret{border-top-color:#000!important}.label{border:1px solid #000}.table{border-collapse:collapse!important}.table-bordered td,.table-bordered th{border:1px solid #ddd!important}}.img-thumbnail,body{background-color:#fff}*,:after,:before{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:62.5%;-webkit-tap-highlight-color:transparent}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;line-height:1.42857143}button,input,select,textarea{margin:0;font-family:inherit;font-size:inherit;line-height:inherit}a{color:#428bca;text-decoration:none}a:focus,a:hover{color:#2a6496;text-decoration:underline}a:focus{outline:#333 dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.img-responsive{display:block;height:auto;max-width:100%}.img-rounded{border-radius:6px}.img-thumbnail{height:auto;max-width:100%;padding:4px;line-height:1.42857143;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.img-circle{border-radius:50%}hr{margin-top:20px;margin-bottom:20px;border-top:1px solid #eee}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;clip:rect(0 0 0 0);border:0}p{margin:0 0 10px}.lead{margin-bottom:20px;font-size:16.1px;font-weight:200;line-height:1.4}h1,h2,h3,h4,h5,h6{margin-bottom:10px}@media (min-width:768px){.lead{font-size:21px}}small{font-size:85%}cite{font-style:normal}.text-muted{color:#999}.text-primary{color:#428bca}.text-warning{color:#c09853}.text-danger{color:#b94a48}.text-success{color:#468847}.text-info{color:#3a87ad}.text-left{text-align:left}.text-right{text-align:right}.text-center{text-align:center}.modal-footer,blockquote.pull-right p,blockquote.pull-right small{text-align:right}.h1,.h2,.h3,.h4,.h5,.h6,h1,h2,h3,h4,h5,h6{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-weight:500;line-height:1.1}.h1 small,.h2 small,.h3 small,.h4 small,.h5 small,.h6 small,h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:400;line-height:1;color:#999}.badge,.label,dt,label{font-weight:700}h1,h2,h3{margin-top:20px}h4,h5,h6{margin-top:10px}.h1,h1{font-size:36px}.h2,h2{font-size:30px}.h3,h3{font-size:24px}.h4,h4{font-size:18px}.h5,h5{font-size:14px}.h6,.input-sm,h6{font-size:12px}.h1 small,h1 small{font-size:24px}.h2 small,h2 small{font-size:18px}.h3 small,.h4 small,h3 small,h4 small{font-size:14px}.page-header{padding-bottom:9px;margin:40px 0 20px;border-bottom:1px solid #eee}blockquote p:last-child,ol ol,ol ul,ul ol,ul ul{margin-bottom:0}ol,ul{margin-top:0;margin-bottom:10px}.list-inline,.list-unstyled{padding-left:0;list-style:none}.list-inline>li{padding-right:5px;padding-left:5px}dl{margin-bottom:20px}dd,dt{line-height:1.42857143}dd{margin-left:0}@media (min-width:768px){.dl-horizontal dt{float:left;width:160px;overflow:hidden;clear:left;text-align:right;text-overflow:ellipsis;white-space:nowrap}.dl-horizontal dd{margin-left:180px}.dl-horizontal dd:after,.dl-horizontal dd:before{display:table;content:" "}.dl-horizontal dd:after{clear:both}}.btn-group-vertical>.btn-group:after,.btn-toolbar:after,.clearfix:after,.container:after,.dropdown-menu>li>a,.form-horizontal .form-group:after,.modal-footer:after,.nav:after,.navbar-collapse:after,.navbar-header:after,.navbar:after,.pager:after,.panel-body:after,.row:after,.tabbable:after{clear:both}address,blockquote small,pre{display:block;line-height:1.42857143}abbr[data-original-title],abbr[title]{cursor:help;border-bottom:1px dotted #999}abbr.initialism{font-size:90%;text-transform:uppercase}blockquote{padding:10px 20px;margin:0 0 20px;border-left:5px solid #eee}blockquote p{font-size:17.5px;font-weight:300;line-height:1.25}blockquote small{color:#999}blockquote small:before{content:'\2014 \00A0'}blockquote.pull-right{padding-right:15px;padding-left:0;border-right:5px solid #eee;border-left:0}blockquote.pull-right small:before{content:''}blockquote.pull-right small:after{content:'\00A0 \2014'}blockquote:after,blockquote:before,q:after,q:before{content:""}address{margin-bottom:20px;font-style:normal}code,pre{font-family:Monaco,Menlo,Consolas,"Courier New",monospace}code{padding:2px 4px;font-size:90%;color:#c7254e;white-space:nowrap;background-color:#f9f2f4;border-radius:4px}pre{padding:9.5px;margin:0 0 10px;font-size:13px;word-break:break-all;word-wrap:break-word;background-color:#f5f5f5;border:1px solid #ccc;border-radius:4px}.container:after,.container:before,.row:after,.row:before{display:table;content:" "}.table,pre.prettyprint{margin-bottom:20px}pre code{padding:0;font-size:inherit;color:inherit;background-color:transparent;border:0}.pre-scrollable{max-height:340px;overflow-y:scroll}.container{padding-right:15px;padding-left:15px;margin-right:auto;margin-left:auto}.row{margin-right:-15px;margin-left:-15px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-12,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9,.col-md-1,.col-md-10,.col-md-11,.col-md-12,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-12,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9,.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-12,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-10,.col-xs-11,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9{float:left}.col-xs-1{width:8.33333333%}.col-xs-2{width:16.66666667%}.col-xs-3{width:25%}.col-xs-4{width:33.33333333%}.col-xs-5{width:41.66666667%}.col-xs-6{width:50%}.col-xs-7{width:58.33333333%}.col-xs-8{width:66.66666667%}.col-xs-9{width:75%}.col-xs-10{width:83.33333333%}.col-xs-11{width:91.66666667%}.col-xs-12{width:100%}@media (min-width:768px){.container{max-width:750px}.col-sm-1,.col-sm-10,.col-sm-11,.col-sm-2,.col-sm-3,.col-sm-4,.col-sm-5,.col-sm-6,.col-sm-7,.col-sm-8,.col-sm-9{float:left}.col-sm-1{width:8.33333333%}.col-sm-2{width:16.66666667%}.col-sm-3{width:25%}.col-sm-4{width:33.33333333%}.col-sm-5{width:41.66666667%}.col-sm-6{width:50%}.col-sm-7{width:58.33333333%}.col-sm-8{width:66.66666667%}.col-sm-9{width:75%}.col-sm-10{width:83.33333333%}.col-sm-11{width:91.66666667%}.col-sm-12{width:100%}.col-sm-push-1{left:8.33333333%}.col-sm-push-2{left:16.66666667%}.col-sm-push-3{left:25%}.col-sm-push-4{left:33.33333333%}.col-sm-push-5{left:41.66666667%}.col-sm-push-6{left:50%}.col-sm-push-7{left:58.33333333%}.col-sm-push-8{left:66.66666667%}.col-sm-push-9{left:75%}.col-sm-push-10{left:83.33333333%}.col-sm-push-11{left:91.66666667%}.col-sm-pull-1{right:8.33333333%}.col-sm-pull-2{right:16.66666667%}.col-sm-pull-3{right:25%}.col-sm-pull-4{right:33.33333333%}.col-sm-pull-5{right:41.66666667%}.col-sm-pull-6{right:50%}.col-sm-pull-7{right:58.33333333%}.col-sm-pull-8{right:66.66666667%}.col-sm-pull-9{right:75%}.col-sm-pull-10{right:83.33333333%}.col-sm-pull-11{right:91.66666667%}.col-sm-offset-1{margin-left:8.33333333%}.col-sm-offset-2{margin-left:16.66666667%}.col-sm-offset-3{margin-left:25%}.col-sm-offset-4{margin-left:33.33333333%}.col-sm-offset-5{margin-left:41.66666667%}.col-sm-offset-6{margin-left:50%}.col-sm-offset-7{margin-left:58.33333333%}.col-sm-offset-8{margin-left:66.66666667%}.col-sm-offset-9{margin-left:75%}.col-sm-offset-10{margin-left:83.33333333%}.col-sm-offset-11{margin-left:91.66666667%}}@media (min-width:992px){.container{max-width:970px}.col-md-1,.col-md-10,.col-md-11,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9{float:left}.col-md-1{width:8.33333333%}.col-md-2{width:16.66666667%}.col-md-3{width:25%}.col-md-4{width:33.33333333%}.col-md-5{width:41.66666667%}.col-md-6{width:50%}.col-md-7{width:58.33333333%}.col-md-8{width:66.66666667%}.col-md-9{width:75%}.col-md-10{width:83.33333333%}.col-md-11{width:91.66666667%}.col-md-12{width:100%}.col-md-push-0{left:auto}.col-md-push-1{left:8.33333333%}.col-md-push-2{left:16.66666667%}.col-md-push-3{left:25%}.col-md-push-4{left:33.33333333%}.col-md-push-5{left:41.66666667%}.col-md-push-6{left:50%}.col-md-push-7{left:58.33333333%}.col-md-push-8{left:66.66666667%}.col-md-push-9{left:75%}.col-md-push-10{left:83.33333333%}.col-md-push-11{left:91.66666667%}.col-md-pull-0{right:auto}.col-md-pull-1{right:8.33333333%}.col-md-pull-2{right:16.66666667%}.col-md-pull-3{right:25%}.col-md-pull-4{right:33.33333333%}.col-md-pull-5{right:41.66666667%}.col-md-pull-6{right:50%}.col-md-pull-7{right:58.33333333%}.col-md-pull-8{right:66.66666667%}.col-md-pull-9{right:75%}.col-md-pull-10{right:83.33333333%}.col-md-pull-11{right:91.66666667%}.col-md-offset-0{margin-left:0}.col-md-offset-1{margin-left:8.33333333%}.col-md-offset-2{margin-left:16.66666667%}.col-md-offset-3{margin-left:25%}.col-md-offset-4{margin-left:33.33333333%}.col-md-offset-5{margin-left:41.66666667%}.col-md-offset-6{margin-left:50%}.col-md-offset-7{margin-left:58.33333333%}.col-md-offset-8{margin-left:66.66666667%}.col-md-offset-9{margin-left:75%}.col-md-offset-10{margin-left:83.33333333%}.col-md-offset-11{margin-left:91.66666667%}}@media (min-width:1200px){.container{max-width:1170px}.col-lg-1,.col-lg-10,.col-lg-11,.col-lg-2,.col-lg-3,.col-lg-4,.col-lg-5,.col-lg-6,.col-lg-7,.col-lg-8,.col-lg-9{float:left}.col-lg-1{width:8.33333333%}.col-lg-2{width:16.66666667%}.col-lg-3{width:25%}.col-lg-4{width:33.33333333%}.col-lg-5{width:41.66666667%}.col-lg-6{width:50%}.col-lg-7{width:58.33333333%}.col-lg-8{width:66.66666667%}.col-lg-9{width:75%}.col-lg-10{width:83.33333333%}.col-lg-11{width:91.66666667%}.col-lg-12{width:100%}.col-lg-push-0{left:auto}.col-lg-push-1{left:8.33333333%}.col-lg-push-2{left:16.66666667%}.col-lg-push-3{left:25%}.col-lg-push-4{left:33.33333333%}.col-lg-push-5{left:41.66666667%}.col-lg-push-6{left:50%}.col-lg-push-7{left:58.33333333%}.col-lg-push-8{left:66.66666667%}.col-lg-push-9{left:75%}.col-lg-push-10{left:83.33333333%}.col-lg-push-11{left:91.66666667%}.col-lg-pull-0{right:auto}.col-lg-pull-1{right:8.33333333%}.col-lg-pull-2{right:16.66666667%}.col-lg-pull-3{right:25%}.col-lg-pull-4{right:33.33333333%}.col-lg-pull-5{right:41.66666667%}.col-lg-pull-6{right:50%}.col-lg-pull-7{right:58.33333333%}.col-lg-pull-8{right:66.66666667%}.col-lg-pull-9{right:75%}.col-lg-pull-10{right:83.33333333%}.col-lg-pull-11{right:91.66666667%}.col-lg-offset-0{margin-left:0}.col-lg-offset-1{margin-left:8.33333333%}.col-lg-offset-2{margin-left:16.66666667%}.col-lg-offset-3{margin-left:25%}.col-lg-offset-4{margin-left:33.33333333%}.col-lg-offset-5{margin-left:41.66666667%}.col-lg-offset-6{margin-left:50%}.col-lg-offset-7{margin-left:58.33333333%}.col-lg-offset-8{margin-left:66.66666667%}.col-lg-offset-9{margin-left:75%}.col-lg-offset-10{margin-left:83.33333333%}.col-lg-offset-11{margin-left:91.66666667%}}table{max-width:100%;background-color:transparent}th{text-align:left}.table{width:100%}.table tbody>tr>td,.table tbody>tr>th,.table tfoot>tr>td,.table tfoot>tr>th,.table thead>tr>td,.table thead>tr>th{padding:8px;line-height:1.42857143;vertical-align:top;border-top:1px solid #ddd}.table thead>tr>th{vertical-align:bottom;border-bottom:2px solid #ddd}.table caption+thead tr:first-child td,.table caption+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table thead:first-child tr:first-child td,.table thead:first-child tr:first-child th{border-top:0}.table tbody+tbody{border-top:2px solid #ddd}.table .table{background-color:#fff}.table-condensed tbody>tr>td,.table-condensed tbody>tr>th,.table-condensed tfoot>tr>td,.table-condensed tfoot>tr>th,.table-condensed thead>tr>td,.table-condensed thead>tr>th{padding:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #ddd}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table-striped>tbody>tr:nth-child(odd)>td,.table-striped>tbody>tr:nth-child(odd)>th{background-color:#f9f9f9}.table-hover>tbody>tr:hover>td,.table-hover>tbody>tr:hover>th,.table>tbody>tr.active>td,.table>tbody>tr.active>th,.table>tbody>tr>td.active,.table>tbody>tr>th.active,.table>tfoot>tr.active>td,.table>tfoot>tr.active>th,.table>tfoot>tr>td.active,.table>tfoot>tr>th.active,.table>thead>tr.active>td,.table>thead>tr.active>th,.table>thead>tr>td.active,.table>thead>tr>th.active{background-color:#f5f5f5}table col[class*=col-]{display:table-column;float:none}table td[class*=col-],table th[class*=col-]{display:table-cell;float:none}.table>tbody>tr.success>td,.table>tbody>tr.success>th,.table>tbody>tr>td.success,.table>tbody>tr>th.success,.table>tfoot>tr.success>td,.table>tfoot>tr.success>th,.table>tfoot>tr>td.success,.table>tfoot>tr>th.success,.table>thead>tr.success>td,.table>thead>tr.success>th,.table>thead>tr>td.success,.table>thead>tr>th.success{background-color:#dff0d8;border-color:#d6e9c6}.table-hover>tbody>tr.success:hover>td,.table-hover>tbody>tr>td.success:hover,.table-hover>tbody>tr>th.success:hover{background-color:#d0e9c6;border-color:#c9e2b3}.table>tbody>tr.danger>td,.table>tbody>tr.danger>th,.table>tbody>tr>td.danger,.table>tbody>tr>th.danger,.table>tfoot>tr.danger>td,.table>tfoot>tr.danger>th,.table>tfoot>tr>td.danger,.table>tfoot>tr>th.danger,.table>thead>tr.danger>td,.table>thead>tr.danger>th,.table>thead>tr>td.danger,.table>thead>tr>th.danger{background-color:#f2dede;border-color:#eed3d7}.table-hover>tbody>tr.danger:hover>td,.table-hover>tbody>tr>td.danger:hover,.table-hover>tbody>tr>th.danger:hover{background-color:#ebcccc;border-color:#e6c1c7}.table>tbody>tr.warning>td,.table>tbody>tr.warning>th,.table>tbody>tr>td.warning,.table>tbody>tr>th.warning,.table>tfoot>tr.warning>td,.table>tfoot>tr.warning>th,.table>tfoot>tr>td.warning,.table>tfoot>tr>th.warning,.table>thead>tr.warning>td,.table>thead>tr.warning>th,.table>thead>tr>td.warning,.table>thead>tr>th.warning{background-color:#fcf8e3;border-color:#fbeed5}.table-hover>tbody>tr.warning:hover>td,.table-hover>tbody>tr>td.warning:hover,.table-hover>tbody>tr>th.warning:hover{background-color:#faf2cc;border-color:#f8e5be}@media (max-width:768px){.table-responsive{width:100%;margin-bottom:15px;overflow-x:scroll;overflow-y:hidden;border:1px solid #ddd}.table-responsive>.table{margin-bottom:0;background-color:#fff}.table-responsive>.table>tbody>tr>td,.table-responsive>.table>tbody>tr>th,.table-responsive>.table>tfoot>tr>td,.table-responsive>.table>tfoot>tr>th,.table-responsive>.table>thead>tr>td,.table-responsive>.table>thead>tr>th{white-space:nowrap}.table-responsive>.table-bordered{border:0}.table-responsive>.table-bordered>tbody>tr>td:first-child,.table-responsive>.table-bordered>tbody>tr>th:first-child,.table-responsive>.table-bordered>tfoot>tr>td:first-child,.table-responsive>.table-bordered>tfoot>tr>th:first-child,.table-responsive>.table-bordered>thead>tr>td:first-child,.table-responsive>.table-bordered>thead>tr>th:first-child{border-left:0}.table-responsive>.table-bordered>tbody>tr>td:last-child,.table-responsive>.table-bordered>tbody>tr>th:last-child,.table-responsive>.table-bordered>tfoot>tr>td:last-child,.table-responsive>.table-bordered>tfoot>tr>th:last-child,.table-responsive>.table-bordered>thead>tr>td:last-child,.table-responsive>.table-bordered>thead>tr>th:last-child{border-right:0}.table-responsive>.table-bordered>tbody>tr:last-child>td,.table-responsive>.table-bordered>tbody>tr:last-child>th,.table-responsive>.table-bordered>tfoot>tr:last-child>td,.table-responsive>.table-bordered>tfoot>tr:last-child>th,.table-responsive>.table-bordered>thead>tr:last-child>td,.table-responsive>.table-bordered>thead>tr:last-child>th{border-bottom:0}}fieldset,legend{padding:0;border:0}fieldset{margin:0}legend{display:block;width:100%;margin-bottom:20px;font-size:21px;line-height:inherit;border-bottom:1px solid #e5e5e5}label{margin-bottom:5px}.btn-block,.checkbox,.form-control,.help-block,.radio,input[type=file]{display:block}input[type=search]{-webkit-appearance:textfield;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=checkbox],input[type=radio]{margin:4px 0 0;margin-top:1px\9;line-height:normal}select[multiple],select[size]{height:auto}select optgroup{font-family:inherit;font-size:inherit;font-style:inherit}input[type=file]:focus,input[type=checkbox]:focus,input[type=radio]:focus{outline:#333 dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}input[type=number]::-webkit-inner-spin-button,input[type=number]::-webkit-outer-spin-button{height:auto}.form-control:-moz-placeholder{color:#999}.form-control::-moz-placeholder{color:#999}.form-control:-ms-input-placeholder{color:#999}.form-control::-webkit-input-placeholder{color:#999}.form-control{width:100%;height:34px;padding:6px 12px;font-size:14px;line-height:1.42857143;color:#555;vertical-align:middle;background-color:#fff;border:1px solid #ccc;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075);-webkit-transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s;transition:border-color ease-in-out .15s,box-shadow ease-in-out .15s}.form-control:focus{border-color:#66afe9;outline:0;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 8px rgba(102,175,233,.6)}.form-control[disabled],.form-control[readonly],fieldset[disabled] .form-control{cursor:not-allowed;background-color:#eee}.btn,.btn-link,.checkbox label,.checkbox-inline,.radio label,.radio-inline{cursor:pointer;font-weight:400}textarea.form-control{height:auto}.form-group{margin-bottom:15px}.checkbox,.radio{min-height:20px;padding-left:20px;margin-top:10px;margin-bottom:10px;vertical-align:middle}.checkbox label,.radio label{display:inline;margin-bottom:0}.checkbox input[type=checkbox],.checkbox-inline input[type=checkbox],.radio input[type=radio],.radio-inline input[type=radio]{float:left;margin-left:-20px}.checkbox+.checkbox,.radio+.radio{margin-top:-5px}.checkbox-inline,.radio-inline{display:inline-block;padding-left:20px;margin-bottom:0;vertical-align:middle}.checkbox-inline+.checkbox-inline,.radio-inline+.radio-inline{margin-top:0;margin-left:10px}.btn-block+.btn-block,.help-block{margin-top:5px}.checkbox-inline[disabled],.checkbox[disabled],.radio-inline[disabled],.radio[disabled],fieldset[disabled] .checkbox,fieldset[disabled] .checkbox-inline,fieldset[disabled] .radio,fieldset[disabled] .radio-inline,fieldset[disabled] input[type=checkbox],fieldset[disabled] input[type=radio],input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.input-sm{height:30px;padding:5px 10px;line-height:1.5;border-radius:3px}select.input-sm{height:30px;line-height:30px}.btn-lg,.input-lg{padding:10px 16px;font-size:18px;line-height:1.33}textarea.input-sm{height:auto}.input-lg{height:45px;border-radius:6px}select.input-lg{height:45px;line-height:45px}textarea.input-lg{height:auto}.has-warning .control-label,.has-warning .help-block{color:#c09853}.has-warning .form-control{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-warning .form-control:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #dbc59e}.has-warning .input-group-addon{color:#c09853;background-color:#fcf8e3;border-color:#c09853}.has-error .control-label,.has-error .help-block{color:#b94a48}.has-error .form-control{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-error .form-control:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #d59392}.has-error .input-group-addon{color:#b94a48;background-color:#f2dede;border-color:#b94a48}.has-success .control-label,.has-success .help-block{color:#468847}.has-success .form-control{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075);box-shadow:inset 0 1px 1px rgba(0,0,0,.075)}.has-success .form-control:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0,0,0,.075),0 0 6px #7aba7b}.has-success .input-group-addon{color:#468847;background-color:#dff0d8;border-color:#468847}.form-control-static{padding-top:7px;margin-bottom:0}.help-block{margin-bottom:10px;color:#737373}@media (min-width:768px){.form-inline .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.form-inline .form-control{display:inline-block}.form-inline .checkbox,.form-inline .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.form-inline .checkbox input[type=checkbox],.form-inline .radio input[type=radio]{float:none;margin-left:0}.form-horizontal .control-label{text-align:right}}.form-horizontal .checkbox,.form-horizontal .checkbox-inline,.form-horizontal .control-label,.form-horizontal .radio,.form-horizontal .radio-inline{padding-top:7px;margin-top:0;margin-bottom:0}.form-horizontal .form-group{margin-right:-15px;margin-left:-15px}.caret,.nav-pills>li+li{margin-left:2px}.form-horizontal .form-group:after,.form-horizontal .form-group:before{display:table;content:" "}.btn,.input-group-addon,.nav-justified>li>a,.nav-tabs.nav-justified>li>a{text-align:center}.btn{display:inline-block;padding:6px 12px;margin-bottom:0;font-size:14px;line-height:1.42857143;white-space:nowrap;vertical-align:middle;border:1px solid transparent;border-radius:4px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;-o-user-select:none;user-select:none}.btn:focus{outline:#333 dotted thin;outline:-webkit-focus-ring-color auto 5px;outline-offset:-2px}.btn:focus,.btn:hover{color:#333;text-decoration:none}.btn.active,.btn:active{outline:0;-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn.disabled,.btn[disabled],fieldset[disabled] .btn{pointer-events:none;cursor:not-allowed;opacity:.65;filter:alpha(opacity=65);-webkit-box-shadow:none;box-shadow:none}.btn-default{color:#333;background-color:#fff;border-color:#ccc}.btn-default.active,.btn-default:active,.btn-default:focus,.btn-default:hover,.open .dropdown-toggle.btn-default{color:#333;background-color:#ebebeb;border-color:#adadad}.btn-default.disabled,.btn-default.disabled.active,.btn-default.disabled:active,.btn-default.disabled:focus,.btn-default.disabled:hover,.btn-default[disabled],.btn-default[disabled].active,.btn-default[disabled]:active,.btn-default[disabled]:focus,.btn-default[disabled]:hover,fieldset[disabled] .btn-default,fieldset[disabled] .btn-default.active,fieldset[disabled] .btn-default:active,fieldset[disabled] .btn-default:focus,fieldset[disabled] .btn-default:hover{background-color:#fff;border-color:#ccc}.btn-primary{color:#fff;background-color:#428bca;border-color:#357ebd}.btn-primary.active,.btn-primary:active,.btn-primary:focus,.btn-primary:hover,.open .dropdown-toggle.btn-primary{color:#fff;background-color:#3276b1;border-color:#285e8e}.btn-primary.disabled,.btn-primary.disabled.active,.btn-primary.disabled:active,.btn-primary.disabled:focus,.btn-primary.disabled:hover,.btn-primary[disabled],.btn-primary[disabled].active,.btn-primary[disabled]:active,.btn-primary[disabled]:focus,.btn-primary[disabled]:hover,fieldset[disabled] .btn-primary,fieldset[disabled] .btn-primary.active,fieldset[disabled] .btn-primary:active,fieldset[disabled] .btn-primary:focus,fieldset[disabled] .btn-primary:hover{background-color:#428bca;border-color:#357ebd}.btn-warning{color:#fff;background-color:#f0ad4e;border-color:#eea236}.btn-warning.active,.btn-warning:active,.btn-warning:focus,.btn-warning:hover,.open .dropdown-toggle.btn-warning{color:#fff;background-color:#ed9c28;border-color:#d58512}.btn-warning.disabled,.btn-warning.disabled.active,.btn-warning.disabled:active,.btn-warning.disabled:focus,.btn-warning.disabled:hover,.btn-warning[disabled],.btn-warning[disabled].active,.btn-warning[disabled]:active,.btn-warning[disabled]:focus,.btn-warning[disabled]:hover,fieldset[disabled] .btn-warning,fieldset[disabled] .btn-warning.active,fieldset[disabled] .btn-warning:active,fieldset[disabled] .btn-warning:focus,fieldset[disabled] .btn-warning:hover{background-color:#f0ad4e;border-color:#eea236}.btn-danger{color:#fff;background-color:#d9534f;border-color:#d43f3a}.btn-danger.active,.btn-danger:active,.btn-danger:focus,.btn-danger:hover,.open .dropdown-toggle.btn-danger{color:#fff;background-color:#d2322d;border-color:#ac2925}.btn-danger.disabled,.btn-danger.disabled.active,.btn-danger.disabled:active,.btn-danger.disabled:focus,.btn-danger.disabled:hover,.btn-danger[disabled],.btn-danger[disabled].active,.btn-danger[disabled]:active,.btn-danger[disabled]:focus,.btn-danger[disabled]:hover,fieldset[disabled] .btn-danger,fieldset[disabled] .btn-danger.active,fieldset[disabled] .btn-danger:active,fieldset[disabled] .btn-danger:focus,fieldset[disabled] .btn-danger:hover{background-color:#d9534f;border-color:#d43f3a}.btn-success{color:#fff;background-color:#5cb85c;border-color:#4cae4c}.btn-success.active,.btn-success:active,.btn-success:focus,.btn-success:hover,.open .dropdown-toggle.btn-success{color:#fff;background-color:#47a447;border-color:#398439}.btn-success.disabled,.btn-success.disabled.active,.btn-success.disabled:active,.btn-success.disabled:focus,.btn-success.disabled:hover,.btn-success[disabled],.btn-success[disabled].active,.btn-success[disabled]:active,.btn-success[disabled]:focus,.btn-success[disabled]:hover,fieldset[disabled] .btn-success,fieldset[disabled] .btn-success.active,fieldset[disabled] .btn-success:active,fieldset[disabled] .btn-success:focus,fieldset[disabled] .btn-success:hover{background-color:#5cb85c;border-color:#4cae4c}.btn-info{color:#fff;background-color:#5bc0de;border-color:#46b8da}.btn-info.active,.btn-info:active,.btn-info:focus,.btn-info:hover,.open .dropdown-toggle.btn-info{color:#fff;background-color:#39b3d7;border-color:#269abc}.btn-info.disabled,.btn-info.disabled.active,.btn-info.disabled:active,.btn-info.disabled:focus,.btn-info.disabled:hover,.btn-info[disabled],.btn-info[disabled].active,.btn-info[disabled]:active,.btn-info[disabled]:focus,.btn-info[disabled]:hover,fieldset[disabled] .btn-info,fieldset[disabled] .btn-info.active,fieldset[disabled] .btn-info:active,fieldset[disabled] .btn-info:focus,fieldset[disabled] .btn-info:hover{background-color:#5bc0de;border-color:#46b8da}.btn-link{color:#428bca;border-radius:0}.btn-link,.btn-link:active,.btn-link[disabled],fieldset[disabled] .btn-link{background-color:transparent;-webkit-box-shadow:none;box-shadow:none}.btn-link,.btn-link:active,.btn-link:focus,.btn-link:hover{border-color:transparent}.btn-link:focus,.btn-link:hover{color:#2a6496;text-decoration:underline;background-color:transparent}.btn-link[disabled]:focus,.btn-link[disabled]:hover,fieldset[disabled] .btn-link:focus,fieldset[disabled] .btn-link:hover{color:#999;text-decoration:none}.btn-lg{border-radius:6px}.btn-sm,.btn-xs{padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}.btn-xs{padding:1px 5px}.btn-block{width:100%;padding-right:0;padding-left:0}input[type=button].btn-block,input[type=reset].btn-block,input[type=submit].btn-block{width:100%}.fade{opacity:0;-webkit-transition:opacity .15s linear;transition:opacity .15s linear}.fade.in{opacity:1}.collapse{display:none}.collapse.in{display:block}.breadcrumb>li,.btn-group,.btn-group-vertical,.caret,.glyphicon,.pagination{display:inline-block}.collapsing{position:relative;height:0;-webkit-transition:height .35s ease;transition:height .35s ease}@font-face{font-family:'Glyphicons Halflings';src:url(../fonts/glyphicons-halflings-regular.eot);src:url(../fonts/glyphicons-halflings-regular.eot?#iefix) format('embedded-opentype'),url(../fonts/glyphicons-halflings-regular.woff) format('woff'),url(../fonts/glyphicons-halflings-regular.ttf) format('truetype'),url(../fonts/glyphicons-halflings-regular.svg#glyphicons-halflingsregular) format('svg')}.glyphicon{position:relative;top:1px;font-family:'Glyphicons Halflings';-webkit-font-smoothing:antialiased;font-style:normal;font-weight:400;line-height:1}.glyphicon-asterisk:before{content:"\2a"}.glyphicon-plus:before{content:"\2b"}.glyphicon-euro:before{content:"\20ac"}.glyphicon-minus:before{content:"\2212"}.glyphicon-cloud:before{content:"\2601"}.glyphicon-envelope:before{content:"\2709"}.glyphicon-pencil:before{content:"\270f"}.glyphicon-glass:before{content:"\e001"}.glyphicon-music:before{content:"\e002"}.glyphicon-search:before{content:"\e003"}.glyphicon-heart:before{content:"\e005"}.glyphicon-star:before{content:"\e006"}.glyphicon-star-empty:before{content:"\e007"}.glyphicon-user:before{content:"\e008"}.glyphicon-film:before{content:"\e009"}.glyphicon-th-large:before{content:"\e010"}.glyphicon-th:before{content:"\e011"}.glyphicon-th-list:before{content:"\e012"}.glyphicon-ok:before{content:"\e013"}.glyphicon-remove:before{content:"\e014"}.glyphicon-zoom-in:before{content:"\e015"}.glyphicon-zoom-out:before{content:"\e016"}.glyphicon-off:before{content:"\e017"}.glyphicon-signal:before{content:"\e018"}.glyphicon-cog:before{content:"\e019"}.glyphicon-trash:before{content:"\e020"}.glyphicon-home:before{content:"\e021"}.glyphicon-file:before{content:"\e022"}.glyphicon-time:before{content:"\e023"}.glyphicon-road:before{content:"\e024"}.glyphicon-download-alt:before{content:"\e025"}.glyphicon-download:before{content:"\e026"}.glyphicon-upload:before{content:"\e027"}.glyphicon-inbox:before{content:"\e028"}.glyphicon-play-circle:before{content:"\e029"}.glyphicon-repeat:before{content:"\e030"}.glyphicon-refresh:before{content:"\e031"}.glyphicon-list-alt:before{content:"\e032"}.glyphicon-flag:before{content:"\e034"}.glyphicon-headphones:before{content:"\e035"}.glyphicon-volume-off:before{content:"\e036"}.glyphicon-volume-down:before{content:"\e037"}.glyphicon-volume-up:before{content:"\e038"}.glyphicon-qrcode:before{content:"\e039"}.glyphicon-barcode:before{content:"\e040"}.glyphicon-tag:before{content:"\e041"}.glyphicon-tags:before{content:"\e042"}.glyphicon-book:before{content:"\e043"}.glyphicon-print:before{content:"\e045"}.glyphicon-font:before{content:"\e047"}.glyphicon-bold:before{content:"\e048"}.glyphicon-italic:before{content:"\e049"}.glyphicon-text-height:before{content:"\e050"}.glyphicon-text-width:before{content:"\e051"}.glyphicon-align-left:before{content:"\e052"}.glyphicon-align-center:before{content:"\e053"}.glyphicon-align-right:before{content:"\e054"}.glyphicon-align-justify:before{content:"\e055"}.glyphicon-list:before{content:"\e056"}.glyphicon-indent-left:before{content:"\e057"}.glyphicon-indent-right:before{content:"\e058"}.glyphicon-facetime-video:before{content:"\e059"}.glyphicon-picture:before{content:"\e060"}.glyphicon-map-marker:before{content:"\e062"}.glyphicon-adjust:before{content:"\e063"}.glyphicon-tint:before{content:"\e064"}.glyphicon-edit:before{content:"\e065"}.glyphicon-share:before{content:"\e066"}.glyphicon-check:before{content:"\e067"}.glyphicon-move:before{content:"\e068"}.glyphicon-step-backward:before{content:"\e069"}.glyphicon-fast-backward:before{content:"\e070"}.glyphicon-backward:before{content:"\e071"}.glyphicon-play:before{content:"\e072"}.glyphicon-pause:before{content:"\e073"}.glyphicon-stop:before{content:"\e074"}.glyphicon-forward:before{content:"\e075"}.glyphicon-fast-forward:before{content:"\e076"}.glyphicon-step-forward:before{content:"\e077"}.glyphicon-eject:before{content:"\e078"}.glyphicon-chevron-left:before{content:"\e079"}.glyphicon-chevron-right:before{content:"\e080"}.glyphicon-plus-sign:before{content:"\e081"}.glyphicon-minus-sign:before{content:"\e082"}.glyphicon-remove-sign:before{content:"\e083"}.glyphicon-ok-sign:before{content:"\e084"}.glyphicon-question-sign:before{content:"\e085"}.glyphicon-info-sign:before{content:"\e086"}.glyphicon-screenshot:before{content:"\e087"}.glyphicon-remove-circle:before{content:"\e088"}.glyphicon-ok-circle:before{content:"\e089"}.glyphicon-ban-circle:before{content:"\e090"}.glyphicon-arrow-left:before{content:"\e091"}.glyphicon-arrow-right:before{content:"\e092"}.glyphicon-arrow-up:before{content:"\e093"}.glyphicon-arrow-down:before{content:"\e094"}.glyphicon-share-alt:before{content:"\e095"}.glyphicon-resize-full:before{content:"\e096"}.glyphicon-resize-small:before{content:"\e097"}.glyphicon-exclamation-sign:before{content:"\e101"}.glyphicon-gift:before{content:"\e102"}.glyphicon-leaf:before{content:"\e103"}.glyphicon-eye-open:before{content:"\e105"}.glyphicon-eye-close:before{content:"\e106"}.glyphicon-warning-sign:before{content:"\e107"}.glyphicon-plane:before{content:"\e108"}.glyphicon-random:before{content:"\e110"}.glyphicon-comment:before{content:"\e111"}.glyphicon-magnet:before{content:"\e112"}.glyphicon-chevron-up:before{content:"\e113"}.glyphicon-chevron-down:before{content:"\e114"}.glyphicon-retweet:before{content:"\e115"}.glyphicon-shopping-cart:before{content:"\e116"}.glyphicon-folder-close:before{content:"\e117"}.glyphicon-folder-open:before{content:"\e118"}.glyphicon-resize-vertical:before{content:"\e119"}.glyphicon-resize-horizontal:before{content:"\e120"}.glyphicon-hdd:before{content:"\e121"}.glyphicon-bullhorn:before{content:"\e122"}.glyphicon-certificate:before{content:"\e124"}.glyphicon-thumbs-up:before{content:"\e125"}.glyphicon-thumbs-down:before{content:"\e126"}.glyphicon-hand-right:before{content:"\e127"}.glyphicon-hand-left:before{content:"\e128"}.glyphicon-hand-up:before{content:"\e129"}.glyphicon-hand-down:before{content:"\e130"}.glyphicon-circle-arrow-right:before{content:"\e131"}.glyphicon-circle-arrow-left:before{content:"\e132"}.glyphicon-circle-arrow-up:before{content:"\e133"}.glyphicon-circle-arrow-down:before{content:"\e134"}.glyphicon-globe:before{content:"\e135"}.glyphicon-tasks:before{content:"\e137"}.glyphicon-filter:before{content:"\e138"}.glyphicon-fullscreen:before{content:"\e140"}.glyphicon-dashboard:before{content:"\e141"}.glyphicon-heart-empty:before{content:"\e143"}.glyphicon-link:before{content:"\e144"}.glyphicon-phone:before{content:"\e145"}.glyphicon-usd:before{content:"\e148"}.glyphicon-gbp:before{content:"\e149"}.glyphicon-sort:before{content:"\e150"}.glyphicon-sort-by-alphabet:before{content:"\e151"}.glyphicon-sort-by-alphabet-alt:before{content:"\e152"}.glyphicon-sort-by-order:before{content:"\e153"}.glyphicon-sort-by-order-alt:before{content:"\e154"}.glyphicon-sort-by-attributes:before{content:"\e155"}.glyphicon-sort-by-attributes-alt:before{content:"\e156"}.glyphicon-unchecked:before{content:"\e157"}.glyphicon-expand:before{content:"\e158"}.glyphicon-collapse-down:before{content:"\e159"}.glyphicon-collapse-up:before{content:"\e160"}.glyphicon-log-in:before{content:"\e161"}.glyphicon-flash:before{content:"\e162"}.glyphicon-log-out:before{content:"\e163"}.glyphicon-new-window:before{content:"\e164"}.glyphicon-record:before{content:"\e165"}.glyphicon-save:before{content:"\e166"}.glyphicon-open:before{content:"\e167"}.glyphicon-saved:before{content:"\e168"}.glyphicon-import:before{content:"\e169"}.glyphicon-export:before{content:"\e170"}.glyphicon-send:before{content:"\e171"}.glyphicon-floppy-disk:before{content:"\e172"}.glyphicon-floppy-saved:before{content:"\e173"}.glyphicon-floppy-remove:before{content:"\e174"}.glyphicon-floppy-save:before{content:"\e175"}.glyphicon-floppy-open:before{content:"\e176"}.glyphicon-credit-card:before{content:"\e177"}.glyphicon-transfer:before{content:"\e178"}.glyphicon-cutlery:before{content:"\e179"}.glyphicon-header:before{content:"\e180"}.glyphicon-compressed:before{content:"\e181"}.glyphicon-earphone:before{content:"\e182"}.glyphicon-phone-alt:before{content:"\e183"}.glyphicon-tower:before{content:"\e184"}.glyphicon-stats:before{content:"\e185"}.glyphicon-sd-video:before{content:"\e186"}.glyphicon-hd-video:before{content:"\e187"}.glyphicon-subtitles:before{content:"\e188"}.glyphicon-sound-stereo:before{content:"\e189"}.glyphicon-sound-dolby:before{content:"\e190"}.glyphicon-sound-5-1:before{content:"\e191"}.glyphicon-sound-6-1:before{content:"\e192"}.glyphicon-sound-7-1:before{content:"\e193"}.glyphicon-copyright-mark:before{content:"\e194"}.glyphicon-registration-mark:before{content:"\e195"}.glyphicon-cloud-download:before{content:"\e197"}.glyphicon-cloud-upload:before{content:"\e198"}.glyphicon-tree-conifer:before{content:"\e199"}.glyphicon-tree-deciduous:before{content:"\e200"}.glyphicon-briefcase:before{content:"\1f4bc"}.glyphicon-calendar:before{content:"\1f4c5"}.glyphicon-pushpin:before{content:"\1f4cc"}.glyphicon-paperclip:before{content:"\1f4ce"}.glyphicon-camera:before{content:"\1f4f7"}.glyphicon-lock:before{content:"\1f512"}.glyphicon-bell:before{content:"\1f514"}.glyphicon-bookmark:before{content:"\1f516"}.glyphicon-fire:before{content:"\1f525"}.glyphicon-wrench:before{content:"\1f527"}.caret{width:0;height:0;vertical-align:middle;border-top:4px solid #000;border-right:4px solid transparent;border-bottom:0 dotted;border-left:4px solid transparent;content:""}.dropdown{position:relative}.dropdown-toggle:focus{outline:0}.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;font-size:14px;list-style:none;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.15);border-radius:4px;-webkit-box-shadow:0 6px 12px rgba(0,0,0,.175);box-shadow:0 6px 12px rgba(0,0,0,.175);background-clip:padding-box}.dropdown-header,.dropdown-menu>li>a{display:block;padding:3px 20px;line-height:1.42857143}.btn-group>.btn-group:not(:first-child):not(:last-child)>.btn,.btn-group>.btn:not(:first-child):not(:last-child):not(.dropdown-toggle){border-radius:0}.btn-group>.btn-group:first-child>.btn:last-child,.btn-group>.btn-group:first-child>.dropdown-toggle,.btn-group>.btn:first-child:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.dropdown-menu.pull-right{right:0;left:auto}.dropdown-menu .divider{height:1px;margin:9px 0;background-color:#e5e5e5}.dropdown-menu>li>a{font-weight:400;color:#333;white-space:nowrap}.dropdown-menu>li>a:focus,.dropdown-menu>li>a:hover{color:#fff;text-decoration:none;background-color:#428bca}.dropdown-menu>.active>a,.dropdown-menu>.active>a:focus,.dropdown-menu>.active>a:hover{color:#fff;text-decoration:none;background-color:#428bca;outline:0}.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{color:#999}.dropdown-menu>.disabled>a:focus,.dropdown-menu>.disabled>a:hover{text-decoration:none;cursor:not-allowed;background-color:transparent;filter:progid:DXImageTransform.Microsoft.gradient(enabled=false)}.open>.dropdown-menu{display:block}.open>a{outline:0}.dropdown-header{font-size:12px;color:#999}.dropdown-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:990}.navbar-nav.pull-right>li>.dropdown-menu,.navbar-nav>li>.dropdown-menu.pull-right,.pull-right>.dropdown-menu{right:0;left:auto}.btn-group-vertical>.btn.active,.btn-group-vertical>.btn:active,.btn-group-vertical>.btn:focus,.btn-group-vertical>.btn:hover,.btn-group>.btn.active,.btn-group>.btn:active,.btn-group>.btn:focus,.btn-group>.btn:hover,.input-group-btn>.btn:active,.input-group-btn>.btn:hover{z-index:2}.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0 dotted;border-bottom:4px solid #000;content:""}.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px}.btn-default .caret{border-top-color:#333}.btn-danger .caret,.btn-info .caret,.btn-primary .caret,.btn-success .caret,.btn-warning .caret{border-top-color:#fff}.dropup .btn-default .caret{border-bottom-color:#333}.dropup .btn-danger .caret,.dropup .btn-info .caret,.dropup .btn-primary .caret,.dropup .btn-success .caret,.dropup .btn-warning .caret{border-bottom-color:#fff}.btn-group,.btn-group-vertical{position:relative;vertical-align:middle}.btn-group-vertical>.btn,.btn-group>.btn{position:relative;float:left}.btn-group-vertical>.btn:focus,.btn-group>.btn:focus{outline:0}.btn-group .btn+.btn,.btn-group .btn+.btn-group,.btn-group .btn-group+.btn,.btn-group .btn-group+.btn-group{margin-left:-1px}.btn-toolbar:after,.btn-toolbar:before{display:table;content:" "}.btn-toolbar .btn-group{float:left}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn+.btn-group,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn-group+.btn-group{margin-left:5px}.btn-group>.btn:first-child{margin-left:0}.btn-group>.btn:last-child:not(:first-child),.btn-group>.dropdown-toggle:not(:first-child){border-bottom-left-radius:0;border-top-left-radius:0}.btn-group>.btn-group{float:left}.btn-group>.btn-group:last-child>.btn:first-child{border-bottom-left-radius:0;border-top-left-radius:0}.btn-group-sm>.btn,.btn-group-xs>.btn{font-size:12px;line-height:1.5;border-radius:3px}.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0}.btn-group-xs>.btn{padding:1px 5px}.btn-group-sm>.btn{padding:5px 10px}.btn-group-lg>.btn{padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}.btn-group>.btn+.dropdown-toggle{padding-right:8px;padding-left:8px}.btn-group>.btn-lg+.dropdown-toggle{padding-right:12px;padding-left:12px}.btn-group.open .dropdown-toggle{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn .caret{margin-left:0}.btn-lg .caret{border-width:5px 5px 0}.dropup .btn-lg .caret{border-width:0 5px 5px}.btn-group-vertical>.btn,.btn-group-vertical>.btn-group{display:block;float:none;width:100%;max-width:100%}.btn-group-vertical>.btn-group:after,.btn-group-vertical>.btn-group:before{display:table;content:" "}.btn-group-vertical>.btn-group>.btn{float:none}.btn-group-vertical>.btn+.btn,.btn-group-vertical>.btn+.btn-group,.btn-group-vertical>.btn-group+.btn,.btn-group-vertical>.btn-group+.btn-group{margin-top:-1px;margin-left:0}.btn-group-vertical>.btn:not(:first-child):not(:last-child){border-radius:0}.btn-group-vertical>.btn:first-child:not(:last-child){border-top-right-radius:4px;border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn:last-child:not(:first-child){border-top-right-radius:0;border-bottom-left-radius:4px;border-top-left-radius:0}.btn-group-vertical>.btn-group:not(:first-child):not(:last-child)>.btn{border-radius:0}.btn-group-vertical>.btn-group:first-child>.btn:last-child,.btn-group-vertical>.btn-group:first-child>.dropdown-toggle{border-bottom-right-radius:0;border-bottom-left-radius:0}.btn-group-vertical>.btn-group:last-child>.btn:first-child{border-top-right-radius:0;border-top-left-radius:0}.btn-group-justified{display:table;width:100%;border-collapse:separate;table-layout:fixed}.btn-group-justified .btn{display:table-cell;float:none;width:1%}[data-toggle=buttons]>.btn>input[type=checkbox],[data-toggle=buttons]>.btn>input[type=radio]{display:none}.input-group{position:relative;display:table;border-collapse:separate}.input-group.col{float:none;padding-right:0;padding-left:0}.input-group .form-control{width:100%;margin-bottom:0}.input-group-lg>.form-control,.input-group-lg>.input-group-addon,.input-group-lg>.input-group-btn>.btn{height:45px;padding:10px 16px;font-size:18px;line-height:1.33;border-radius:6px}select.input-group-lg>.form-control,select.input-group-lg>.input-group-addon,select.input-group-lg>.input-group-btn>.btn{height:45px;line-height:45px}textarea.input-group-lg>.form-control,textarea.input-group-lg>.input-group-addon,textarea.input-group-lg>.input-group-btn>.btn{height:auto}.input-group-sm>.form-control,.input-group-sm>.input-group-addon,.input-group-sm>.input-group-btn>.btn{height:30px;padding:5px 10px;font-size:12px;line-height:1.5;border-radius:3px}select.input-group-sm>.form-control,select.input-group-sm>.input-group-addon,select.input-group-sm>.input-group-btn>.btn{height:30px;line-height:30px}textarea.input-group-sm>.form-control,textarea.input-group-sm>.input-group-addon,textarea.input-group-sm>.input-group-btn>.btn{height:auto}.input-group .form-control,.input-group-addon,.input-group-btn{display:table-cell}.input-group .form-control:not(:first-child):not(:last-child),.input-group-addon:not(:first-child):not(:last-child),.input-group-btn:not(:first-child):not(:last-child){border-radius:0}.input-group-addon,.input-group-btn{width:1%;white-space:nowrap;vertical-align:middle}.input-group-addon{padding:6px 12px;font-size:14px;font-weight:400;line-height:1;background-color:#eee;border:1px solid #ccc;border-radius:4px}.input-group-addon.input-sm{padding:5px 10px;font-size:12px;border-radius:3px}.input-group-addon.input-lg{padding:10px 16px;font-size:18px;border-radius:6px}.input-group-addon input[type=checkbox],.input-group-addon input[type=radio]{margin-top:0}.input-group .form-control:first-child,.input-group-addon:first-child,.input-group-btn:first-child>.btn,.input-group-btn:first-child>.dropdown-toggle,.input-group-btn:last-child>.btn:not(:last-child):not(.dropdown-toggle){border-top-right-radius:0;border-bottom-right-radius:0}.input-group-addon:first-child{border-right:0}.input-group .form-control:last-child,.input-group-addon:last-child,.input-group-btn:first-child>.btn:not(:first-child),.input-group-btn:last-child>.btn,.input-group-btn:last-child>.dropdown-toggle{border-bottom-left-radius:0;border-top-left-radius:0}.input-group-addon:last-child{border-left:0}.input-group-btn{position:relative;white-space:nowrap}.input-group-btn>.btn{position:relative}.input-group-btn>.btn+.btn{margin-left:-4px}.nav{padding-left:0;margin-bottom:0;list-style:none}.nav:after,.nav:before{display:table;content:" "}.nav>li,.nav>li>a{display:block;position:relative}.nav>li>a{padding:10px 15px}.nav>li>a:focus,.nav>li>a:hover{text-decoration:none;background-color:#eee}.nav>li.disabled>a{color:#999}.nav>li.disabled>a:focus,.nav>li.disabled>a:hover{color:#999;text-decoration:none;cursor:not-allowed;background-color:transparent}.nav .open>a,.nav .open>a:focus,.nav .open>a:hover{background-color:#eee;border-color:#428bca}.nav .nav-divider{height:1px;margin:9px 0;background-color:#e5e5e5}.nav>li>a>img{max-width:none}.nav-tabs{border-bottom:1px solid #ddd}.nav-tabs>li{float:left;margin-bottom:-1px}.nav-tabs>li>a{margin-right:2px;line-height:1.42857143;border:1px solid transparent;border-radius:4px 4px 0 0}.nav-tabs>li>a:hover{border-color:#eee #eee #ddd}.nav-tabs>li.active>a,.nav-tabs>li.active>a:focus,.nav-tabs>li.active>a:hover{color:#555;cursor:default;background-color:#fff;border:1px solid #ddd;border-bottom-color:transparent}.nav-tabs.nav-justified{width:100%;border-bottom:0}.nav-tabs.nav-justified>li{float:none}.nav-tabs.nav-justified>li>a{margin-right:0;border-bottom:1px solid #ddd}@media (min-width:768px){.navbar-right .dropdown-menu{right:0;left:auto}.nav-tabs.nav-justified>li{display:table-cell;width:1%}}.nav-tabs.nav-justified>.active>a{border-bottom-color:#fff}.nav-pills>li{float:left}.nav-justified>li,.nav-stacked>li{float:none}.nav-pills>li>a{border-radius:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{color:#fff;background-color:#428bca}.nav-stacked>li+li{margin-top:2px;margin-left:0}.nav-justified{width:100%}@media (min-width:768px){.nav-justified>li{display:table-cell;width:1%}}.nav-tabs-justified{border-bottom:0}.nav-tabs-justified>li>a{margin-right:0;border-bottom:1px solid #ddd}.nav-tabs-justified>.active>a{border-bottom-color:#fff}.tabbable:after,.tabbable:before{display:table;content:" "}.pill-content>.pill-pane,.tab-content>.tab-pane{display:none}.pill-content>.active,.tab-content>.active{display:block}.navbar-collapse:after,.navbar-collapse:before,.navbar-header:after,.navbar-header:before,.navbar:after,.navbar:before{display:table;content:" "}.nav .caret{border-top-color:#428bca;border-bottom-color:#428bca}.nav a:hover .caret{border-top-color:#2a6496;border-bottom-color:#2a6496}.nav-tabs .dropdown-menu{margin-top:-1px;border-top-right-radius:0;border-top-left-radius:0}.navbar{position:relative;z-index:1000;min-height:50px;margin-bottom:20px;border:1px solid transparent}.navbar-collapse{max-height:340px;padding-right:15px;padding-left:15px;overflow-x:visible;border-top:1px solid transparent;box-shadow:inset 0 1px 0 rgba(255,255,255,.1);-webkit-overflow-scrolling:touch}.navbar-collapse.in{overflow-y:auto}@media (min-width:768px){.navbar{border-radius:4px}.navbar-header{float:left}.navbar-collapse{width:auto;border-top:0;box-shadow:none}.navbar-collapse.collapse{display:block!important;height:auto!important;padding-bottom:0;overflow:visible!important}.navbar-collapse.in{overflow-y:visible}.navbar-collapse .navbar-nav.navbar-left:first-child{margin-left:-15px}.navbar-collapse .navbar-nav.navbar-right:last-child{margin-right:-15px}.navbar-collapse .navbar-text:last-child{margin-right:0}}.container>.navbar-collapse,.container>.navbar-header{margin-right:-15px;margin-left:-15px}.navbar-static-top{border-width:0 0 1px}.navbar-fixed-bottom,.navbar-fixed-top{position:fixed;right:0;left:0;border-width:0 0 1px}.navbar-fixed-top{top:0;z-index:1030}.navbar-fixed-bottom{bottom:0;margin-bottom:0}.navbar-brand{float:left;padding:15px;font-size:18px;line-height:20px}.navbar-brand:focus,.navbar-brand:hover{text-decoration:none}@media (min-width:768px){.container>.navbar-collapse,.container>.navbar-header{margin-right:0;margin-left:0}.navbar-fixed-bottom,.navbar-fixed-top,.navbar-static-top{border-radius:0}.navbar>.container .navbar-brand{margin-left:-15px}}.navbar-toggle{position:relative;float:right;padding:9px 10px;margin-top:8px;margin-right:15px;margin-bottom:8px;background-color:transparent;border:1px solid transparent;border-radius:4px}.navbar-toggle .icon-bar{display:block;width:22px;height:2px;border-radius:1px}.navbar-toggle .icon-bar+.icon-bar{margin-top:4px}.navbar-nav{margin:7.5px -15px}.navbar-nav>li>a{padding-top:10px;padding-bottom:10px;line-height:20px}@media (max-width:767px){.navbar-nav .open .dropdown-menu{position:static;float:none;width:auto;margin-top:0;background-color:transparent;border:0;box-shadow:none}.navbar-nav .open .dropdown-menu .dropdown-header,.navbar-nav .open .dropdown-menu>li>a{padding:5px 15px 5px 25px}.navbar-nav .open .dropdown-menu>li>a{line-height:20px}.navbar-nav .open .dropdown-menu>li>a:focus,.navbar-nav .open .dropdown-menu>li>a:hover{background-image:none}}@media (min-width:768px){.navbar-toggle{display:none}.navbar-nav{float:left;margin:0}.navbar-nav>li{float:left}.navbar-nav>li>a{padding-top:15px;padding-bottom:15px}.navbar-left{float:left!important}.navbar-right{float:right!important}}.navbar-form{padding:10px 15px;border-top:1px solid transparent;border-bottom:1px solid transparent;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1),0 1px 0 rgba(255,255,255,.1);margin:8px -15px}@media (min-width:768px){.navbar-form .form-group{display:inline-block;margin-bottom:0;vertical-align:middle}.navbar-form .form-control{display:inline-block}.navbar-form .checkbox,.navbar-form .radio{display:inline-block;padding-left:0;margin-top:0;margin-bottom:0}.navbar-form .checkbox input[type=checkbox],.navbar-form .radio input[type=radio]{float:none;margin-left:0}.navbar-form{width:auto;padding-top:0;padding-bottom:0;margin-right:0;margin-left:0;border:0;-webkit-box-shadow:none;box-shadow:none}}@media (max-width:767px){.navbar-form .form-group{margin-bottom:5px}}.navbar-nav>li>.dropdown-menu{margin-top:0;border-top-right-radius:0;border-top-left-radius:0}.navbar-fixed-bottom .navbar-nav>li>.dropdown-menu{border-bottom-right-radius:0;border-bottom-left-radius:0}.breadcrumb,.pagination,.progress{border-radius:4px}.navbar-btn{margin-top:8px;margin-bottom:8px}.navbar-text{float:left;margin-top:15px;margin-bottom:15px}@media (min-width:768px){.navbar-text{margin-right:15px;margin-left:15px}}.navbar-default{background-color:#f8f8f8;border-color:#e7e7e7}.navbar-default .navbar-brand{color:#777}.navbar-default .navbar-brand:focus,.navbar-default .navbar-brand:hover{color:#5e5e5e;background-color:transparent}.navbar-default .navbar-nav>li>a,.navbar-default .navbar-text{color:#777}.navbar-default .navbar-nav>li>a:focus,.navbar-default .navbar-nav>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav>.active>a,.navbar-default .navbar-nav>.active>a:focus,.navbar-default .navbar-nav>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.disabled>a,.navbar-default .navbar-nav>.disabled>a:focus,.navbar-default .navbar-nav>.disabled>a:hover{color:#ccc;background-color:transparent}.navbar-default .navbar-toggle{border-color:#ddd}.navbar-default .navbar-toggle:focus,.navbar-default .navbar-toggle:hover{background-color:#ddd}.navbar-default .navbar-toggle .icon-bar{background-color:#ccc}.navbar-default .navbar-collapse,.navbar-default .navbar-form{border-color:#e6e6e6}.navbar-default .navbar-nav>.dropdown>a:focus .caret,.navbar-default .navbar-nav>.dropdown>a:hover .caret{border-top-color:#333;border-bottom-color:#333}.navbar-default .navbar-nav>.open>a,.navbar-default .navbar-nav>.open>a:focus,.navbar-default .navbar-nav>.open>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav>.open>a .caret,.navbar-default .navbar-nav>.open>a:focus .caret,.navbar-default .navbar-nav>.open>a:hover .caret{border-top-color:#555;border-bottom-color:#555}.navbar-default .navbar-nav>.dropdown>a .caret{border-top-color:#777;border-bottom-color:#777}@media (max-width:767px){.navbar-default .navbar-nav .open .dropdown-menu>li>a{color:#777}.navbar-default .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>li>a:hover{color:#333;background-color:transparent}.navbar-default .navbar-nav .open .dropdown-menu>.active>a,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.active>a:hover{color:#555;background-color:#e7e7e7}.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-default .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#ccc;background-color:transparent}}.navbar-default .navbar-link{color:#777}.navbar-default .navbar-link:hover{color:#333}.navbar-inverse{background-color:#222;border-color:#080808}.navbar-inverse .navbar-brand{color:#999}.navbar-inverse .navbar-brand:focus,.navbar-inverse .navbar-brand:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>li>a,.navbar-inverse .navbar-text{color:#999}.navbar-inverse .navbar-nav>li>a:focus,.navbar-inverse .navbar-nav>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav>.active>a,.navbar-inverse .navbar-nav>.active>a:focus,.navbar-inverse .navbar-nav>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.disabled>a,.navbar-inverse .navbar-nav>.disabled>a:focus,.navbar-inverse .navbar-nav>.disabled>a:hover{color:#444;background-color:transparent}.navbar-inverse .navbar-toggle{border-color:#333}.navbar-inverse .navbar-toggle:focus,.navbar-inverse .navbar-toggle:hover{background-color:#333}.navbar-inverse .navbar-toggle .icon-bar{background-color:#fff}.navbar-inverse .navbar-collapse,.navbar-inverse .navbar-form{border-color:#101010}.navbar-inverse .navbar-nav>.open>a,.navbar-inverse .navbar-nav>.open>a:focus,.navbar-inverse .navbar-nav>.open>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav>.dropdown>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}.navbar-inverse .navbar-nav>.dropdown>a .caret{border-top-color:#999;border-bottom-color:#999}.navbar-inverse .navbar-nav>.open>a .caret,.navbar-inverse .navbar-nav>.open>a:focus .caret,.navbar-inverse .navbar-nav>.open>a:hover .caret{border-top-color:#fff;border-bottom-color:#fff}@media (max-width:767px){.navbar-inverse .navbar-nav .open .dropdown-menu>.dropdown-header{border-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a{color:#999}.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>li>a:hover{color:#fff;background-color:transparent}.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.active>a:hover{color:#fff;background-color:#080808}.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:focus,.navbar-inverse .navbar-nav .open .dropdown-menu>.disabled>a:hover{color:#444;background-color:transparent}}.navbar-inverse .navbar-link{color:#999}.navbar-inverse .navbar-link:hover{color:#fff}.breadcrumb{padding:8px 15px;margin-bottom:20px;list-style:none;background-color:#f5f5f5}.breadcrumb>li+li:before{padding:0 5px;color:#ccc;content:"/\00a0"}.breadcrumb>.active{color:#999}.pagination{padding-left:0;margin:20px 0}.pagination>li{display:inline}.pagination>li>a,.pagination>li>span{position:relative;float:left;padding:6px 12px;margin-left:-1px;line-height:1.42857143;text-decoration:none;background-color:#fff;border:1px solid #ddd}.close,.list-group-item>.badge,.pager .next>a,.pager .next>span{float:right}.badge,.label{line-height:1;white-space:nowrap;vertical-align:baseline;text-align:center}.pagination>li:first-child>a,.pagination>li:first-child>span{margin-left:0;border-bottom-left-radius:4px;border-top-left-radius:4px}.pagination>li:last-child>a,.pagination>li:last-child>span{border-top-right-radius:4px;border-bottom-right-radius:4px}.pagination>li>a:focus,.pagination>li>a:hover,.pagination>li>span:focus,.pagination>li>span:hover{background-color:#eee}.pagination>.active>a,.pagination>.active>a:focus,.pagination>.active>a:hover,.pagination>.active>span,.pagination>.active>span:focus,.pagination>.active>span:hover{z-index:2;color:#fff;cursor:default;background-color:#428bca;border-color:#428bca}.pagination>.disabled>a,.pagination>.disabled>a:focus,.pagination>.disabled>a:hover,.pagination>.disabled>span{color:#999;cursor:not-allowed;background-color:#fff;border-color:#ddd}.pagination-lg>li>a,.pagination-lg>li>span{padding:10px 16px;font-size:18px}.pagination-lg>li:first-child>a,.pagination-lg>li:first-child>span{border-bottom-left-radius:6px;border-top-left-radius:6px}.pagination-lg>li:last-child>a,.pagination-lg>li:last-child>span{border-top-right-radius:6px;border-bottom-right-radius:6px}.pagination-sm>li>a,.pagination-sm>li>span{padding:5px 10px;font-size:12px}.pagination-sm>li:first-child>a,.pagination-sm>li:first-child>span{border-bottom-left-radius:3px;border-top-left-radius:3px}.pagination-sm>li:last-child>a,.pagination-sm>li:last-child>span{border-top-right-radius:3px;border-bottom-right-radius:3px}.pager{padding-left:0;margin:20px 0;text-align:center;list-style:none}.pager:after,.pager:before{display:table;content:" "}.pager li{display:inline}.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;border-radius:15px}.pager li>a:focus,.pager li>a:hover{text-decoration:none;background-color:#eee}.pager .previous>a,.pager .previous>span{float:left}.pager .disabled>a,.pager .disabled>a:focus,.pager .disabled>a:hover,.pager .disabled>span{color:#999;cursor:not-allowed;background-color:#fff}.label{display:inline;padding:.2em .6em .3em;font-size:75%;color:#fff;border-radius:.25em}.badge,.progress-bar,.tooltip{font-size:12px}.label[href]:focus,.label[href]:hover{color:#fff;text-decoration:none;cursor:pointer}.label:empty{display:none}.label-default{background-color:#999}.label-default[href]:focus,.label-default[href]:hover{background-color:grey}.label-primary{background-color:#428bca}.label-primary[href]:focus,.label-primary[href]:hover{background-color:#3071a9}.label-success{background-color:#5cb85c}.label-success[href]:focus,.label-success[href]:hover{background-color:#449d44}.label-info{background-color:#5bc0de}.label-info[href]:focus,.label-info[href]:hover{background-color:#31b0d5}.label-warning{background-color:#f0ad4e}.label-warning[href]:focus,.label-warning[href]:hover{background-color:#ec971f}.label-danger{background-color:#d9534f}.label-danger[href]:focus,.label-danger[href]:hover{background-color:#c9302c}.badge{display:inline-block;min-width:10px;padding:3px 7px;color:#fff;background-color:#999;border-radius:10px}.badge:empty{display:none}a.badge:focus,a.badge:hover{color:#fff;text-decoration:none;cursor:pointer}.btn .badge{position:relative;top:-1px}.nav-pills>.active>a>.badge,a.list-group-item.active>.badge{color:#428bca;background-color:#fff}.nav-pills>li>a>.badge{margin-left:3px}.jumbotron{padding:30px;margin-bottom:30px;font-size:21px;font-weight:200;line-height:2.14285714;color:inherit;background-color:#eee}.alert,.progress{margin-bottom:20px}.alert .alert-link,.close{font-weight:700}.jumbotron h1{line-height:1;color:inherit}.jumbotron p{line-height:1.4}.container .jumbotron{border-radius:6px}@media screen and (min-width:768px){.jumbotron{padding-top:48px;padding-bottom:48px}.container .jumbotron{padding-right:60px;padding-left:60px}.jumbotron h1{font-size:63px}}.thumbnail{display:inline-block;display:block;height:auto;max-width:100%;padding:4px;line-height:1.42857143;background-color:#fff;border:1px solid #ddd;border-radius:4px;-webkit-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.thumbnail>img{display:block;height:auto;max-width:100%;margin-right:auto;margin-left:auto}a.thumbnail:focus,a.thumbnail:hover{border-color:#428bca}.thumbnail .caption{padding:9px;color:#333}.alert,.panel-body{padding:15px}.alert{border:1px solid transparent;border-radius:4px}.alert h4{margin-top:0;color:inherit}.alert>p,.alert>ul{margin-bottom:0}.alert>p+p{margin-top:5px}.alert-dismissable{padding-right:35px}.alert-dismissable .close{position:relative;top:-2px;right:-21px;color:inherit}.alert-success{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.alert-success hr{border-top-color:#c9e2b3}.alert-success .alert-link{color:#356635}.alert-info{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.alert-info hr{border-top-color:#a6e1ec}.alert-info .alert-link{color:#2d6987}.alert-warning{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.alert-warning hr{border-top-color:#f8e5be}.alert-warning .alert-link{color:#a47e3c}.alert-danger{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.alert-danger hr{border-top-color:#e6c1c7}.alert-danger .alert-link{color:#953b39}@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}@-o-keyframes progress-bar-stripes{from{background-position:0 0}to{background-position:40px 0}}@keyframes progress-bar-stripes{from{background-position:40px 0}to{background-position:0 0}}.progress{height:20px;overflow:hidden;background-color:#f5f5f5;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1);box-shadow:inset 0 1px 2px rgba(0,0,0,.1)}.progress-bar{float:left;width:0;height:100%;color:#fff;text-align:center;background-color:#428bca;-webkit-box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 0 -1px 0 rgba(0,0,0,.15);-webkit-transition:width .6s ease;transition:width .6s ease}.progress-striped .progress-bar{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,.15)),color-stop(.75,rgba(255,255,255,.15)),color-stop(.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:40px 40px}.progress.active .progress-bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite}.progress-bar-success{background-color:#5cb85c}.progress-striped .progress-bar-success{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,.15)),color-stop(.75,rgba(255,255,255,.15)),color-stop(.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,.15)),color-stop(.75,rgba(255,255,255,.15)),color-stop(.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-info{background-color:#5bc0de}.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning{background-color:#f0ad4e}.progress-striped .progress-bar-warning{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger{background-color:#d9534f}.progress-striped .progress-bar-danger{background-image:-webkit-gradient(linear,0 100%,100% 0,color-stop(.25,rgba(255,255,255,.15)),color-stop(.25,transparent),color-stop(.5,transparent),color-stop(.5,rgba(255,255,255,.15)),color-stop(.75,rgba(255,255,255,.15)),color-stop(.75,transparent),to(transparent));background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-moz-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.media,.media-body{overflow:hidden;zoom:1}.media,.media .media{margin-top:15px}.media:first-child{margin-top:0}.media-object{display:block}.media-heading{margin:0 0 5px}.media>.pull-left{margin-right:10px}.media>.pull-right{margin-left:10px}.media-list{padding-left:0;list-style:none}.list-group{padding-left:0;margin-bottom:20px}.list-group-item{position:relative;display:block;padding:10px 15px;margin-bottom:-1px;background-color:#fff;border:1px solid #ddd}.modal,.modal-backdrop{position:fixed;top:0;right:0;left:0}.list-group-item:first-child{border-top-right-radius:4px;border-top-left-radius:4px}.list-group-item:last-child{margin-bottom:0;border-bottom-right-radius:4px;border-bottom-left-radius:4px}.list-group-item>.badge+.badge{margin-right:5px}a.list-group-item{color:#555}a.list-group-item .list-group-item-heading{color:#333}a.list-group-item:focus,a.list-group-item:hover{text-decoration:none;background-color:#f5f5f5}.list-group-item.active,.list-group-item.active:focus,.list-group-item.active:hover{z-index:2;color:#fff;background-color:#428bca;border-color:#428bca}.list-group-item.active .list-group-item-heading,.list-group-item.active:focus .list-group-item-heading,.list-group-item.active:hover .list-group-item-heading{color:inherit}.list-group-item.active .list-group-item-text,.list-group-item.active:focus .list-group-item-text,.list-group-item.active:hover .list-group-item-text{color:#e1edf7}.list-group-item-heading{margin-top:0;margin-bottom:5px}.list-group-item-text{margin-bottom:0;line-height:1.3}.panel{margin-bottom:20px;background-color:#fff;border:1px solid transparent;border-radius:4px;-webkit-box-shadow:0 1px 1px rgba(0,0,0,.05);box-shadow:0 1px 1px rgba(0,0,0,.05)}.panel-group .panel,.panel-title,.panel>.list-group,.panel>.table{margin-bottom:0}.panel-body:after,.panel-body:before{display:table;content:" "}.panel>.list-group .list-group-item{border-width:1px 0}.panel>.list-group .list-group-item:first-child{border-top-right-radius:0;border-top-left-radius:0}.panel>.list-group .list-group-item:last-child{border-bottom:0}.panel-heading+.list-group .list-group-item:first-child{border-top-width:0}.panel-footer,.panel-group .panel-heading+.panel-collapse .panel-body,.panel>.panel-body+.table{border-top:1px solid #ddd}.panel-heading{padding:10px 15px;border-bottom:1px solid transparent;border-top-right-radius:3px;border-top-left-radius:3px}.panel-title{margin-top:0;font-size:16px}.panel-title>a{color:inherit}.panel-footer{padding:10px 15px;background-color:#f5f5f5;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.panel-group .panel{overflow:hidden;border-radius:4px}.panel-group .panel+.panel{margin-top:5px}.panel-group .panel-heading{border-bottom:0}.panel-group .panel-footer{border-top:0}.panel-group .panel-footer+.panel-collapse .panel-body{border-bottom:1px solid #ddd}.panel-default{border-color:#ddd}.panel-default>.panel-heading{color:#333;background-color:#f5f5f5;border-color:#ddd}.panel-default>.panel-heading+.panel-collapse .panel-body{border-top-color:#ddd}.panel-default>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#ddd}.panel-primary{border-color:#428bca}.panel-primary>.panel-heading{color:#fff;background-color:#428bca;border-color:#428bca}.panel-primary>.panel-heading+.panel-collapse .panel-body{border-top-color:#428bca}.panel-primary>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#428bca}.panel-success{border-color:#d6e9c6}.panel-success>.panel-heading{color:#468847;background-color:#dff0d8;border-color:#d6e9c6}.panel-success>.panel-heading+.panel-collapse .panel-body{border-top-color:#d6e9c6}.panel-success>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#d6e9c6}.panel-warning{border-color:#fbeed5}.panel-warning>.panel-heading{color:#c09853;background-color:#fcf8e3;border-color:#fbeed5}.panel-warning>.panel-heading+.panel-collapse .panel-body{border-top-color:#fbeed5}.panel-warning>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#fbeed5}.panel-danger{border-color:#eed3d7}.panel-danger>.panel-heading{color:#b94a48;background-color:#f2dede;border-color:#eed3d7}.panel-danger>.panel-heading+.panel-collapse .panel-body{border-top-color:#eed3d7}.panel-danger>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#eed3d7}.panel-info{border-color:#bce8f1}.panel-info>.panel-heading{color:#3a87ad;background-color:#d9edf7;border-color:#bce8f1}.panel-info>.panel-heading+.panel-collapse .panel-body{border-top-color:#bce8f1}.panel-info>.panel-footer+.panel-collapse .panel-body{border-bottom-color:#bce8f1}.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.05);box-shadow:inset 0 1px 1px rgba(0,0,0,.05)}.well blockquote{border-color:#ddd;border-color:rgba(0,0,0,.15)}.well-lg{padding:24px;border-radius:6px}.well-sm{padding:9px;border-radius:3px}.close{font-size:21px;line-height:1;color:#000;text-shadow:0 1px 0 #fff;opacity:.2;filter:alpha(opacity=20)}.close:focus,.close:hover{color:#000;text-decoration:none;cursor:pointer;opacity:.5;filter:alpha(opacity=50)}button.close{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.modal-content,.popover{background-clip:padding-box}.modal-open{overflow:hidden}.modal-open .navbar-fixed-bottom,.modal-open .navbar-fixed-top,body.modal-open{margin-right:15px}.modal{bottom:0;z-index:1040;display:none;overflow:auto;overflow-y:scroll}.modal.fade .modal-dialog{-webkit-transform:translate(0,-25%);-ms-transform:translate(0,-25%);transform:translate(0,-25%);-webkit-transition:-webkit-transform .3s ease-out;-moz-transition:-moz-transform .3s ease-out;-o-transition:-o-transform .3s ease-out;transition:transform .3s ease-out}.modal.in .modal-dialog{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.modal-dialog{z-index:1050;width:auto;padding:10px;margin-right:auto;margin-left:auto}.modal-content{position:relative;background-color:#fff;border:1px solid #999;border:1px solid rgba(0,0,0,.2);border-radius:6px;outline:0;-webkit-box-shadow:0 3px 9px rgba(0,0,0,.5);box-shadow:0 3px 9px rgba(0,0,0,.5)}.modal-backdrop{bottom:0;z-index:1030;background-color:#000}.modal-backdrop.fade{opacity:0;filter:alpha(opacity=0)}.carousel-control,.modal-backdrop.in{opacity:.5;filter:alpha(opacity=50)}.modal-header{min-height:16.43px;padding:15px;border-bottom:1px solid #e5e5e5}.modal-header .close{margin-top:-2px}.modal-title{margin:0;line-height:1.42857143}.modal-body{position:relative;padding:20px}.modal-footer{padding:19px 20px 20px;margin-top:15px;border-top:1px solid #e5e5e5}.modal-footer:after,.modal-footer:before{display:table;content:" "}.modal-footer .btn+.btn{margin-bottom:0;margin-left:5px}.modal-footer .btn-group .btn+.btn{margin-left:-1px}.modal-footer .btn-block+.btn-block{margin-left:0}@media screen and (min-width:768px){.modal-dialog{right:auto;left:50%;width:600px;padding-top:30px;padding-bottom:30px}.modal-content{-webkit-box-shadow:0 5px 15px rgba(0,0,0,.5);box-shadow:0 5px 15px rgba(0,0,0,.5)}}.tooltip{position:absolute;z-index:1030;display:block;line-height:1.4;opacity:0;filter:alpha(opacity=0);visibility:visible}.tooltip.in{opacity:.9;filter:alpha(opacity=90)}.tooltip.top{padding:5px 0;margin-top:-3px}.tooltip.right{padding:0 5px;margin-left:3px}.tooltip.bottom{padding:5px 0;margin-top:3px}.tooltip.left{padding:0 5px;margin-left:-3px}.tooltip-inner{max-width:200px;padding:3px 8px;color:#fff;text-align:center;text-decoration:none;background-color:#000;border-radius:4px}.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid}.tooltip.top .tooltip-arrow,.tooltip.top-left .tooltip-arrow,.tooltip.top-right .tooltip-arrow{bottom:0;border-top-color:#000;border-width:5px 5px 0}.tooltip.top .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.top-left .tooltip-arrow{left:5px}.tooltip.top-right .tooltip-arrow{right:5px}.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-right-color:#000;border-width:5px 5px 5px 0}.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-left-color:#000;border-width:5px 0 5px 5px}.tooltip.bottom .tooltip-arrow,.tooltip.bottom-left .tooltip-arrow,.tooltip.bottom-right .tooltip-arrow{border-bottom-color:#000;border-width:0 5px 5px;top:0}.tooltip.bottom .tooltip-arrow{left:50%;margin-left:-5px}.tooltip.bottom-left .tooltip-arrow{left:5px}.tooltip.bottom-right .tooltip-arrow{right:5px}.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;white-space:normal;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0,0,0,.2);border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0,0,0,.2);box-shadow:0 5px 10px rgba(0,0,0,.2)}.popover.top{margin-top:-10px}.popover.right{margin-left:10px}.popover.bottom{margin-top:10px}.popover.left{margin-left:-10px}.popover-title{padding:8px 14px;margin:0;font-size:14px;font-weight:400;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;border-radius:5px 5px 0 0}.popover-content{padding:9px 14px}.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid}.popover .arrow{border-width:11px}.popover .arrow:after{border-width:10px;content:""}.popover.top .arrow{bottom:-11px;left:50%;margin-left:-11px;border-top-color:#999;border-top-color:rgba(0,0,0,.25);border-bottom-width:0}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-top-color:#fff;border-bottom-width:0;content:" "}.popover.left .arrow:after,.popover.right .arrow:after{bottom:-10px;content:" "}.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-right-color:#999;border-right-color:rgba(0,0,0,.25);border-left-width:0}.popover.right .arrow:after{left:1px;border-right-color:#fff;border-left-width:0}.popover.bottom .arrow{top:-11px;left:50%;margin-left:-11px;border-bottom-color:#999;border-bottom-color:rgba(0,0,0,.25);border-top-width:0}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-bottom-color:#fff;border-top-width:0;content:" "}.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-left-color:#999;border-left-color:rgba(0,0,0,.25);border-right-width:0}.popover.left .arrow:after{right:1px;border-left-color:#fff;border-right-width:0}.carousel{position:relative}.carousel-inner{position:relative;width:100%;overflow:hidden}.carousel-inner>.item{position:relative;display:none;-webkit-transition:.6s ease-in-out left;transition:.6s ease-in-out left}.carousel-inner>.item>a>img,.carousel-inner>.item>img{display:block;height:auto;max-width:100%;line-height:1}.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block}.carousel-inner>.active{left:0}.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%}.carousel-inner>.next{left:100%}.carousel-inner>.prev{left:-100%}.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0}.carousel-inner>.active.left{left:-100%}.carousel-inner>.active.right{left:100%}.carousel-control{position:absolute;top:0;bottom:0;left:0;width:15%;font-size:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-control.left{background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,.5)),to(rgba(0,0,0,.0001)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.5) 0),color-stop(rgba(0,0,0,.0001) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.5) 0,rgba(0,0,0,.0001) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1)}.carousel-control.right{right:0;left:auto;background-image:-webkit-gradient(linear,0 top,100% top,from(rgba(0,0,0,.0001)),to(rgba(0,0,0,.5)));background-image:-webkit-linear-gradient(left,color-stop(rgba(0,0,0,.0001) 0),color-stop(rgba(0,0,0,.5) 100%));background-image:-moz-linear-gradient(left,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-image:linear-gradient(to right,rgba(0,0,0,.0001) 0,rgba(0,0,0,.5) 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1)}.carousel-control:focus,.carousel-control:hover{color:#fff;text-decoration:none;opacity:.9;filter:alpha(opacity=90)}.carousel-control .glyphicon-chevron-left,.carousel-control .glyphicon-chevron-right,.carousel-control .icon-next,.carousel-control .icon-prev{position:absolute;top:50%;left:50%;z-index:5;display:inline-block}.carousel-control .icon-next,.carousel-control .icon-prev{width:20px;height:20px;margin-top:-10px;margin-left:-10px;font-family:serif}.carousel-control .icon-prev:before{content:'\2039'}.carousel-control .icon-next:before{content:'\203a'}.carousel-indicators{position:absolute;bottom:10px;left:50%;z-index:15;width:60%;padding-left:0;margin-left:-30%;text-align:center;list-style:none}.carousel-indicators li{display:inline-block;width:10px;height:10px;margin:1px;text-indent:-999px;cursor:pointer;border:1px solid #fff;border-radius:10px}.carousel-indicators .active{width:12px;height:12px;margin:0;background-color:#fff}.carousel-caption{position:absolute;right:15%;bottom:20px;left:15%;z-index:10;padding-top:20px;padding-bottom:20px;color:#fff;text-align:center;text-shadow:0 1px 2px rgba(0,0,0,.6)}.carousel-caption .btn,.text-hide{text-shadow:none}@media screen and (min-width:768px){.carousel-control .icon-next,.carousel-control .icon-prev{width:30px;height:30px;margin-top:-15px;margin-left:-15px;font-size:30px}.carousel-caption{right:20%;left:20%;padding-bottom:30px}.carousel-indicators{bottom:20px}}.clearfix:after,.clearfix:before{display:table;content:" "}.pull-right{float:right!important}.pull-left{float:left!important}.hide{display:none!important}.show{display:block!important}.hidden,.visible-xs,td.visible-xs,th.visible-xs,tr.visible-xs{display:none!important}.invisible{visibility:hidden}.text-hide{font:0/0 a;color:transparent;background-color:transparent;border:0}.affix{position:fixed}@-ms-viewport{width:device-width}@media screen and (max-width:400px){@-ms-viewport{width:320px}}.hidden{visibility:hidden!important}@media (max-width:767px){.visible-xs{display:block!important}tr.visible-xs{display:table-row!important}td.visible-xs,th.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-xs.visible-sm{display:block!important}tr.visible-xs.visible-sm{display:table-row!important}td.visible-xs.visible-sm,th.visible-xs.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-xs.visible-md{display:block!important}tr.visible-xs.visible-md{display:table-row!important}td.visible-xs.visible-md,th.visible-xs.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-xs.visible-lg{display:block!important}tr.visible-xs.visible-lg{display:table-row!important}td.visible-xs.visible-lg,th.visible-xs.visible-lg{display:table-cell!important}}.visible-sm,td.visible-sm,th.visible-sm,tr.visible-sm{display:none!important}@media (max-width:767px){.visible-sm.visible-xs{display:block!important}tr.visible-sm.visible-xs{display:table-row!important}td.visible-sm.visible-xs,th.visible-sm.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-sm{display:block!important}tr.visible-sm{display:table-row!important}td.visible-sm,th.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-sm.visible-md{display:block!important}tr.visible-sm.visible-md{display:table-row!important}td.visible-sm.visible-md,th.visible-sm.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-sm.visible-lg{display:block!important}tr.visible-sm.visible-lg{display:table-row!important}td.visible-sm.visible-lg,th.visible-sm.visible-lg{display:table-cell!important}}.visible-md,td.visible-md,th.visible-md,tr.visible-md{display:none!important}@media (max-width:767px){.visible-md.visible-xs{display:block!important}tr.visible-md.visible-xs{display:table-row!important}td.visible-md.visible-xs,th.visible-md.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-md.visible-sm{display:block!important}tr.visible-md.visible-sm{display:table-row!important}td.visible-md.visible-sm,th.visible-md.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-md{display:block!important}tr.visible-md{display:table-row!important}td.visible-md,th.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-md.visible-lg{display:block!important}tr.visible-md.visible-lg{display:table-row!important}td.visible-md.visible-lg,th.visible-md.visible-lg{display:table-cell!important}}.visible-lg,td.visible-lg,th.visible-lg,tr.visible-lg{display:none!important}@media (max-width:767px){.visible-lg.visible-xs{display:block!important}tr.visible-lg.visible-xs{display:table-row!important}td.visible-lg.visible-xs,th.visible-lg.visible-xs{display:table-cell!important}}@media (min-width:768px) and (max-width:991px){.visible-lg.visible-sm{display:block!important}tr.visible-lg.visible-sm{display:table-row!important}td.visible-lg.visible-sm,th.visible-lg.visible-sm{display:table-cell!important}}@media (min-width:992px) and (max-width:1199px){.visible-lg.visible-md{display:block!important}tr.visible-lg.visible-md{display:table-row!important}td.visible-lg.visible-md,th.visible-lg.visible-md{display:table-cell!important}}@media (min-width:1200px){.visible-lg{display:block!important}tr.visible-lg{display:table-row!important}td.visible-lg,th.visible-lg{display:table-cell!important}}.hidden-xs{display:block!important}tr.hidden-xs{display:table-row!important}td.hidden-xs,th.hidden-xs{display:table-cell!important}@media (max-width:767px){.hidden-xs,td.hidden-xs,th.hidden-xs,tr.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-xs.hidden-sm,td.hidden-xs.hidden-sm,th.hidden-xs.hidden-sm,tr.hidden-xs.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-xs.hidden-md,td.hidden-xs.hidden-md,th.hidden-xs.hidden-md,tr.hidden-xs.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-xs.hidden-lg,td.hidden-xs.hidden-lg,th.hidden-xs.hidden-lg,tr.hidden-xs.hidden-lg{display:none!important}}.hidden-sm{display:block!important}tr.hidden-sm{display:table-row!important}td.hidden-sm,th.hidden-sm{display:table-cell!important}@media (max-width:767px){.hidden-sm.hidden-xs,td.hidden-sm.hidden-xs,th.hidden-sm.hidden-xs,tr.hidden-sm.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-sm,td.hidden-sm,th.hidden-sm,tr.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-sm.hidden-md,td.hidden-sm.hidden-md,th.hidden-sm.hidden-md,tr.hidden-sm.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-sm.hidden-lg,td.hidden-sm.hidden-lg,th.hidden-sm.hidden-lg,tr.hidden-sm.hidden-lg{display:none!important}}.hidden-md{display:block!important}tr.hidden-md{display:table-row!important}td.hidden-md,th.hidden-md{display:table-cell!important}@media (max-width:767px){.hidden-md.hidden-xs,td.hidden-md.hidden-xs,th.hidden-md.hidden-xs,tr.hidden-md.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-md.hidden-sm,td.hidden-md.hidden-sm,th.hidden-md.hidden-sm,tr.hidden-md.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-md,td.hidden-md,th.hidden-md,tr.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-md.hidden-lg,td.hidden-md.hidden-lg,th.hidden-md.hidden-lg,tr.hidden-md.hidden-lg{display:none!important}}.hidden-lg{display:block!important}tr.hidden-lg{display:table-row!important}td.hidden-lg,th.hidden-lg{display:table-cell!important}@media (max-width:767px){.hidden-lg.hidden-xs,td.hidden-lg.hidden-xs,th.hidden-lg.hidden-xs,tr.hidden-lg.hidden-xs{display:none!important}}@media (min-width:768px) and (max-width:991px){.hidden-lg.hidden-sm,td.hidden-lg.hidden-sm,th.hidden-lg.hidden-sm,tr.hidden-lg.hidden-sm{display:none!important}}@media (min-width:992px) and (max-width:1199px){.hidden-lg.hidden-md,td.hidden-lg.hidden-md,th.hidden-lg.hidden-md,tr.hidden-lg.hidden-md{display:none!important}}@media (min-width:1200px){.hidden-lg,td.hidden-lg,th.hidden-lg,tr.hidden-lg{display:none!important}}.visible-print,td.visible-print,th.visible-print,tr.visible-print{display:none!important}@media print{.visible-print{display:block!important}tr.visible-print{display:table-row!important}td.visible-print,th.visible-print{display:table-cell!important}.hidden-print,td.hidden-print,th.hidden-print,tr.hidden-print{display:none!important}}body{padding-bottom:30px;font-size:16px}.ver{font-size:.9em;font-weight:700;display:inline-block;position:relative;top:-16px;left:187px}#resources .col-md-6 .showDocs,#resources .reqBody,#resources .resetRequest,.stackTrace{display:none}.masthead button{float:right;margin-left:10px}.alert code{white-space:normal}.modal .label{float:right}.modal .col-sm-6{margin-top:10px}.modal dl{margin:0}.modal ul{padding:0 0 0 15px}.runner .well.resource{margin:15px 0 0}#resources{margin-top:-20px}#resources .accordion-toggle{display:block;margin:-10px -15px;padding:10px 15px}#resources .accordion-toggle:hover{text-decoration:none;background:#ddd}#resources .resource h4 span{font-size:.6em}#resources .verb{float:right;margin-left:5px;padding-top:4px;margin-top:-18px}#resources .resetRequest,#resources .submitRequest{margin-left:10px;float:right}#resources .verb.label-default{background-color:#ccc}#resources .hideDocs,#resources .showDocs{float:right}#resources .micro{padding:5px 0;width:10px;text-align:center}.inputs-wrapper,.tab-content{padding-top:10px}#resources .doc{display:block;color:#000}#resources .doc.hint{padding-left:20px;color:#717171}#resources .progress{display:none;margin-top:10px}#resources .response{display:none}#resources .responseTime{float:right;font-size:.8em;margin-top:5px;margin-bottom:-2px}#resources .responseBody{white-space:nowrap}#resources pre{overflow-x:scroll;width:100%}#resources .headerName{font-weight:700;text-align:right}#resources .headerName,#resources .headerVal{font-size:.8em;line-height:1.6em}#resources select{width:85px;display:inline-block}#resources textarea{font-family:monospace;font-size:.9em}.reqMethod{float:left}.resourceUri{width:100%;max-width:54%;margin-left:90px;margin-top:0;font-family:monospace}.response{display:none}.response label{display:block;text-align:right}a.expander{cursor:pointer}.expandable{max-height:0;overflow:hidden;display:block;margin-bottom:0;-webkit-transition:max-height .7s cubic-bezier(.77,0,.175,1);-moz-transition:max-height .7s cubic-bezier(.77,0,.175,1);-o-transition:max-height .7s cubic-bezier(.77,0,.175,1);transition:max-height .7s cubic-bezier(.77,0,.175,1);-webkit-transition-timing-function:cubic-bezier(.77,0,.175,1);-moz-transition-timing-function:cubic-bezier(.77,0,.175,1);-o-transition-timing-function:cubic-bezier(.77,0,.175,1);transition-timing-function:cubic-bezier(.77,0,.175,1)}.expandable.active{max-height:1000px;margin-bottom:15px}.verbHeading{font-size:1.6em;font-weight:700;text-transform:capitalize}.inputs-wrapper{padding-left:20px}.resourceUriPath{float:right;margin-top:-15px}.queryParams .form-group:last-child{margin-bottom:0} \ No newline at end of file diff --git a/v1/taffy/dashboard/dash.js b/v1/taffy/dashboard/dash.js index a553a33..516a637 100644 --- a/v1/taffy/dashboard/dash.js +++ b/v1/taffy/dashboard/dash.js @@ -4,223 +4,460 @@ if (!String.prototype.trim) { }; } -$(function(){ +document.addEventListener('DOMContentLoaded', function(){ - //hide request body form field for GET/DELETE on accordion open - $("#resources").on('shown.bs.collapse', function(e){ - var resource = $("#resources .in .resource"); - var method = resource.find('.reqMethod option:checked').html(); - if (method === 'GET' || method === 'DELETE'){ - resource.find('.reqBody').hide('fast'); - resource.find('.queryParams').addClass('active'); - }else{ - var args = window.taffy.resources[resource.data('beanName')][method.toLowerCase()]; - var ta = resource.find('.reqBody').show('fast').find('textarea'); - ta.val(JSON.stringify(args, null, 3)); - resource.find('.queryParams').removeClass('active'); - } - }); - //hide request body form field for GET/DELETE on method change - $(".resource .reqMethod").on('change', function(){ - var resource = $(this).closest('.resource'); - var method = resource.find('.reqMethod option:checked').html(); - if (method === 'GET' || method === 'DELETE' || method == 'OPTIONS'){ - resource.find('.reqBody').hide('fast'); - }else{ - var args = window.taffy.resources[resource.data('beanName')][method.toLowerCase()]; - var ta = resource.find('.reqBody').show('fast').find('textarea'); - ta.val(JSON.stringify(args, null, 3)); - resource.find('.queryParams').find('input').val(''); - } + // hljs setup (if available) + if (typeof hljs !== 'undefined') { + hljs.configure({ ignoreUnescapedHTML: true }); + + // Format JSON in sample responses + document.querySelectorAll('.json-format').forEach(function(el) { + try { + var json = JSON.parse(el.textContent); + el.textContent = JSON.stringify(json, null, 3); + } catch(e) {} + }); + + hljs.highlightAll(); + } + + // Modal handling (native dialog) + document.querySelectorAll('[data-modal-target]').forEach(function(el) { + el.addEventListener('click', function() { + var modalId = this.dataset.modalTarget; + document.getElementById(modalId).showModal(); + }); }); - $(".addParam").click(function(){ - var resource = $(this).closest('.resource') - ,params = resource.find('.queryParams'); - var tmpl = '
=
'; - params.append(tmpl); + document.querySelectorAll('.modal .modal-close').forEach(function(el) { + el.addEventListener('click', function() { + this.closest('.modal').close(); + }); }); - $(".resource").on('click', '.delParam', function(){ - var row = $(this).closest('.row'); - row.remove(); + // Close modal on backdrop click + document.querySelectorAll('.modal').forEach(function(modal) { + modal.addEventListener('click', function(e) { + if (e.target === this) { + this.close(); + } + }); + }); + + // Resource accordion + document.querySelectorAll('.resource-header').forEach(function(el) { + el.addEventListener('click', function() { + var targetId = this.dataset.target; + var content = document.getElementById(targetId); + var wasOpen = content.classList.contains('open'); + content.classList.toggle('open'); + + // On open, show/hide request body based on method + if (!wasOpen) { + var resource = content.querySelector('.resource'); + var method = resource.querySelector('.reqMethod option:checked').textContent; + if (method === 'GET' || method === 'DELETE' || method === 'OPTIONS') { + resource.querySelector('.reqBody').style.display = 'none'; + resource.querySelector('.queryParams').classList.add('active'); + } else { + var args = window.taffy.resources[resource.dataset.beanName]; + if (args && args[method.toLowerCase()]) { + var reqBody = resource.querySelector('.reqBody'); + reqBody.style.display = ''; + var ta = reqBody.querySelector('textarea'); + ta.value = JSON.stringify(args[method.toLowerCase()], null, 3); + } else { + resource.querySelector('.reqBody').style.display = ''; + } + resource.querySelector('.queryParams').classList.remove('active'); + } + } + }); + }); + + // Doc accordion + document.querySelectorAll('.doc-accordion-trigger').forEach(function(el) { + el.addEventListener('click', function() { + var targetId = this.dataset.target; + document.getElementById(targetId).classList.toggle('open'); + this.classList.toggle('open'); + }); + }); + + // Tab handling + document.querySelectorAll('.tab-btn').forEach(function(el) { + el.addEventListener('click', function() { + var tabGroup = this.closest('.tabs'); + var targetId = this.dataset.tab; + + tabGroup.querySelectorAll('.tab-btn').forEach(function(btn) { + btn.classList.remove('active'); + }); + this.classList.add('active'); + + tabGroup.querySelectorAll('.tab-pane').forEach(function(pane) { + pane.classList.remove('active'); + }); + document.getElementById(targetId).classList.add('active'); + }); + }); + + // Reload button + var reloadBtn = document.getElementById('reload'); + if (reloadBtn && window.taffy && window.taffy.config) { + reloadBtn.addEventListener('click', function() { + var cfg = window.taffy.config; + var reloadUrl = cfg.scriptName + '?dashboard&' + cfg.reloadKey + '=' + cfg.reloadPassword; + var btn = this; + btn.textContent = 'Reloading...'; + btn.disabled = true; + + fetch(reloadUrl) + .then(function(response) { + if (response.ok) { + document.getElementById('alerts').insertAdjacentHTML('beforeend', '
API Cache Successfully Reloaded. Refresh to see changes.
'); + btn.disabled = false; + btn.textContent = 'Reload API Cache'; + setTimeout(function() { + var el = document.getElementById('reloadSuccess'); + if (el) el.remove(); + }, 2000); + } else { + throw new Error('Reload failed'); + } + }) + .catch(function() { + document.getElementById('alerts').insertAdjacentHTML('beforeend', '
API Cache Reload Failed!
'); + btn.disabled = false; + btn.textContent = 'Reload API Cache'; + setTimeout(function() { + var el = document.getElementById('reloadFail'); + if (el) el.remove(); + }, 2000); + }); + }); + } + + // Resource search + var searchInput = document.getElementById('resourceSearch'); + if (searchInput) { + searchInput.addEventListener('keyup', filterResources); + searchInput.addEventListener('keydown', function(e) { + if (e.keyCode == 27) { + this.value = ''; + filterResources(); + } + }); + } + + // Resource sorting + initSortPickers(); + + // Request body visibility on method change + document.querySelectorAll(".resource .reqMethod").forEach(function(el) { + el.addEventListener('change', function(){ + var resource = this.closest('.resource'); + var method = resource.querySelector('.reqMethod option:checked').textContent; + if (method === 'GET' || method === 'DELETE' || method == 'OPTIONS'){ + resource.querySelector('.reqBody').style.display = 'none'; + }else{ + var args = window.taffy.resources[resource.dataset.beanName][method.toLowerCase()]; + var reqBody = resource.querySelector('.reqBody'); + reqBody.style.display = ''; + var ta = reqBody.querySelector('textarea'); + ta.value = JSON.stringify(args, null, 3); + resource.querySelectorAll('.queryParams input').forEach(function(inp) { + inp.value = ''; + }); + } + }); + }); + + document.querySelectorAll(".addParam").forEach(function(el) { + el.addEventListener('click', function(){ + var resource = this.closest('.resource'); + var params = resource.querySelector('.queryParams'); + var tmpl = '
=
'; + params.insertAdjacentHTML('beforeend', tmpl); + }); + }); + + document.querySelectorAll(".resource").forEach(function(resource) { + resource.addEventListener('click', function(e){ + if (e.target.classList.contains('delParam')) { + var row = e.target.closest('.qparam'); + row.remove(); + } + }); }); //interpolate resource uri token values as they're typed - $(".resource").on('keyup', 'input', function(e){ - var $this = $(this) - ,resource = $this.closest('.resource') - ,tokens = params( resource.find('.reqTokens form').serialize() ) - ,q = qParams(resource) - ,uri = resource.data('uri') + document.querySelectorAll(".resource").forEach(function(resource) { + resource.addEventListener('keyup', function(e){ + if (!e.target.matches('input')) return; + var form = resource.querySelector('.reqTokens form'); + var tokens = form ? params(new FormData(form)) : {}; + var q = qParams(resource); + var uri = resource.dataset.uri; - for (var t in tokens){ - if (tokens[t] === '') - delete tokens[t]; - } - var result = uri.supplant(tokens); - result += (q.length) ? '?' + q : ''; - resource.find('.resourceUri').val(result); + for (var t in tokens){ + if (tokens[t] === '') + delete tokens[t]; + } + var result = uri.supplant(tokens); + result += (q.length) ? '?' + q : ''; + resource.querySelector('.resourceUri').value = result; + }); }); - $(".submitRequest").click(function(){ - var submit = $(this) - ,resource = submit.closest('.resource') - ,reset = resource.find('.resetRequest') - ,loading = resource.find('.progress') - ,response = resource.find('.response') - ,basicAuth = resource.find(".basicAuth"); + document.querySelectorAll(".submitRequest").forEach(function(el) { + el.addEventListener('click', function(){ + var submit = this; + var resource = submit.closest('.resource'); + var reset = resource.querySelector('.resetRequest'); + var loading = resource.querySelector('.progress'); + var response = resource.querySelector('.response'); + var basicAuth = resource.querySelector(".basicAuth"); - //validate tokens - resource.find('.has-error').removeClass('has-error'); - var tokenErrors = resource.find('.tokenErrors'); - var tokens = resource.find('.reqTokens input'); - tokenErrors.empty(); - for (var t=0;t' + tok.attr('name') + ' is required'); + //validate tokens + resource.querySelectorAll('.has-error').forEach(function(el) { + el.classList.remove('has-error'); + }); + var tokenErrors = resource.querySelector('.tokenErrors'); + var tokens = resource.querySelectorAll('.reqTokens input'); + if (tokenErrors) tokenErrors.innerHTML = ''; + for (var t=0;t' + tok.name + ' is required'); + } } - } - if (resource.find('.reqTokens .has-error').length > 0){ - return false; - } - - loading.show(); - submit.attr('disabled','disabled'); - - response.hide(); - - //interpolate the full request path - var uri = resource.data('uri') - ,form = params( resource.find('.reqTokens form').serialize() ) - ,path = uri.supplant(form); - - var verb = resource.find('.reqMethod option:checked').val(); - var body = (verb === 'GET' || verb === 'DELETE') ? qParams(resource) : resource.find('.reqBody textarea').val(); - var reqHeaders = resource.find('.requestHeaders').val().replace(/\r/g, '').split('\n'); - var headers = { - Accept: resource.find('.reqFormat option:checked').val() - ,"Content-Type": (verb === 'GET' || verb === 'DELETE') ? "application/x-www-form-urlencoded" : "application/json" - }; - for (var h in reqHeaders){ - var kv = reqHeaders[h].trim().split(':'); - if (kv[0].trim().length == 0){ - continue; + if (resource.querySelectorAll('.reqTokens .has-error').length > 0){ + return false; } - if (kv.length == 2){ - headers[ kv[0].trim() ] = kv[1].trim(); - }else if (kv.length == 1){ - headers [kv[0].trim() ] = ""; - }else{ - var k = kv.shift().trim(); - var v = kv.join(':').trim(); - headers[ k ] = v; - } - } - var basicAuthUsername = basicAuth.find("input[name=username]").val(); - var basicAuthPassword = basicAuth.find("input[name=password]").val(); + loading.classList.add('show'); + submit.disabled = true; - if(basicAuthUsername.length && basicAuthPassword.length){ - headers["Authorization"] = "Basic " + Base64.encode(basicAuthUsername + ":" + basicAuthPassword); - } + response.classList.remove('show'); - submitRequest(verb, path, headers, body, function(timeSpent, status, headers, body){ - loading.hide(); - submit.removeAttr('disabled'); - reset.show(); - headers = parseHeaders(headers); + //interpolate the full request path + var uri = resource.dataset.uri; + var form = resource.querySelector('.reqTokens form'); + var formParams = form ? params(new FormData(form)) : {}; + var path = uri.supplant(formParams); - if (headers['content-type'].indexOf('application/json') > -1 || headers['content-type'].indexOf('text/json') > -1 || headers['content-type'].indexOf('application/vnd.api+json') > -1){ - //indentation! - if (body.length){ - body = JSON.stringify(JSON.parse(body), null, 3); - // only do syntax highlighting if hljs is defined - if (typeof hljs === 'undefined') { - body = body.split('\n') - .join('
') - .replace(/\s/g,' '); - } else { - // syntax highlight json and then replace spaces at the start of each line (or after
) with   - body = hljs.highlight("json", body).value; - body = body.split('\n') - .join('
') - .replace(/(\)(\s+)/g, function(match, p1, p2, offset, string){ - return [p1, p2.replace(/\s/g,' ')].join(''); - }); - } + var verb = resource.querySelector('.reqMethod option:checked').value; + var q = qParams(resource); + var body = (verb === 'GET' || verb === 'DELETE') ? null : resource.querySelector('.reqBody textarea').value; + if (q.length) path += '?' + q; + var reqHeaders = resource.querySelector('.requestHeaders').value.replace(/\r/g, '').split('\n'); + var headers = { + Accept: resource.querySelector('.reqFormat option:checked').value + ,"Content-Type": (verb === 'GET' || verb === 'DELETE') ? "application/x-www-form-urlencoded" : "application/json" + }; + for (var h in reqHeaders){ + var kv = reqHeaders[h].trim().split(':'); + if (kv[0].trim().length == 0){ + continue; + } + if (kv.length == 2){ + headers[ kv[0].trim() ] = kv[1].trim(); + }else if (kv.length == 1){ + headers [kv[0].trim() ] = ""; + }else{ + var k = kv.shift().trim(); + var v = kv.join(':').trim(); + headers[ k ] = v; } } - var headerRow = response.find('.responseHeaders'); - headerRow.empty(); - response.show(); - var sortable = []; - for (var h in headers){ - sortable.push(h); - } - sortable.sort(); - for (var h in sortable){ - headerRow.append('
' + sortable[h] + ':
' + headers[sortable[h]] + '
'); + var basicAuthUsername = basicAuth.querySelector("input[name=username]").value; + var basicAuthPassword = basicAuth.querySelector("input[name=password]").value; + + if(basicAuthUsername.length && basicAuthPassword.length){ + headers["Authorization"] = "Basic " + Base64.encode(basicAuthUsername + ":" + basicAuthPassword); } - response.find('.responseTime').html('Request took ' + timeSpent + 'ms'); - response.find('.responseStatus').html(status); - response.find('.responseBody').html(body); + submitRequest(verb, path, headers, body, function(timeSpent, status, headers, body){ + loading.classList.remove('show'); + submit.disabled = false; + reset.style.display = ''; + headers = parseHeaders(headers); + + if (headers['content-type'] && (headers['content-type'].indexOf('application/json') > -1 || headers['content-type'].indexOf('text/json') > -1 || headers['content-type'].indexOf('application/vnd.api+json') > -1)){ + //indentation! + if (body.length){ + body = JSON.stringify(JSON.parse(body), null, 3); + // only do syntax highlighting if hljs is defined + if (typeof hljs === 'undefined') { + body = body.split('\n') + .join('
') + .replace(/\s/g,' '); + } else { + // syntax highlight json and then replace spaces at the start of each line (or after
) with   + body = hljs.highlight(body, {language: "json"}).value; + body = body.split('\n') + .join('
') + .replace(/(\)(\s+)/g, function(match, p1, p2, offset, string){ + return [p1, p2.replace(/\s/g,' ')].join(''); + }); + } + } + } + + var headerRow = response.querySelector('.response-headers'); + headerRow.innerHTML = ''; + response.classList.add('show'); + var sortable = []; + for (var h in headers){ + sortable.push(h); + } + sortable.sort(); + for (var h in sortable){ + headerRow.insertAdjacentHTML('beforeend', '
' + sortable[h] + ': ' + headers[sortable[h]] + '
'); + } + + response.querySelector('.response-time').innerHTML = 'Request took ' + timeSpent + 'ms'; + response.querySelector('.response-status').innerHTML = status; + response.querySelector('.responseBody').innerHTML = body; + }); + }); - }); - $(".resetRequest").click(function(){ - var reset = $(this) - ,resource = reset.closest('.resource') - ,response = resource.find('.response') - ,tokens = resource.find('.reqTokens form input') - ,params = resource.find('.queryParams input') - ,uri = resource.data('uri'); + document.querySelectorAll(".resetRequest").forEach(function(el) { + el.addEventListener('click', function(){ + var reset = this; + var resource = reset.closest('.resource'); + var response = resource.querySelector('.response'); + var tokens = resource.querySelectorAll('.reqTokens form input'); + var paramInputs = resource.querySelectorAll('.queryParams input'); + var uri = resource.dataset.uri; - response.hide(); - reset.hide(); - resource.find('.resourceUri').val(uri); + response.classList.remove('show'); + reset.style.display = 'none'; + resource.querySelector('.resourceUri').value = uri; - tokens.each(function(){ - $(this).val(''); + tokens.forEach(function(inp){ + inp.value = ''; + }); + paramInputs.forEach(function(inp){ + inp.value = ''; + }); }); - params.each(function(){ - $(this).val(''); - }) }); }); function qParams(resource){ var validParams = []; - resource.find('.qparam').each(function(){ - var $this = $(this), n = $this.find('.paramName'), v = $this.find('.paramValue'); - var nameLen = n.val().length, valLen = v.val().length; + resource.querySelectorAll('.qparam').forEach(function(el){ + var n = el.querySelector('.paramName'), v = el.querySelector('.paramValue'); + var nameLen = n.value.length, valLen = v.value.length; if (nameLen && valLen){ - validParams.push(encodeURIComponent(n.val()) + '=' + encodeURIComponent(v.val())); - $this.removeClass('has-error'); + validParams.push(encodeURIComponent(n.value) + '=' + encodeURIComponent(v.value)); + el.classList.remove('has-error'); }else{ - $this.addClass('has-error'); + el.classList.add('has-error'); } }); return validParams.join('&'); } function toggleStackTrace(id){ - console.log('toggling %s', id); - $('#' + id).toggle(); + var el = document.getElementById(id); + if (el) el.classList.toggle('show'); } -function params(query){ - var parameters = {}, parameter; - if (query.length > 1){ - query = query.split('&'); +function filterResources(){ + var filter = document.getElementById('resourceSearch').value.toUpperCase(); + document.querySelectorAll('.resource-panel').forEach(function(panel) { + var text = panel.querySelector('.resource-name').textContent; + panel.style.display = text.toUpperCase().indexOf(filter) > -1 ? '' : 'none'; + }); +} + +function getCookie(name) { + var nameEQ = name + '=', ca = document.cookie.split(';'), i = 0, c; + for(;i < ca.length;i++) { + c = ca[i]; + while (c[0]==' ') c = c.substring(1); + if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length); + } + return null; +} + +function submitRequest(verb, resource, headers, body, callback){ + var cfg = window.taffy.config; + var url = window.location.protocol + '//' + window.location.host; + var endpointURLParam = cfg.endpointURLParam; + var endpoint = resource.split('?')[0]; + var contentType = null; + + if (cfg.csrfCookieName && cfg.csrfHeaderName) { + var csrfCookie = getCookie(cfg.csrfCookieName); + if (csrfCookie) { + headers[cfg.csrfHeaderName] = csrfCookie; + } + } + + url += cfg.scriptName + '?' + endpointURLParam + '=' + encodeURIComponent(endpoint); + if (resource.indexOf('?') && resource.split('?')[1]) { + url += '&' + resource.split('?')[1]; + } + + if (body && typeof body === 'string') { + try { + JSON.parse(body); + contentType = "application/json"; + } catch (e) {} + } + + var before = Date.now(); + + var fetchOptions = { + method: verb, + headers: headers, + cache: 'no-store' + }; + + if (body && verb !== 'GET' && verb !== 'HEAD') { + fetchOptions.body = body; + if (contentType) { + fetchOptions.headers['Content-Type'] = contentType; + } + } + + fetch(url, fetchOptions) + .then(function(response) { + return response.text().then(function(text) { + var after = Date.now(), t = after - before; + var headersStr = ''; + response.headers.forEach(function(value, key) { + headersStr += key + ': ' + value + '\n'; + }); + callback(t, response.status + " " + response.statusText, headersStr, text); + }); + }) + .catch(function(error) { + var after = Date.now(), t = after - before; + callback(t, "0 Network Error", "", error.message || "Request failed"); + }); +} + +function params(formData){ + var parameters = {}; + if (formData instanceof FormData) { + formData.forEach(function(value, key) { + parameters[key] = value; + }); + } else if (typeof formData === 'string' && formData.length > 1) { + var query = formData.split('&'); for (var i = 0; i < query.length; i++) { - parameter = query[i].split("="); + var parameter = query[i].split("="); if (parameter.length === 1) { parameter[1] = ""; } parameters[decodeURIComponent(parameter[0])] = decodeURIComponent(parameter[1]); } @@ -230,6 +467,7 @@ function params(query){ function parseHeaders(h){ var out = {}; + if (!h) return out; var chunks = h.toLowerCase().split('\n'); for (var i=0,j=chunks.length; i 0 ){ + document.querySelectorAll('input,select,textarea,button').forEach(function(elem){ + if (elem.type === 'hidden') return; + var invisibleParent = elem.closest(invisible_parent_class); + if (invisibleParent){ //could be invisible... - if ( $elem.parents( invisible_parent_class + parent_visible_modifier_class ).length > 0 ){ + if (invisibleParent.classList.contains('active')){ //is visible, give it a tab index - $elem.attr( 'tabindex', nextTabIndex ); + elem.tabIndex = nextTabIndex; nextTabIndex++; } }else{ - $elem.attr( 'tabindex', nextTabIndex ); + elem.tabIndex = nextTabIndex; nextTabIndex++; } }); } var handleExpansion = function(e){ - var $this = $(this) - ,$target = $( $this.data('target') ) - ,isVisible = $target.hasClass('active'); - - if ( $this.is('a') ){ + var el = this; + var target = document.querySelector(el.dataset.target); + if (!target) return; + var isVisible = target.classList.contains('active'); + if (el.tagName === 'A'){ e.preventDefault(); if (isVisible){ - $target.removeClass('active'); - $this.closest('.hide-on-expand').show('fast'); + target.classList.remove('active'); + var hideOnExpand = el.closest('.hide-on-expand'); + if (hideOnExpand) hideOnExpand.style.display = ''; }else{ - $target.addClass('active'); - $this.closest('.hide-on-expand').hide('fast'); + target.classList.add('active'); + var hideOnExpand = el.closest('.hide-on-expand'); + if (hideOnExpand) hideOnExpand.style.display = 'none'; } updateTabindexes(); return false; - }else if ( $this.is('input[type=checkbox]') ){ - - if ( $this.prop('checked') ){ - $target.addClass('active'); + }else if (el.type === 'checkbox'){ + if (el.checked){ + target.classList.add('active'); }else{ - $target.removeClass('active'); + target.classList.remove('active'); } - }else if ( $this.is('input[type=radio]') ){ - - var expand = $this.data('expand') && $this.is(':checked'); - - if ( expand ){ - $target.addClass('active'); + }else if (el.type === 'radio'){ + var expand = el.dataset.expand && el.checked; + if (expand){ + target.classList.add('active'); }else{ - $target.removeClass('active'); + target.classList.remove('active'); } - }else if ( $this.is('select') ){ - - var selectedOption = $this.find('option:selected'); - var expand = selectedOption.data('expand'); - - if ( expand ){ - $target.addClass('active'); + }else if (el.tagName === 'SELECT'){ + var selectedOption = el.options[el.selectedIndex]; + var expand = selectedOption && selectedOption.dataset.expand; + if (expand){ + target.classList.add('active'); }else{ - $target.removeClass('active'); + target.classList.remove('active'); } - }else if ( $this.is('input[type=text]') ){ - - if ( $this.val().trim().length > 0 ){ - $target.addClass('active'); + }else if (el.type === 'text'){ + if (el.value.trim().length > 0){ + target.classList.add('active'); }else{ - $target.removeClass('active'); + target.classList.remove('active'); } - } updateTabindexes(); } - $('a.expander').on('click', handleExpansion); - $('input.expander,select.expander').on('keyup change', handleExpansion); - - //initialize starting state of text fields - $('input.expander,select.expander').each(function(){ - handleExpansion.apply(this); + document.querySelectorAll('a.expander').forEach(function(el) { + el.addEventListener('click', handleExpansion); + }); + document.querySelectorAll('input.expander,select.expander').forEach(function(el) { + el.addEventListener('keyup', handleExpansion); + el.addEventListener('change', handleExpansion); + // initialize starting state + handleExpansion.call(el); }); } expandingFormElements(); + +function initSortPickers() { + document.querySelectorAll('.sort-picker').forEach(function(picker) { + var storeKey = picker.dataset.storeKey; + var accordion = picker.closest('section').querySelector('#resourcesAccordion'); + if (!accordion) return; + + // Snapshot original (match) order + var panels = Array.prototype.slice.call(accordion.querySelectorAll('.resource-panel')); + panels.forEach(function(panel, i) { + panel.dataset.sortMatch = i; + }); + + function sortPanels(mode) { + var sorted = panels.slice(); + if (mode === 'name') { + sorted.sort(function(a, b) { + return (a.dataset.sortName || '').localeCompare(b.dataset.sortName || ''); + }); + } else if (mode === 'uri') { + sorted.sort(function(a, b) { + return (a.dataset.sortUri || '').localeCompare(b.dataset.sortUri || ''); + }); + } else { + sorted.sort(function(a, b) { + return Number(a.dataset.sortMatch) - Number(b.dataset.sortMatch); + }); + } + sorted.forEach(function(panel) { + accordion.appendChild(panel); + }); + + // Show/hide match order hint + var hint = picker.closest('section').querySelector('.match-order-hint'); + if (hint) { + hint.style.display = mode === 'match' ? '' : 'none'; + } + } + + // Restore saved sort + var saved = localStorage.getItem(storeKey) || 'name'; + picker.querySelectorAll('.sort-btn').forEach(function(btn) { + btn.classList.toggle('active', btn.dataset.sort === saved); + }); + sortPanels(saved); + + // Click handlers + picker.querySelectorAll('.sort-btn').forEach(function(btn) { + btn.addEventListener('click', function() { + picker.querySelectorAll('.sort-btn').forEach(function(b) { + b.classList.remove('active'); + }); + btn.classList.add('active'); + var mode = btn.dataset.sort; + localStorage.setItem(storeKey, mode); + sortPanels(mode); + }); + }); + }); +} diff --git a/v1/taffy/dashboard/dash.less b/v1/taffy/dashboard/dash.less deleted file mode 100644 index e5ddcb4..0000000 --- a/v1/taffy/dashboard/dash.less +++ /dev/null @@ -1,228 +0,0 @@ -@import "bootstrap.min.less"; - -body { - padding-bottom: 30px; - font-size: 16px; -} - -.ver { - font-size: 0.9em; - font-weight: bold; - display: inline-block; - position: relative; - top: -16px; - left: 187px; -} - -.masthead { - button { - float: right; - margin-left: 10px; - } -} - -.stackTrace { - display: none; -} - -.alert { - code { - white-space: normal; - } -} - -.modal { - .label { - float: right; - } - .col-sm-6 { - margin-top: 10px; - } - dl { - margin: 0; - } - ul { - padding: 0 0 0 15px; - } -} - -.runner .well.resource { - margin: 15px 0 0 0; -} - -#resources { - margin-top: -20px; - - .accordion-toggle { - display: block; - margin: -10px -15px; - padding: 10px 15px; - - &:hover { - text-decoration: none; - background: #ddd; - } - } - .resource { - h4 { - span { - font-size: 0.6em; - } - } - } - .verb { - float: right; - margin-left: 5px; - padding-top: 4px; - margin-top: -18px; - - &.label-default { - background-color: #ccc; - } - } - .showDocs { - float: right; - } - .hideDocs { - float: right; - } - .col-md-6 { - .showDocs { - display: none; - } - } - .submitRequest { - float: right; - margin-left: 10px; - } - .resetRequest { - display: none; - float: right; - margin-left: 10px; - } - .micro { - padding: 5px 0; - width: 10px; - text-align: center; - } - .reqBody { - display: none; - } - .doc { - display: block; - color: #000; - } - .doc.hint { - padding-left: 20px; - color: #717171; - } - .progress { - display: none; - margin-top: 10px; - } - .response { - display: none; - } - .responseTime { - float: right; - font-size: 0.8em; - margin-top: 5px; - margin-bottom: -2px; - } - .responseBody { - white-space: nowrap; - } - pre { - overflow-x: scroll; - width: 100%; - } - .headerName { - font-weight: bold; - text-align: right; - } - .headerName, - .headerVal { - font-size: 0.8em; - line-height: 1.6em; - } - - select { - width: 85px; - display: inline-block; - } - - textarea { - font-family: monospace; - font-size: 0.9em; - } -} - -.reqMethod { - float: left; -} -.resourceUri { - width: 100%; - max-width: 54%; - // margin: .5em 0; - margin-left: 90px; - margin-top: 0; - font-family: monospace; -} - -.response { - display: none; - - label { - display: block; - text-align: right; - } -} - -a.expander { - cursor: pointer; -} -.expandable { - max-height: 0; - overflow: hidden; - display: block; - margin-bottom: 0; - - -webkit-transition: max-height 700ms cubic-bezier(0.77, 0, 0.175, 1); - -moz-transition: max-height 700ms cubic-bezier(0.77, 0, 0.175, 1); - -o-transition: max-height 700ms cubic-bezier(0.77, 0, 0.175, 1); - transition: max-height 700ms cubic-bezier(0.77, 0, 0.175, 1); /* easeInOutQuart */ - - -webkit-transition-timing-function: cubic-bezier(0.77, 0, 0.175, 1); - -moz-transition-timing-function: cubic-bezier(0.77, 0, 0.175, 1); - -o-transition-timing-function: cubic-bezier(0.77, 0, 0.175, 1); - transition-timing-function: cubic-bezier( - 0.77, - 0, - 0.175, - 1 - ); /* easeInOutQuart */ - - &.active { - max-height: 1000px; - margin-bottom: 15px; - } -} -.tab-content { - padding-top: 10px; -} -.verbHeading { - font-size: 1.6em; - font-weight: bold; - text-transform: capitalize; -} -.inputs-wrapper { - padding-left: 20px; - padding-top: 10px; -} -.resourceUriPath { - float: right; - margin-top: -15px; -} -.queryParams .form-group:last-child { - margin-bottom: 0; -} diff --git a/v1/taffy/dashboard/dashboard.cfm b/v1/taffy/dashboard/dashboard.cfm index 46c75a0..a61066a 100644 --- a/v1/taffy/dashboard/dashboard.cfm +++ b/v1/taffy/dashboard/dashboard.cfm @@ -4,140 +4,179 @@ Taffy Dashboard + + + + + + + -
+
-
- - - -

API Dashboard

- Taffy #application._taffy.version# -
+
+
+

API Dashboard

+ Taffy #application._taffy.version# +
+
+ + + + +
+
- + -
+
- @@ -147,40 +186,45 @@
- #local.err.resource# contains a conflicting URI. + #local.err.resource# contains a conflicting URI. - #local.err.resource# should have a URI that begins with a forward slash. + #local.err.resource# should have a URI that begins with a forward slash. - #local.err.resource# contains a syntax error. + #local.err.resource# contains a syntax error. Error on line #local.err.exception.tagcontext[1].line#: -
- +
+ #local.err.exception.message#

#local.err.exception.detail#
-
+
- Toggle Stack Trace -
+ Toggle Stack Trace
- Reload the API Cache after resolving this error. +

Reload the API Cache after resolving this error.

-
+
-
-

- Resources: - -

-
+
+
+

Resources:

+ +
+ + + +
+
+ +
@@ -190,308 +234,294 @@ continue; -
- -
-
-
- -
-
-
-
- - - - - - - - - - - -
-

URI Tokens: (required)

-
-
- -
-
- -
-
- -
-
-
-
-
+
+
+
+ + +
+
+
+
+ -
- - - -
-

Request Body:

- - - - - - - - - - - - - - - - continue; - - - - - - - - - - - - - - - - - - - - - - - -
-
-
- Loading... -
-
-
-
-

Response:

-
-

-

-
-
-
-
-
-
- - -
#local.docData.hint#

- - - - - - - continue; + + + - - -
-
- - #local.func.name# - - #local.func.taffy_verb# - - #local.func['taffy:verb']# - -
-
- -
#local.func.hint#
-
-
-
-
-
Inputs
-
-
-
- - - - continue; - -
-
- - optional - - required - - - #local.param.type# - - #local.param.name# - - - (default: "") - - (default: #local.param.default#) - - - - - -

#local.param.hint#

-
-
-
-
-
-
+ + + + +
+ + + + + + + + + + + + + + + +
+

Request Body:

+ + + + + + + + + + + + + + + + continue; - -
+ + + + + + + + + + + + + + + + + + + +
+
+
+
+
+

Response:

+
+

+ +
+
+
+ + + +

#local.docData.hint#

+
+ + + + + + + continue; + + + +
+
+ + #local.func.name# + + #local.func.taffy_verb# + + #local.func['taffy:verb']# + +
+ +

#local.func.hint#

+
+ + + + + + + + +
+ +
+ +
+ + optional + + required + + + #local.param.type# + + #local.param.name# + + min length: #local.param["taffy_minlength"]# + + + max length: #local.param["taffy_maxlength"]# + + + min: #local.param["taffy_min"]# + + + max: #local.param["taffy_max"]# + + + pattern: #local.param["taffy_pattern"]# + + + + (default: "")(default: #local.param.default#) + + + +

#local.param.hint#

+
+
+
+
+
+
+ + + + + + + + + + + +
+ +
+
#serializeJson(sample)#
+
+
+
+ +
+
+
+
-
-
+
+ -
-
Taffy is running but you haven't defined any resources yet.
-
+
+
Taffy is running but you haven't defined any resources yet.
+

It looks like you don't have any resources defined. Get started by creating the folder #guessResourcesFullPath()#, in which you should place your @@ -500,8 +530,7 @@

Or you could set up a bean factory, like ColdSpring or DI/1. Want to know more about using bean factories with Taffy? - Check out the wiki! + Check out the wiki!

If all else fails, I recommend starting with Getting Started. @@ -509,160 +538,24 @@

+ -
+
Warning: Your reload key and password are using the framework default settings. - It's advised that you change these in production. + It's advised that you change these in production.
-
Resources are listed in matching order. From top to bottom, the first URI to match the request is used.
-
-
+ +
+ +
diff --git a/v1/taffy/dashboard/dashboard.css b/v1/taffy/dashboard/dashboard.css new file mode 100644 index 0000000..f2074c4 --- /dev/null +++ b/v1/taffy/dashboard/dashboard.css @@ -0,0 +1,853 @@ +/* Base styles */ +body { + font-family: + 'Atkinson Hyperlegible', + system-ui, + -apple-system, + sans-serif; + background-color: #f3f4f6; + color: #111827; + line-height: 1.5; +} + +button, +input, +select, +textarea { + font-family: inherit; +} + +/* Header */ +.dashboard-header { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + gap: 1rem; + margin-bottom: 2rem; +} + +.dashboard-title { + font-size: 1.875rem; + font-weight: 700; + color: #111827; + margin: 0; +} + +.dashboard-version { + font-size: 0.875rem; + color: #4b5563; +} + +/* Buttons */ +.btn { + display: inline-flex; + align-items: center; + padding: 0.5rem 1rem; + font-size: 0.875rem; + font-weight: 500; + border-radius: 0.5rem; + cursor: pointer; + transition: all 0.15s ease; + border: none; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.btn-primary { + background-color: #2563eb; + color: white; +} +.btn-primary:hover { + background-color: #1d4ed8; +} + +.btn-success { + background-color: #059669; + color: white; +} +.btn-success:hover { + background-color: #047857; +} + +.btn-warning { + background-color: #d97706; + color: white; +} +.btn-warning:hover { + background-color: #b45309; +} + +.btn-secondary { + background-color: white; + color: #374151; + border: 1px solid #9ca3af; +} +.btn-secondary:hover { + background-color: #f3f4f6; +} + +.btn-ghost { + background-color: #e5e7eb; + color: #374151; +} +.btn-ghost:hover { + background-color: #d1d5db; +} + +.btn-icon { + background-color: transparent; + padding: 0.25rem; + box-shadow: none; + line-height: 0; +} +.btn-icon svg { + display: block; + width: 1.75rem; + height: 1.75rem; +} + +.has-tooltip { + position: relative; +} +.has-tooltip::after { + content: attr(data-tooltip); + position: absolute; + top: calc(100% + 0.375rem); + right: 0; + background-color: #1f2937; + color: white; + font-size: 0.8125rem; + font-weight: 500; + padding: 0.5rem 0.75rem; + border-radius: 0.375rem; + white-space: nowrap; + pointer-events: none; + opacity: 0; + visibility: hidden; + z-index: 10; +} +.has-tooltip:hover::after, +.has-tooltip:focus-visible::after { + opacity: 1; + visibility: visible; +} + +/* Form controls */ +.form-input { + display: block; + width: 100%; + padding: 0.5rem 0.75rem; + font-size: 0.875rem; + border: 1px solid #9ca3af; + border-radius: 0.5rem; + background-color: white; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.05); + box-sizing: border-box; +} +.form-input:focus { + outline: none; + border-color: #2563eb; + box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); +} + +.form-select { + padding: 0.5rem 0.75rem; + font-size: 0.875rem; + border: 1px solid #9ca3af; + border-radius: 0.5rem; + background-color: white; + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.05); +} +.form-select:focus { + outline: none; + border-color: #2563eb; + box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1); +} + +textarea.form-input { + font-family: 'Atkinson Hyperlegible Mono', ui-monospace, monospace; + resize: vertical; + max-width: 100%; + box-sizing: border-box; +} + +/* Request body section */ +.reqBody { + max-width: 100%; + overflow: hidden; +} + +/* Resource panels */ +.resource-panel { + background: white; + border: 1px solid #d1d5db; + border-radius: 0.5rem; + margin-bottom: 0.5rem; + overflow: hidden; + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.08); +} + +.resource-header { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: space-between; + gap: 0.5rem 1rem; + padding: 0.75rem 1rem; + cursor: pointer; + transition: background-color 0.15s; +} +.resource-header:hover { + background-color: #f3f4f6; +} + +.resource-name { + font-weight: 500; + color: #111827; +} + +.resource-meta { + display: flex; + flex-wrap: wrap; + align-items: center; + justify-content: flex-end; + gap: 0.5rem; + flex: 1 1 auto; +} + +.resource-uri { + font-family: 'Atkinson Hyperlegible Mono', ui-monospace, monospace; + font-size: 0.875rem; + font-weight: 700; + color: #059669; + word-break: break-all; +} + +/* HTTP method badges */ +.verb { + display: inline-block; + padding: 0.125rem 0.5rem; + font-size: 0.75rem; + font-weight: 600; + border-radius: 0.25rem; + text-transform: uppercase; +} + +.verb-get { + background-color: #059669; + color: white; +} +.verb-post { + background-color: #d97706; + color: white; +} +.verb-put { + background-color: #2563eb; + color: white; +} +.verb-patch { + background-color: #2563eb; + color: white; +} +.verb-delete { + background-color: #dc2626; + color: white; +} +.verb-disabled { + background-color: #e5e7eb; + color: #6b7280; +} + +/* Resource content */ +.resource-content { + display: none; + border-top: 1px solid #d1d5db; + padding: 1rem; +} +.resource-content.open { + display: block; +} + +/* Tabs */ +.tabs-nav { + display: flex; + border-bottom: 1px solid #d1d5db; + margin-bottom: 1rem; +} + +.tab-btn { + padding: 0.5rem 1rem; + font-size: 0.875rem; + font-weight: 500; + color: #4b5563; + background: none; + border: none; + border-bottom: 2px solid transparent; + margin-bottom: -1px; + cursor: pointer; + transition: all 0.15s; +} +.tab-btn:hover { + color: #374151; +} +.tab-btn.active { + color: #2563eb; + border-bottom-color: #2563eb; +} + +.tab-pane { + display: none; +} +.tab-pane.active { + display: block; +} + +/* Runner form */ +.runner-form { + background-color: #f3f4f6; + border: 1px solid #d1d5db; + border-radius: 0.5rem; + padding: 1rem; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.04); +} + +.runner-row { + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.75rem; + margin-bottom: 1rem; +} + +.runner-uri { + flex: 1; + min-width: 200px; + font-family: 'Atkinson Hyperlegible Mono', ui-monospace, monospace; +} + +/* Expandable sections */ +.toggles { + display: flex; + flex-wrap: wrap; + gap: 1rem; + margin-bottom: 1rem; +} + +.expander { + font-size: 0.875rem; + color: #2563eb; + cursor: pointer; +} +.expander:hover { + color: #1d4ed8; + text-decoration: underline; +} + +.expandable { + display: none; + background: white; + border: 1px solid #d1d5db; + border-radius: 0.5rem; + padding: 1rem; + margin-bottom: 1rem; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.expandable.active, +.expandable.open { + display: block; +} + +.section-title { + font-size: 0.875rem; + font-weight: 600; + color: #111827; + margin-bottom: 0.75rem; + margin-top: 0; +} + +.section-subtitle { + font-weight: 400; + color: #4b5563; +} + +/* Query params */ +.qparam { + display: flex; + align-items: center; + gap: 0.5rem; + margin-bottom: 0.5rem; +} +.qparam .form-input { + flex: 1; +} +.qparam.has-error .form-input { + border-color: #dc2626; +} + +/* Token inputs */ +.token-row { + display: flex; + align-items: center; + gap: 0.75rem; + margin-bottom: 0.75rem; +} +.token-row.has-error .form-input { + border-color: #dc2626; +} +.token-label { + width: 8rem; + font-size: 0.875rem; + font-weight: 500; + color: #374151; +} +.token-input { + flex: 1; +} + +/* Basic auth */ +.auth-row { + display: flex; + gap: 0.75rem; +} +.auth-row .form-input { + flex: 1; +} + +/* Response */ +.response { + display: none; + margin-top: 1rem; + padding-top: 1rem; + border-top: 1px solid #d1d5db; +} +.response.show { + display: block; +} + +.response-headers { + font-family: 'Atkinson Hyperlegible Mono', ui-monospace, monospace; + font-size: 0.75rem; + color: #4b5563; + white-space: pre-wrap; + margin-bottom: 0.5rem; +} + +.response-time { + font-size: 0.875rem; + color: #4b5563; + margin-bottom: 0.5rem; +} + +.response-status { + display: inline-block; + padding: 0.25rem 0.5rem; + font-size: 0.75rem; + font-weight: 500; + background-color: #e5e7eb; + border-radius: 0.25rem; + margin-bottom: 0.75rem; +} + +.response-body { + background-color: #1f2937; + color: #f3f4f6; + padding: 1rem; + border-radius: 0.5rem; + border: 1px solid #374151; + overflow-x: auto; + font-size: 0.875rem; + margin: 0; +} +.response-body code { + font-family: 'Atkinson Hyperlegible Mono', ui-monospace, monospace; +} +.response-body code.hljs { + padding: 0; +} +.response .response-body { + padding: 1px; +} +.response .response-body .responseBody { + border-radius: 0.4rem; + padding: 1rem; +} + +/* Sample response in docs - lime green theme */ +.sample-response-content.doc-accordion-content { + padding: 0; +} +.sample-response-content.doc-accordion-content .response-body { + margin: 0; + padding: 1rem; + border-radius: 0; + border: 0; + background-color: #f0fdf4; + color: #14532d; +} +.sample-response-content.doc-accordion-content .response-body code.hljs { + background-color: transparent; +} + +/* Progress */ +.progress { + display: none; + height: 4px; + background-color: #dbeafe; + border-radius: 2px; + overflow: hidden; + margin: 1rem 0; +} +.progress.show { + display: block; +} +.progress-bar { + height: 100%; + background-color: #2563eb; + animation: pulse 1.5s ease-in-out infinite; +} +@keyframes pulse { + 0%, + 100% { + opacity: 1; + } + 50% { + opacity: 0.5; + } +} + +/* Alerts */ +.alert { + padding: 1rem; + border-radius: 0.5rem; + margin-bottom: 1rem; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.alert-info { + background-color: #eff6ff; + border: 1px solid #bfdbfe; + color: #1e40af; +} +.alert-warning { + background-color: #fffbeb; + border: 1px solid #fde68a; + color: #92400e; +} +.alert-success { + background-color: #ecfdf5; + border: 1px solid #a7f3d0; + color: #065f46; +} +.alert-danger { + background-color: #fef2f2; + border: 1px solid #fecaca; + color: #991b1b; +} + +/* Modal (native dialog) */ +.modal { + border: none; + border-radius: 0.75rem; + box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25); + max-width: 42rem; + width: calc(100% - 2rem); + max-height: 90vh; + padding: 0; + overflow: hidden; +} +.modal::backdrop { + background-color: rgba(0, 0, 0, 0.5); +} + +.modal-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 1rem 1.5rem; + border-bottom: 1px solid #d1d5db; +} + +.modal-title { + font-size: 1.125rem; + font-weight: 600; + color: #111827; + margin: 0; +} + +.modal-close { + background: none; + border: none; + font-size: 1.5rem; + color: #9ca3af; + cursor: pointer; + line-height: 1; +} +.modal-close:hover { + color: #4b5563; +} + +.modal-body { + overflow-y: auto; + max-height: calc(90vh - 4rem); +} + +/* Config table */ +.config-table { + width: 100%; + font-size: 0.875rem; +} +.config-table tr { + border-bottom: 1px solid #f3f4f6; +} +.config-table tr:hover { + background-color: #f3f4f6; +} +.config-table td { + padding: 0.75rem 1.5rem; + vertical-align: top; +} +.config-table td:first-child { + font-weight: 500; + color: #111827; +} +.config-table td:last-child { + color: #4b5563; +} + +.help-link { + display: inline-flex; + align-items: center; + justify-content: center; + width: 1.25rem; + height: 1.25rem; + background-color: #e5e7eb; + color: #4b5563; + font-size: 0.75rem; + border-radius: 50%; + text-decoration: none; + margin-right: 0.5rem; +} +.help-link:hover { + background-color: #d1d5db; +} + +/* Documentation tab */ +.doc-section { + margin: 0; +} + +.doc-verb-title { + font-size: 1.125rem; + font-weight: 600; + text-transform: uppercase; + color: #111827; + margin-bottom: 0.5rem; +} + +.doc-hint { + color: #4b5563; + margin-bottom: 1rem; +} + +.doc-accordion { + border: 1px solid #d1d5db; + border-radius: 0.5rem; + overflow: hidden; + margin-bottom: 0.75rem; + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} + +.doc-accordion-trigger { + display: flex; + align-items: center; + justify-content: space-between; + width: 100%; + padding: 0.5rem 1rem; + background-color: #f3f4f6; + border: none; + font-size: 0.875rem; + font-weight: 500; + color: #374151; + cursor: pointer; + text-align: left; +} +.doc-accordion-trigger:hover { + background-color: #f3f4f6; +} +.doc-accordion-trigger svg { + width: 1rem; + height: 1rem; + transition: transform 0.2s; +} +.doc-accordion-trigger.open svg { + transform: rotate(180deg); +} + +.doc-accordion-content { + display: none; + padding: 1rem; + border-top: 1px solid #d1d5db; +} +.doc-accordion-content.open { + display: block; +} + +.param-item { + display: flex; + flex-wrap: wrap; + align-items: baseline; + gap: 0.5rem; + padding: 0.5rem 0; + border-bottom: 1px solid #e5e7eb; +} +.param-item:last-child { + border-bottom: none; + padding-bottom: 0; +} + +.param-badge { + display: inline-block; + width: 4.5rem; + padding: 0.125rem 0; + font-size: 0.625rem; + font-weight: 600; + text-transform: uppercase; + letter-spacing: 0.025em; + border-radius: 0.25rem; + text-align: center; +} +.param-optional { + background-color: #e5e7eb; + color: #4b5563; +} +.param-required { + background-color: #fee2e2; + color: #991b1b; +} + +.param-type { + display: inline-block; + width: 4rem; + font-size: 0.75rem; + font-family: 'Atkinson Hyperlegible Mono', ui-monospace, monospace; + color: #6b7280; + background-color: #e5e7eb; + padding: 0.125rem 0; + border-radius: 0.25rem; + text-align: center; +} + +.param-name { + font-weight: 600; + font-family: 'Atkinson Hyperlegible Mono', ui-monospace, monospace; + color: #111827; +} + +.param-default { + font-size: 0.75rem; + color: #6b7280; +} + +.param-constraint { + display: inline-block; + font-size: 0.6875rem; + font-family: 'Atkinson Hyperlegible Mono', ui-monospace, monospace; + color: #1e40af; + background-color: #dbeafe; + padding: 0.0625rem 0.375rem; + border-radius: 0.25rem; +} + +.param-hint { + flex-basis: 100%; + font-size: 0.8125rem; + color: #4b5563; + margin-top: 0.25rem; + padding-left: 0; +} + +/* Empty state */ +.empty-state { + background-color: #fffbeb; + border: 1px solid #fde68a; + border-radius: 0.5rem; + overflow: hidden; + margin-top: 1rem; +} +.empty-state-header { + padding: 0.75rem 1rem; + background-color: #fef3c7; + font-weight: 500; + color: #92400e; +} +.empty-state-body { + padding: 1rem; + color: #92400e; +} +.empty-state-body p { + margin-bottom: 0.75rem; +} +.empty-state-body p:last-child { + margin-bottom: 0; +} +.empty-state-body a { + color: #b45309; + text-decoration: underline; +} +.empty-state-body code { + background-color: #fef3c7; + padding: 0.125rem 0.25rem; + border-radius: 0.25rem; +} + +/* Sort picker */ +.sort-picker { + display: inline-flex; + border: 1px solid #d1d5db; + border-radius: 0.375rem; + overflow: hidden; +} + +.sort-btn { + padding: 0.25rem 0.625rem; + font-size: 0.75rem; + font-weight: 500; + background: white; + color: #4b5563; + border: none; + border-right: 1px solid #d1d5db; + cursor: pointer; + transition: all 0.15s; +} +.sort-btn:last-child { + border-right: none; +} +.sort-btn:hover { + background-color: #f3f4f6; +} +.sort-btn.active { + background-color: #2563eb; + color: white; +} + +/* Stack trace */ +.stackTrace { + display: none; + margin-top: 0.5rem; +} +.stackTrace.show { + display: block; +} + +/* Utility */ +.text-muted { + color: #4b5563; +} +.font-mono { + font-family: 'Atkinson Hyperlegible Mono', ui-monospace, monospace; +} +.mb-4 { + margin-bottom: 1rem; +} +.mt-4 { + margin-top: 1rem; +} diff --git a/v1/taffy/dashboard/docs.cfm b/v1/taffy/dashboard/docs.cfm index f957853..20088b6 100644 --- a/v1/taffy/dashboard/docs.cfm +++ b/v1/taffy/dashboard/docs.cfm @@ -4,8 +4,13 @@ <cfoutput>#application._taffy.settings.docs.APIName# Documentation - #application._taffy.settings.docs.APIversion#</cfoutput> + + + + + @@ -14,15 +19,29 @@ window.taffy = { resources: {} }; -
-
-

#application._taffy.settings.docs.APIName#

- Version #application._taffy.settings.docs.APIversion# -
+
-
-

Resources:

-
+
+
+

#application._taffy.settings.docs.APIName#

+ Version #application._taffy.settings.docs.APIversion# +
+
+ +
+
+ +
+
+

Resources:

+
+ + + +
+
+ +
@@ -31,159 +50,144 @@ continue; -
-
-

- - - #local.beanMeta['taffy:docs:name']# - - #local.beanMeta['taffy_docs_name']# - - #local.currentResource.beanName# - - - - - #ucase(listFirst(local.verb,'|'))# + + + + + + +
+
+ #local.displayName# + + #local.currentResource.srcUri# + + + #local.verb# - #local.currentResource.srcUri# -

+
-
-
-
- - -
#docData.hint#

- - - - - - - - - +
+ + + +

#local.docData.hint#

+
+ + + + + + + + + + + + continue; + + +
+
#thisVerb#
+ +

#local.func.hint#

+
+ + + + + + - - continue; - - -
#thisVerb#
- -
#local.func.hint#
-
-
- - - - - - continue; - - - - -
-
-
Inputs
-
-
-
- - - - continue; - -
-
- #local.param.name# - - optional - - required - - - #local.param.type# - - - - (default: "") - - (default: #local.param.default#) - - - - - -

#local.param.hint#

-
-
-
-
-
-
-
-
- - - - - - - - - - - - -
-
-
-
-
- Sample Response -
-
-
-
-
- -
-
-
-
-
-
-
- -
-
-
+ +
+ +
+ +
+ + optional + + required + + + #local.param.type# + + #local.param.name# + + min length: #local.param["taffy_minlength"]# + + + max length: #local.param["taffy_maxlength"]# + + + min: #local.param["taffy_min"]# + + + max: #local.param["taffy_max"]# + + + pattern: #local.param["taffy_pattern"]# + + + + (default: "")(default: #local.param.default#) + + + +

#local.param.hint#

+
+
+
+
+
+
+ + + + + + + + + + + + +
+ +
+
#serializeJson(sample)#
+
+
+
+ +
+
-
-
+
+ -
-
Taffy is running but you haven't defined any resources yet.
-
+
+
Taffy is running but you haven't defined any resources yet.
+

It looks like you don't have any resources defined. Get started by creating the folder #guessResourcesFullPath()#, in which you should place your @@ -201,19 +205,103 @@

-
Resources are listed in matching order. From top to bottom, the first URI to match the request is used.
-
-
+ +
+ +
diff --git a/v1/taffy/dashboard/highlight-github.min.css b/v1/taffy/dashboard/highlight-github.min.css index bf6226c..275239a 100644 --- a/v1/taffy/dashboard/highlight-github.min.css +++ b/v1/taffy/dashboard/highlight-github.min.css @@ -1,31 +1,10 @@ -/* -github.com style (c) Vasily Polovnyov +pre code.hljs{display:block;overflow-x:auto;padding:1em}code.hljs{padding:3px 5px}/*! + Theme: GitHub + Description: Light theme as seen on github.com + Author: github.com + Maintainer: @Hirse + Updated: 2021-05-15 -highlight.js v8.2 - -Copyright (c) 2006, Ivan Sagalaev -All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of highlight.js nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -.hljs{display:block;overflow-x:auto;padding:.5em;color:#333;background:#f8f8f8;-webkit-text-size-adjust:none}.hljs-comment,.hljs-template_comment,.diff .hljs-header,.hljs-javadoc{color:#998;font-style:italic}.hljs-keyword,.css .rule .hljs-keyword,.hljs-winutils,.javascript .hljs-title,.nginx .hljs-title,.hljs-subst,.hljs-request,.hljs-status{color:#333;font-weight:bold}.hljs-number,.hljs-hexcolor,.ruby .hljs-constant{color:#008080}.hljs-string,.hljs-tag .hljs-value,.hljs-phpdoc,.hljs-dartdoc,.tex .hljs-formula{color:#d14}.hljs-title,.hljs-id,.scss .hljs-preprocessor{color:#900;font-weight:bold}.javascript .hljs-title,.hljs-list .hljs-keyword,.hljs-subst{font-weight:normal}.hljs-class .hljs-title,.hljs-type,.vhdl .hljs-literal,.tex .hljs-command{color:#458;font-weight:bold}.hljs-tag,.hljs-tag .hljs-title,.hljs-rules .hljs-property,.django .hljs-tag .hljs-keyword{color:#000080;font-weight:normal}.hljs-attribute,.hljs-variable,.lisp .hljs-body{color:#008080}.hljs-regexp{color:#009926}.hljs-symbol,.ruby .hljs-symbol .hljs-string,.lisp .hljs-keyword,.clojure .hljs-keyword,.scheme .hljs-keyword,.tex .hljs-special,.hljs-prompt{color:#990073}.hljs-built_in{color:#0086b3}.hljs-preprocessor,.hljs-pragma,.hljs-pi,.hljs-doctype,.hljs-shebang,.hljs-cdata{color:#999;font-weight:bold}.hljs-deletion{background:#fdd}.hljs-addition{background:#dfd}.diff .hljs-change{background:#0086b3}.hljs-chunk{color:#aaa} + Outdated base version: https://github.com/primer/github-syntax-light + Current colors taken from GitHub's CSS +*/.hljs{color:#24292e;background:#fff}.hljs-doctag,.hljs-keyword,.hljs-meta .hljs-keyword,.hljs-template-tag,.hljs-template-variable,.hljs-type,.hljs-variable.language_{color:#d73a49}.hljs-title,.hljs-title.class_,.hljs-title.class_.inherited__,.hljs-title.function_{color:#6f42c1}.hljs-attr,.hljs-attribute,.hljs-literal,.hljs-meta,.hljs-number,.hljs-operator,.hljs-selector-attr,.hljs-selector-class,.hljs-selector-id,.hljs-variable{color:#005cc5}.hljs-meta .hljs-string,.hljs-regexp,.hljs-string{color:#032f62}.hljs-built_in,.hljs-symbol{color:#e36209}.hljs-code,.hljs-comment,.hljs-formula{color:#6a737d}.hljs-name,.hljs-quote,.hljs-selector-pseudo,.hljs-selector-tag{color:#22863a}.hljs-subst{color:#24292e}.hljs-section{color:#005cc5;font-weight:700}.hljs-bullet{color:#735c0f}.hljs-emphasis{color:#24292e;font-style:italic}.hljs-strong{color:#24292e;font-weight:700}.hljs-addition{color:#22863a;background-color:#f0fff4}.hljs-deletion{color:#b31d28;background-color:#ffeef0} \ No newline at end of file diff --git a/v1/taffy/dashboard/highlight.min.js b/v1/taffy/dashboard/highlight.min.js index b518872..5d699ae 100644 --- a/v1/taffy/dashboard/highlight.min.js +++ b/v1/taffy/dashboard/highlight.min.js @@ -1,29 +1,1213 @@ -/* -highlight.js v8.2 - -Copyright (c) 2006, Ivan Sagalaev -All rights reserved. -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - * Redistributions of source code must retain the above copyright - notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. - * Neither the name of highlight.js nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND ANY -EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE REGENTS AND CONTRIBUTORS BE LIABLE FOR ANY -DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND -ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. -*/ -var hljs=new function(){function j(v){return v.replace(/&/gm,"&").replace(//gm,">")}function t(v){return v.nodeName.toLowerCase()}function h(w,x){var v=w&&w.exec(x);return v&&v.index==0}function r(w){var v=(w.className+" "+(w.parentNode?w.parentNode.className:"")).split(/\s+/);v=v.map(function(x){return x.replace(/^lang(uage)?-/,"")});return v.filter(function(x){return i(x)||/no(-?)highlight/.test(x)})[0]}function o(x,y){var v={};for(var w in x){v[w]=x[w]}if(y){for(var w in y){v[w]=y[w]}}return v}function u(x){var v=[];(function w(y,z){for(var A=y.firstChild;A;A=A.nextSibling){if(A.nodeType==3){z+=A.nodeValue.length}else{if(A.nodeType==1){v.push({event:"start",offset:z,node:A});z=w(A,z);if(!t(A).match(/br|hr|img|input/)){v.push({event:"stop",offset:z,node:A})}}}}return z})(x,0);return v}function q(w,y,C){var x=0;var F="";var z=[];function B(){if(!w.length||!y.length){return w.length?w:y}if(w[0].offset!=y[0].offset){return(w[0].offset"}function E(G){F+=""}function v(G){(G.event=="start"?A:E)(G.node)}while(w.length||y.length){var D=B();F+=j(C.substr(x,D[0].offset-x));x=D[0].offset;if(D==w){z.reverse().forEach(E);do{v(D.splice(0,1)[0]);D=B()}while(D==w&&D.length&&D[0].offset==x);z.reverse().forEach(A)}else{if(D[0].event=="start"){z.push(D[0].node)}else{z.pop()}v(D.splice(0,1)[0])}}return F+j(C.substr(x))}function m(y){function v(z){return(z&&z.source)||z}function w(A,z){return RegExp(v(A),"m"+(y.cI?"i":"")+(z?"g":""))}function x(D,C){if(D.compiled){return}D.compiled=true;D.k=D.k||D.bK;if(D.k){var z={};var E=function(G,F){if(y.cI){F=F.toLowerCase()}F.split(" ").forEach(function(H){var I=H.split("|");z[I[0]]=[G,I[1]?Number(I[1]):1]})};if(typeof D.k=="string"){E("keyword",D.k)}else{Object.keys(D.k).forEach(function(F){E(F,D.k[F])})}D.k=z}D.lR=w(D.l||/\b[A-Za-z0-9_]+\b/,true);if(C){if(D.bK){D.b="\\b("+D.bK.split(" ").join("|")+")\\b"}if(!D.b){D.b=/\B|\b/}D.bR=w(D.b);if(!D.e&&!D.eW){D.e=/\B|\b/}if(D.e){D.eR=w(D.e)}D.tE=v(D.e)||"";if(D.eW&&C.tE){D.tE+=(D.e?"|":"")+C.tE}}if(D.i){D.iR=w(D.i)}if(D.r===undefined){D.r=1}if(!D.c){D.c=[]}var B=[];D.c.forEach(function(F){if(F.v){F.v.forEach(function(G){B.push(o(F,G))})}else{B.push(F=="self"?D:F)}});D.c=B;D.c.forEach(function(F){x(F,D)});if(D.starts){x(D.starts,C)}var A=D.c.map(function(F){return F.bK?"\\.?("+F.b+")\\.?":F.b}).concat([D.tE,D.i]).map(v).filter(Boolean);D.t=A.length?w(A.join("|"),true):{exec:function(F){return null}}}x(y)}function c(T,L,J,R){function v(V,W){for(var U=0;U";V+=aa+'">';return V+Y+Z}function N(){if(!I.k){return j(C)}var U="";var X=0;I.lR.lastIndex=0;var V=I.lR.exec(C);while(V){U+=j(C.substr(X,V.index-X));var W=E(I,V);if(W){H+=W[1];U+=w(W[0],j(V[0]))}else{U+=j(V[0])}X=I.lR.lastIndex;V=I.lR.exec(C)}return U+j(C.substr(X))}function F(){if(I.sL&&!f[I.sL]){return j(C)}var U=I.sL?c(I.sL,C,true,S):e(C);if(I.r>0){H+=U.r}if(I.subLanguageMode=="continuous"){S=U.top}return w(U.language,U.value,false,true)}function Q(){return I.sL!==undefined?F():N()}function P(W,V){var U=W.cN?w(W.cN,"",true):"";if(W.rB){D+=U;C=""}else{if(W.eB){D+=j(V)+U;C=""}else{D+=U;C=V}}I=Object.create(W,{parent:{value:I}})}function G(U,Y){C+=U;if(Y===undefined){D+=Q();return 0}var W=v(Y,I);if(W){D+=Q();P(W,Y);return W.rB?0:Y.length}var X=z(I,Y);if(X){var V=I;if(!(V.rE||V.eE)){C+=Y}D+=Q();do{if(I.cN){D+=""}H+=I.r;I=I.parent}while(I!=X.parent);if(V.eE){D+=j(Y)}C="";if(X.starts){P(X.starts,"")}return V.rE?0:Y.length}if(A(Y,I)){throw new Error('Illegal lexeme "'+Y+'" for mode "'+(I.cN||"")+'"')}C+=Y;return Y.length||1}var M=i(T);if(!M){throw new Error('Unknown language: "'+T+'"')}m(M);var I=R||M;var S;var D="";for(var K=I;K!=M;K=K.parent){if(K.cN){D=w(K.cN,"",true)+D}}var C="";var H=0;try{var B,y,x=0;while(true){I.t.lastIndex=x;B=I.t.exec(L);if(!B){break}y=G(L.substr(x,B.index-x),B[0]);x=B.index+y}G(L.substr(x));for(var K=I;K.parent;K=K.parent){if(K.cN){D+=""}}return{r:H,value:D,language:T,top:I}}catch(O){if(O.message.indexOf("Illegal")!=-1){return{r:0,value:j(L)}}else{throw O}}}function e(y,x){x=x||b.languages||Object.keys(f);var v={r:0,value:j(y)};var w=v;x.forEach(function(z){if(!i(z)){return}var A=c(z,y,false);A.language=z;if(A.r>w.r){w=A}if(A.r>v.r){w=v;v=A}});if(w.language){v.second_best=w}return v}function g(v){if(b.tabReplace){v=v.replace(/^((<[^>]+>|\t)+)/gm,function(w,z,y,x){return z.replace(/\t/g,b.tabReplace)})}if(b.useBR){v=v.replace(/\n/g,"
")}return v}function p(A){var B=r(A);if(/no(-?)highlight/.test(B)){return}var y;if(b.useBR){y=document.createElementNS("http://www.w3.org/1999/xhtml","div");y.innerHTML=A.innerHTML.replace(/\n/g,"").replace(//g,"\n")}else{y=A}var z=y.textContent;var v=B?c(B,z,true):e(z);var x=u(y);if(x.length){var w=document.createElementNS("http://www.w3.org/1999/xhtml","div");w.innerHTML=v.value;v.value=q(x,u(w),z)}v.value=g(v.value);A.innerHTML=v.value;A.className+=" hljs "+(!B&&v.language||"");A.result={language:v.language,re:v.r};if(v.second_best){A.second_best={language:v.second_best.language,re:v.second_best.r}}}var b={classPrefix:"hljs-",tabReplace:null,useBR:false,languages:undefined};function s(v){b=o(b,v)}function l(){if(l.called){return}l.called=true;var v=document.querySelectorAll("pre code");Array.prototype.forEach.call(v,p)}function a(){addEventListener("DOMContentLoaded",l,false);addEventListener("load",l,false)}var f={};var n={};function d(v,x){var w=f[v]=x(this);if(w.aliases){w.aliases.forEach(function(y){n[y]=v})}}function k(){return Object.keys(f)}function i(v){return f[v]||f[n[v]]}this.highlight=c;this.highlightAuto=e;this.fixMarkup=g;this.highlightBlock=p;this.configure=s;this.initHighlighting=l;this.initHighlightingOnLoad=a;this.registerLanguage=d;this.listLanguages=k;this.getLanguage=i;this.inherit=o;this.IR="[a-zA-Z][a-zA-Z0-9_]*";this.UIR="[a-zA-Z_][a-zA-Z0-9_]*";this.NR="\\b\\d+(\\.\\d+)?";this.CNR="(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)";this.BNR="\\b(0b[01]+)";this.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~";this.BE={b:"\\\\[\\s\\S]",r:0};this.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[this.BE]};this.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[this.BE]};this.PWM={b:/\b(a|an|the|are|I|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such)\b/};this.CLCM={cN:"comment",b:"//",e:"$",c:[this.PWM]};this.CBCM={cN:"comment",b:"/\\*",e:"\\*/",c:[this.PWM]};this.HCM={cN:"comment",b:"#",e:"$",c:[this.PWM]};this.NM={cN:"number",b:this.NR,r:0};this.CNM={cN:"number",b:this.CNR,r:0};this.BNM={cN:"number",b:this.BNR,r:0};this.CSSNM={cN:"number",b:this.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0};this.RM={cN:"regexp",b:/\//,e:/\/[gim]*/,i:/\n/,c:[this.BE,{b:/\[/,e:/\]/,r:0,c:[this.BE]}]};this.TM={cN:"title",b:this.IR,r:0};this.UTM={cN:"title",b:this.UIR,r:0}}();hljs.registerLanguage("coffeescript",function(c){var b={keyword:"in if for while finally new do return else break catch instanceof throw try this switch continue typeof delete debugger super then unless until loop of by when and or is isnt not",literal:"true false null undefined yes no on off",reserved:"case default function var void with const let enum export import native __hasProp __extends __slice __bind __indexOf",built_in:"npm require console print module global window document"};var a="[A-Za-z$_][0-9A-Za-z$_]*";var f=c.inherit(c.TM,{b:a});var e={cN:"subst",b:/#\{/,e:/}/,k:b};var d=[c.BNM,c.inherit(c.CNM,{starts:{e:"(\\s*/)?",r:0}}),{cN:"string",v:[{b:/'''/,e:/'''/,c:[c.BE]},{b:/'/,e:/'/,c:[c.BE]},{b:/"""/,e:/"""/,c:[c.BE,e]},{b:/"/,e:/"/,c:[c.BE,e]}]},{cN:"regexp",v:[{b:"///",e:"///",c:[e,c.HCM]},{b:"//[gim]*",r:0},{b:/\/(?![ *])(\\\/|.)*?\/[gim]*(?=\W|$)/}]},{cN:"property",b:"@"+a},{b:"`",e:"`",eB:true,eE:true,sL:"javascript"}];e.c=d;return{aliases:["coffee","cson","iced"],k:b,i:/\/\*/,c:d.concat([{cN:"comment",b:"###",e:"###"},c.HCM,{cN:"function",b:"(^\\s*|\\B)("+a+"\\s*=\\s*)?(\\(.*\\))?\\s*\\B[-=]>",e:"[-=]>",rB:true,c:[f,{cN:"params",b:"\\([^\\(]",rB:true,c:[{b:/\(/,e:/\)/,k:b,c:["self"].concat(d)}]}]},{cN:"class",bK:"class",e:"$",i:/[:="\[\]]/,c:[{bK:"extends",eW:true,i:/[:="\[\]]/,c:[f]},f]},{cN:"attribute",b:a+":",e:":",rB:true,eE:true,r:0}])}});hljs.registerLanguage("nginx",function(c){var b={cN:"variable",v:[{b:/\$\d+/},{b:/\$\{/,e:/}/},{b:"[\\$\\@]"+c.UIR}]};var a={eW:true,l:"[a-z/_]+",k:{built_in:"on off yes no true false none blocked debug info notice warn error crit select break last permanent redirect kqueue rtsig epoll poll /dev/poll"},r:0,i:"=>",c:[c.HCM,{cN:"string",c:[c.BE,b],v:[{b:/"/,e:/"/},{b:/'/,e:/'/}]},{cN:"url",b:"([a-z]+):/",e:"\\s",eW:true,eE:true,c:[b]},{cN:"regexp",c:[c.BE,b],v:[{b:"\\s\\^",e:"\\s|{|;",rE:true},{b:"~\\*?\\s+",e:"\\s|{|;",rE:true},{b:"\\*(\\.[a-z\\-]+)+"},{b:"([a-z\\-]+\\.)+\\*"}]},{cN:"number",b:"\\b\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}(:\\d{1,5})?\\b"},{cN:"number",b:"\\b\\d+[kKmMgGdshdwy]*\\b",r:0},b]};return{aliases:["nginxconf"],c:[c.HCM,{b:c.UIR+"\\s",e:";|{",rB:true,c:[{cN:"title",b:c.UIR,starts:a}],r:0}],i:"[^\\s\\}]"}});hljs.registerLanguage("json",function(a){var e={literal:"true false null"};var d=[a.QSM,a.CNM];var c={cN:"value",e:",",eW:true,eE:true,c:d,k:e};var b={b:"{",e:"}",c:[{cN:"attribute",b:'\\s*"',e:'"\\s*:\\s*',eB:true,eE:true,c:[a.BE],i:"\\n",starts:c}],i:"\\S"};var f={b:"\\[",e:"\\]",c:[a.inherit(c,{cN:null})],i:"\\S"};d.splice(d.length,0,b,f);return{c:d,k:e,i:"\\S"}});hljs.registerLanguage("http",function(a){return{i:"\\S",c:[{cN:"status",b:"^HTTP/[0-9\\.]+",e:"$",c:[{cN:"number",b:"\\b\\d{3}\\b"}]},{cN:"request",b:"^[A-Z]+ (.*?) HTTP/[0-9\\.]+$",rB:true,e:"$",c:[{cN:"string",b:" ",e:" ",eB:true,eE:true}]},{cN:"attribute",b:"^\\w",e:": ",eE:true,i:"\\n|\\s|=",starts:{cN:"string",e:"$"}},{b:"\\n\\n",starts:{sL:"",eW:true}}]}});hljs.registerLanguage("javascript",function(a){return{aliases:["js"],k:{keyword:"in if for while finally var new function do return void else break catch instanceof with throw case default try this switch continue typeof delete let yield const class",literal:"true false null undefined NaN Infinity",built_in:"eval isFinite isNaN parseFloat parseInt decodeURI decodeURIComponent encodeURI encodeURIComponent escape unescape Object Function Boolean Error EvalError InternalError RangeError ReferenceError StopIteration SyntaxError TypeError URIError Number Math Date String RegExp Array Float32Array Float64Array Int16Array Int32Array Int8Array Uint16Array Uint32Array Uint8Array Uint8ClampedArray ArrayBuffer DataView JSON Intl arguments require module console window document"},c:[{cN:"pi",b:/^\s*('|")use strict('|")/,r:10},a.ASM,a.QSM,a.CLCM,a.CBCM,a.CNM,{b:"("+a.RSR+"|\\b(case|return|throw)\\b)\\s*",k:"return throw case",c:[a.CLCM,a.CBCM,a.RM,{b:/;/,r:0,sL:"xml"}],r:0},{cN:"function",bK:"function",e:/\{/,eE:true,c:[a.inherit(a.TM,{b:/[A-Za-z$_][0-9A-Za-z$_]*/}),{cN:"params",b:/\(/,e:/\)/,c:[a.CLCM,a.CBCM],i:/["'\(]/}],i:/\[|%/},{b:/\$[(.]/},{b:"\\."+a.IR,r:0}]}});hljs.registerLanguage("sql",function(a){var b={cN:"comment",b:"--",e:"$"};return{cI:true,i:/[<>]/,c:[{cN:"operator",bK:"begin end start commit rollback savepoint lock alter create drop rename call delete do handler insert load replace select truncate update set show pragma grant merge describe use explain help declare prepare execute deallocate savepoint release unlock purge reset change stop analyze cache flush optimize repair kill install uninstall checksum restore check backup",e:/;/,eW:true,k:{keyword:"abs absolute acos action add adddate addtime aes_decrypt aes_encrypt after aggregate all allocate alter analyze and any are as asc ascii asin assertion at atan atan2 atn2 authorization authors avg backup before begin benchmark between bin binlog bit_and bit_count bit_length bit_or bit_xor both by cache call cascade cascaded case cast catalog ceil ceiling chain change changed char_length character_length charindex charset check checksum checksum_agg choose close coalesce coercibility collate collation collationproperty column columns columns_updated commit compress concat concat_ws concurrent connect connection connection_id consistent constraint constraints continue contributors conv convert convert_tz corresponding cos cot count count_big crc32 create cross cume_dist curdate current current_date current_time current_timestamp current_user cursor curtime data database databases datalength date_add date_format date_sub dateadd datediff datefromparts datename datepart datetime2fromparts datetimeoffsetfromparts day dayname dayofmonth dayofweek dayofyear deallocate declare decode default deferrable deferred degrees delayed delete des_decrypt des_encrypt des_key_file desc describe descriptor diagnostics difference disconnect distinct distinctrow div do domain double drop dumpfile each else elt enclosed encode encrypt end end-exec engine engines eomonth errors escape escaped event eventdata events except exception exec execute exists exp explain export_set extended external extract fast fetch field fields find_in_set first first_value floor flush for force foreign format found found_rows from from_base64 from_days from_unixtime full function get get_format get_lock getdate getutcdate global go goto grant grants greatest group group_concat grouping grouping_id gtid_subset gtid_subtract handler having help hex high_priority hosts hour ident_current ident_incr ident_seed identified identity if ifnull ignore iif ilike immediate in index indicator inet6_aton inet6_ntoa inet_aton inet_ntoa infile initially inner innodb input insert install instr intersect into is is_free_lock is_ipv4 is_ipv4_compat is_ipv4_mapped is_not is_not_null is_used_lock isdate isnull isolation join key kill language last last_day last_insert_id last_value lcase lead leading least leaves left len lenght level like limit lines ln load load_file local localtime localtimestamp locate lock log log10 log2 logfile logs low_priority lower lpad ltrim make_set makedate maketime master master_pos_wait match matched max md5 medium merge microsecond mid min minute mod mode module month monthname mutex name_const names national natural nchar next no no_write_to_binlog not now nullif nvarchar oct octet_length of old_password on only open optimize option optionally or ord order outer outfile output pad parse partial partition password patindex percent_rank percentile_cont percentile_disc period_add period_diff pi plugin position pow power pragma precision prepare preserve primary prior privileges procedure procedure_analyze processlist profile profiles public publishingservername purge quarter query quick quote quotename radians rand read references regexp relative relaylog release release_lock rename repair repeat replace replicate reset restore restrict return returns reverse revoke right rlike rollback rollup round row row_count rows rpad rtrim savepoint schema scroll sec_to_time second section select serializable server session session_user set sha sha1 sha2 share show sign sin size slave sleep smalldatetimefromparts snapshot some soname soundex sounds_like space sql sql_big_result sql_buffer_result sql_cache sql_calc_found_rows sql_no_cache sql_small_result sql_variant_property sqlstate sqrt square start starting status std stddev stddev_pop stddev_samp stdev stdevp stop str str_to_date straight_join strcmp string stuff subdate substr substring subtime subtring_index sum switchoffset sysdate sysdatetime sysdatetimeoffset system_user sysutcdatetime table tables tablespace tan temporary terminated tertiary_weights then time time_format time_to_sec timediff timefromparts timestamp timestampadd timestampdiff timezone_hour timezone_minute to to_base64 to_days to_seconds todatetimeoffset trailing transaction translation trigger trigger_nestlevel triggers trim truncate try_cast try_convert try_parse ucase uncompress uncompressed_length unhex unicode uninstall union unique unix_timestamp unknown unlock update upgrade upped upper usage use user user_resources using utc_date utc_time utc_timestamp uuid uuid_short validate_password_strength value values var var_pop var_samp variables variance varp version view warnings week weekday weekofyear weight_string when whenever where with work write xml xor year yearweek zon",literal:"true false null",built_in:"array bigint binary bit blob boolean char character date dec decimal float int integer interval number numeric real serial smallint varchar varying int8 serial8 text"},c:[{cN:"string",b:"'",e:"'",c:[a.BE,{b:"''"}]},{cN:"string",b:'"',e:'"',c:[a.BE,{b:'""'}]},{cN:"string",b:"`",e:"`",c:[a.BE]},a.CNM,a.CBCM,b]},a.CBCM,b]}});hljs.registerLanguage("php",function(b){var e={cN:"variable",b:"(\\$|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*"};var a={cN:"preprocessor",b:/<\?(php)?|\?>/};var c={cN:"string",c:[b.BE,a],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},b.inherit(b.ASM,{i:null}),b.inherit(b.QSM,{i:null})]};var d={v:[b.BNM,b.CNM]};return{aliases:["php3","php4","php5","php6"],cI:true,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally",c:[b.CLCM,b.HCM,{cN:"comment",b:"/\\*",e:"\\*/",c:[{cN:"phpdoc",b:"\\s@[A-Za-z]+"},a]},{cN:"comment",b:"__halt_compiler.+?;",eW:true,k:"__halt_compiler",l:b.UIR},{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[b.BE]},a,e,{cN:"function",bK:"function",e:/[;{]/,eE:true,i:"\\$|\\[|%",c:[b.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",e,b.CBCM,c,d]}]},{cN:"class",bK:"class interface",e:"{",eE:true,i:/[:\(\$"]/,c:[{bK:"extends implements"},b.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[b.UTM]},{bK:"use",e:";",c:[b.UTM]},{b:"=>"},c,d]}});hljs.registerLanguage("makefile",function(a){var b={cN:"variable",b:/\$\(/,e:/\)/,c:[a.BE]};return{aliases:["mk","mak"],c:[a.HCM,{b:/^\w+\s*\W*=/,rB:true,r:0,starts:{cN:"constant",e:/\s*\W*=/,eE:true,starts:{e:/$/,r:0,c:[b]}}},{cN:"title",b:/^[\w]+:\s*$/},{cN:"phony",b:/^\.PHONY:/,e:/$/,k:".PHONY",l:/[\.\w]+/},{b:/^\t+/,e:/$/,r:0,c:[a.QSM,b]}]}});hljs.registerLanguage("bash",function(b){var a={cN:"variable",v:[{b:/\$[\w\d#@][\w\d_]*/},{b:/\$\{(.*?)\}/}]};var d={cN:"string",b:/"/,e:/"/,c:[b.BE,a,{cN:"variable",b:/\$\(/,e:/\)/,c:[b.BE]}]};var c={cN:"string",b:/'/,e:/'/};return{aliases:["sh","zsh"],l:/-?[a-z\.]+/,k:{keyword:"if then else elif fi for break continue while in do done exit return set declare case esac export exec",literal:"true false",built_in:"printf echo read cd pwd pushd popd dirs let eval unset typeset readonly getopts source shopt caller type hash bind help sudo",operator:"-ne -eq -lt -gt -f -d -e -s -l -a"},c:[{cN:"shebang",b:/^#![^\n]+sh\s*$/,r:10},{cN:"function",b:/\w[\w\d_]*\s*\(\s*\)\s*\{/,rB:true,c:[b.inherit(b.TM,{b:/\w[\w\d_]*/})],r:0},b.HCM,b.NM,d,c,a]}});hljs.registerLanguage("cpp",function(a){var b={keyword:"false int float while private char catch export virtual operator sizeof dynamic_cast|10 typedef const_cast|10 const struct for static_cast|10 union namespace unsigned long throw volatile static protected bool template mutable if public friend do return goto auto void enum else break new extern using true class asm case typeid short reinterpret_cast|10 default double register explicit signed typename try this switch continue wchar_t inline delete alignof char16_t char32_t constexpr decltype noexcept nullptr static_assert thread_local restrict _Bool complex _Complex _Imaginary",built_in:"std string cin cout cerr clog stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap array shared_ptr abort abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf"};return{aliases:["c","h","c++","h++"],k:b,i:""]',k:"include",i:"\\n"},a.CLCM]},{cN:"stl_container",b:"\\b(deque|list|queue|stack|vector|map|set|bitset|multiset|multimap|unordered_map|unordered_set|unordered_multiset|unordered_multimap|array)\\s*<",e:">",k:b,c:["self"]},{b:a.IR+"::"}]}});hljs.registerLanguage("perl",function(c){var d="getpwent getservent quotemeta msgrcv scalar kill dbmclose undef lc ma syswrite tr send umask sysopen shmwrite vec qx utime local oct semctl localtime readpipe do return format read sprintf dbmopen pop getpgrp not getpwnam rewinddir qqfileno qw endprotoent wait sethostent bless s|0 opendir continue each sleep endgrent shutdown dump chomp connect getsockname die socketpair close flock exists index shmgetsub for endpwent redo lstat msgctl setpgrp abs exit select print ref gethostbyaddr unshift fcntl syscall goto getnetbyaddr join gmtime symlink semget splice x|0 getpeername recv log setsockopt cos last reverse gethostbyname getgrnam study formline endhostent times chop length gethostent getnetent pack getprotoent getservbyname rand mkdir pos chmod y|0 substr endnetent printf next open msgsnd readdir use unlink getsockopt getpriority rindex wantarray hex system getservbyport endservent int chr untie rmdir prototype tell listen fork shmread ucfirst setprotoent else sysseek link getgrgid shmctl waitpid unpack getnetbyname reset chdir grep split require caller lcfirst until warn while values shift telldir getpwuid my getprotobynumber delete and sort uc defined srand accept package seekdir getprotobyname semop our rename seek if q|0 chroot sysread setpwent no crypt getc chown sqrt write setnetent setpriority foreach tie sin msgget map stat getlogin unless elsif truncate exec keys glob tied closedirioctl socket readlink eval xor readline binmode setservent eof ord bind alarm pipe atan2 getgrent exp time push setgrent gt lt or ne m|0 break given say state when";var f={cN:"subst",b:"[$@]\\{",e:"\\}",k:d};var g={b:"->{",e:"}"};var a={cN:"variable",v:[{b:/\$\d/},{b:/[\$\%\@](\^\w\b|#\w+(\:\:\w+)*|{\w+}|\w+(\:\:\w*)*)/},{b:/[\$\%\@][^\s\w{]/,r:0}]};var e={cN:"comment",b:"^(__END__|__DATA__)",e:"\\n$",r:5};var h=[c.BE,f,a];var b=[a,c.HCM,e,{cN:"comment",b:"^\\=\\w",e:"\\=cut",eW:true},g,{cN:"string",c:h,v:[{b:"q[qwxr]?\\s*\\(",e:"\\)",r:5},{b:"q[qwxr]?\\s*\\[",e:"\\]",r:5},{b:"q[qwxr]?\\s*\\{",e:"\\}",r:5},{b:"q[qwxr]?\\s*\\|",e:"\\|",r:5},{b:"q[qwxr]?\\s*\\<",e:"\\>",r:5},{b:"qw\\s+q",e:"q",r:5},{b:"'",e:"'",c:[c.BE]},{b:'"',e:'"'},{b:"`",e:"`",c:[c.BE]},{b:"{\\w+}",c:[],r:0},{b:"-?\\w+\\s*\\=\\>",c:[],r:0}]},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{b:"(\\/\\/|"+c.RSR+"|\\b(split|return|print|reverse|grep)\\b)\\s*",k:"split return print reverse grep",r:0,c:[c.HCM,e,{cN:"regexp",b:"(s|tr|y)/(\\\\.|[^/])*/(\\\\.|[^/])*/[a-z]*",r:10},{cN:"regexp",b:"(m|qr)?/",e:"/[a-z]*",c:[c.BE],r:0}]},{cN:"sub",bK:"sub",e:"(\\s*\\(.*?\\))?[;{]",r:5},{cN:"operator",b:"-\\w\\b",r:0}];f.c=b;g.c=b;return{aliases:["pl"],k:d,c:b}});hljs.registerLanguage("ini",function(a){return{cI:true,i:/\S/,c:[{cN:"comment",b:";",e:"$"},{cN:"title",b:"^\\[",e:"\\]"},{cN:"setting",b:"^[a-z0-9\\[\\]_-]+[ \\t]*=[ \\t]*",e:"$",c:[{cN:"value",eW:true,k:"on off true false yes no",c:[a.QSM,a.NM],r:0}]}]}});hljs.registerLanguage("apache",function(a){var b={cN:"number",b:"[\\$%]\\d+"};return{aliases:["apacheconf"],cI:true,c:[a.HCM,{cN:"tag",b:""},{cN:"keyword",b:/\w+/,r:0,k:{common:"order deny allow setenv rewriterule rewriteengine rewritecond documentroot sethandler errordocument loadmodule options header listen serverroot servername"},starts:{e:/$/,r:0,k:{literal:"on off all"},c:[{cN:"sqbracket",b:"\\s\\[",e:"\\]$"},{cN:"cbracket",b:"[\\$%]\\{",e:"\\}",c:["self",b]},b,a.QSM]}}],i:/\S/}});hljs.registerLanguage("java",function(c){var b=c.UIR+"(<"+c.UIR+">)?";var a="false synchronized int abstract float private char boolean static null if const for true while long throw strictfp finally protected import native final return void enum else break transient new catch instanceof byte super volatile case assert short package default double public try this switch continue throws protected public private";return{aliases:["jsp"],k:a,i:/<\//,c:[{cN:"javadoc",b:"/\\*\\*",e:"\\*/",r:0,c:[{cN:"javadoctag",b:"(^|\\s)@[A-Za-z]+"}]},c.CLCM,c.CBCM,c.ASM,c.QSM,{cN:"class",bK:"class interface",e:/[{;=]/,eE:true,k:"class interface",i:/[:"\[\]]/,c:[{bK:"extends implements"},c.UTM]},{bK:"new",e:/\s/,r:0},{cN:"function",b:"("+b+"\\s+)+"+c.UIR+"\\s*\\(",rB:true,e:/[{;=]/,eE:true,k:a,c:[{b:c.UIR+"\\s*\\(",rB:true,c:[c.UTM]},{cN:"params",b:/\(/,e:/\)/,k:a,c:[c.ASM,c.QSM,c.CNM,c.CBCM]},c.CLCM,c.CBCM]},c.CNM,{cN:"annotation",b:"@[A-Za-z]+"}]}});hljs.registerLanguage("xml",function(a){var c="[A-Za-z0-9\\._:-]+";var d={b:/<\?(php)?(?!\w)/,e:/\?>/,sL:"php",subLanguageMode:"continuous"};var b={eW:true,i:/]+/}]}]}]};return{aliases:["html","xhtml","rss","atom","xsl","plist"],cI:true,c:[{cN:"doctype",b:"",r:10,c:[{b:"\\[",e:"\\]"}]},{cN:"comment",b:"",r:10},{cN:"cdata",b:"<\\!\\[CDATA\\[",e:"\\]\\]>",r:10},{cN:"tag",b:"|$)",e:">",k:{title:"style"},c:[b],starts:{e:"",rE:true,sL:"css"}},{cN:"tag",b:"|$)",e:">",k:{title:"script"},c:[b],starts:{e:"<\/script>",rE:true,sL:"javascript"}},{b:"<%",e:"%>",sL:"vbscript"},d,{cN:"pi",b:/<\?\w+/,e:/\?>/,r:10},{cN:"tag",b:"",c:[{cN:"title",b:/[^ \/><\n\t]+/,r:0},b]}]}});hljs.registerLanguage("markdown",function(a){return{aliases:["md","mkdown","mkd"],c:[{cN:"header",v:[{b:"^#{1,6}",e:"$"},{b:"^.+?\\n[=-]{2,}$"}]},{b:"<",e:">",sL:"xml",r:0},{cN:"bullet",b:"^([*+-]|(\\d+\\.))\\s+"},{cN:"strong",b:"[*_]{2}.+?[*_]{2}"},{cN:"emphasis",v:[{b:"\\*.+?\\*"},{b:"_.+?_",r:0}]},{cN:"blockquote",b:"^>\\s+",e:"$"},{cN:"code",v:[{b:"`.+?`"},{b:"^( {4}|\t)",e:"$",r:0}]},{cN:"horizontal_rule",b:"^[-\\*]{3,}",e:"$"},{b:"\\[.+?\\][\\(\\[].*?[\\)\\]]",rB:true,c:[{cN:"link_label",b:"\\[",e:"\\]",eB:true,rE:true,r:0},{cN:"link_url",b:"\\]\\(",e:"\\)",eB:true,eE:true},{cN:"link_reference",b:"\\]\\[",e:"\\]",eB:true,eE:true}],r:10},{b:"^\\[.+\\]:",rB:true,c:[{cN:"link_reference",b:"\\[",e:"\\]:",eB:true,eE:true,starts:{cN:"link_url",e:"$"}}]}]}});hljs.registerLanguage("cs",function(c){var b="abstract as base bool break byte case catch char checked const continue decimal default delegate do double else enum event explicit extern false finally fixed float for foreach goto if implicit in int interface internal is lock long new null object operator out override params private protected public readonly ref return sbyte sealed short sizeof stackalloc static string struct switch this throw true try typeof uint ulong unchecked unsafe ushort using virtual volatile void while async await protected public private internal ascending descending from get group into join let orderby partial select set value var where yield";var a=c.IR+"(<"+c.IR+">)?";return{aliases:["csharp"],k:b,i:/::/,c:[{cN:"comment",b:"///",e:"$",rB:true,c:[{cN:"xmlDocTag",v:[{b:"///",r:0},{b:""},{b:""}]}]},c.CLCM,c.CBCM,{cN:"preprocessor",b:"#",e:"$",k:"if else elif endif define undef warning error line region endregion pragma checksum"},{cN:"string",b:'@"',e:'"',c:[{b:'""'}]},c.ASM,c.QSM,c.CNM,{bK:"class namespace interface",e:/[{;=]/,i:/[^\s:]/,c:[c.TM,c.CLCM,c.CBCM]},{bK:"new",e:/\s/,r:0},{cN:"function",b:"("+a+"\\s+)+"+c.IR+"\\s*\\(",rB:true,e:/[{;=]/,eE:true,k:b,c:[{b:c.IR+"\\s*\\(",rB:true,c:[c.TM]},{cN:"params",b:/\(/,e:/\)/,k:b,c:[c.ASM,c.QSM,c.CNM,c.CBCM]},c.CLCM,c.CBCM]}]}});hljs.registerLanguage("ruby",function(f){var j="[a-zA-Z_]\\w*[!?=]?|[-+~]\\@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?";var i="and false then defined module in return redo if BEGIN retry end for true self when next until do begin unless END rescue nil else break undef not super class case require yield alias while ensure elsif or include attr_reader attr_writer attr_accessor";var b={cN:"yardoctag",b:"@[A-Za-z]+"};var c={cN:"value",b:"#<",e:">"};var k={cN:"comment",v:[{b:"#",e:"$",c:[b]},{b:"^\\=begin",e:"^\\=end",c:[b],r:10},{b:"^__END__",e:"\\n$"}]};var d={cN:"subst",b:"#\\{",e:"}",k:i};var e={cN:"string",c:[f.BE,d],v:[{b:/'/,e:/'/},{b:/"/,e:/"/},{b:"%[qw]?\\(",e:"\\)"},{b:"%[qw]?\\[",e:"\\]"},{b:"%[qw]?{",e:"}"},{b:"%[qw]?<",e:">"},{b:"%[qw]?/",e:"/"},{b:"%[qw]?%",e:"%"},{b:"%[qw]?-",e:"-"},{b:"%[qw]?\\|",e:"\\|"},{b:/\B\?(\\\d{1,3}|\\x[A-Fa-f0-9]{1,2}|\\u[A-Fa-f0-9]{4}|\\?\S)\b/}]};var a={cN:"params",b:"\\(",e:"\\)",k:i};var h=[e,c,k,{cN:"class",bK:"class module",e:"$|;",i:/=/,c:[f.inherit(f.TM,{b:"[A-Za-z_]\\w*(::\\w+)*(\\?|\\!)?"}),{cN:"inheritance",b:"<\\s*",c:[{cN:"parent",b:"("+f.IR+"::)?"+f.IR}]},k]},{cN:"function",bK:"def",e:" |$|;",r:0,c:[f.inherit(f.TM,{b:j}),a,k]},{cN:"constant",b:"(::)?(\\b[A-Z]\\w*(::)?)+",r:0},{cN:"symbol",b:f.UIR+"(\\!|\\?)?:",r:0},{cN:"symbol",b:":",c:[e,{b:j}],r:0},{cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},{cN:"variable",b:"(\\$\\W)|((\\$|\\@\\@?)(\\w+))"},{b:"("+f.RSR+")\\s*",c:[c,k,{cN:"regexp",c:[f.BE,d],i:/\n/,v:[{b:"/",e:"/[a-z]*"},{b:"%r{",e:"}[a-z]*"},{b:"%r\\(",e:"\\)[a-z]*"},{b:"%r!",e:"![a-z]*"},{b:"%r\\[",e:"\\][a-z]*"}]}],r:0}];d.c=h;a.c=h;var g=[{b:/^\s*=>/,cN:"status",starts:{e:"$",c:h}},{cN:"prompt",b:/^\S[^=>\n]*>+/,starts:{e:"$",c:h}}];return{aliases:["rb","gemspec","podspec","thor","irb"],k:i,c:[k].concat(g).concat(h)}});hljs.registerLanguage("diff",function(a){return{aliases:["patch"],c:[{cN:"chunk",r:10,v:[{b:/^\@\@ +\-\d+,\d+ +\+\d+,\d+ +\@\@$/},{b:/^\*\*\* +\d+,\d+ +\*\*\*\*$/},{b:/^\-\-\- +\d+,\d+ +\-\-\-\-$/}]},{cN:"header",v:[{b:/Index: /,e:/$/},{b:/=====/,e:/=====$/},{b:/^\-\-\-/,e:/$/},{b:/^\*{3} /,e:/$/},{b:/^\+\+\+/,e:/$/},{b:/\*{5}/,e:/\*{5}$/}]},{cN:"addition",b:"^\\+",e:"$"},{cN:"deletion",b:"^\\-",e:"$"},{cN:"change",b:"^\\!",e:"$"}]}});hljs.registerLanguage("objectivec",function(a){var d={keyword:"int float while char export sizeof typedef const struct for union unsigned long volatile static bool mutable if do return goto void enum else break extern asm case short default double register explicit signed typename this switch continue wchar_t inline readonly assign readwrite self @synchronized id typeof nonatomic super unichar IBOutlet IBAction strong weak copy in out inout bycopy byref oneway __strong __weak __block __autoreleasing @private @protected @public @try @property @end @throw @catch @finally @autoreleasepool @synthesize @dynamic @selector @optional @required",literal:"false true FALSE TRUE nil YES NO NULL",built_in:"NSString NSData NSDictionary CGRect CGPoint UIButton UILabel UITextView UIWebView MKMapView NSView NSViewController NSWindow NSWindowController NSSet NSUUID NSIndexSet UISegmentedControl NSObject UITableViewDelegate UITableViewDataSource NSThread UIActivityIndicator UITabbar UIToolBar UIBarButtonItem UIImageView NSAutoreleasePool UITableView BOOL NSInteger CGFloat NSException NSLog NSMutableString NSMutableArray NSMutableDictionary NSURL NSIndexPath CGSize UITableViewCell UIView UIViewController UINavigationBar UINavigationController UITabBarController UIPopoverController UIPopoverControllerDelegate UIImage NSNumber UISearchBar NSFetchedResultsController NSFetchedResultsChangeType UIScrollView UIScrollViewDelegate UIEdgeInsets UIColor UIFont UIApplication NSNotFound NSNotificationCenter NSNotification UILocalNotification NSBundle NSFileManager NSTimeInterval NSDate NSCalendar NSUserDefaults UIWindow NSRange NSArray NSError NSURLRequest NSURLConnection NSURLSession NSURLSessionDataTask NSURLSessionDownloadTask NSURLSessionUploadTask NSURLResponseUIInterfaceOrientation MPMoviePlayerController dispatch_once_t dispatch_queue_t dispatch_sync dispatch_async dispatch_once"};var c=/[a-zA-Z@][a-zA-Z0-9_]*/;var b="@interface @class @protocol @implementation";return{aliases:["m","mm","objc","obj-c"],k:d,l:c,i:""}]}]},{cN:"class",b:"("+b.split(" ").join("|")+")\\b",e:"({|$)",eE:true,k:b,l:c,c:[a.UTM]},{cN:"variable",b:"\\."+a.UIR,r:0}]}});hljs.registerLanguage("css",function(a){var b="[a-zA-Z-][a-zA-Z0-9_-]*";var c={cN:"function",b:b+"\\(",rB:true,eE:true,e:"\\("};return{cI:true,i:"[=/|']",c:[a.CBCM,{cN:"id",b:"\\#[A-Za-z0-9_-]+"},{cN:"class",b:"\\.[A-Za-z0-9_-]+",r:0},{cN:"attr_selector",b:"\\[",e:"\\]",i:"$"},{cN:"pseudo",b:":(:)?[a-zA-Z0-9\\_\\-\\+\\(\\)\\\"\\']+"},{cN:"at_rule",b:"@(font-face|page)",l:"[a-z-]+",k:"font-face page"},{cN:"at_rule",b:"@",e:"[{;]",c:[{cN:"keyword",b:/\S+/},{b:/\s/,eW:true,eE:true,r:0,c:[c,a.ASM,a.QSM,a.CSSNM]}]},{cN:"tag",b:b,r:0},{cN:"rules",b:"{",e:"}",i:"[^\\s]",r:0,c:[a.CBCM,{cN:"rule",b:"[^\\s]",rB:true,e:";",eW:true,c:[{cN:"attribute",b:"[A-Z\\_\\.\\-]+",e:":",eE:true,i:"[^\\s]",starts:{cN:"value",eW:true,eE:true,c:[c,a.CSSNM,a.QSM,a.ASM,a.CBCM,{cN:"hexcolor",b:"#[0-9A-Fa-f]+"},{cN:"important",b:"!important"}]}}]}]}]}});hljs.registerLanguage("python",function(a){var f={cN:"prompt",b:/^(>>>|\.\.\.) /};var b={cN:"string",c:[a.BE],v:[{b:/(u|b)?r?'''/,e:/'''/,c:[f],r:10},{b:/(u|b)?r?"""/,e:/"""/,c:[f],r:10},{b:/(u|r|ur)'/,e:/'/,r:10},{b:/(u|r|ur)"/,e:/"/,r:10},{b:/(b|br)'/,e:/'/},{b:/(b|br)"/,e:/"/},a.ASM,a.QSM]};var d={cN:"number",r:0,v:[{b:a.BNR+"[lLjJ]?"},{b:"\\b(0o[0-7]+)[lLjJ]?"},{b:a.CNR+"[lLjJ]?"}]};var e={cN:"params",b:/\(/,e:/\)/,c:["self",f,d,b]};var c={e:/:/,i:/[${=;\n]/,c:[a.UTM,e]};return{aliases:["py","gyp"],k:{keyword:"and elif is global as in if from raise for except finally print import pass return exec else break not with class assert yield try while continue del or def lambda nonlocal|10 None True False",built_in:"Ellipsis NotImplemented"},i:/(<\/|->|\?)/,c:[f,d,b,a.HCM,a.inherit(c,{cN:"function",bK:"def",r:10}),a.inherit(c,{cN:"class",bK:"class"}),{cN:"decorator",b:/@/,e:/$/},{b:/\b(print|exec)\(/}]}}); +/*! + Highlight.js v11.9.0 (git: f47103d4f1) + (c) 2006-2023 undefined and other contributors + License: BSD-3-Clause + */ +var hljs=function(){"use strict";function e(n){ +return n instanceof Map?n.clear=n.delete=n.set=()=>{ +throw Error("map is read-only")}:n instanceof Set&&(n.add=n.clear=n.delete=()=>{ +throw Error("set is read-only") +}),Object.freeze(n),Object.getOwnPropertyNames(n).forEach((t=>{ +const a=n[t],i=typeof a;"object"!==i&&"function"!==i||Object.isFrozen(a)||e(a) +})),n}class n{constructor(e){ +void 0===e.data&&(e.data={}),this.data=e.data,this.isMatchIgnored=!1} +ignoreMatch(){this.isMatchIgnored=!0}}function t(e){ +return e.replace(/&/g,"&").replace(//g,">").replace(/"/g,""").replace(/'/g,"'") +}function a(e,...n){const t=Object.create(null);for(const n in e)t[n]=e[n] +;return n.forEach((e=>{for(const n in e)t[n]=e[n]})),t}const i=e=>!!e.scope +;class r{constructor(e,n){ +this.buffer="",this.classPrefix=n.classPrefix,e.walk(this)}addText(e){ +this.buffer+=t(e)}openNode(e){if(!i(e))return;const n=((e,{prefix:n})=>{ +if(e.startsWith("language:"))return e.replace("language:","language-") +;if(e.includes(".")){const t=e.split(".") +;return[`${n}${t.shift()}`,...t.map(((e,n)=>`${e}${"_".repeat(n+1)}`))].join(" ") +}return`${n}${e}`})(e.scope,{prefix:this.classPrefix});this.span(n)} +closeNode(e){i(e)&&(this.buffer+="")}value(){return this.buffer}span(e){ +this.buffer+=``}}const s=(e={})=>{const n={children:[]} +;return Object.assign(n,e),n};class o{constructor(){ +this.rootNode=s(),this.stack=[this.rootNode]}get top(){ +return this.stack[this.stack.length-1]}get root(){return this.rootNode}add(e){ +this.top.children.push(e)}openNode(e){const n=s({scope:e}) +;this.add(n),this.stack.push(n)}closeNode(){ +if(this.stack.length>1)return this.stack.pop()}closeAllNodes(){ +for(;this.closeNode(););}toJSON(){return JSON.stringify(this.rootNode,null,4)} +walk(e){return this.constructor._walk(e,this.rootNode)}static _walk(e,n){ +return"string"==typeof n?e.addText(n):n.children&&(e.openNode(n), +n.children.forEach((n=>this._walk(e,n))),e.closeNode(n)),e}static _collapse(e){ +"string"!=typeof e&&e.children&&(e.children.every((e=>"string"==typeof e))?e.children=[e.children.join("")]:e.children.forEach((e=>{ +o._collapse(e)})))}}class l extends o{constructor(e){super(),this.options=e} +addText(e){""!==e&&this.add(e)}startScope(e){this.openNode(e)}endScope(){ +this.closeNode()}__addSublanguage(e,n){const t=e.root +;n&&(t.scope="language:"+n),this.add(t)}toHTML(){ +return new r(this,this.options).value()}finalize(){ +return this.closeAllNodes(),!0}}function c(e){ +return e?"string"==typeof e?e:e.source:null}function d(e){return b("(?=",e,")")} +function g(e){return b("(?:",e,")*")}function u(e){return b("(?:",e,")?")} +function b(...e){return e.map((e=>c(e))).join("")}function m(...e){const n=(e=>{ +const n=e[e.length-1] +;return"object"==typeof n&&n.constructor===Object?(e.splice(e.length-1,1),n):{} +})(e);return"("+(n.capture?"":"?:")+e.map((e=>c(e))).join("|")+")"} +function p(e){return RegExp(e.toString()+"|").exec("").length-1} +const _=/\[(?:[^\\\]]|\\.)*\]|\(\??|\\([1-9][0-9]*)|\\./ +;function h(e,{joinWith:n}){let t=0;return e.map((e=>{t+=1;const n=t +;let a=c(e),i="";for(;a.length>0;){const e=_.exec(a);if(!e){i+=a;break} +i+=a.substring(0,e.index), +a=a.substring(e.index+e[0].length),"\\"===e[0][0]&&e[1]?i+="\\"+(Number(e[1])+n):(i+=e[0], +"("===e[0]&&t++)}return i})).map((e=>`(${e})`)).join(n)} +const f="[a-zA-Z]\\w*",E="[a-zA-Z_]\\w*",y="\\b\\d+(\\.\\d+)?",N="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",w="\\b(0b[01]+)",v={ +begin:"\\\\[\\s\\S]",relevance:0},O={scope:"string",begin:"'",end:"'", +illegal:"\\n",contains:[v]},k={scope:"string",begin:'"',end:'"',illegal:"\\n", +contains:[v]},x=(e,n,t={})=>{const i=a({scope:"comment",begin:e,end:n, +contains:[]},t);i.contains.push({scope:"doctag", +begin:"[ ]*(?=(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):)", +end:/(TODO|FIXME|NOTE|BUG|OPTIMIZE|HACK|XXX):/,excludeBegin:!0,relevance:0}) +;const r=m("I","a","is","so","us","to","at","if","in","it","on",/[A-Za-z]+['](d|ve|re|ll|t|s|n)/,/[A-Za-z]+[-][a-z]+/,/[A-Za-z][a-z]{2,}/) +;return i.contains.push({begin:b(/[ ]+/,"(",r,/[.]?[:]?([.][ ]|[ ])/,"){3}")}),i +},M=x("//","$"),S=x("/\\*","\\*/"),A=x("#","$");var C=Object.freeze({ +__proto__:null,APOS_STRING_MODE:O,BACKSLASH_ESCAPE:v,BINARY_NUMBER_MODE:{ +scope:"number",begin:w,relevance:0},BINARY_NUMBER_RE:w,COMMENT:x, +C_BLOCK_COMMENT_MODE:S,C_LINE_COMMENT_MODE:M,C_NUMBER_MODE:{scope:"number", +begin:N,relevance:0},C_NUMBER_RE:N,END_SAME_AS_BEGIN:e=>Object.assign(e,{ +"on:begin":(e,n)=>{n.data._beginMatch=e[1]},"on:end":(e,n)=>{ +n.data._beginMatch!==e[1]&&n.ignoreMatch()}}),HASH_COMMENT_MODE:A,IDENT_RE:f, +MATCH_NOTHING_RE:/\b\B/,METHOD_GUARD:{begin:"\\.\\s*"+E,relevance:0}, +NUMBER_MODE:{scope:"number",begin:y,relevance:0},NUMBER_RE:y, +PHRASAL_WORDS_MODE:{ +begin:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|they|like|more)\b/ +},QUOTE_STRING_MODE:k,REGEXP_MODE:{scope:"regexp",begin:/\/(?=[^/\n]*\/)/, +end:/\/[gimuy]*/,contains:[v,{begin:/\[/,end:/\]/,relevance:0,contains:[v]}]}, +RE_STARTERS_RE:"!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~", +SHEBANG:(e={})=>{const n=/^#![ ]*\// +;return e.binary&&(e.begin=b(n,/.*\b/,e.binary,/\b.*/)),a({scope:"meta",begin:n, +end:/$/,relevance:0,"on:begin":(e,n)=>{0!==e.index&&n.ignoreMatch()}},e)}, +TITLE_MODE:{scope:"title",begin:f,relevance:0},UNDERSCORE_IDENT_RE:E, +UNDERSCORE_TITLE_MODE:{scope:"title",begin:E,relevance:0}});function T(e,n){ +"."===e.input[e.index-1]&&n.ignoreMatch()}function R(e,n){ +void 0!==e.className&&(e.scope=e.className,delete e.className)}function D(e,n){ +n&&e.beginKeywords&&(e.begin="\\b("+e.beginKeywords.split(" ").join("|")+")(?!\\.)(?=\\b|\\s)", +e.__beforeBegin=T,e.keywords=e.keywords||e.beginKeywords,delete e.beginKeywords, +void 0===e.relevance&&(e.relevance=0))}function I(e,n){ +Array.isArray(e.illegal)&&(e.illegal=m(...e.illegal))}function L(e,n){ +if(e.match){ +if(e.begin||e.end)throw Error("begin & end are not supported with match") +;e.begin=e.match,delete e.match}}function B(e,n){ +void 0===e.relevance&&(e.relevance=1)}const $=(e,n)=>{if(!e.beforeMatch)return +;if(e.starts)throw Error("beforeMatch cannot be used with starts") +;const t=Object.assign({},e);Object.keys(e).forEach((n=>{delete e[n] +})),e.keywords=t.keywords,e.begin=b(t.beforeMatch,d(t.begin)),e.starts={ +relevance:0,contains:[Object.assign(t,{endsParent:!0})] +},e.relevance=0,delete t.beforeMatch +},z=["of","and","for","in","not","or","if","then","parent","list","value"],F="keyword" +;function U(e,n,t=F){const a=Object.create(null) +;return"string"==typeof e?i(t,e.split(" ")):Array.isArray(e)?i(t,e):Object.keys(e).forEach((t=>{ +Object.assign(a,U(e[t],n,t))})),a;function i(e,t){ +n&&(t=t.map((e=>e.toLowerCase()))),t.forEach((n=>{const t=n.split("|") +;a[t[0]]=[e,j(t[0],t[1])]}))}}function j(e,n){ +return n?Number(n):(e=>z.includes(e.toLowerCase()))(e)?0:1}const P={},K=e=>{ +console.error(e)},H=(e,...n)=>{console.log("WARN: "+e,...n)},q=(e,n)=>{ +P[`${e}/${n}`]||(console.log(`Deprecated as of ${e}. ${n}`),P[`${e}/${n}`]=!0) +},G=Error();function Z(e,n,{key:t}){let a=0;const i=e[t],r={},s={} +;for(let e=1;e<=n.length;e++)s[e+a]=i[e],r[e+a]=!0,a+=p(n[e-1]) +;e[t]=s,e[t]._emit=r,e[t]._multi=!0}function W(e){(e=>{ +e.scope&&"object"==typeof e.scope&&null!==e.scope&&(e.beginScope=e.scope, +delete e.scope)})(e),"string"==typeof e.beginScope&&(e.beginScope={ +_wrap:e.beginScope}),"string"==typeof e.endScope&&(e.endScope={_wrap:e.endScope +}),(e=>{if(Array.isArray(e.begin)){ +if(e.skip||e.excludeBegin||e.returnBegin)throw K("skip, excludeBegin, returnBegin not compatible with beginScope: {}"), +G +;if("object"!=typeof e.beginScope||null===e.beginScope)throw K("beginScope must be object"), +G;Z(e,e.begin,{key:"beginScope"}),e.begin=h(e.begin,{joinWith:""})}})(e),(e=>{ +if(Array.isArray(e.end)){ +if(e.skip||e.excludeEnd||e.returnEnd)throw K("skip, excludeEnd, returnEnd not compatible with endScope: {}"), +G +;if("object"!=typeof e.endScope||null===e.endScope)throw K("endScope must be object"), +G;Z(e,e.end,{key:"endScope"}),e.end=h(e.end,{joinWith:""})}})(e)}function Q(e){ +function n(n,t){ +return RegExp(c(n),"m"+(e.case_insensitive?"i":"")+(e.unicodeRegex?"u":"")+(t?"g":"")) +}class t{constructor(){ +this.matchIndexes={},this.regexes=[],this.matchAt=1,this.position=0} +addRule(e,n){ +n.position=this.position++,this.matchIndexes[this.matchAt]=n,this.regexes.push([n,e]), +this.matchAt+=p(e)+1}compile(){0===this.regexes.length&&(this.exec=()=>null) +;const e=this.regexes.map((e=>e[1]));this.matcherRe=n(h(e,{joinWith:"|" +}),!0),this.lastIndex=0}exec(e){this.matcherRe.lastIndex=this.lastIndex +;const n=this.matcherRe.exec(e);if(!n)return null +;const t=n.findIndex(((e,n)=>n>0&&void 0!==e)),a=this.matchIndexes[t] +;return n.splice(0,t),Object.assign(n,a)}}class i{constructor(){ +this.rules=[],this.multiRegexes=[], +this.count=0,this.lastIndex=0,this.regexIndex=0}getMatcher(e){ +if(this.multiRegexes[e])return this.multiRegexes[e];const n=new t +;return this.rules.slice(e).forEach((([e,t])=>n.addRule(e,t))), +n.compile(),this.multiRegexes[e]=n,n}resumingScanAtSamePosition(){ +return 0!==this.regexIndex}considerAll(){this.regexIndex=0}addRule(e,n){ +this.rules.push([e,n]),"begin"===n.type&&this.count++}exec(e){ +const n=this.getMatcher(this.regexIndex);n.lastIndex=this.lastIndex +;let t=n.exec(e) +;if(this.resumingScanAtSamePosition())if(t&&t.index===this.lastIndex);else{ +const n=this.getMatcher(0);n.lastIndex=this.lastIndex+1,t=n.exec(e)} +return t&&(this.regexIndex+=t.position+1, +this.regexIndex===this.count&&this.considerAll()),t}} +if(e.compilerExtensions||(e.compilerExtensions=[]), +e.contains&&e.contains.includes("self"))throw Error("ERR: contains `self` is not supported at the top-level of a language. See documentation.") +;return e.classNameAliases=a(e.classNameAliases||{}),function t(r,s){const o=r +;if(r.isCompiled)return o +;[R,L,W,$].forEach((e=>e(r,s))),e.compilerExtensions.forEach((e=>e(r,s))), +r.__beforeBegin=null,[D,I,B].forEach((e=>e(r,s))),r.isCompiled=!0;let l=null +;return"object"==typeof r.keywords&&r.keywords.$pattern&&(r.keywords=Object.assign({},r.keywords), +l=r.keywords.$pattern, +delete r.keywords.$pattern),l=l||/\w+/,r.keywords&&(r.keywords=U(r.keywords,e.case_insensitive)), +o.keywordPatternRe=n(l,!0), +s&&(r.begin||(r.begin=/\B|\b/),o.beginRe=n(o.begin),r.end||r.endsWithParent||(r.end=/\B|\b/), +r.end&&(o.endRe=n(o.end)), +o.terminatorEnd=c(o.end)||"",r.endsWithParent&&s.terminatorEnd&&(o.terminatorEnd+=(r.end?"|":"")+s.terminatorEnd)), +r.illegal&&(o.illegalRe=n(r.illegal)), +r.contains||(r.contains=[]),r.contains=[].concat(...r.contains.map((e=>(e=>(e.variants&&!e.cachedVariants&&(e.cachedVariants=e.variants.map((n=>a(e,{ +variants:null},n)))),e.cachedVariants?e.cachedVariants:X(e)?a(e,{ +starts:e.starts?a(e.starts):null +}):Object.isFrozen(e)?a(e):e))("self"===e?r:e)))),r.contains.forEach((e=>{t(e,o) +})),r.starts&&t(r.starts,s),o.matcher=(e=>{const n=new i +;return e.contains.forEach((e=>n.addRule(e.begin,{rule:e,type:"begin" +}))),e.terminatorEnd&&n.addRule(e.terminatorEnd,{type:"end" +}),e.illegal&&n.addRule(e.illegal,{type:"illegal"}),n})(o),o}(e)}function X(e){ +return!!e&&(e.endsWithParent||X(e.starts))}class V extends Error{ +constructor(e,n){super(e),this.name="HTMLInjectionError",this.html=n}} +const J=t,Y=a,ee=Symbol("nomatch"),ne=t=>{ +const a=Object.create(null),i=Object.create(null),r=[];let s=!0 +;const o="Could not find the language '{}', did you forget to load/include a language module?",c={ +disableAutodetect:!0,name:"Plain text",contains:[]};let p={ +ignoreUnescapedHTML:!1,throwUnescapedHTML:!1,noHighlightRe:/^(no-?highlight)$/i, +languageDetectRe:/\blang(?:uage)?-([\w-]+)\b/i,classPrefix:"hljs-", +cssSelector:"pre code",languages:null,__emitter:l};function _(e){ +return p.noHighlightRe.test(e)}function h(e,n,t){let a="",i="" +;"object"==typeof n?(a=e, +t=n.ignoreIllegals,i=n.language):(q("10.7.0","highlight(lang, code, ...args) has been deprecated."), +q("10.7.0","Please use highlight(code, options) instead.\nhttps://github.com/highlightjs/highlight.js/issues/2277"), +i=e,a=n),void 0===t&&(t=!0);const r={code:a,language:i};x("before:highlight",r) +;const s=r.result?r.result:f(r.language,r.code,t) +;return s.code=r.code,x("after:highlight",s),s}function f(e,t,i,r){ +const l=Object.create(null);function c(){if(!x.keywords)return void S.addText(A) +;let e=0;x.keywordPatternRe.lastIndex=0;let n=x.keywordPatternRe.exec(A),t="" +;for(;n;){t+=A.substring(e,n.index) +;const i=w.case_insensitive?n[0].toLowerCase():n[0],r=(a=i,x.keywords[a]);if(r){ +const[e,a]=r +;if(S.addText(t),t="",l[i]=(l[i]||0)+1,l[i]<=7&&(C+=a),e.startsWith("_"))t+=n[0];else{ +const t=w.classNameAliases[e]||e;g(n[0],t)}}else t+=n[0] +;e=x.keywordPatternRe.lastIndex,n=x.keywordPatternRe.exec(A)}var a +;t+=A.substring(e),S.addText(t)}function d(){null!=x.subLanguage?(()=>{ +if(""===A)return;let e=null;if("string"==typeof x.subLanguage){ +if(!a[x.subLanguage])return void S.addText(A) +;e=f(x.subLanguage,A,!0,M[x.subLanguage]),M[x.subLanguage]=e._top +}else e=E(A,x.subLanguage.length?x.subLanguage:null) +;x.relevance>0&&(C+=e.relevance),S.__addSublanguage(e._emitter,e.language) +})():c(),A=""}function g(e,n){ +""!==e&&(S.startScope(n),S.addText(e),S.endScope())}function u(e,n){let t=1 +;const a=n.length-1;for(;t<=a;){if(!e._emit[t]){t++;continue} +const a=w.classNameAliases[e[t]]||e[t],i=n[t];a?g(i,a):(A=i,c(),A=""),t++}} +function b(e,n){ +return e.scope&&"string"==typeof e.scope&&S.openNode(w.classNameAliases[e.scope]||e.scope), +e.beginScope&&(e.beginScope._wrap?(g(A,w.classNameAliases[e.beginScope._wrap]||e.beginScope._wrap), +A=""):e.beginScope._multi&&(u(e.beginScope,n),A="")),x=Object.create(e,{parent:{ +value:x}}),x}function m(e,t,a){let i=((e,n)=>{const t=e&&e.exec(n) +;return t&&0===t.index})(e.endRe,a);if(i){if(e["on:end"]){const a=new n(e) +;e["on:end"](t,a),a.isMatchIgnored&&(i=!1)}if(i){ +for(;e.endsParent&&e.parent;)e=e.parent;return e}} +if(e.endsWithParent)return m(e.parent,t,a)}function _(e){ +return 0===x.matcher.regexIndex?(A+=e[0],1):(D=!0,0)}function h(e){ +const n=e[0],a=t.substring(e.index),i=m(x,e,a);if(!i)return ee;const r=x +;x.endScope&&x.endScope._wrap?(d(), +g(n,x.endScope._wrap)):x.endScope&&x.endScope._multi?(d(), +u(x.endScope,e)):r.skip?A+=n:(r.returnEnd||r.excludeEnd||(A+=n), +d(),r.excludeEnd&&(A=n));do{ +x.scope&&S.closeNode(),x.skip||x.subLanguage||(C+=x.relevance),x=x.parent +}while(x!==i.parent);return i.starts&&b(i.starts,e),r.returnEnd?0:n.length} +let y={};function N(a,r){const o=r&&r[0];if(A+=a,null==o)return d(),0 +;if("begin"===y.type&&"end"===r.type&&y.index===r.index&&""===o){ +if(A+=t.slice(r.index,r.index+1),!s){const n=Error(`0 width match regex (${e})`) +;throw n.languageName=e,n.badRule=y.rule,n}return 1} +if(y=r,"begin"===r.type)return(e=>{ +const t=e[0],a=e.rule,i=new n(a),r=[a.__beforeBegin,a["on:begin"]] +;for(const n of r)if(n&&(n(e,i),i.isMatchIgnored))return _(t) +;return a.skip?A+=t:(a.excludeBegin&&(A+=t), +d(),a.returnBegin||a.excludeBegin||(A=t)),b(a,e),a.returnBegin?0:t.length})(r) +;if("illegal"===r.type&&!i){ +const e=Error('Illegal lexeme "'+o+'" for mode "'+(x.scope||"")+'"') +;throw e.mode=x,e}if("end"===r.type){const e=h(r);if(e!==ee)return e} +if("illegal"===r.type&&""===o)return 1 +;if(R>1e5&&R>3*r.index)throw Error("potential infinite loop, way more iterations than matches") +;return A+=o,o.length}const w=v(e) +;if(!w)throw K(o.replace("{}",e)),Error('Unknown language: "'+e+'"') +;const O=Q(w);let k="",x=r||O;const M={},S=new p.__emitter(p);(()=>{const e=[] +;for(let n=x;n!==w;n=n.parent)n.scope&&e.unshift(n.scope) +;e.forEach((e=>S.openNode(e)))})();let A="",C=0,T=0,R=0,D=!1;try{ +if(w.__emitTokens)w.__emitTokens(t,S);else{for(x.matcher.considerAll();;){ +R++,D?D=!1:x.matcher.considerAll(),x.matcher.lastIndex=T +;const e=x.matcher.exec(t);if(!e)break;const n=N(t.substring(T,e.index),e) +;T=e.index+n}N(t.substring(T))}return S.finalize(),k=S.toHTML(),{language:e, +value:k,relevance:C,illegal:!1,_emitter:S,_top:x}}catch(n){ +if(n.message&&n.message.includes("Illegal"))return{language:e,value:J(t), +illegal:!0,relevance:0,_illegalBy:{message:n.message,index:T, +context:t.slice(T-100,T+100),mode:n.mode,resultSoFar:k},_emitter:S};if(s)return{ +language:e,value:J(t),illegal:!1,relevance:0,errorRaised:n,_emitter:S,_top:x} +;throw n}}function E(e,n){n=n||p.languages||Object.keys(a);const t=(e=>{ +const n={value:J(e),illegal:!1,relevance:0,_top:c,_emitter:new p.__emitter(p)} +;return n._emitter.addText(e),n})(e),i=n.filter(v).filter(k).map((n=>f(n,e,!1))) +;i.unshift(t);const r=i.sort(((e,n)=>{ +if(e.relevance!==n.relevance)return n.relevance-e.relevance +;if(e.language&&n.language){if(v(e.language).supersetOf===n.language)return 1 +;if(v(n.language).supersetOf===e.language)return-1}return 0})),[s,o]=r,l=s +;return l.secondBest=o,l}function y(e){let n=null;const t=(e=>{ +let n=e.className+" ";n+=e.parentNode?e.parentNode.className:"" +;const t=p.languageDetectRe.exec(n);if(t){const n=v(t[1]) +;return n||(H(o.replace("{}",t[1])), +H("Falling back to no-highlight mode for this block.",e)),n?t[1]:"no-highlight"} +return n.split(/\s+/).find((e=>_(e)||v(e)))})(e);if(_(t))return +;if(x("before:highlightElement",{el:e,language:t +}),e.dataset.highlighted)return void console.log("Element previously highlighted. To highlight again, first unset `dataset.highlighted`.",e) +;if(e.children.length>0&&(p.ignoreUnescapedHTML||(console.warn("One of your code blocks includes unescaped HTML. This is a potentially serious security risk."), +console.warn("https://github.com/highlightjs/highlight.js/wiki/security"), +console.warn("The element with unescaped HTML:"), +console.warn(e)),p.throwUnescapedHTML))throw new V("One of your code blocks includes unescaped HTML.",e.innerHTML) +;n=e;const a=n.textContent,r=t?h(a,{language:t,ignoreIllegals:!0}):E(a) +;e.innerHTML=r.value,e.dataset.highlighted="yes",((e,n,t)=>{const a=n&&i[n]||t +;e.classList.add("hljs"),e.classList.add("language-"+a) +})(e,t,r.language),e.result={language:r.language,re:r.relevance, +relevance:r.relevance},r.secondBest&&(e.secondBest={ +language:r.secondBest.language,relevance:r.secondBest.relevance +}),x("after:highlightElement",{el:e,result:r,text:a})}let N=!1;function w(){ +"loading"!==document.readyState?document.querySelectorAll(p.cssSelector).forEach(y):N=!0 +}function v(e){return e=(e||"").toLowerCase(),a[e]||a[i[e]]} +function O(e,{languageName:n}){"string"==typeof e&&(e=[e]),e.forEach((e=>{ +i[e.toLowerCase()]=n}))}function k(e){const n=v(e) +;return n&&!n.disableAutodetect}function x(e,n){const t=e;r.forEach((e=>{ +e[t]&&e[t](n)}))} +"undefined"!=typeof window&&window.addEventListener&&window.addEventListener("DOMContentLoaded",(()=>{ +N&&w()}),!1),Object.assign(t,{highlight:h,highlightAuto:E,highlightAll:w, +highlightElement:y, +highlightBlock:e=>(q("10.7.0","highlightBlock will be removed entirely in v12.0"), +q("10.7.0","Please use highlightElement now."),y(e)),configure:e=>{p=Y(p,e)}, +initHighlighting:()=>{ +w(),q("10.6.0","initHighlighting() deprecated. Use highlightAll() now.")}, +initHighlightingOnLoad:()=>{ +w(),q("10.6.0","initHighlightingOnLoad() deprecated. Use highlightAll() now.") +},registerLanguage:(e,n)=>{let i=null;try{i=n(t)}catch(n){ +if(K("Language definition for '{}' could not be registered.".replace("{}",e)), +!s)throw n;K(n),i=c} +i.name||(i.name=e),a[e]=i,i.rawDefinition=n.bind(null,t),i.aliases&&O(i.aliases,{ +languageName:e})},unregisterLanguage:e=>{delete a[e] +;for(const n of Object.keys(i))i[n]===e&&delete i[n]}, +listLanguages:()=>Object.keys(a),getLanguage:v,registerAliases:O, +autoDetection:k,inherit:Y,addPlugin:e=>{(e=>{ +e["before:highlightBlock"]&&!e["before:highlightElement"]&&(e["before:highlightElement"]=n=>{ +e["before:highlightBlock"](Object.assign({block:n.el},n)) +}),e["after:highlightBlock"]&&!e["after:highlightElement"]&&(e["after:highlightElement"]=n=>{ +e["after:highlightBlock"](Object.assign({block:n.el},n))})})(e),r.push(e)}, +removePlugin:e=>{const n=r.indexOf(e);-1!==n&&r.splice(n,1)}}),t.debugMode=()=>{ +s=!1},t.safeMode=()=>{s=!0},t.versionString="11.9.0",t.regex={concat:b, +lookahead:d,either:m,optional:u,anyNumberOfTimes:g} +;for(const n in C)"object"==typeof C[n]&&e(C[n]);return Object.assign(t,C),t +},te=ne({});te.newInstance=()=>ne({});var ae=te;const ie=e=>({IMPORTANT:{ +scope:"meta",begin:"!important"},BLOCK_COMMENT:e.C_BLOCK_COMMENT_MODE,HEXCOLOR:{ +scope:"number",begin:/#(([0-9a-fA-F]{3,4})|(([0-9a-fA-F]{2}){3,4}))\b/}, +FUNCTION_DISPATCH:{className:"built_in",begin:/[\w-]+(?=\()/}, +ATTRIBUTE_SELECTOR_MODE:{scope:"selector-attr",begin:/\[/,end:/\]/,illegal:"$", +contains:[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE]},CSS_NUMBER_MODE:{ +scope:"number", +begin:e.NUMBER_RE+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?", +relevance:0},CSS_VARIABLE:{className:"attr",begin:/--[A-Za-z_][A-Za-z0-9_-]*/} +}),re=["a","abbr","address","article","aside","audio","b","blockquote","body","button","canvas","caption","cite","code","dd","del","details","dfn","div","dl","dt","em","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","header","hgroup","html","i","iframe","img","input","ins","kbd","label","legend","li","main","mark","menu","nav","object","ol","p","q","quote","samp","section","span","strong","summary","sup","table","tbody","td","textarea","tfoot","th","thead","time","tr","ul","var","video"],se=["any-hover","any-pointer","aspect-ratio","color","color-gamut","color-index","device-aspect-ratio","device-height","device-width","display-mode","forced-colors","grid","height","hover","inverted-colors","monochrome","orientation","overflow-block","overflow-inline","pointer","prefers-color-scheme","prefers-contrast","prefers-reduced-motion","prefers-reduced-transparency","resolution","scan","scripting","update","width","min-width","max-width","min-height","max-height"],oe=["active","any-link","blank","checked","current","default","defined","dir","disabled","drop","empty","enabled","first","first-child","first-of-type","fullscreen","future","focus","focus-visible","focus-within","has","host","host-context","hover","indeterminate","in-range","invalid","is","lang","last-child","last-of-type","left","link","local-link","not","nth-child","nth-col","nth-last-child","nth-last-col","nth-last-of-type","nth-of-type","only-child","only-of-type","optional","out-of-range","past","placeholder-shown","read-only","read-write","required","right","root","scope","target","target-within","user-invalid","valid","visited","where"],le=["after","backdrop","before","cue","cue-region","first-letter","first-line","grammar-error","marker","part","placeholder","selection","slotted","spelling-error"],ce=["align-content","align-items","align-self","all","animation","animation-delay","animation-direction","animation-duration","animation-fill-mode","animation-iteration-count","animation-name","animation-play-state","animation-timing-function","backface-visibility","background","background-attachment","background-blend-mode","background-clip","background-color","background-image","background-origin","background-position","background-repeat","background-size","block-size","border","border-block","border-block-color","border-block-end","border-block-end-color","border-block-end-style","border-block-end-width","border-block-start","border-block-start-color","border-block-start-style","border-block-start-width","border-block-style","border-block-width","border-bottom","border-bottom-color","border-bottom-left-radius","border-bottom-right-radius","border-bottom-style","border-bottom-width","border-collapse","border-color","border-image","border-image-outset","border-image-repeat","border-image-slice","border-image-source","border-image-width","border-inline","border-inline-color","border-inline-end","border-inline-end-color","border-inline-end-style","border-inline-end-width","border-inline-start","border-inline-start-color","border-inline-start-style","border-inline-start-width","border-inline-style","border-inline-width","border-left","border-left-color","border-left-style","border-left-width","border-radius","border-right","border-right-color","border-right-style","border-right-width","border-spacing","border-style","border-top","border-top-color","border-top-left-radius","border-top-right-radius","border-top-style","border-top-width","border-width","bottom","box-decoration-break","box-shadow","box-sizing","break-after","break-before","break-inside","caption-side","caret-color","clear","clip","clip-path","clip-rule","color","column-count","column-fill","column-gap","column-rule","column-rule-color","column-rule-style","column-rule-width","column-span","column-width","columns","contain","content","content-visibility","counter-increment","counter-reset","cue","cue-after","cue-before","cursor","direction","display","empty-cells","filter","flex","flex-basis","flex-direction","flex-flow","flex-grow","flex-shrink","flex-wrap","float","flow","font","font-display","font-family","font-feature-settings","font-kerning","font-language-override","font-size","font-size-adjust","font-smoothing","font-stretch","font-style","font-synthesis","font-variant","font-variant-caps","font-variant-east-asian","font-variant-ligatures","font-variant-numeric","font-variant-position","font-variation-settings","font-weight","gap","glyph-orientation-vertical","grid","grid-area","grid-auto-columns","grid-auto-flow","grid-auto-rows","grid-column","grid-column-end","grid-column-start","grid-gap","grid-row","grid-row-end","grid-row-start","grid-template","grid-template-areas","grid-template-columns","grid-template-rows","hanging-punctuation","height","hyphens","icon","image-orientation","image-rendering","image-resolution","ime-mode","inline-size","isolation","justify-content","left","letter-spacing","line-break","line-height","list-style","list-style-image","list-style-position","list-style-type","margin","margin-block","margin-block-end","margin-block-start","margin-bottom","margin-inline","margin-inline-end","margin-inline-start","margin-left","margin-right","margin-top","marks","mask","mask-border","mask-border-mode","mask-border-outset","mask-border-repeat","mask-border-slice","mask-border-source","mask-border-width","mask-clip","mask-composite","mask-image","mask-mode","mask-origin","mask-position","mask-repeat","mask-size","mask-type","max-block-size","max-height","max-inline-size","max-width","min-block-size","min-height","min-inline-size","min-width","mix-blend-mode","nav-down","nav-index","nav-left","nav-right","nav-up","none","normal","object-fit","object-position","opacity","order","orphans","outline","outline-color","outline-offset","outline-style","outline-width","overflow","overflow-wrap","overflow-x","overflow-y","padding","padding-block","padding-block-end","padding-block-start","padding-bottom","padding-inline","padding-inline-end","padding-inline-start","padding-left","padding-right","padding-top","page-break-after","page-break-before","page-break-inside","pause","pause-after","pause-before","perspective","perspective-origin","pointer-events","position","quotes","resize","rest","rest-after","rest-before","right","row-gap","scroll-margin","scroll-margin-block","scroll-margin-block-end","scroll-margin-block-start","scroll-margin-bottom","scroll-margin-inline","scroll-margin-inline-end","scroll-margin-inline-start","scroll-margin-left","scroll-margin-right","scroll-margin-top","scroll-padding","scroll-padding-block","scroll-padding-block-end","scroll-padding-block-start","scroll-padding-bottom","scroll-padding-inline","scroll-padding-inline-end","scroll-padding-inline-start","scroll-padding-left","scroll-padding-right","scroll-padding-top","scroll-snap-align","scroll-snap-stop","scroll-snap-type","scrollbar-color","scrollbar-gutter","scrollbar-width","shape-image-threshold","shape-margin","shape-outside","speak","speak-as","src","tab-size","table-layout","text-align","text-align-all","text-align-last","text-combine-upright","text-decoration","text-decoration-color","text-decoration-line","text-decoration-style","text-emphasis","text-emphasis-color","text-emphasis-position","text-emphasis-style","text-indent","text-justify","text-orientation","text-overflow","text-rendering","text-shadow","text-transform","text-underline-position","top","transform","transform-box","transform-origin","transform-style","transition","transition-delay","transition-duration","transition-property","transition-timing-function","unicode-bidi","vertical-align","visibility","voice-balance","voice-duration","voice-family","voice-pitch","voice-range","voice-rate","voice-stress","voice-volume","white-space","widows","width","will-change","word-break","word-spacing","word-wrap","writing-mode","z-index"].reverse(),de=oe.concat(le) +;var ge="[0-9](_*[0-9])*",ue=`\\.(${ge})`,be="[0-9a-fA-F](_*[0-9a-fA-F])*",me={ +className:"number",variants:[{ +begin:`(\\b(${ge})((${ue})|\\.)?|(${ue}))[eE][+-]?(${ge})[fFdD]?\\b`},{ +begin:`\\b(${ge})((${ue})[fFdD]?\\b|\\.([fFdD]\\b)?)`},{ +begin:`(${ue})[fFdD]?\\b`},{begin:`\\b(${ge})[fFdD]\\b`},{ +begin:`\\b0[xX]((${be})\\.?|(${be})?\\.(${be}))[pP][+-]?(${ge})[fFdD]?\\b`},{ +begin:"\\b(0|[1-9](_*[0-9])*)[lL]?\\b"},{begin:`\\b0[xX](${be})[lL]?\\b`},{ +begin:"\\b0(_*[0-7])*[lL]?\\b"},{begin:"\\b0[bB][01](_*[01])*[lL]?\\b"}], +relevance:0};function pe(e,n,t){return-1===t?"":e.replace(n,(a=>pe(e,n,t-1)))} +const _e="[A-Za-z$_][0-9A-Za-z$_]*",he=["as","in","of","if","for","while","finally","var","new","function","do","return","void","else","break","catch","instanceof","with","throw","case","default","try","switch","continue","typeof","delete","let","yield","const","class","debugger","async","await","static","import","from","export","extends"],fe=["true","false","null","undefined","NaN","Infinity"],Ee=["Object","Function","Boolean","Symbol","Math","Date","Number","BigInt","String","RegExp","Array","Float32Array","Float64Array","Int8Array","Uint8Array","Uint8ClampedArray","Int16Array","Int32Array","Uint16Array","Uint32Array","BigInt64Array","BigUint64Array","Set","Map","WeakSet","WeakMap","ArrayBuffer","SharedArrayBuffer","Atomics","DataView","JSON","Promise","Generator","GeneratorFunction","AsyncFunction","Reflect","Proxy","Intl","WebAssembly"],ye=["Error","EvalError","InternalError","RangeError","ReferenceError","SyntaxError","TypeError","URIError"],Ne=["setInterval","setTimeout","clearInterval","clearTimeout","require","exports","eval","isFinite","isNaN","parseFloat","parseInt","decodeURI","decodeURIComponent","encodeURI","encodeURIComponent","escape","unescape"],we=["arguments","this","super","console","window","document","localStorage","sessionStorage","module","global"],ve=[].concat(Ne,Ee,ye) +;function Oe(e){const n=e.regex,t=_e,a={begin:/<[A-Za-z0-9\\._:-]+/, +end:/\/[A-Za-z0-9\\._:-]+>|\/>/,isTrulyOpeningTag:(e,n)=>{ +const t=e[0].length+e.index,a=e.input[t] +;if("<"===a||","===a)return void n.ignoreMatch();let i +;">"===a&&(((e,{after:n})=>{const t="",M={ +match:[/const|var|let/,/\s+/,t,/\s*/,/=\s*/,/(async\s*)?/,n.lookahead(x)], +keywords:"async",className:{1:"keyword",3:"title.function"},contains:[f]} +;return{name:"JavaScript",aliases:["js","jsx","mjs","cjs"],keywords:i,exports:{ +PARAMS_CONTAINS:h,CLASS_REFERENCE:y},illegal:/#(?![$_A-z])/, +contains:[e.SHEBANG({label:"shebang",binary:"node",relevance:5}),{ +label:"use_strict",className:"meta",relevance:10, +begin:/^\s*['"]use (strict|asm)['"]/ +},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,d,g,u,b,m,{match:/\$\d+/},l,y,{ +className:"attr",begin:t+n.lookahead(":"),relevance:0},M,{ +begin:"("+e.RE_STARTERS_RE+"|\\b(case|return|throw)\\b)\\s*", +keywords:"return throw case",relevance:0,contains:[m,e.REGEXP_MODE,{ +className:"function",begin:x,returnBegin:!0,end:"\\s*=>",contains:[{ +className:"params",variants:[{begin:e.UNDERSCORE_IDENT_RE,relevance:0},{ +className:null,begin:/\(\s*\)/,skip:!0},{begin:/\(/,end:/\)/,excludeBegin:!0, +excludeEnd:!0,keywords:i,contains:h}]}]},{begin:/,/,relevance:0},{match:/\s+/, +relevance:0},{variants:[{begin:"<>",end:""},{ +match:/<[A-Za-z0-9\\._:-]+\s*\/>/},{begin:a.begin, +"on:begin":a.isTrulyOpeningTag,end:a.end}],subLanguage:"xml",contains:[{ +begin:a.begin,end:a.end,skip:!0,contains:["self"]}]}]},N,{ +beginKeywords:"while if switch catch for"},{ +begin:"\\b(?!function)"+e.UNDERSCORE_IDENT_RE+"\\([^()]*(\\([^()]*(\\([^()]*\\)[^()]*)*\\)[^()]*)*\\)\\s*\\{", +returnBegin:!0,label:"func.def",contains:[f,e.inherit(e.TITLE_MODE,{begin:t, +className:"title.function"})]},{match:/\.\.\./,relevance:0},O,{match:"\\$"+t, +relevance:0},{match:[/\bconstructor(?=\s*\()/],className:{1:"title.function"}, +contains:[f]},w,{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},E,k,{match:/\$[(.]/}]}} +const ke=e=>b(/\b/,e,/\w$/.test(e)?/\b/:/\B/),xe=["Protocol","Type"].map(ke),Me=["init","self"].map(ke),Se=["Any","Self"],Ae=["actor","any","associatedtype","async","await",/as\?/,/as!/,"as","borrowing","break","case","catch","class","consume","consuming","continue","convenience","copy","default","defer","deinit","didSet","distributed","do","dynamic","each","else","enum","extension","fallthrough",/fileprivate\(set\)/,"fileprivate","final","for","func","get","guard","if","import","indirect","infix",/init\?/,/init!/,"inout",/internal\(set\)/,"internal","in","is","isolated","nonisolated","lazy","let","macro","mutating","nonmutating",/open\(set\)/,"open","operator","optional","override","postfix","precedencegroup","prefix",/private\(set\)/,"private","protocol",/public\(set\)/,"public","repeat","required","rethrows","return","set","some","static","struct","subscript","super","switch","throws","throw",/try\?/,/try!/,"try","typealias",/unowned\(safe\)/,/unowned\(unsafe\)/,"unowned","var","weak","where","while","willSet"],Ce=["false","nil","true"],Te=["assignment","associativity","higherThan","left","lowerThan","none","right"],Re=["#colorLiteral","#column","#dsohandle","#else","#elseif","#endif","#error","#file","#fileID","#fileLiteral","#filePath","#function","#if","#imageLiteral","#keyPath","#line","#selector","#sourceLocation","#warning"],De=["abs","all","any","assert","assertionFailure","debugPrint","dump","fatalError","getVaList","isKnownUniquelyReferenced","max","min","numericCast","pointwiseMax","pointwiseMin","precondition","preconditionFailure","print","readLine","repeatElement","sequence","stride","swap","swift_unboxFromSwiftValueWithType","transcode","type","unsafeBitCast","unsafeDowncast","withExtendedLifetime","withUnsafeMutablePointer","withUnsafePointer","withVaList","withoutActuallyEscaping","zip"],Ie=m(/[/=\-+!*%<>&|^~?]/,/[\u00A1-\u00A7]/,/[\u00A9\u00AB]/,/[\u00AC\u00AE]/,/[\u00B0\u00B1]/,/[\u00B6\u00BB\u00BF\u00D7\u00F7]/,/[\u2016-\u2017]/,/[\u2020-\u2027]/,/[\u2030-\u203E]/,/[\u2041-\u2053]/,/[\u2055-\u205E]/,/[\u2190-\u23FF]/,/[\u2500-\u2775]/,/[\u2794-\u2BFF]/,/[\u2E00-\u2E7F]/,/[\u3001-\u3003]/,/[\u3008-\u3020]/,/[\u3030]/),Le=m(Ie,/[\u0300-\u036F]/,/[\u1DC0-\u1DFF]/,/[\u20D0-\u20FF]/,/[\uFE00-\uFE0F]/,/[\uFE20-\uFE2F]/),Be=b(Ie,Le,"*"),$e=m(/[a-zA-Z_]/,/[\u00A8\u00AA\u00AD\u00AF\u00B2-\u00B5\u00B7-\u00BA]/,/[\u00BC-\u00BE\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]/,/[\u0100-\u02FF\u0370-\u167F\u1681-\u180D\u180F-\u1DBF]/,/[\u1E00-\u1FFF]/,/[\u200B-\u200D\u202A-\u202E\u203F-\u2040\u2054\u2060-\u206F]/,/[\u2070-\u20CF\u2100-\u218F\u2460-\u24FF\u2776-\u2793]/,/[\u2C00-\u2DFF\u2E80-\u2FFF]/,/[\u3004-\u3007\u3021-\u302F\u3031-\u303F\u3040-\uD7FF]/,/[\uF900-\uFD3D\uFD40-\uFDCF\uFDF0-\uFE1F\uFE30-\uFE44]/,/[\uFE47-\uFEFE\uFF00-\uFFFD]/),ze=m($e,/\d/,/[\u0300-\u036F\u1DC0-\u1DFF\u20D0-\u20FF\uFE20-\uFE2F]/),Fe=b($e,ze,"*"),Ue=b(/[A-Z]/,ze,"*"),je=["attached","autoclosure",b(/convention\(/,m("swift","block","c"),/\)/),"discardableResult","dynamicCallable","dynamicMemberLookup","escaping","freestanding","frozen","GKInspectable","IBAction","IBDesignable","IBInspectable","IBOutlet","IBSegueAction","inlinable","main","nonobjc","NSApplicationMain","NSCopying","NSManaged",b(/objc\(/,Fe,/\)/),"objc","objcMembers","propertyWrapper","requires_stored_property_inits","resultBuilder","Sendable","testable","UIApplicationMain","unchecked","unknown","usableFromInline","warn_unqualified_access"],Pe=["iOS","iOSApplicationExtension","macOS","macOSApplicationExtension","macCatalyst","macCatalystApplicationExtension","watchOS","watchOSApplicationExtension","tvOS","tvOSApplicationExtension","swift"] +;var Ke=Object.freeze({__proto__:null,grmr_bash:e=>{const n=e.regex,t={},a={ +begin:/\$\{/,end:/\}/,contains:["self",{begin:/:-/,contains:[t]}]} +;Object.assign(t,{className:"variable",variants:[{ +begin:n.concat(/\$[\w\d#@][\w\d_]*/,"(?![\\w\\d])(?![$])")},a]});const i={ +className:"subst",begin:/\$\(/,end:/\)/,contains:[e.BACKSLASH_ESCAPE]},r={ +begin:/<<-?\s*(?=\w+)/,starts:{contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/, +end:/(\w+)/,className:"string"})]}},s={className:"string",begin:/"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,t,i]};i.contains.push(s);const o={begin:/\$?\(\(/, +end:/\)\)/,contains:[{begin:/\d+#[0-9a-f]+/,className:"number"},e.NUMBER_MODE,t] +},l=e.SHEBANG({binary:"(fish|bash|zsh|sh|csh|ksh|tcsh|dash|scsh)",relevance:10 +}),c={className:"function",begin:/\w[\w\d_]*\s*\(\s*\)\s*\{/,returnBegin:!0, +contains:[e.inherit(e.TITLE_MODE,{begin:/\w[\w\d_]*/})],relevance:0};return{ +name:"Bash",aliases:["sh"],keywords:{$pattern:/\b[a-z][a-z0-9._-]+\b/, +keyword:["if","then","else","elif","fi","for","while","until","in","do","done","case","esac","function","select"], +literal:["true","false"], +built_in:["break","cd","continue","eval","exec","exit","export","getopts","hash","pwd","readonly","return","shift","test","times","trap","umask","unset","alias","bind","builtin","caller","command","declare","echo","enable","help","let","local","logout","mapfile","printf","read","readarray","source","type","typeset","ulimit","unalias","set","shopt","autoload","bg","bindkey","bye","cap","chdir","clone","comparguments","compcall","compctl","compdescribe","compfiles","compgroups","compquote","comptags","comptry","compvalues","dirs","disable","disown","echotc","echoti","emulate","fc","fg","float","functions","getcap","getln","history","integer","jobs","kill","limit","log","noglob","popd","print","pushd","pushln","rehash","sched","setcap","setopt","stat","suspend","ttyctl","unfunction","unhash","unlimit","unsetopt","vared","wait","whence","where","which","zcompile","zformat","zftp","zle","zmodload","zparseopts","zprof","zpty","zregexparse","zsocket","zstyle","ztcp","chcon","chgrp","chown","chmod","cp","dd","df","dir","dircolors","ln","ls","mkdir","mkfifo","mknod","mktemp","mv","realpath","rm","rmdir","shred","sync","touch","truncate","vdir","b2sum","base32","base64","cat","cksum","comm","csplit","cut","expand","fmt","fold","head","join","md5sum","nl","numfmt","od","paste","ptx","pr","sha1sum","sha224sum","sha256sum","sha384sum","sha512sum","shuf","sort","split","sum","tac","tail","tr","tsort","unexpand","uniq","wc","arch","basename","chroot","date","dirname","du","echo","env","expr","factor","groups","hostid","id","link","logname","nice","nohup","nproc","pathchk","pinky","printenv","printf","pwd","readlink","runcon","seq","sleep","stat","stdbuf","stty","tee","test","timeout","tty","uname","unlink","uptime","users","who","whoami","yes"] +},contains:[l,e.SHEBANG(),c,o,e.HASH_COMMENT_MODE,r,{match:/(\/[a-z._-]+)+/},s,{ +match:/\\"/},{className:"string",begin:/'/,end:/'/},{match:/\\'/},t]}}, +grmr_c:e=>{const n=e.regex,t=e.COMMENT("//","$",{contains:[{begin:/\\\n/}] +}),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",r="("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",s={ +className:"type",variants:[{begin:"\\b[a-z\\d_]*_t\\b"},{ +match:/\batomic_[a-z]{3,6}\b/}]},o={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ +className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ +className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 +},g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ +keyword:["asm","auto","break","case","continue","default","do","else","enum","extern","for","fortran","goto","if","inline","register","restrict","return","sizeof","struct","switch","typedef","union","volatile","while","_Alignas","_Alignof","_Atomic","_Generic","_Noreturn","_Static_assert","_Thread_local","alignas","alignof","noreturn","static_assert","thread_local","_Pragma"], +type:["float","double","signed","unsigned","int","short","long","char","void","_Bool","_Complex","_Imaginary","_Decimal32","_Decimal64","_Decimal128","const","static","complex","bool","imaginary"], +literal:"true false NULL", +built_in:"std string wstring cin cout cerr clog stdin stdout stderr stringstream istringstream ostringstream auto_ptr deque list queue stack vector map set pair bitset multiset multimap unordered_set unordered_map unordered_multiset unordered_multimap priority_queue make_pair array shared_ptr abort terminate abs acos asin atan2 atan calloc ceil cosh cos exit exp fabs floor fmod fprintf fputs free frexp fscanf future isalnum isalpha iscntrl isdigit isgraph islower isprint ispunct isspace isupper isxdigit tolower toupper labs ldexp log10 log malloc realloc memchr memcmp memcpy memset modf pow printf putchar puts scanf sinh sin snprintf sprintf sqrt sscanf strcat strchr strcmp strcpy strcspn strlen strncat strncmp strncpy strpbrk strrchr strspn strstr tanh tan vfprintf vprintf vsprintf endl initializer_list unique_ptr" +},b=[c,s,t,e.C_BLOCK_COMMENT_MODE,l,o],m={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:u,contains:b.concat([{begin:/\(/,end:/\)/,keywords:u, +contains:b.concat(["self"]),relevance:0}]),relevance:0},p={ +begin:"("+r+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{ +begin:g,returnBegin:!0,contains:[e.inherit(d,{className:"title.function"})], +relevance:0},{relevance:0,match:/,/},{className:"params",begin:/\(/,end:/\)/, +keywords:u,relevance:0,contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/, +end:/\)/,keywords:u,relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,s] +}]},s,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C",aliases:["h"],keywords:u, +disableAutodetect:!0,illegal:"=]/,contains:[{ +beginKeywords:"final class struct"},e.TITLE_MODE]}]),exports:{preprocessor:c, +strings:o,keywords:u}}},grmr_cpp:e=>{const n=e.regex,t=e.COMMENT("//","$",{ +contains:[{begin:/\\\n/}] +}),a="decltype\\(auto\\)",i="[a-zA-Z_]\\w*::",r="(?!struct)("+a+"|"+n.optional(i)+"[a-zA-Z_]\\w*"+n.optional("<[^<>]+>")+")",s={ +className:"type",begin:"\\b[a-z\\d_]*_t\\b"},o={className:"string",variants:[{ +begin:'(u8?|U|L)?"',end:'"',illegal:"\\n",contains:[e.BACKSLASH_ESCAPE]},{ +begin:"(u8?|U|L)?'(\\\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4,8}|[0-7]{3}|\\S)|.)", +end:"'",illegal:"."},e.END_SAME_AS_BEGIN({ +begin:/(?:u8?|U|L)?R"([^()\\ ]{0,16})\(/,end:/\)([^()\\ ]{0,16})"/})]},l={ +className:"number",variants:[{begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)((ll|LL|l|L)(u|U)?|(u|U)(ll|LL|l|L)?|f|F|b|B)" +},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},c={className:"meta",begin:/#\s*[a-z]+\b/,end:/$/,keywords:{ +keyword:"if else elif endif define undef warning error line pragma _Pragma ifdef ifndef include" +},contains:[{begin:/\\\n/,relevance:0},e.inherit(o,{className:"string"}),{ +className:"string",begin:/<.*?>/},t,e.C_BLOCK_COMMENT_MODE]},d={ +className:"title",begin:n.optional(i)+e.IDENT_RE,relevance:0 +},g=n.optional(i)+e.IDENT_RE+"\\s*\\(",u={ +type:["bool","char","char16_t","char32_t","char8_t","double","float","int","long","short","void","wchar_t","unsigned","signed","const","static"], +keyword:["alignas","alignof","and","and_eq","asm","atomic_cancel","atomic_commit","atomic_noexcept","auto","bitand","bitor","break","case","catch","class","co_await","co_return","co_yield","compl","concept","const_cast|10","consteval","constexpr","constinit","continue","decltype","default","delete","do","dynamic_cast|10","else","enum","explicit","export","extern","false","final","for","friend","goto","if","import","inline","module","mutable","namespace","new","noexcept","not","not_eq","nullptr","operator","or","or_eq","override","private","protected","public","reflexpr","register","reinterpret_cast|10","requires","return","sizeof","static_assert","static_cast|10","struct","switch","synchronized","template","this","thread_local","throw","transaction_safe","transaction_safe_dynamic","true","try","typedef","typeid","typename","union","using","virtual","volatile","while","xor","xor_eq"], +literal:["NULL","false","nullopt","nullptr","true"],built_in:["_Pragma"], +_type_hints:["any","auto_ptr","barrier","binary_semaphore","bitset","complex","condition_variable","condition_variable_any","counting_semaphore","deque","false_type","future","imaginary","initializer_list","istringstream","jthread","latch","lock_guard","multimap","multiset","mutex","optional","ostringstream","packaged_task","pair","promise","priority_queue","queue","recursive_mutex","recursive_timed_mutex","scoped_lock","set","shared_future","shared_lock","shared_mutex","shared_timed_mutex","shared_ptr","stack","string_view","stringstream","timed_mutex","thread","true_type","tuple","unique_lock","unique_ptr","unordered_map","unordered_multimap","unordered_multiset","unordered_set","variant","vector","weak_ptr","wstring","wstring_view"] +},b={className:"function.dispatch",relevance:0,keywords:{ +_hint:["abort","abs","acos","apply","as_const","asin","atan","atan2","calloc","ceil","cerr","cin","clog","cos","cosh","cout","declval","endl","exchange","exit","exp","fabs","floor","fmod","forward","fprintf","fputs","free","frexp","fscanf","future","invoke","isalnum","isalpha","iscntrl","isdigit","isgraph","islower","isprint","ispunct","isspace","isupper","isxdigit","labs","launder","ldexp","log","log10","make_pair","make_shared","make_shared_for_overwrite","make_tuple","make_unique","malloc","memchr","memcmp","memcpy","memset","modf","move","pow","printf","putchar","puts","realloc","scanf","sin","sinh","snprintf","sprintf","sqrt","sscanf","std","stderr","stdin","stdout","strcat","strchr","strcmp","strcpy","strcspn","strlen","strncat","strncmp","strncpy","strpbrk","strrchr","strspn","strstr","swap","tan","tanh","terminate","to_underlying","tolower","toupper","vfprintf","visit","vprintf","vsprintf"] +}, +begin:n.concat(/\b/,/(?!decltype)/,/(?!if)/,/(?!for)/,/(?!switch)/,/(?!while)/,e.IDENT_RE,n.lookahead(/(<[^<>]+>|)\s*\(/)) +},m=[b,c,s,t,e.C_BLOCK_COMMENT_MODE,l,o],p={variants:[{begin:/=/,end:/;/},{ +begin:/\(/,end:/\)/},{beginKeywords:"new throw return else",end:/;/}], +keywords:u,contains:m.concat([{begin:/\(/,end:/\)/,keywords:u, +contains:m.concat(["self"]),relevance:0}]),relevance:0},_={className:"function", +begin:"("+r+"[\\*&\\s]+)+"+g,returnBegin:!0,end:/[{;=]/,excludeEnd:!0, +keywords:u,illegal:/[^\w\s\*&:<>.]/,contains:[{begin:a,keywords:u,relevance:0},{ +begin:g,returnBegin:!0,contains:[d],relevance:0},{begin:/::/,relevance:0},{ +begin:/:/,endsWithParent:!0,contains:[o,l]},{relevance:0,match:/,/},{ +className:"params",begin:/\(/,end:/\)/,keywords:u,relevance:0, +contains:[t,e.C_BLOCK_COMMENT_MODE,o,l,s,{begin:/\(/,end:/\)/,keywords:u, +relevance:0,contains:["self",t,e.C_BLOCK_COMMENT_MODE,o,l,s]}] +},s,t,e.C_BLOCK_COMMENT_MODE,c]};return{name:"C++", +aliases:["cc","c++","h++","hpp","hh","hxx","cxx"],keywords:u,illegal:"",keywords:u,contains:["self",s]},{begin:e.IDENT_RE+"::",keywords:u},{ +match:[/\b(?:enum(?:\s+(?:class|struct))?|class|struct|union)/,/\s+/,/\w+/], +className:{1:"keyword",3:"title.class"}}])}},grmr_csharp:e=>{const n={ +keyword:["abstract","as","base","break","case","catch","class","const","continue","do","else","event","explicit","extern","finally","fixed","for","foreach","goto","if","implicit","in","interface","internal","is","lock","namespace","new","operator","out","override","params","private","protected","public","readonly","record","ref","return","scoped","sealed","sizeof","stackalloc","static","struct","switch","this","throw","try","typeof","unchecked","unsafe","using","virtual","void","volatile","while"].concat(["add","alias","and","ascending","async","await","by","descending","equals","from","get","global","group","init","into","join","let","nameof","not","notnull","on","or","orderby","partial","remove","select","set","unmanaged","value|0","var","when","where","with","yield"]), +built_in:["bool","byte","char","decimal","delegate","double","dynamic","enum","float","int","long","nint","nuint","object","sbyte","short","string","ulong","uint","ushort"], +literal:["default","false","null","true"]},t=e.inherit(e.TITLE_MODE,{ +begin:"[a-zA-Z](\\.?\\w)*"}),a={className:"number",variants:[{ +begin:"\\b(0b[01']+)"},{ +begin:"(-?)\\b([\\d']+(\\.[\\d']*)?|\\.[\\d']+)(u|U|l|L|ul|UL|f|F|b|B)"},{ +begin:"(-?)(\\b0[xX][a-fA-F0-9']+|(\\b[\\d']+(\\.[\\d']*)?|\\.[\\d']+)([eE][-+]?[\\d']+)?)" +}],relevance:0},i={className:"string",begin:'@"',end:'"',contains:[{begin:'""'}] +},r=e.inherit(i,{illegal:/\n/}),s={className:"subst",begin:/\{/,end:/\}/, +keywords:n},o=e.inherit(s,{illegal:/\n/}),l={className:"string",begin:/\$"/, +end:'"',illegal:/\n/,contains:[{begin:/\{\{/},{begin:/\}\}/ +},e.BACKSLASH_ESCAPE,o]},c={className:"string",begin:/\$@"/,end:'"',contains:[{ +begin:/\{\{/},{begin:/\}\}/},{begin:'""'},s]},d=e.inherit(c,{illegal:/\n/, +contains:[{begin:/\{\{/},{begin:/\}\}/},{begin:'""'},o]}) +;s.contains=[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.C_BLOCK_COMMENT_MODE], +o.contains=[d,l,r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,a,e.inherit(e.C_BLOCK_COMMENT_MODE,{ +illegal:/\n/})];const g={variants:[c,l,i,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},u={begin:"<",end:">",contains:[{beginKeywords:"in out"},t] +},b=e.IDENT_RE+"(<"+e.IDENT_RE+"(\\s*,\\s*"+e.IDENT_RE+")*>)?(\\[\\])?",m={ +begin:"@"+e.IDENT_RE,relevance:0};return{name:"C#",aliases:["cs","c#"], +keywords:n,illegal:/::/,contains:[e.COMMENT("///","$",{returnBegin:!0, +contains:[{className:"doctag",variants:[{begin:"///",relevance:0},{ +begin:"\x3c!--|--\x3e"},{begin:""}]}] +}),e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{className:"meta",begin:"#", +end:"$",keywords:{ +keyword:"if else elif endif define undef warning error line region endregion pragma checksum" +}},g,a,{beginKeywords:"class interface",relevance:0,end:/[{;=]/, +illegal:/[^\s:,]/,contains:[{beginKeywords:"where class" +},t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{beginKeywords:"namespace", +relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[t,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"record",relevance:0,end:/[{;=]/,illegal:/[^\s:]/, +contains:[t,u,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"meta", +begin:"^\\s*\\[(?=[\\w])",excludeBegin:!0,end:"\\]",excludeEnd:!0,contains:[{ +className:"string",begin:/"/,end:/"/}]},{ +beginKeywords:"new return throw await else",relevance:0},{className:"function", +begin:"("+b+"\\s+)+"+e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, +end:/\s*[{;=]/,excludeEnd:!0,keywords:n,contains:[{ +beginKeywords:"public private protected static internal protected abstract async extern override unsafe virtual new sealed partial", +relevance:0},{begin:e.IDENT_RE+"\\s*(<[^=]+>\\s*)?\\(",returnBegin:!0, +contains:[e.TITLE_MODE,u],relevance:0},{match:/\(\)/},{className:"params", +begin:/\(/,end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:n,relevance:0, +contains:[g,a,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},m]}},grmr_css:e=>{ +const n=e.regex,t=ie(e),a=[e.APOS_STRING_MODE,e.QUOTE_STRING_MODE];return{ +name:"CSS",case_insensitive:!0,illegal:/[=|'\$]/,keywords:{ +keyframePosition:"from to"},classNameAliases:{keyframePosition:"selector-tag"}, +contains:[t.BLOCK_COMMENT,{begin:/-(webkit|moz|ms|o)-(?=[a-z])/ +},t.CSS_NUMBER_MODE,{className:"selector-id",begin:/#[A-Za-z0-9_-]+/,relevance:0 +},{className:"selector-class",begin:"\\.[a-zA-Z-][a-zA-Z0-9_-]*",relevance:0 +},t.ATTRIBUTE_SELECTOR_MODE,{className:"selector-pseudo",variants:[{ +begin:":("+oe.join("|")+")"},{begin:":(:)?("+le.join("|")+")"}] +},t.CSS_VARIABLE,{className:"attribute",begin:"\\b("+ce.join("|")+")\\b"},{ +begin:/:/,end:/[;}{]/, +contains:[t.BLOCK_COMMENT,t.HEXCOLOR,t.IMPORTANT,t.CSS_NUMBER_MODE,...a,{ +begin:/(url|data-uri)\(/,end:/\)/,relevance:0,keywords:{built_in:"url data-uri" +},contains:[...a,{className:"string",begin:/[^)]/,endsWithParent:!0, +excludeEnd:!0}]},t.FUNCTION_DISPATCH]},{begin:n.lookahead(/@/),end:"[{;]", +relevance:0,illegal:/:/,contains:[{className:"keyword",begin:/@-?\w[\w]*(-\w+)*/ +},{begin:/\s/,endsWithParent:!0,excludeEnd:!0,relevance:0,keywords:{ +$pattern:/[a-z-]+/,keyword:"and or not only",attribute:se.join(" ")},contains:[{ +begin:/[a-z-]+(?=:)/,className:"attribute"},...a,t.CSS_NUMBER_MODE]}]},{ +className:"selector-tag",begin:"\\b("+re.join("|")+")\\b"}]}},grmr_diff:e=>{ +const n=e.regex;return{name:"Diff",aliases:["patch"],contains:[{ +className:"meta",relevance:10, +match:n.either(/^@@ +-\d+,\d+ +\+\d+,\d+ +@@/,/^\*\*\* +\d+,\d+ +\*\*\*\*$/,/^--- +\d+,\d+ +----$/) +},{className:"comment",variants:[{ +begin:n.either(/Index: /,/^index/,/={3,}/,/^-{3}/,/^\*{3} /,/^\+{3}/,/^diff --git/), +end:/$/},{match:/^\*{15}$/}]},{className:"addition",begin:/^\+/,end:/$/},{ +className:"deletion",begin:/^-/,end:/$/},{className:"addition",begin:/^!/, +end:/$/}]}},grmr_go:e=>{const n={ +keyword:["break","case","chan","const","continue","default","defer","else","fallthrough","for","func","go","goto","if","import","interface","map","package","range","return","select","struct","switch","type","var"], +type:["bool","byte","complex64","complex128","error","float32","float64","int8","int16","int32","int64","string","uint8","uint16","uint32","uint64","int","uint","uintptr","rune"], +literal:["true","false","iota","nil"], +built_in:["append","cap","close","complex","copy","imag","len","make","new","panic","print","println","real","recover","delete"] +};return{name:"Go",aliases:["golang"],keywords:n,illegal:"{const n=e.regex;return{name:"GraphQL",aliases:["gql"], +case_insensitive:!0,disableAutodetect:!1,keywords:{ +keyword:["query","mutation","subscription","type","input","schema","directive","interface","union","scalar","fragment","enum","on"], +literal:["true","false","null"]}, +contains:[e.HASH_COMMENT_MODE,e.QUOTE_STRING_MODE,e.NUMBER_MODE,{ +scope:"punctuation",match:/[.]{3}/,relevance:0},{scope:"punctuation", +begin:/[\!\(\)\:\=\[\]\{\|\}]{1}/,relevance:0},{scope:"variable",begin:/\$/, +end:/\W/,excludeEnd:!0,relevance:0},{scope:"meta",match:/@\w+/,excludeEnd:!0},{ +scope:"symbol",begin:n.concat(/[_A-Za-z][_0-9A-Za-z]*/,n.lookahead(/\s*:/)), +relevance:0}],illegal:[/[;<']/,/BEGIN/]}},grmr_ini:e=>{const n=e.regex,t={ +className:"number",relevance:0,variants:[{begin:/([+-]+)?[\d]+_[\d_]+/},{ +begin:e.NUMBER_RE}]},a=e.COMMENT();a.variants=[{begin:/;/,end:/$/},{begin:/#/, +end:/$/}];const i={className:"variable",variants:[{begin:/\$[\w\d"][\w\d_]*/},{ +begin:/\$\{(.*?)\}/}]},r={className:"literal", +begin:/\bon|off|true|false|yes|no\b/},s={className:"string", +contains:[e.BACKSLASH_ESCAPE],variants:[{begin:"'''",end:"'''",relevance:10},{ +begin:'"""',end:'"""',relevance:10},{begin:'"',end:'"'},{begin:"'",end:"'"}] +},o={begin:/\[/,end:/\]/,contains:[a,r,i,s,t,"self"],relevance:0 +},l=n.either(/[A-Za-z0-9_-]+/,/"(\\"|[^"])*"/,/'[^']*'/);return{ +name:"TOML, also INI",aliases:["toml"],case_insensitive:!0,illegal:/\S/, +contains:[a,{className:"section",begin:/\[+/,end:/\]+/},{ +begin:n.concat(l,"(\\s*\\.\\s*",l,")*",n.lookahead(/\s*=\s*[^#\s]/)), +className:"attr",starts:{end:/$/,contains:[a,o,r,i,s,t]}}]}},grmr_java:e=>{ +const n=e.regex,t="[\xc0-\u02b8a-zA-Z_$][\xc0-\u02b8a-zA-Z_$0-9]*",a=t+pe("(?:<"+t+"~~~(?:\\s*,\\s*"+t+"~~~)*>)?",/~~~/g,2),i={ +keyword:["synchronized","abstract","private","var","static","if","const ","for","while","strictfp","finally","protected","import","native","final","void","enum","else","break","transient","catch","instanceof","volatile","case","assert","package","default","public","try","switch","continue","throws","protected","public","private","module","requires","exports","do","sealed","yield","permits"], +literal:["false","true","null"], +type:["char","boolean","long","float","int","byte","short","double"], +built_in:["super","this"]},r={className:"meta",begin:"@"+t,contains:[{ +begin:/\(/,end:/\)/,contains:["self"]}]},s={className:"params",begin:/\(/, +end:/\)/,keywords:i,relevance:0,contains:[e.C_BLOCK_COMMENT_MODE],endsParent:!0} +;return{name:"Java",aliases:["jsp"],keywords:i,illegal:/<\/|#/, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{begin:/\w+@/, +relevance:0},{className:"doctag",begin:"@[A-Za-z]+"}]}),{ +begin:/import java\.[a-z]+\./,keywords:"import",relevance:2 +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,{begin:/"""/,end:/"""/, +className:"string",contains:[e.BACKSLASH_ESCAPE] +},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{ +match:[/\b(?:class|interface|enum|extends|implements|new)/,/\s+/,t],className:{ +1:"keyword",3:"title.class"}},{match:/non-sealed/,scope:"keyword"},{ +begin:[n.concat(/(?!else)/,t),/\s+/,t,/\s+/,/=(?!=)/],className:{1:"type", +3:"variable",5:"operator"}},{begin:[/record/,/\s+/,t],className:{1:"keyword", +3:"title.class"},contains:[s,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{ +beginKeywords:"new throw return else",relevance:0},{ +begin:["(?:"+a+"\\s+)",e.UNDERSCORE_IDENT_RE,/\s*(?=\()/],className:{ +2:"title.function"},keywords:i,contains:[{className:"params",begin:/\(/, +end:/\)/,keywords:i,relevance:0, +contains:[r,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,me,e.C_BLOCK_COMMENT_MODE] +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},me,r]}},grmr_javascript:Oe, +grmr_json:e=>{const n=["true","false","null"],t={scope:"literal", +beginKeywords:n.join(" ")};return{name:"JSON",keywords:{literal:n},contains:[{ +className:"attr",begin:/"(\\.|[^\\"\r\n])*"(?=\s*:)/,relevance:1.01},{ +match:/[{}[\],:]/,className:"punctuation",relevance:0 +},e.QUOTE_STRING_MODE,t,e.C_NUMBER_MODE,e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE], +illegal:"\\S"}},grmr_kotlin:e=>{const n={ +keyword:"abstract as val var vararg get set class object open private protected public noinline crossinline dynamic final enum if else do while for when throw try catch finally import package is in fun override companion reified inline lateinit init interface annotation data sealed internal infix operator out by constructor super tailrec where const inner suspend typealias external expect actual", +built_in:"Byte Short Char Int Long Boolean Float Double Void Unit Nothing", +literal:"true false null"},t={className:"symbol",begin:e.UNDERSCORE_IDENT_RE+"@" +},a={className:"subst",begin:/\$\{/,end:/\}/,contains:[e.C_NUMBER_MODE]},i={ +className:"variable",begin:"\\$"+e.UNDERSCORE_IDENT_RE},r={className:"string", +variants:[{begin:'"""',end:'"""(?=[^"])',contains:[i,a]},{begin:"'",end:"'", +illegal:/\n/,contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"',illegal:/\n/, +contains:[e.BACKSLASH_ESCAPE,i,a]}]};a.contains.push(r);const s={ +className:"meta", +begin:"@(?:file|property|field|get|set|receiver|param|setparam|delegate)\\s*:(?:\\s*"+e.UNDERSCORE_IDENT_RE+")?" +},o={className:"meta",begin:"@"+e.UNDERSCORE_IDENT_RE,contains:[{begin:/\(/, +end:/\)/,contains:[e.inherit(r,{className:"string"}),"self"]}] +},l=me,c=e.COMMENT("/\\*","\\*/",{contains:[e.C_BLOCK_COMMENT_MODE]}),d={ +variants:[{className:"type",begin:e.UNDERSCORE_IDENT_RE},{begin:/\(/,end:/\)/, +contains:[]}]},g=d;return g.variants[1].contains=[d],d.variants[1].contains=[g], +{name:"Kotlin",aliases:["kt","kts"],keywords:n, +contains:[e.COMMENT("/\\*\\*","\\*/",{relevance:0,contains:[{className:"doctag", +begin:"@[A-Za-z]+"}]}),e.C_LINE_COMMENT_MODE,c,{className:"keyword", +begin:/\b(break|continue|return|this)\b/,starts:{contains:[{className:"symbol", +begin:/@\w+/}]}},t,s,o,{className:"function",beginKeywords:"fun",end:"[(]|$", +returnBegin:!0,excludeEnd:!0,keywords:n,relevance:5,contains:[{ +begin:e.UNDERSCORE_IDENT_RE+"\\s*\\(",returnBegin:!0,relevance:0, +contains:[e.UNDERSCORE_TITLE_MODE]},{className:"type",begin://, +keywords:"reified",relevance:0},{className:"params",begin:/\(/,end:/\)/, +endsParent:!0,keywords:n,relevance:0,contains:[{begin:/:/,end:/[=,\/]/, +endsWithParent:!0,contains:[d,e.C_LINE_COMMENT_MODE,c],relevance:0 +},e.C_LINE_COMMENT_MODE,c,s,o,r,e.C_NUMBER_MODE]},c]},{ +begin:[/class|interface|trait/,/\s+/,e.UNDERSCORE_IDENT_RE],beginScope:{ +3:"title.class"},keywords:"class interface trait",end:/[:\{(]|$/,excludeEnd:!0, +illegal:"extends implements",contains:[{ +beginKeywords:"public protected internal private constructor" +},e.UNDERSCORE_TITLE_MODE,{className:"type",begin://,excludeBegin:!0, +excludeEnd:!0,relevance:0},{className:"type",begin:/[,:]\s*/,end:/[<\(,){\s]|$/, +excludeBegin:!0,returnEnd:!0},s,o]},r,{className:"meta",begin:"^#!/usr/bin/env", +end:"$",illegal:"\n"},l]}},grmr_less:e=>{ +const n=ie(e),t=de,a="[\\w-]+",i="("+a+"|@\\{"+a+"\\})",r=[],s=[],o=e=>({ +className:"string",begin:"~?"+e+".*?"+e}),l=(e,n,t)=>({className:e,begin:n, +relevance:t}),c={$pattern:/[a-z-]+/,keyword:"and or not only", +attribute:se.join(" ")},d={begin:"\\(",end:"\\)",contains:s,keywords:c, +relevance:0} +;s.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,o("'"),o('"'),n.CSS_NUMBER_MODE,{ +begin:"(url|data-uri)\\(",starts:{className:"string",end:"[\\)\\n]", +excludeEnd:!0} +},n.HEXCOLOR,d,l("variable","@@?"+a,10),l("variable","@\\{"+a+"\\}"),l("built_in","~?`[^`]*?`"),{ +className:"attribute",begin:a+"\\s*:",end:":",returnBegin:!0,excludeEnd:!0 +},n.IMPORTANT,{beginKeywords:"and not"},n.FUNCTION_DISPATCH);const g=s.concat({ +begin:/\{/,end:/\}/,contains:r}),u={beginKeywords:"when",endsWithParent:!0, +contains:[{beginKeywords:"and not"}].concat(s)},b={begin:i+"\\s*:", +returnBegin:!0,end:/[;}]/,relevance:0,contains:[{begin:/-(webkit|moz|ms|o)-/ +},n.CSS_VARIABLE,{className:"attribute",begin:"\\b("+ce.join("|")+")\\b", +end:/(?=:)/,starts:{endsWithParent:!0,illegal:"[<=$]",relevance:0,contains:s}}] +},m={className:"keyword", +begin:"@(import|media|charset|font-face|(-[a-z]+-)?keyframes|supports|document|namespace|page|viewport|host)\\b", +starts:{end:"[;{}]",keywords:c,returnEnd:!0,contains:s,relevance:0}},p={ +className:"variable",variants:[{begin:"@"+a+"\\s*:",relevance:15},{begin:"@"+a +}],starts:{end:"[;}]",returnEnd:!0,contains:g}},_={variants:[{ +begin:"[\\.#:&\\[>]",end:"[;{}]"},{begin:i,end:/\{/}],returnBegin:!0, +returnEnd:!0,illegal:"[<='$\"]",relevance:0, +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,u,l("keyword","all\\b"),l("variable","@\\{"+a+"\\}"),{ +begin:"\\b("+re.join("|")+")\\b",className:"selector-tag" +},n.CSS_NUMBER_MODE,l("selector-tag",i,0),l("selector-id","#"+i),l("selector-class","\\."+i,0),l("selector-tag","&",0),n.ATTRIBUTE_SELECTOR_MODE,{ +className:"selector-pseudo",begin:":("+oe.join("|")+")"},{ +className:"selector-pseudo",begin:":(:)?("+le.join("|")+")"},{begin:/\(/, +end:/\)/,relevance:0,contains:g},{begin:"!important"},n.FUNCTION_DISPATCH]},h={ +begin:a+":(:)?"+`(${t.join("|")})`,returnBegin:!0,contains:[_]} +;return r.push(e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,m,p,h,b,_,u,n.FUNCTION_DISPATCH), +{name:"Less",case_insensitive:!0,illegal:"[=>'/<($\"]",contains:r}}, +grmr_lua:e=>{const n="\\[=*\\[",t="\\]=*\\]",a={begin:n,end:t,contains:["self"] +},i=[e.COMMENT("--(?!"+n+")","$"),e.COMMENT("--"+n,t,{contains:[a],relevance:10 +})];return{name:"Lua",keywords:{$pattern:e.UNDERSCORE_IDENT_RE, +literal:"true false nil", +keyword:"and break do else elseif end for goto if in local not or repeat return then until while", +built_in:"_G _ENV _VERSION __index __newindex __mode __call __metatable __tostring __len __gc __add __sub __mul __div __mod __pow __concat __unm __eq __lt __le assert collectgarbage dofile error getfenv getmetatable ipairs load loadfile loadstring module next pairs pcall print rawequal rawget rawset require select setfenv setmetatable tonumber tostring type unpack xpcall arg self coroutine resume yield status wrap create running debug getupvalue debug sethook getmetatable gethook setmetatable setlocal traceback setfenv getinfo setupvalue getlocal getregistry getfenv io lines write close flush open output type read stderr stdin input stdout popen tmpfile math log max acos huge ldexp pi cos tanh pow deg tan cosh sinh random randomseed frexp ceil floor rad abs sqrt modf asin min mod fmod log10 atan2 exp sin atan os exit setlocale date getenv difftime remove time clock tmpname rename execute package preload loadlib loaded loaders cpath config path seeall string sub upper len gfind rep find match char dump gmatch reverse byte format gsub lower table setn insert getn foreachi maxn foreach concat sort remove" +},contains:i.concat([{className:"function",beginKeywords:"function",end:"\\)", +contains:[e.inherit(e.TITLE_MODE,{ +begin:"([_a-zA-Z]\\w*\\.)*([_a-zA-Z]\\w*:)?[_a-zA-Z]\\w*"}),{className:"params", +begin:"\\(",endsWithParent:!0,contains:i}].concat(i) +},e.C_NUMBER_MODE,e.APOS_STRING_MODE,e.QUOTE_STRING_MODE,{className:"string", +begin:n,end:t,contains:[a],relevance:5}])}},grmr_makefile:e=>{const n={ +className:"variable",variants:[{begin:"\\$\\("+e.UNDERSCORE_IDENT_RE+"\\)", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\$[@%{ +const n={begin:/<\/?[A-Za-z_]/,end:">",subLanguage:"xml",relevance:0},t={ +variants:[{begin:/\[.+?\]\[.*?\]/,relevance:0},{ +begin:/\[.+?\]\(((data|javascript|mailto):|(?:http|ftp)s?:\/\/).*?\)/, +relevance:2},{ +begin:e.regex.concat(/\[.+?\]\(/,/[A-Za-z][A-Za-z0-9+.-]*/,/:\/\/.*?\)/), +relevance:2},{begin:/\[.+?\]\([./?&#].*?\)/,relevance:1},{ +begin:/\[.*?\]\(.*?\)/,relevance:0}],returnBegin:!0,contains:[{match:/\[(?=\])/ +},{className:"string",relevance:0,begin:"\\[",end:"\\]",excludeBegin:!0, +returnEnd:!0},{className:"link",relevance:0,begin:"\\]\\(",end:"\\)", +excludeBegin:!0,excludeEnd:!0},{className:"symbol",relevance:0,begin:"\\]\\[", +end:"\\]",excludeBegin:!0,excludeEnd:!0}]},a={className:"strong",contains:[], +variants:[{begin:/_{2}(?!\s)/,end:/_{2}/},{begin:/\*{2}(?!\s)/,end:/\*{2}/}] +},i={className:"emphasis",contains:[],variants:[{begin:/\*(?![*\s])/,end:/\*/},{ +begin:/_(?![_\s])/,end:/_/,relevance:0}]},r=e.inherit(a,{contains:[] +}),s=e.inherit(i,{contains:[]});a.contains.push(s),i.contains.push(r) +;let o=[n,t];return[a,i,r,s].forEach((e=>{e.contains=e.contains.concat(o) +})),o=o.concat(a,i),{name:"Markdown",aliases:["md","mkdown","mkd"],contains:[{ +className:"section",variants:[{begin:"^#{1,6}",end:"$",contains:o},{ +begin:"(?=^.+?\\n[=-]{2,}$)",contains:[{begin:"^[=-]*$"},{begin:"^",end:"\\n", +contains:o}]}]},n,{className:"bullet",begin:"^[ \t]*([*+-]|(\\d+\\.))(?=\\s+)", +end:"\\s+",excludeEnd:!0},a,i,{className:"quote",begin:"^>\\s+",contains:o, +end:"$"},{className:"code",variants:[{begin:"(`{3,})[^`](.|\\n)*?\\1`*[ ]*"},{ +begin:"(~{3,})[^~](.|\\n)*?\\1~*[ ]*"},{begin:"```",end:"```+[ ]*$"},{ +begin:"~~~",end:"~~~+[ ]*$"},{begin:"`.+?`"},{begin:"(?=^( {4}|\\t))", +contains:[{begin:"^( {4}|\\t)",end:"(\\n)$"}],relevance:0}]},{ +begin:"^[-\\*]{3,}",end:"$"},t,{begin:/^\[[^\n]+\]:/,returnBegin:!0,contains:[{ +className:"symbol",begin:/\[/,end:/\]/,excludeBegin:!0,excludeEnd:!0},{ +className:"link",begin:/:\s*/,end:/$/,excludeBegin:!0}]}]}},grmr_objectivec:e=>{ +const n=/[a-zA-Z@][a-zA-Z0-9_]*/,t={$pattern:n, +keyword:["@interface","@class","@protocol","@implementation"]};return{ +name:"Objective-C",aliases:["mm","objc","obj-c","obj-c++","objective-c++"], +keywords:{"variable.language":["this","super"],$pattern:n, +keyword:["while","export","sizeof","typedef","const","struct","for","union","volatile","static","mutable","if","do","return","goto","enum","else","break","extern","asm","case","default","register","explicit","typename","switch","continue","inline","readonly","assign","readwrite","self","@synchronized","id","typeof","nonatomic","IBOutlet","IBAction","strong","weak","copy","in","out","inout","bycopy","byref","oneway","__strong","__weak","__block","__autoreleasing","@private","@protected","@public","@try","@property","@end","@throw","@catch","@finally","@autoreleasepool","@synthesize","@dynamic","@selector","@optional","@required","@encode","@package","@import","@defs","@compatibility_alias","__bridge","__bridge_transfer","__bridge_retained","__bridge_retain","__covariant","__contravariant","__kindof","_Nonnull","_Nullable","_Null_unspecified","__FUNCTION__","__PRETTY_FUNCTION__","__attribute__","getter","setter","retain","unsafe_unretained","nonnull","nullable","null_unspecified","null_resettable","class","instancetype","NS_DESIGNATED_INITIALIZER","NS_UNAVAILABLE","NS_REQUIRES_SUPER","NS_RETURNS_INNER_POINTER","NS_INLINE","NS_AVAILABLE","NS_DEPRECATED","NS_ENUM","NS_OPTIONS","NS_SWIFT_UNAVAILABLE","NS_ASSUME_NONNULL_BEGIN","NS_ASSUME_NONNULL_END","NS_REFINED_FOR_SWIFT","NS_SWIFT_NAME","NS_SWIFT_NOTHROW","NS_DURING","NS_HANDLER","NS_ENDHANDLER","NS_VALUERETURN","NS_VOIDRETURN"], +literal:["false","true","FALSE","TRUE","nil","YES","NO","NULL"], +built_in:["dispatch_once_t","dispatch_queue_t","dispatch_sync","dispatch_async","dispatch_once"], +type:["int","float","char","unsigned","signed","short","long","double","wchar_t","unichar","void","bool","BOOL","id|0","_Bool"] +},illegal:"/,end:/$/,illegal:"\\n" +},e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE]},{className:"class", +begin:"("+t.keyword.join("|")+")\\b",end:/(\{|$)/,excludeEnd:!0,keywords:t, +contains:[e.UNDERSCORE_TITLE_MODE]},{begin:"\\."+e.UNDERSCORE_IDENT_RE, +relevance:0}]}},grmr_perl:e=>{const n=e.regex,t=/[dualxmsipngr]{0,12}/,a={ +$pattern:/[\w.]+/, +keyword:"abs accept alarm and atan2 bind binmode bless break caller chdir chmod chomp chop chown chr chroot close closedir connect continue cos crypt dbmclose dbmopen defined delete die do dump each else elsif endgrent endhostent endnetent endprotoent endpwent endservent eof eval exec exists exit exp fcntl fileno flock for foreach fork format formline getc getgrent getgrgid getgrnam gethostbyaddr gethostbyname gethostent getlogin getnetbyaddr getnetbyname getnetent getpeername getpgrp getpriority getprotobyname getprotobynumber getprotoent getpwent getpwnam getpwuid getservbyname getservbyport getservent getsockname getsockopt given glob gmtime goto grep gt hex if index int ioctl join keys kill last lc lcfirst length link listen local localtime log lstat lt ma map mkdir msgctl msgget msgrcv msgsnd my ne next no not oct open opendir or ord our pack package pipe pop pos print printf prototype push q|0 qq quotemeta qw qx rand read readdir readline readlink readpipe recv redo ref rename require reset return reverse rewinddir rindex rmdir say scalar seek seekdir select semctl semget semop send setgrent sethostent setnetent setpgrp setpriority setprotoent setpwent setservent setsockopt shift shmctl shmget shmread shmwrite shutdown sin sleep socket socketpair sort splice split sprintf sqrt srand stat state study sub substr symlink syscall sysopen sysread sysseek system syswrite tell telldir tie tied time times tr truncate uc ucfirst umask undef unless unlink unpack unshift untie until use utime values vec wait waitpid wantarray warn when while write x|0 xor y|0" +},i={className:"subst",begin:"[$@]\\{",end:"\\}",keywords:a},r={begin:/->\{/, +end:/\}/},s={variants:[{begin:/\$\d/},{ +begin:n.concat(/[$%@](\^\w\b|#\w+(::\w+)*|\{\w+\}|\w+(::\w*)*)/,"(?![A-Za-z])(?![@$%])") +},{begin:/[$%@][^\s\w{]/,relevance:0}] +},o=[e.BACKSLASH_ESCAPE,i,s],l=[/!/,/\//,/\|/,/\?/,/'/,/"/,/#/],c=(e,a,i="\\1")=>{ +const r="\\1"===i?i:n.concat(i,a) +;return n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,r,/(?:\\.|[^\\\/])*?/,i,t) +},d=(e,a,i)=>n.concat(n.concat("(?:",e,")"),a,/(?:\\.|[^\\\/])*?/,i,t),g=[s,e.HASH_COMMENT_MODE,e.COMMENT(/^=\w/,/=cut/,{ +endsWithParent:!0}),r,{className:"string",contains:o,variants:[{ +begin:"q[qwxr]?\\s*\\(",end:"\\)",relevance:5},{begin:"q[qwxr]?\\s*\\[", +end:"\\]",relevance:5},{begin:"q[qwxr]?\\s*\\{",end:"\\}",relevance:5},{ +begin:"q[qwxr]?\\s*\\|",end:"\\|",relevance:5},{begin:"q[qwxr]?\\s*<",end:">", +relevance:5},{begin:"qw\\s+q",end:"q",relevance:5},{begin:"'",end:"'", +contains:[e.BACKSLASH_ESCAPE]},{begin:'"',end:'"'},{begin:"`",end:"`", +contains:[e.BACKSLASH_ESCAPE]},{begin:/\{\w+\}/,relevance:0},{ +begin:"-?\\w+\\s*=>",relevance:0}]},{className:"number", +begin:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b", +relevance:0},{ +begin:"(\\/\\/|"+e.RE_STARTERS_RE+"|\\b(split|return|print|reverse|grep)\\b)\\s*", +keywords:"split return print reverse grep",relevance:0, +contains:[e.HASH_COMMENT_MODE,{className:"regexp",variants:[{ +begin:c("s|tr|y",n.either(...l,{capture:!0}))},{begin:c("s|tr|y","\\(","\\)")},{ +begin:c("s|tr|y","\\[","\\]")},{begin:c("s|tr|y","\\{","\\}")}],relevance:2},{ +className:"regexp",variants:[{begin:/(m|qr)\/\//,relevance:0},{ +begin:d("(?:m|qr)?",/\//,/\//)},{begin:d("m|qr",n.either(...l,{capture:!0 +}),/\1/)},{begin:d("m|qr",/\(/,/\)/)},{begin:d("m|qr",/\[/,/\]/)},{ +begin:d("m|qr",/\{/,/\}/)}]}]},{className:"function",beginKeywords:"sub", +end:"(\\s*\\(.*?\\))?[;{]",excludeEnd:!0,relevance:5,contains:[e.TITLE_MODE]},{ +begin:"-\\w\\b",relevance:0},{begin:"^__DATA__$",end:"^__END__$", +subLanguage:"mojolicious",contains:[{begin:"^@@.*",end:"$",className:"comment"}] +}];return i.contains=g,r.contains=g,{name:"Perl",aliases:["pl","pm"],keywords:a, +contains:g}},grmr_php:e=>{ +const n=e.regex,t=/(?![A-Za-z0-9])(?![$])/,a=n.concat(/[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/,t),i=n.concat(/(\\?[A-Z][a-z0-9_\x7f-\xff]+|\\?[A-Z]+(?=[A-Z][a-z0-9_\x7f-\xff])){1,}/,t),r={ +scope:"variable",match:"\\$+"+a},s={scope:"subst",variants:[{begin:/\$\w+/},{ +begin:/\{\$/,end:/\}/}]},o=e.inherit(e.APOS_STRING_MODE,{illegal:null +}),l="[ \t\n]",c={scope:"string",variants:[e.inherit(e.QUOTE_STRING_MODE,{ +illegal:null,contains:e.QUOTE_STRING_MODE.contains.concat(s)}),o,{ +begin:/<<<[ \t]*(?:(\w+)|"(\w+)")\n/,end:/[ \t]*(\w+)\b/, +contains:e.QUOTE_STRING_MODE.contains.concat(s),"on:begin":(e,n)=>{ +n.data._beginMatch=e[1]||e[2]},"on:end":(e,n)=>{ +n.data._beginMatch!==e[1]&&n.ignoreMatch()}},e.END_SAME_AS_BEGIN({ +begin:/<<<[ \t]*'(\w+)'\n/,end:/[ \t]*(\w+)\b/})]},d={scope:"number",variants:[{ +begin:"\\b0[bB][01]+(?:_[01]+)*\\b"},{begin:"\\b0[oO][0-7]+(?:_[0-7]+)*\\b"},{ +begin:"\\b0[xX][\\da-fA-F]+(?:_[\\da-fA-F]+)*\\b"},{ +begin:"(?:\\b\\d+(?:_\\d+)*(\\.(?:\\d+(?:_\\d+)*))?|\\B\\.\\d+)(?:[eE][+-]?\\d+)?" +}],relevance:0 +},g=["false","null","true"],u=["__CLASS__","__DIR__","__FILE__","__FUNCTION__","__COMPILER_HALT_OFFSET__","__LINE__","__METHOD__","__NAMESPACE__","__TRAIT__","die","echo","exit","include","include_once","print","require","require_once","array","abstract","and","as","binary","bool","boolean","break","callable","case","catch","class","clone","const","continue","declare","default","do","double","else","elseif","empty","enddeclare","endfor","endforeach","endif","endswitch","endwhile","enum","eval","extends","final","finally","float","for","foreach","from","global","goto","if","implements","instanceof","insteadof","int","integer","interface","isset","iterable","list","match|0","mixed","new","never","object","or","private","protected","public","readonly","real","return","string","switch","throw","trait","try","unset","use","var","void","while","xor","yield"],b=["Error|0","AppendIterator","ArgumentCountError","ArithmeticError","ArrayIterator","ArrayObject","AssertionError","BadFunctionCallException","BadMethodCallException","CachingIterator","CallbackFilterIterator","CompileError","Countable","DirectoryIterator","DivisionByZeroError","DomainException","EmptyIterator","ErrorException","Exception","FilesystemIterator","FilterIterator","GlobIterator","InfiniteIterator","InvalidArgumentException","IteratorIterator","LengthException","LimitIterator","LogicException","MultipleIterator","NoRewindIterator","OutOfBoundsException","OutOfRangeException","OuterIterator","OverflowException","ParentIterator","ParseError","RangeException","RecursiveArrayIterator","RecursiveCachingIterator","RecursiveCallbackFilterIterator","RecursiveDirectoryIterator","RecursiveFilterIterator","RecursiveIterator","RecursiveIteratorIterator","RecursiveRegexIterator","RecursiveTreeIterator","RegexIterator","RuntimeException","SeekableIterator","SplDoublyLinkedList","SplFileInfo","SplFileObject","SplFixedArray","SplHeap","SplMaxHeap","SplMinHeap","SplObjectStorage","SplObserver","SplPriorityQueue","SplQueue","SplStack","SplSubject","SplTempFileObject","TypeError","UnderflowException","UnexpectedValueException","UnhandledMatchError","ArrayAccess","BackedEnum","Closure","Fiber","Generator","Iterator","IteratorAggregate","Serializable","Stringable","Throwable","Traversable","UnitEnum","WeakReference","WeakMap","Directory","__PHP_Incomplete_Class","parent","php_user_filter","self","static","stdClass"],m={ +keyword:u,literal:(e=>{const n=[];return e.forEach((e=>{ +n.push(e),e.toLowerCase()===e?n.push(e.toUpperCase()):n.push(e.toLowerCase()) +})),n})(g),built_in:b},p=e=>e.map((e=>e.replace(/\|\d+$/,""))),_={variants:[{ +match:[/new/,n.concat(l,"+"),n.concat("(?!",p(b).join("\\b|"),"\\b)"),i],scope:{ +1:"keyword",4:"title.class"}}]},h=n.concat(a,"\\b(?!\\()"),f={variants:[{ +match:[n.concat(/::/,n.lookahead(/(?!class\b)/)),h],scope:{2:"variable.constant" +}},{match:[/::/,/class/],scope:{2:"variable.language"}},{ +match:[i,n.concat(/::/,n.lookahead(/(?!class\b)/)),h],scope:{1:"title.class", +3:"variable.constant"}},{match:[i,n.concat("::",n.lookahead(/(?!class\b)/))], +scope:{1:"title.class"}},{match:[i,/::/,/class/],scope:{1:"title.class", +3:"variable.language"}}]},E={scope:"attr", +match:n.concat(a,n.lookahead(":"),n.lookahead(/(?!::)/))},y={relevance:0, +begin:/\(/,end:/\)/,keywords:m,contains:[E,r,f,e.C_BLOCK_COMMENT_MODE,c,d,_] +},N={relevance:0, +match:[/\b/,n.concat("(?!fn\\b|function\\b|",p(u).join("\\b|"),"|",p(b).join("\\b|"),"\\b)"),a,n.concat(l,"*"),n.lookahead(/(?=\()/)], +scope:{3:"title.function.invoke"},contains:[y]};y.contains.push(N) +;const w=[E,f,e.C_BLOCK_COMMENT_MODE,c,d,_];return{case_insensitive:!1, +keywords:m,contains:[{begin:n.concat(/#\[\s*/,i),beginScope:"meta",end:/]/, +endScope:"meta",keywords:{literal:g,keyword:["new","array"]},contains:[{ +begin:/\[/,end:/]/,keywords:{literal:g,keyword:["new","array"]}, +contains:["self",...w]},...w,{scope:"meta",match:i}] +},e.HASH_COMMENT_MODE,e.COMMENT("//","$"),e.COMMENT("/\\*","\\*/",{contains:[{ +scope:"doctag",match:"@[A-Za-z]+"}]}),{match:/__halt_compiler\(\);/, +keywords:"__halt_compiler",starts:{scope:"comment",end:e.MATCH_NOTHING_RE, +contains:[{match:/\?>/,scope:"meta",endsParent:!0}]}},{scope:"meta",variants:[{ +begin:/<\?php/,relevance:10},{begin:/<\?=/},{begin:/<\?/,relevance:.1},{ +begin:/\?>/}]},{scope:"variable.language",match:/\$this\b/},r,N,f,{ +match:[/const/,/\s/,a],scope:{1:"keyword",3:"variable.constant"}},_,{ +scope:"function",relevance:0,beginKeywords:"fn function",end:/[;{]/, +excludeEnd:!0,illegal:"[$%\\[]",contains:[{beginKeywords:"use" +},e.UNDERSCORE_TITLE_MODE,{begin:"=>",endsParent:!0},{scope:"params", +begin:"\\(",end:"\\)",excludeBegin:!0,excludeEnd:!0,keywords:m, +contains:["self",r,f,e.C_BLOCK_COMMENT_MODE,c,d]}]},{scope:"class",variants:[{ +beginKeywords:"enum",illegal:/[($"]/},{beginKeywords:"class interface trait", +illegal:/[:($"]/}],relevance:0,end:/\{/,excludeEnd:!0,contains:[{ +beginKeywords:"extends implements"},e.UNDERSCORE_TITLE_MODE]},{ +beginKeywords:"namespace",relevance:0,end:";",illegal:/[.']/, +contains:[e.inherit(e.UNDERSCORE_TITLE_MODE,{scope:"title.class"})]},{ +beginKeywords:"use",relevance:0,end:";",contains:[{ +match:/\b(as|const|function)\b/,scope:"keyword"},e.UNDERSCORE_TITLE_MODE]},c,d]} +},grmr_php_template:e=>({name:"PHP template",subLanguage:"xml",contains:[{ +begin:/<\?(php|=)?/,end:/\?>/,subLanguage:"php",contains:[{begin:"/\\*", +end:"\\*/",skip:!0},{begin:'b"',end:'"',skip:!0},{begin:"b'",end:"'",skip:!0 +},e.inherit(e.APOS_STRING_MODE,{illegal:null,className:null,contains:null, +skip:!0}),e.inherit(e.QUOTE_STRING_MODE,{illegal:null,className:null, +contains:null,skip:!0})]}]}),grmr_plaintext:e=>({name:"Plain text", +aliases:["text","txt"],disableAutodetect:!0}),grmr_python:e=>{ +const n=e.regex,t=/[\p{XID_Start}_]\p{XID_Continue}*/u,a=["and","as","assert","async","await","break","case","class","continue","def","del","elif","else","except","finally","for","from","global","if","import","in","is","lambda","match","nonlocal|10","not","or","pass","raise","return","try","while","with","yield"],i={ +$pattern:/[A-Za-z]\w+|__\w+__/,keyword:a, +built_in:["__import__","abs","all","any","ascii","bin","bool","breakpoint","bytearray","bytes","callable","chr","classmethod","compile","complex","delattr","dict","dir","divmod","enumerate","eval","exec","filter","float","format","frozenset","getattr","globals","hasattr","hash","help","hex","id","input","int","isinstance","issubclass","iter","len","list","locals","map","max","memoryview","min","next","object","oct","open","ord","pow","print","property","range","repr","reversed","round","set","setattr","slice","sorted","staticmethod","str","sum","super","tuple","type","vars","zip"], +literal:["__debug__","Ellipsis","False","None","NotImplemented","True"], +type:["Any","Callable","Coroutine","Dict","List","Literal","Generic","Optional","Sequence","Set","Tuple","Type","Union"] +},r={className:"meta",begin:/^(>>>|\.\.\.) /},s={className:"subst",begin:/\{/, +end:/\}/,keywords:i,illegal:/#/},o={begin:/\{\{/,relevance:0},l={ +className:"string",contains:[e.BACKSLASH_ESCAPE],variants:[{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{ +begin:/([uU]|[bB]|[rR]|[bB][rR]|[rR][bB])?"""/,end:/"""/, +contains:[e.BACKSLASH_ESCAPE,r],relevance:10},{ +begin:/([fF][rR]|[rR][fF]|[fF])'''/,end:/'''/, +contains:[e.BACKSLASH_ESCAPE,r,o,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"""/, +end:/"""/,contains:[e.BACKSLASH_ESCAPE,r,o,s]},{begin:/([uU]|[rR])'/,end:/'/, +relevance:10},{begin:/([uU]|[rR])"/,end:/"/,relevance:10},{ +begin:/([bB]|[bB][rR]|[rR][bB])'/,end:/'/},{begin:/([bB]|[bB][rR]|[rR][bB])"/, +end:/"/},{begin:/([fF][rR]|[rR][fF]|[fF])'/,end:/'/, +contains:[e.BACKSLASH_ESCAPE,o,s]},{begin:/([fF][rR]|[rR][fF]|[fF])"/,end:/"/, +contains:[e.BACKSLASH_ESCAPE,o,s]},e.APOS_STRING_MODE,e.QUOTE_STRING_MODE] +},c="[0-9](_?[0-9])*",d=`(\\b(${c}))?\\.(${c})|\\b(${c})\\.`,g="\\b|"+a.join("|"),u={ +className:"number",relevance:0,variants:[{ +begin:`(\\b(${c})|(${d}))[eE][+-]?(${c})[jJ]?(?=${g})`},{begin:`(${d})[jJ]?`},{ +begin:`\\b([1-9](_?[0-9])*|0+(_?0)*)[lLjJ]?(?=${g})`},{ +begin:`\\b0[bB](_?[01])+[lL]?(?=${g})`},{begin:`\\b0[oO](_?[0-7])+[lL]?(?=${g})` +},{begin:`\\b0[xX](_?[0-9a-fA-F])+[lL]?(?=${g})`},{begin:`\\b(${c})[jJ](?=${g})` +}]},b={className:"comment",begin:n.lookahead(/# type:/),end:/$/,keywords:i, +contains:[{begin:/# type:/},{begin:/#/,end:/\b\B/,endsWithParent:!0}]},m={ +className:"params",variants:[{className:"",begin:/\(\s*\)/,skip:!0},{begin:/\(/, +end:/\)/,excludeBegin:!0,excludeEnd:!0,keywords:i, +contains:["self",r,u,l,e.HASH_COMMENT_MODE]}]};return s.contains=[l,u,r],{ +name:"Python",aliases:["py","gyp","ipython"],unicodeRegex:!0,keywords:i, +illegal:/(<\/|\?)|=>/,contains:[r,u,{begin:/\bself\b/},{beginKeywords:"if", +relevance:0},l,b,e.HASH_COMMENT_MODE,{match:[/\bdef/,/\s+/,t],scope:{ +1:"keyword",3:"title.function"},contains:[m]},{variants:[{ +match:[/\bclass/,/\s+/,t,/\s*/,/\(\s*/,t,/\s*\)/]},{match:[/\bclass/,/\s+/,t]}], +scope:{1:"keyword",3:"title.class",6:"title.class.inherited"}},{ +className:"meta",begin:/^[\t ]*@/,end:/(?=#)|$/,contains:[u,m,l]}]}}, +grmr_python_repl:e=>({aliases:["pycon"],contains:[{className:"meta.prompt", +starts:{end:/ |$/,starts:{end:"$",subLanguage:"python"}},variants:[{ +begin:/^>>>(?=[ ]|$)/},{begin:/^\.\.\.(?=[ ]|$)/}]}]}),grmr_r:e=>{ +const n=e.regex,t=/(?:(?:[a-zA-Z]|\.[._a-zA-Z])[._a-zA-Z0-9]*)|\.(?!\d)/,a=n.either(/0[xX][0-9a-fA-F]+\.[0-9a-fA-F]*[pP][+-]?\d+i?/,/0[xX][0-9a-fA-F]+(?:[pP][+-]?\d+)?[Li]?/,/(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?[Li]?/),i=/[=!<>:]=|\|\||&&|:::?|<-|<<-|->>|->|\|>|[-+*\/?!$&|:<=>@^~]|\*\*/,r=n.either(/[()]/,/[{}]/,/\[\[/,/[[\]]/,/\\/,/,/) +;return{name:"R",keywords:{$pattern:t, +keyword:"function if in break next repeat else for while", +literal:"NULL NA TRUE FALSE Inf NaN NA_integer_|10 NA_real_|10 NA_character_|10 NA_complex_|10", +built_in:"LETTERS letters month.abb month.name pi T F abs acos acosh all any anyNA Arg as.call as.character as.complex as.double as.environment as.integer as.logical as.null.default as.numeric as.raw asin asinh atan atanh attr attributes baseenv browser c call ceiling class Conj cos cosh cospi cummax cummin cumprod cumsum digamma dim dimnames emptyenv exp expression floor forceAndCall gamma gc.time globalenv Im interactive invisible is.array is.atomic is.call is.character is.complex is.double is.environment is.expression is.finite is.function is.infinite is.integer is.language is.list is.logical is.matrix is.na is.name is.nan is.null is.numeric is.object is.pairlist is.raw is.recursive is.single is.symbol lazyLoadDBfetch length lgamma list log max min missing Mod names nargs nzchar oldClass on.exit pos.to.env proc.time prod quote range Re rep retracemem return round seq_along seq_len seq.int sign signif sin sinh sinpi sqrt standardGeneric substitute sum switch tan tanh tanpi tracemem trigamma trunc unclass untracemem UseMethod xtfrm" +},contains:[e.COMMENT(/#'/,/$/,{contains:[{scope:"doctag",match:/@examples/, +starts:{end:n.lookahead(n.either(/\n^#'\s*(?=@[a-zA-Z]+)/,/\n^(?!#')/)), +endsParent:!0}},{scope:"doctag",begin:"@param",end:/$/,contains:[{ +scope:"variable",variants:[{match:t},{match:/`(?:\\.|[^`\\])+`/}],endsParent:!0 +}]},{scope:"doctag",match:/@[a-zA-Z]+/},{scope:"keyword",match:/\\[a-zA-Z]+/}] +}),e.HASH_COMMENT_MODE,{scope:"string",contains:[e.BACKSLASH_ESCAPE], +variants:[e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\(/,end:/\)(-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\{/,end:/\}(-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]"(-*)\[/,end:/\](-*)"/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\(/,end:/\)(-*)'/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\{/,end:/\}(-*)'/ +}),e.END_SAME_AS_BEGIN({begin:/[rR]'(-*)\[/,end:/\](-*)'/}),{begin:'"',end:'"', +relevance:0},{begin:"'",end:"'",relevance:0}]},{relevance:0,variants:[{scope:{ +1:"operator",2:"number"},match:[i,a]},{scope:{1:"operator",2:"number"}, +match:[/%[^%]*%/,a]},{scope:{1:"punctuation",2:"number"},match:[r,a]},{scope:{ +2:"number"},match:[/[^a-zA-Z0-9._]|^/,a]}]},{scope:{3:"operator"}, +match:[t,/\s+/,/<-/,/\s+/]},{scope:"operator",relevance:0,variants:[{match:i},{ +match:/%[^%]*%/}]},{scope:"punctuation",relevance:0,match:r},{begin:"`",end:"`", +contains:[{begin:/\\./}]}]}},grmr_ruby:e=>{ +const n=e.regex,t="([a-zA-Z_]\\w*[!?=]?|[-+~]@|<<|>>|=~|===?|<=>|[<>]=?|\\*\\*|[-/+%^&*~`|]|\\[\\]=?)",a=n.either(/\b([A-Z]+[a-z0-9]+)+/,/\b([A-Z]+[a-z0-9]+)+[A-Z]+/),i=n.concat(a,/(::\w+)*/),r={ +"variable.constant":["__FILE__","__LINE__","__ENCODING__"], +"variable.language":["self","super"], +keyword:["alias","and","begin","BEGIN","break","case","class","defined","do","else","elsif","end","END","ensure","for","if","in","module","next","not","or","redo","require","rescue","retry","return","then","undef","unless","until","when","while","yield","include","extend","prepend","public","private","protected","raise","throw"], +built_in:["proc","lambda","attr_accessor","attr_reader","attr_writer","define_method","private_constant","module_function"], +literal:["true","false","nil"]},s={className:"doctag",begin:"@[A-Za-z]+"},o={ +begin:"#<",end:">"},l=[e.COMMENT("#","$",{contains:[s] +}),e.COMMENT("^=begin","^=end",{contains:[s],relevance:10 +}),e.COMMENT("^__END__",e.MATCH_NOTHING_RE)],c={className:"subst",begin:/#\{/, +end:/\}/,keywords:r},d={className:"string",contains:[e.BACKSLASH_ESCAPE,c], +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/`/,end:/`/},{ +begin:/%[qQwWx]?\(/,end:/\)/},{begin:/%[qQwWx]?\[/,end:/\]/},{ +begin:/%[qQwWx]?\{/,end:/\}/},{begin:/%[qQwWx]?/},{begin:/%[qQwWx]?\//, +end:/\//},{begin:/%[qQwWx]?%/,end:/%/},{begin:/%[qQwWx]?-/,end:/-/},{ +begin:/%[qQwWx]?\|/,end:/\|/},{begin:/\B\?(\\\d{1,3})/},{ +begin:/\B\?(\\x[A-Fa-f0-9]{1,2})/},{begin:/\B\?(\\u\{?[A-Fa-f0-9]{1,6}\}?)/},{ +begin:/\B\?(\\M-\\C-|\\M-\\c|\\c\\M-|\\M-|\\C-\\M-)[\x20-\x7e]/},{ +begin:/\B\?\\(c|C-)[\x20-\x7e]/},{begin:/\B\?\\?\S/},{ +begin:n.concat(/<<[-~]?'?/,n.lookahead(/(\w+)(?=\W)[^\n]*\n(?:[^\n]*\n)*?\s*\1\b/)), +contains:[e.END_SAME_AS_BEGIN({begin:/(\w+)/,end:/(\w+)/, +contains:[e.BACKSLASH_ESCAPE,c]})]}]},g="[0-9](_?[0-9])*",u={className:"number", +relevance:0,variants:[{ +begin:`\\b([1-9](_?[0-9])*|0)(\\.(${g}))?([eE][+-]?(${g})|r)?i?\\b`},{ +begin:"\\b0[dD][0-9](_?[0-9])*r?i?\\b"},{begin:"\\b0[bB][0-1](_?[0-1])*r?i?\\b" +},{begin:"\\b0[oO][0-7](_?[0-7])*r?i?\\b"},{ +begin:"\\b0[xX][0-9a-fA-F](_?[0-9a-fA-F])*r?i?\\b"},{ +begin:"\\b0(_?[0-7])+r?i?\\b"}]},b={variants:[{match:/\(\)/},{ +className:"params",begin:/\(/,end:/(?=\))/,excludeBegin:!0,endsParent:!0, +keywords:r}]},m=[d,{variants:[{match:[/class\s+/,i,/\s+<\s+/,i]},{ +match:[/\b(class|module)\s+/,i]}],scope:{2:"title.class", +4:"title.class.inherited"},keywords:r},{match:[/(include|extend)\s+/,i],scope:{ +2:"title.class"},keywords:r},{relevance:0,match:[i,/\.new[. (]/],scope:{ +1:"title.class"}},{relevance:0,match:/\b[A-Z][A-Z_0-9]+\b/, +className:"variable.constant"},{relevance:0,match:a,scope:"title.class"},{ +match:[/def/,/\s+/,t],scope:{1:"keyword",3:"title.function"},contains:[b]},{ +begin:e.IDENT_RE+"::"},{className:"symbol", +begin:e.UNDERSCORE_IDENT_RE+"(!|\\?)?:",relevance:0},{className:"symbol", +begin:":(?!\\s)",contains:[d,{begin:t}],relevance:0},u,{className:"variable", +begin:"(\\$\\W)|((\\$|@@?)(\\w+))(?=[^@$?])(?![A-Za-z])(?![@$?'])"},{ +className:"params",begin:/\|/,end:/\|/,excludeBegin:!0,excludeEnd:!0, +relevance:0,keywords:r},{begin:"("+e.RE_STARTERS_RE+"|unless)\\s*", +keywords:"unless",contains:[{className:"regexp",contains:[e.BACKSLASH_ESCAPE,c], +illegal:/\n/,variants:[{begin:"/",end:"/[a-z]*"},{begin:/%r\{/,end:/\}[a-z]*/},{ +begin:"%r\\(",end:"\\)[a-z]*"},{begin:"%r!",end:"![a-z]*"},{begin:"%r\\[", +end:"\\][a-z]*"}]}].concat(o,l),relevance:0}].concat(o,l) +;c.contains=m,b.contains=m;const p=[{begin:/^\s*=>/,starts:{end:"$",contains:m} +},{className:"meta.prompt", +begin:"^([>?]>|[\\w#]+\\(\\w+\\):\\d+:\\d+[>*]|(\\w+-)?\\d+\\.\\d+\\.\\d+(p\\d+)?[^\\d][^>]+>)(?=[ ])", +starts:{end:"$",keywords:r,contains:m}}];return l.unshift(o),{name:"Ruby", +aliases:["rb","gemspec","podspec","thor","irb"],keywords:r,illegal:/\/\*/, +contains:[e.SHEBANG({binary:"ruby"})].concat(p).concat(l).concat(m)}}, +grmr_rust:e=>{const n=e.regex,t={className:"title.function.invoke",relevance:0, +begin:n.concat(/\b/,/(?!let|for|while|if|else|match\b)/,e.IDENT_RE,n.lookahead(/\s*\(/)) +},a="([ui](8|16|32|64|128|size)|f(32|64))?",i=["drop ","Copy","Send","Sized","Sync","Drop","Fn","FnMut","FnOnce","ToOwned","Clone","Debug","PartialEq","PartialOrd","Eq","Ord","AsRef","AsMut","Into","From","Default","Iterator","Extend","IntoIterator","DoubleEndedIterator","ExactSizeIterator","SliceConcatExt","ToString","assert!","assert_eq!","bitflags!","bytes!","cfg!","col!","concat!","concat_idents!","debug_assert!","debug_assert_eq!","env!","eprintln!","panic!","file!","format!","format_args!","include_bytes!","include_str!","line!","local_data_key!","module_path!","option_env!","print!","println!","select!","stringify!","try!","unimplemented!","unreachable!","vec!","write!","writeln!","macro_rules!","assert_ne!","debug_assert_ne!"],r=["i8","i16","i32","i64","i128","isize","u8","u16","u32","u64","u128","usize","f32","f64","str","char","bool","Box","Option","Result","String","Vec"] +;return{name:"Rust",aliases:["rs"],keywords:{$pattern:e.IDENT_RE+"!?",type:r, +keyword:["abstract","as","async","await","become","box","break","const","continue","crate","do","dyn","else","enum","extern","false","final","fn","for","if","impl","in","let","loop","macro","match","mod","move","mut","override","priv","pub","ref","return","self","Self","static","struct","super","trait","true","try","type","typeof","unsafe","unsized","use","virtual","where","while","yield"], +literal:["true","false","Some","None","Ok","Err"],built_in:i},illegal:""},t]}}, +grmr_scss:e=>{const n=ie(e),t=le,a=oe,i="@[a-z-]+",r={className:"variable", +begin:"(\\$[a-zA-Z-][a-zA-Z0-9_-]*)\\b",relevance:0};return{name:"SCSS", +case_insensitive:!0,illegal:"[=/|']", +contains:[e.C_LINE_COMMENT_MODE,e.C_BLOCK_COMMENT_MODE,n.CSS_NUMBER_MODE,{ +className:"selector-id",begin:"#[A-Za-z0-9_-]+",relevance:0},{ +className:"selector-class",begin:"\\.[A-Za-z0-9_-]+",relevance:0 +},n.ATTRIBUTE_SELECTOR_MODE,{className:"selector-tag", +begin:"\\b("+re.join("|")+")\\b",relevance:0},{className:"selector-pseudo", +begin:":("+a.join("|")+")"},{className:"selector-pseudo", +begin:":(:)?("+t.join("|")+")"},r,{begin:/\(/,end:/\)/, +contains:[n.CSS_NUMBER_MODE]},n.CSS_VARIABLE,{className:"attribute", +begin:"\\b("+ce.join("|")+")\\b"},{ +begin:"\\b(whitespace|wait|w-resize|visible|vertical-text|vertical-ideographic|uppercase|upper-roman|upper-alpha|underline|transparent|top|thin|thick|text|text-top|text-bottom|tb-rl|table-header-group|table-footer-group|sw-resize|super|strict|static|square|solid|small-caps|separate|se-resize|scroll|s-resize|rtl|row-resize|ridge|right|repeat|repeat-y|repeat-x|relative|progress|pointer|overline|outside|outset|oblique|nowrap|not-allowed|normal|none|nw-resize|no-repeat|no-drop|newspaper|ne-resize|n-resize|move|middle|medium|ltr|lr-tb|lowercase|lower-roman|lower-alpha|loose|list-item|line|line-through|line-edge|lighter|left|keep-all|justify|italic|inter-word|inter-ideograph|inside|inset|inline|inline-block|inherit|inactive|ideograph-space|ideograph-parenthesis|ideograph-numeric|ideograph-alpha|horizontal|hidden|help|hand|groove|fixed|ellipsis|e-resize|double|dotted|distribute|distribute-space|distribute-letter|distribute-all-lines|disc|disabled|default|decimal|dashed|crosshair|collapse|col-resize|circle|char|center|capitalize|break-word|break-all|bottom|both|bolder|bold|block|bidi-override|below|baseline|auto|always|all-scroll|absolute|table|table-cell)\\b" +},{begin:/:/,end:/[;}{]/,relevance:0, +contains:[n.BLOCK_COMMENT,r,n.HEXCOLOR,n.CSS_NUMBER_MODE,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.IMPORTANT,n.FUNCTION_DISPATCH] +},{begin:"@(page|font-face)",keywords:{$pattern:i,keyword:"@page @font-face"}},{ +begin:"@",end:"[{;]",returnBegin:!0,keywords:{$pattern:/[a-z-]+/, +keyword:"and or not only",attribute:se.join(" ")},contains:[{begin:i, +className:"keyword"},{begin:/[a-z-]+(?=:)/,className:"attribute" +},r,e.QUOTE_STRING_MODE,e.APOS_STRING_MODE,n.HEXCOLOR,n.CSS_NUMBER_MODE] +},n.FUNCTION_DISPATCH]}},grmr_shell:e=>({name:"Shell Session", +aliases:["console","shellsession"],contains:[{className:"meta.prompt", +begin:/^\s{0,3}[/~\w\d[\]()@-]*[>%$#][ ]?/,starts:{end:/[^\\](?=\s*$)/, +subLanguage:"bash"}}]}),grmr_sql:e=>{ +const n=e.regex,t=e.COMMENT("--","$"),a=["true","false","unknown"],i=["bigint","binary","blob","boolean","char","character","clob","date","dec","decfloat","decimal","float","int","integer","interval","nchar","nclob","national","numeric","real","row","smallint","time","timestamp","varchar","varying","varbinary"],r=["abs","acos","array_agg","asin","atan","avg","cast","ceil","ceiling","coalesce","corr","cos","cosh","count","covar_pop","covar_samp","cume_dist","dense_rank","deref","element","exp","extract","first_value","floor","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","last_value","lead","listagg","ln","log","log10","lower","max","min","mod","nth_value","ntile","nullif","percent_rank","percentile_cont","percentile_disc","position","position_regex","power","rank","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","row_number","sin","sinh","sqrt","stddev_pop","stddev_samp","substring","substring_regex","sum","tan","tanh","translate","translate_regex","treat","trim","trim_array","unnest","upper","value_of","var_pop","var_samp","width_bucket"],s=["create table","insert into","primary key","foreign key","not null","alter table","add constraint","grouping sets","on overflow","character set","respect nulls","ignore nulls","nulls first","nulls last","depth first","breadth first"],o=r,l=["abs","acos","all","allocate","alter","and","any","are","array","array_agg","array_max_cardinality","as","asensitive","asin","asymmetric","at","atan","atomic","authorization","avg","begin","begin_frame","begin_partition","between","bigint","binary","blob","boolean","both","by","call","called","cardinality","cascaded","case","cast","ceil","ceiling","char","char_length","character","character_length","check","classifier","clob","close","coalesce","collate","collect","column","commit","condition","connect","constraint","contains","convert","copy","corr","corresponding","cos","cosh","count","covar_pop","covar_samp","create","cross","cube","cume_dist","current","current_catalog","current_date","current_default_transform_group","current_path","current_role","current_row","current_schema","current_time","current_timestamp","current_path","current_role","current_transform_group_for_type","current_user","cursor","cycle","date","day","deallocate","dec","decimal","decfloat","declare","default","define","delete","dense_rank","deref","describe","deterministic","disconnect","distinct","double","drop","dynamic","each","element","else","empty","end","end_frame","end_partition","end-exec","equals","escape","every","except","exec","execute","exists","exp","external","extract","false","fetch","filter","first_value","float","floor","for","foreign","frame_row","free","from","full","function","fusion","get","global","grant","group","grouping","groups","having","hold","hour","identity","in","indicator","initial","inner","inout","insensitive","insert","int","integer","intersect","intersection","interval","into","is","join","json_array","json_arrayagg","json_exists","json_object","json_objectagg","json_query","json_table","json_table_primitive","json_value","lag","language","large","last_value","lateral","lead","leading","left","like","like_regex","listagg","ln","local","localtime","localtimestamp","log","log10","lower","match","match_number","match_recognize","matches","max","member","merge","method","min","minute","mod","modifies","module","month","multiset","national","natural","nchar","nclob","new","no","none","normalize","not","nth_value","ntile","null","nullif","numeric","octet_length","occurrences_regex","of","offset","old","omit","on","one","only","open","or","order","out","outer","over","overlaps","overlay","parameter","partition","pattern","per","percent","percent_rank","percentile_cont","percentile_disc","period","portion","position","position_regex","power","precedes","precision","prepare","primary","procedure","ptf","range","rank","reads","real","recursive","ref","references","referencing","regr_avgx","regr_avgy","regr_count","regr_intercept","regr_r2","regr_slope","regr_sxx","regr_sxy","regr_syy","release","result","return","returns","revoke","right","rollback","rollup","row","row_number","rows","running","savepoint","scope","scroll","search","second","seek","select","sensitive","session_user","set","show","similar","sin","sinh","skip","smallint","some","specific","specifictype","sql","sqlexception","sqlstate","sqlwarning","sqrt","start","static","stddev_pop","stddev_samp","submultiset","subset","substring","substring_regex","succeeds","sum","symmetric","system","system_time","system_user","table","tablesample","tan","tanh","then","time","timestamp","timezone_hour","timezone_minute","to","trailing","translate","translate_regex","translation","treat","trigger","trim","trim_array","true","truncate","uescape","union","unique","unknown","unnest","update","upper","user","using","value","values","value_of","var_pop","var_samp","varbinary","varchar","varying","versioning","when","whenever","where","width_bucket","window","with","within","without","year","add","asc","collation","desc","final","first","last","view"].filter((e=>!r.includes(e))),c={ +begin:n.concat(/\b/,n.either(...o),/\s*\(/),relevance:0,keywords:{built_in:o}} +;return{name:"SQL",case_insensitive:!0,illegal:/[{}]|<\//,keywords:{ +$pattern:/\b[\w\.]+/,keyword:((e,{exceptions:n,when:t}={})=>{const a=t +;return n=n||[],e.map((e=>e.match(/\|\d+$/)||n.includes(e)?e:a(e)?e+"|0":e)) +})(l,{when:e=>e.length<3}),literal:a,type:i, +built_in:["current_catalog","current_date","current_default_transform_group","current_path","current_role","current_schema","current_transform_group_for_type","current_user","session_user","system_time","system_user","current_time","localtime","current_timestamp","localtimestamp"] +},contains:[{begin:n.either(...s),relevance:0,keywords:{$pattern:/[\w\.]+/, +keyword:l.concat(s),literal:a,type:i}},{className:"type", +begin:n.either("double precision","large object","with timezone","without timezone") +},c,{className:"variable",begin:/@[a-z0-9][a-z0-9_]*/},{className:"string", +variants:[{begin:/'/,end:/'/,contains:[{begin:/''/}]}]},{begin:/"/,end:/"/, +contains:[{begin:/""/}]},e.C_NUMBER_MODE,e.C_BLOCK_COMMENT_MODE,t,{ +className:"operator",begin:/[-+*/=%^~]|&&?|\|\|?|!=?|<(?:=>?|<|>)?|>[>=]?/, +relevance:0}]}},grmr_swift:e=>{const n={match:/\s+/,relevance:0 +},t=e.COMMENT("/\\*","\\*/",{contains:["self"]}),a=[e.C_LINE_COMMENT_MODE,t],i={ +match:[/\./,m(...xe,...Me)],className:{2:"keyword"}},r={match:b(/\./,m(...Ae)), +relevance:0},s=Ae.filter((e=>"string"==typeof e)).concat(["_|0"]),o={variants:[{ +className:"keyword", +match:m(...Ae.filter((e=>"string"!=typeof e)).concat(Se).map(ke),...Me)}]},l={ +$pattern:m(/\b\w+/,/#\w+/),keyword:s.concat(Re),literal:Ce},c=[i,r,o],g=[{ +match:b(/\./,m(...De)),relevance:0},{className:"built_in", +match:b(/\b/,m(...De),/(?=\()/)}],u={match:/->/,relevance:0},p=[u,{ +className:"operator",relevance:0,variants:[{match:Be},{match:`\\.(\\.|${Le})+`}] +}],_="([0-9]_*)+",h="([0-9a-fA-F]_*)+",f={className:"number",relevance:0, +variants:[{match:`\\b(${_})(\\.(${_}))?([eE][+-]?(${_}))?\\b`},{ +match:`\\b0x(${h})(\\.(${h}))?([pP][+-]?(${_}))?\\b`},{match:/\b0o([0-7]_*)+\b/ +},{match:/\b0b([01]_*)+\b/}]},E=(e="")=>({className:"subst",variants:[{ +match:b(/\\/,e,/[0\\tnr"']/)},{match:b(/\\/,e,/u\{[0-9a-fA-F]{1,8}\}/)}] +}),y=(e="")=>({className:"subst",match:b(/\\/,e,/[\t ]*(?:[\r\n]|\r\n)/) +}),N=(e="")=>({className:"subst",label:"interpol",begin:b(/\\/,e,/\(/),end:/\)/ +}),w=(e="")=>({begin:b(e,/"""/),end:b(/"""/,e),contains:[E(e),y(e),N(e)] +}),v=(e="")=>({begin:b(e,/"/),end:b(/"/,e),contains:[E(e),N(e)]}),O={ +className:"string", +variants:[w(),w("#"),w("##"),w("###"),v(),v("#"),v("##"),v("###")] +},k=[e.BACKSLASH_ESCAPE,{begin:/\[/,end:/\]/,relevance:0, +contains:[e.BACKSLASH_ESCAPE]}],x={begin:/\/[^\s](?=[^/\n]*\/)/,end:/\//, +contains:k},M=e=>{const n=b(e,/\//),t=b(/\//,e);return{begin:n,end:t, +contains:[...k,{scope:"comment",begin:`#(?!.*${t})`,end:/$/}]}},S={ +scope:"regexp",variants:[M("###"),M("##"),M("#"),x]},A={match:b(/`/,Fe,/`/) +},C=[A,{className:"variable",match:/\$\d+/},{className:"variable", +match:`\\$${ze}+`}],T=[{match:/(@|#(un)?)available/,scope:"keyword",starts:{ +contains:[{begin:/\(/,end:/\)/,keywords:Pe,contains:[...p,f,O]}]}},{ +scope:"keyword",match:b(/@/,m(...je))},{scope:"meta",match:b(/@/,Fe)}],R={ +match:d(/\b[A-Z]/),relevance:0,contains:[{className:"type", +match:b(/(AV|CA|CF|CG|CI|CL|CM|CN|CT|MK|MP|MTK|MTL|NS|SCN|SK|UI|WK|XC)/,ze,"+") +},{className:"type",match:Ue,relevance:0},{match:/[?!]+/,relevance:0},{ +match:/\.\.\./,relevance:0},{match:b(/\s+&\s+/,d(Ue)),relevance:0}]},D={ +begin://,keywords:l,contains:[...a,...c,...T,u,R]};R.contains.push(D) +;const I={begin:/\(/,end:/\)/,relevance:0,keywords:l,contains:["self",{ +match:b(Fe,/\s*:/),keywords:"_|0",relevance:0 +},...a,S,...c,...g,...p,f,O,...C,...T,R]},L={begin://, +keywords:"repeat each",contains:[...a,R]},B={begin:/\(/,end:/\)/,keywords:l, +contains:[{begin:m(d(b(Fe,/\s*:/)),d(b(Fe,/\s+/,Fe,/\s*:/))),end:/:/, +relevance:0,contains:[{className:"keyword",match:/\b_\b/},{className:"params", +match:Fe}]},...a,...c,...p,f,O,...T,R,I],endsParent:!0,illegal:/["']/},$={ +match:[/(func|macro)/,/\s+/,m(A.match,Fe,Be)],className:{1:"keyword", +3:"title.function"},contains:[L,B,n],illegal:[/\[/,/%/]},z={ +match:[/\b(?:subscript|init[?!]?)/,/\s*(?=[<(])/],className:{1:"keyword"}, +contains:[L,B,n],illegal:/\[|%/},F={match:[/operator/,/\s+/,Be],className:{ +1:"keyword",3:"title"}},U={begin:[/precedencegroup/,/\s+/,Ue],className:{ +1:"keyword",3:"title"},contains:[R],keywords:[...Te,...Ce],end:/}/} +;for(const e of O.variants){const n=e.contains.find((e=>"interpol"===e.label)) +;n.keywords=l;const t=[...c,...g,...p,f,O,...C];n.contains=[...t,{begin:/\(/, +end:/\)/,contains:["self",...t]}]}return{name:"Swift",keywords:l, +contains:[...a,$,z,{beginKeywords:"struct protocol class extension enum actor", +end:"\\{",excludeEnd:!0,keywords:l,contains:[e.inherit(e.TITLE_MODE,{ +className:"title.class",begin:/[A-Za-z$_][\u00C0-\u02B80-9A-Za-z$_]*/}),...c] +},F,U,{beginKeywords:"import",end:/$/,contains:[...a],relevance:0 +},S,...c,...g,...p,f,O,...C,...T,R,I]}},grmr_typescript:e=>{ +const n=Oe(e),t=_e,a=["any","void","number","boolean","string","object","never","symbol","bigint","unknown"],i={ +beginKeywords:"namespace",end:/\{/,excludeEnd:!0, +contains:[n.exports.CLASS_REFERENCE]},r={beginKeywords:"interface",end:/\{/, +excludeEnd:!0,keywords:{keyword:"interface extends",built_in:a}, +contains:[n.exports.CLASS_REFERENCE]},s={$pattern:_e, +keyword:he.concat(["type","namespace","interface","public","private","protected","implements","declare","abstract","readonly","enum","override"]), +literal:fe,built_in:ve.concat(a),"variable.language":we},o={className:"meta", +begin:"@"+t},l=(e,n,t)=>{const a=e.contains.findIndex((e=>e.label===n)) +;if(-1===a)throw Error("can not find mode to replace");e.contains.splice(a,1,t)} +;return Object.assign(n.keywords,s), +n.exports.PARAMS_CONTAINS.push(o),n.contains=n.contains.concat([o,i,r]), +l(n,"shebang",e.SHEBANG()),l(n,"use_strict",{className:"meta",relevance:10, +begin:/^\s*['"]use strict['"]/ +}),n.contains.find((e=>"func.def"===e.label)).relevance=0,Object.assign(n,{ +name:"TypeScript",aliases:["ts","tsx","mts","cts"]}),n},grmr_vbnet:e=>{ +const n=e.regex,t=/\d{1,2}\/\d{1,2}\/\d{4}/,a=/\d{4}-\d{1,2}-\d{1,2}/,i=/(\d|1[012])(:\d+){0,2} *(AM|PM)/,r=/\d{1,2}(:\d{1,2}){1,2}/,s={ +className:"literal",variants:[{begin:n.concat(/# */,n.either(a,t),/ *#/)},{ +begin:n.concat(/# */,r,/ *#/)},{begin:n.concat(/# */,i,/ *#/)},{ +begin:n.concat(/# */,n.either(a,t),/ +/,n.either(i,r),/ *#/)}] +},o=e.COMMENT(/'''/,/$/,{contains:[{className:"doctag",begin:/<\/?/,end:/>/}] +}),l=e.COMMENT(null,/$/,{variants:[{begin:/'/},{begin:/([\t ]|^)REM(?=\s)/}]}) +;return{name:"Visual Basic .NET",aliases:["vb"],case_insensitive:!0, +classNameAliases:{label:"symbol"},keywords:{ +keyword:"addhandler alias aggregate ansi as async assembly auto binary by byref byval call case catch class compare const continue custom declare default delegate dim distinct do each equals else elseif end enum erase error event exit explicit finally for friend from function get global goto group handles if implements imports in inherits interface into iterator join key let lib loop me mid module mustinherit mustoverride mybase myclass namespace narrowing new next notinheritable notoverridable of off on operator option optional order overloads overridable overrides paramarray partial preserve private property protected public raiseevent readonly redim removehandler resume return select set shadows shared skip static step stop structure strict sub synclock take text then throw to try unicode until using when where while widening with withevents writeonly yield", +built_in:"addressof and andalso await directcast gettype getxmlnamespace is isfalse isnot istrue like mod nameof new not or orelse trycast typeof xor cbool cbyte cchar cdate cdbl cdec cint clng cobj csbyte cshort csng cstr cuint culng cushort", +type:"boolean byte char date decimal double integer long object sbyte short single string uinteger ulong ushort", +literal:"true false nothing"}, +illegal:"//|\\{|\\}|endif|gosub|variant|wend|^\\$ ",contains:[{ +className:"string",begin:/"(""|[^/n])"C\b/},{className:"string",begin:/"/, +end:/"/,illegal:/\n/,contains:[{begin:/""/}]},s,{className:"number",relevance:0, +variants:[{begin:/\b\d[\d_]*((\.[\d_]+(E[+-]?[\d_]+)?)|(E[+-]?[\d_]+))[RFD@!#]?/ +},{begin:/\b\d[\d_]*((U?[SIL])|[%&])?/},{begin:/&H[\dA-F_]+((U?[SIL])|[%&])?/},{ +begin:/&O[0-7_]+((U?[SIL])|[%&])?/},{begin:/&B[01_]+((U?[SIL])|[%&])?/}]},{ +className:"label",begin:/^\w+:/},o,l,{className:"meta", +begin:/[\t ]*#(const|disable|else|elseif|enable|end|externalsource|if|region)\b/, +end:/$/,keywords:{ +keyword:"const disable else elseif enable end externalsource if region then"}, +contains:[l]}]}},grmr_wasm:e=>{e.regex;const n=e.COMMENT(/\(;/,/;\)/) +;return n.contains.push("self"),{name:"WebAssembly",keywords:{$pattern:/[\w.]+/, +keyword:["anyfunc","block","br","br_if","br_table","call","call_indirect","data","drop","elem","else","end","export","func","global.get","global.set","local.get","local.set","local.tee","get_global","get_local","global","if","import","local","loop","memory","memory.grow","memory.size","module","mut","nop","offset","param","result","return","select","set_global","set_local","start","table","tee_local","then","type","unreachable"] +},contains:[e.COMMENT(/;;/,/$/),n,{match:[/(?:offset|align)/,/\s*/,/=/], +className:{1:"keyword",3:"operator"}},{className:"variable",begin:/\$[\w_]+/},{ +match:/(\((?!;)|\))+/,className:"punctuation",relevance:0},{ +begin:[/(?:func|call|call_indirect)/,/\s+/,/\$[^\s)]+/],className:{1:"keyword", +3:"title.function"}},e.QUOTE_STRING_MODE,{match:/(i32|i64|f32|f64)(?!\.)/, +className:"type"},{className:"keyword", +match:/\b(f32|f64|i32|i64)(?:\.(?:abs|add|and|ceil|clz|const|convert_[su]\/i(?:32|64)|copysign|ctz|demote\/f64|div(?:_[su])?|eqz?|extend_[su]\/i32|floor|ge(?:_[su])?|gt(?:_[su])?|le(?:_[su])?|load(?:(?:8|16|32)_[su])?|lt(?:_[su])?|max|min|mul|nearest|neg?|or|popcnt|promote\/f32|reinterpret\/[fi](?:32|64)|rem_[su]|rot[lr]|shl|shr_[su]|store(?:8|16|32)?|sqrt|sub|trunc(?:_[su]\/f(?:32|64))?|wrap\/i64|xor))\b/ +},{className:"number",relevance:0, +match:/[+-]?\b(?:\d(?:_?\d)*(?:\.\d(?:_?\d)*)?(?:[eE][+-]?\d(?:_?\d)*)?|0x[\da-fA-F](?:_?[\da-fA-F])*(?:\.[\da-fA-F](?:_?[\da-fA-D])*)?(?:[pP][+-]?\d(?:_?\d)*)?)\b|\binf\b|\bnan(?::0x[\da-fA-F](?:_?[\da-fA-D])*)?\b/ +}]}},grmr_xml:e=>{ +const n=e.regex,t=n.concat(/[\p{L}_]/u,n.optional(/[\p{L}0-9_.-]*:/u),/[\p{L}0-9_.-]*/u),a={ +className:"symbol",begin:/&[a-z]+;|&#[0-9]+;|&#x[a-f0-9]+;/},i={begin:/\s/, +contains:[{className:"keyword",begin:/#?[a-z_][a-z1-9_-]+/,illegal:/\n/}] +},r=e.inherit(i,{begin:/\(/,end:/\)/}),s=e.inherit(e.APOS_STRING_MODE,{ +className:"string"}),o=e.inherit(e.QUOTE_STRING_MODE,{className:"string"}),l={ +endsWithParent:!0,illegal:/`]+/}]}]}]};return{ +name:"HTML, XML", +aliases:["html","xhtml","rss","atom","xjb","xsd","xsl","plist","wsf","svg"], +case_insensitive:!0,unicodeRegex:!0,contains:[{className:"meta",begin://,relevance:10,contains:[i,o,s,r,{begin:/\[/,end:/\]/,contains:[{ +className:"meta",begin://,contains:[i,r,o,s]}]}] +},e.COMMENT(//,{relevance:10}),{begin://, +relevance:10},a,{className:"meta",end:/\?>/,variants:[{begin:/<\?xml/, +relevance:10,contains:[o]},{begin:/<\?[a-z][a-z0-9]+/}]},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"style"},contains:[l],starts:{ +end:/<\/style>/,returnEnd:!0,subLanguage:["css","xml"]}},{className:"tag", +begin:/)/,end:/>/,keywords:{name:"script"},contains:[l],starts:{ +end:/<\/script>/,returnEnd:!0,subLanguage:["javascript","handlebars","xml"]}},{ +className:"tag",begin:/<>|<\/>/},{className:"tag", +begin:n.concat(//,/>/,/\s/)))), +end:/\/?>/,contains:[{className:"name",begin:t,relevance:0,starts:l}]},{ +className:"tag",begin:n.concat(/<\//,n.lookahead(n.concat(t,/>/))),contains:[{ +className:"name",begin:t,relevance:0},{begin:/>/,relevance:0,endsParent:!0}]}]} +},grmr_yaml:e=>{ +const n="true false yes no null",t="[\\w#;/?:@&=+$,.~*'()[\\]]+",a={ +className:"string",relevance:0,variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/ +},{begin:/\S+/}],contains:[e.BACKSLASH_ESCAPE,{className:"template-variable", +variants:[{begin:/\{\{/,end:/\}\}/},{begin:/%\{/,end:/\}/}]}]},i=e.inherit(a,{ +variants:[{begin:/'/,end:/'/},{begin:/"/,end:/"/},{begin:/[^\s,{}[\]]+/}]}),r={ +end:",",endsWithParent:!0,excludeEnd:!0,keywords:n,relevance:0},s={begin:/\{/, +end:/\}/,contains:[r],illegal:"\\n",relevance:0},o={begin:"\\[",end:"\\]", +contains:[r],illegal:"\\n",relevance:0},l=[{className:"attr",variants:[{ +begin:"\\w[\\w :\\/.-]*:(?=[ \t]|$)"},{begin:'"\\w[\\w :\\/.-]*":(?=[ \t]|$)'},{ +begin:"'\\w[\\w :\\/.-]*':(?=[ \t]|$)"}]},{className:"meta",begin:"^---\\s*$", +relevance:10},{className:"string", +begin:"[\\|>]([1-9]?[+-])?[ ]*\\n( +)[^ ][^\\n]*\\n(\\2[^\\n]+\\n?)*"},{ +begin:"<%[%=-]?",end:"[%-]?%>",subLanguage:"ruby",excludeBegin:!0,excludeEnd:!0, +relevance:0},{className:"type",begin:"!\\w+!"+t},{className:"type", +begin:"!<"+t+">"},{className:"type",begin:"!"+t},{className:"type",begin:"!!"+t +},{className:"meta",begin:"&"+e.UNDERSCORE_IDENT_RE+"$"},{className:"meta", +begin:"\\*"+e.UNDERSCORE_IDENT_RE+"$"},{className:"bullet",begin:"-(?=[ ]|$)", +relevance:0},e.HASH_COMMENT_MODE,{beginKeywords:n,keywords:{literal:n}},{ +className:"number", +begin:"\\b[0-9]{4}(-[0-9][0-9]){0,2}([Tt \\t][0-9][0-9]?(:[0-9][0-9]){2})?(\\.[0-9]*)?([ \\t])*(Z|[-+][0-9][0-9]?(:[0-9][0-9])?)?\\b" +},{className:"number",begin:e.C_NUMBER_RE+"\\b",relevance:0},s,o,a],c=[...l] +;return c.pop(),c.push(i),r.contains=c,{name:"YAML",case_insensitive:!0, +aliases:["yml"],contains:l}}});const He=ae;for(const e of Object.keys(Ke)){ +const n=e.replace("grmr_","").replace("_","-");He.registerLanguage(n,Ke[e])} +return He}() +;"object"==typeof exports&&"undefined"!=typeof module&&(module.exports=hljs); \ No newline at end of file diff --git a/v1/taffy/dashboard/jquery.min.js b/v1/taffy/dashboard/jquery.min.js deleted file mode 100644 index 644d35e..0000000 --- a/v1/taffy/dashboard/jquery.min.js +++ /dev/null @@ -1,4 +0,0 @@ -/*! jQuery v3.2.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!function(a,b){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){"use strict";var c=[],d=a.document,e=Object.getPrototypeOf,f=c.slice,g=c.concat,h=c.push,i=c.indexOf,j={},k=j.toString,l=j.hasOwnProperty,m=l.toString,n=m.call(Object),o={};function p(a,b){b=b||d;var c=b.createElement("script");c.text=a,b.head.appendChild(c).parentNode.removeChild(c)}var q="3.2.1",r=function(a,b){return new r.fn.init(a,b)},s=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,t=/^-ms-/,u=/-([a-z])/g,v=function(a,b){return b.toUpperCase()};r.fn=r.prototype={jquery:q,constructor:r,length:0,toArray:function(){return f.call(this)},get:function(a){return null==a?f.call(this):a<0?this[a+this.length]:this[a]},pushStack:function(a){var b=r.merge(this.constructor(),a);return b.prevObject=this,b},each:function(a){return r.each(this,a)},map:function(a){return this.pushStack(r.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(f.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(a<0?b:0);return this.pushStack(c>=0&&c0&&b-1 in a)}var x=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ha(),z=ha(),A=ha(),B=function(a,b){return a===b&&(l=!0),0},C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=function(a,b){for(var c=0,d=a.length;c+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(N),U=new RegExp("^"+L+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L+"|[*])"),ATTR:new RegExp("^"+M),PSEUDO:new RegExp("^"+N),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),aa=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:d<0?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},ba=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ca=function(a,b){return b?"\0"===a?"\ufffd":a.slice(0,-1)+"\\"+a.charCodeAt(a.length-1).toString(16)+" ":"\\"+a},da=function(){m()},ea=ta(function(a){return a.disabled===!0&&("form"in a||"label"in a)},{dir:"parentNode",next:"legend"});try{G.apply(D=H.call(v.childNodes),v.childNodes),D[v.childNodes.length].nodeType}catch(fa){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function ga(a,b,d,e){var f,h,j,k,l,o,r,s=b&&b.ownerDocument,w=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==w&&9!==w&&11!==w)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==w&&(l=Z.exec(a)))if(f=l[1]){if(9===w){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(s&&(j=s.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(l[2])return G.apply(d,b.getElementsByTagName(a)),d;if((f=l[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==w)s=b,r=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(ba,ca):b.setAttribute("id",k=u),o=g(a),h=o.length;while(h--)o[h]="#"+k+" "+sa(o[h]);r=o.join(","),s=$.test(a)&&qa(b.parentNode)||b}if(r)try{return G.apply(d,s.querySelectorAll(r)),d}catch(x){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(P,"$1"),b,d,e)}function ha(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ia(a){return a[u]=!0,a}function ja(a){var b=n.createElement("fieldset");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ka(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function la(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&a.sourceIndex-b.sourceIndex;if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function na(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function oa(a){return function(b){return"form"in b?b.parentNode&&b.disabled===!1?"label"in b?"label"in b.parentNode?b.parentNode.disabled===a:b.disabled===a:b.isDisabled===a||b.isDisabled!==!a&&ea(b)===a:b.disabled===a:"label"in b&&b.disabled===a}}function pa(a){return ia(function(b){return b=+b,ia(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function qa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=ga.support={},f=ga.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return!!b&&"HTML"!==b.nodeName},m=ga.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),v!==n&&(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ja(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ja(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(n.getElementsByClassName),c.getById=ja(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){return a.getAttribute("id")===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}}):(d.filter.ID=function(a){var b=a.replace(_,aa);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}},d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c,d,e,f=b.getElementById(a);if(f){if(c=f.getAttributeNode("id"),c&&c.value===a)return[f];e=b.getElementsByName(a),d=0;while(f=e[d++])if(c=f.getAttributeNode("id"),c&&c.value===a)return[f]}return[]}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){if("undefined"!=typeof b.getElementsByClassName&&p)return b.getElementsByClassName(a)},r=[],q=[],(c.qsa=Y.test(n.querySelectorAll))&&(ja(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ja(function(a){a.innerHTML="";var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+K+"*[*^$|!~]?="),2!==a.querySelectorAll(":enabled").length&&q.push(":enabled",":disabled"),o.appendChild(a).disabled=!0,2!==a.querySelectorAll(":disabled").length&&q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Y.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ja(function(a){c.disconnectedMatch=s.call(a,"*"),s.call(a,"[s!='']:x"),r.push("!=",N)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Y.test(o.compareDocumentPosition),t=b||Y.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?I(k,a)-I(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?I(k,a)-I(k,b):0;if(e===f)return la(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?la(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},ga.matches=function(a,b){return ga(a,null,null,b)},ga.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(S,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return ga(b,n,null,[a]).length>0},ga.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},ga.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},ga.escape=function(a){return(a+"").replace(ba,ca)},ga.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},ga.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=ga.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=ga.selectors={cacheLength:50,createPseudo:ia,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(_,aa),a[3]=(a[3]||a[4]||a[5]||"").replace(_,aa),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||ga.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&ga.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return V.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&T.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(_,aa).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=ga.attr(d,a);return null==e?"!="===b:!b||(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(O," ")+" ").indexOf(c)>-1:"|="===b&&(e===c||e.slice(0,c.length+1)===c+"-"))}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||ga.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ia(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ia(function(a){var b=[],c=[],d=h(a.replace(P,"$1"));return d[u]?ia(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ia(function(a){return function(b){return ga(a,b).length>0}}),contains:ia(function(a){return a=a.replace(_,aa),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ia(function(a){return U.test(a||"")||ga.error("unsupported lang: "+a),a=a.replace(_,aa).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:oa(!1),disabled:oa(!0),checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:pa(function(){return[0]}),last:pa(function(a,b){return[b-1]}),eq:pa(function(a,b,c){return[c<0?c+b:c]}),even:pa(function(a,b){for(var c=0;c=0;)a.push(d);return a}),gt:pa(function(a,b,c){for(var d=c<0?c+b:c;++d1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function va(a,b,c){for(var d=0,e=b.length;d-1&&(f[j]=!(g[j]=l))}}else r=wa(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ya(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ta(function(a){return a===b},h,!0),l=ta(function(a){return I(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];i1&&ua(m),i>1&&sa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(P,"$1"),c,i0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=E.call(i));u=wa(u)}G.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&ga.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ia(f):f}return h=ga.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=ya(b[c]),f[u]?d.push(f):e.push(f);f=A(a,za(e,d)),f.selector=a}return f},i=ga.select=function(a,b,c,e){var f,i,j,k,l,m="function"==typeof a&&a,n=!e&&g(a=m.selector||a);if(c=c||[],1===n.length){if(i=n[0]=n[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&9===b.nodeType&&p&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(_,aa),b)||[])[0],!b)return c;m&&(b=b.parentNode),a=a.slice(i.shift().value.length)}f=V.needsContext.test(a)?0:i.length;while(f--){if(j=i[f],d.relative[k=j.type])break;if((l=d.find[k])&&(e=l(j.matches[0].replace(_,aa),$.test(i[0].type)&&qa(b.parentNode)||b))){if(i.splice(f,1),a=e.length&&sa(i),!a)return G.apply(c,e),c;break}}}return(m||h(a,n))(e,b,!p,c,!b||$.test(a)&&qa(b.parentNode)||b),c},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ja(function(a){return 1&a.compareDocumentPosition(n.createElement("fieldset"))}),ja(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ka("type|href|height|width",function(a,b,c){if(!c)return a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ja(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ka("value",function(a,b,c){if(!c&&"input"===a.nodeName.toLowerCase())return a.defaultValue}),ja(function(a){return null==a.getAttribute("disabled")})||ka(J,function(a,b,c){var d;if(!c)return a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),ga}(a);r.find=x,r.expr=x.selectors,r.expr[":"]=r.expr.pseudos,r.uniqueSort=r.unique=x.uniqueSort,r.text=x.getText,r.isXMLDoc=x.isXML,r.contains=x.contains,r.escapeSelector=x.escape;var y=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&r(a).is(c))break;d.push(a)}return d},z=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},A=r.expr.match.needsContext;function B(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()}var C=/^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i,D=/^.[^:#\[\.,]*$/;function E(a,b,c){return r.isFunction(b)?r.grep(a,function(a,d){return!!b.call(a,d,a)!==c}):b.nodeType?r.grep(a,function(a){return a===b!==c}):"string"!=typeof b?r.grep(a,function(a){return i.call(b,a)>-1!==c}):D.test(b)?r.filter(b,a,c):(b=r.filter(b,a),r.grep(a,function(a){return i.call(b,a)>-1!==c&&1===a.nodeType}))}r.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?r.find.matchesSelector(d,a)?[d]:[]:r.find.matches(a,r.grep(b,function(a){return 1===a.nodeType}))},r.fn.extend({find:function(a){var b,c,d=this.length,e=this;if("string"!=typeof a)return this.pushStack(r(a).filter(function(){for(b=0;b1?r.uniqueSort(c):c},filter:function(a){return this.pushStack(E(this,a||[],!1))},not:function(a){return this.pushStack(E(this,a||[],!0))},is:function(a){return!!E(this,"string"==typeof a&&A.test(a)?r(a):a||[],!1).length}});var F,G=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/,H=r.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||F,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:G.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof r?b[0]:b,r.merge(this,r.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),C.test(e[1])&&r.isPlainObject(b))for(e in b)r.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&(this[0]=f,this.length=1),this}return a.nodeType?(this[0]=a,this.length=1,this):r.isFunction(a)?void 0!==c.ready?c.ready(a):a(r):r.makeArray(a,this)};H.prototype=r.fn,F=r(d);var I=/^(?:parents|prev(?:Until|All))/,J={children:!0,contents:!0,next:!0,prev:!0};r.fn.extend({has:function(a){var b=r(a,this),c=b.length;return this.filter(function(){for(var a=0;a-1:1===c.nodeType&&r.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?r.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?i.call(r(a),this[0]):i.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(r.uniqueSort(r.merge(this.get(),r(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function K(a,b){while((a=a[b])&&1!==a.nodeType);return a}r.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return y(a,"parentNode")},parentsUntil:function(a,b,c){return y(a,"parentNode",c)},next:function(a){return K(a,"nextSibling")},prev:function(a){return K(a,"previousSibling")},nextAll:function(a){return y(a,"nextSibling")},prevAll:function(a){return y(a,"previousSibling")},nextUntil:function(a,b,c){return y(a,"nextSibling",c)},prevUntil:function(a,b,c){return y(a,"previousSibling",c)},siblings:function(a){return z((a.parentNode||{}).firstChild,a)},children:function(a){return z(a.firstChild)},contents:function(a){return B(a,"iframe")?a.contentDocument:(B(a,"template")&&(a=a.content||a),r.merge([],a.childNodes))}},function(a,b){r.fn[a]=function(c,d){var e=r.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=r.filter(d,e)),this.length>1&&(J[a]||r.uniqueSort(e),I.test(a)&&e.reverse()),this.pushStack(e)}});var L=/[^\x20\t\r\n\f]+/g;function M(a){var b={};return r.each(a.match(L)||[],function(a,c){b[c]=!0}),b}r.Callbacks=function(a){a="string"==typeof a?M(a):r.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=e||a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),c<=h&&h--}),this},has:function(a){return a?r.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||b||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j};function N(a){return a}function O(a){throw a}function P(a,b,c,d){var e;try{a&&r.isFunction(e=a.promise)?e.call(a).done(b).fail(c):a&&r.isFunction(e=a.then)?e.call(a,b,c):b.apply(void 0,[a].slice(d))}catch(a){c.apply(void 0,[a])}}r.extend({Deferred:function(b){var c=[["notify","progress",r.Callbacks("memory"),r.Callbacks("memory"),2],["resolve","done",r.Callbacks("once memory"),r.Callbacks("once memory"),0,"resolved"],["reject","fail",r.Callbacks("once memory"),r.Callbacks("once memory"),1,"rejected"]],d="pending",e={state:function(){return d},always:function(){return f.done(arguments).fail(arguments),this},"catch":function(a){return e.then(null,a)},pipe:function(){var a=arguments;return r.Deferred(function(b){r.each(c,function(c,d){var e=r.isFunction(a[d[4]])&&a[d[4]];f[d[1]](function(){var a=e&&e.apply(this,arguments);a&&r.isFunction(a.promise)?a.promise().progress(b.notify).done(b.resolve).fail(b.reject):b[d[0]+"With"](this,e?[a]:arguments)})}),a=null}).promise()},then:function(b,d,e){var f=0;function g(b,c,d,e){return function(){var h=this,i=arguments,j=function(){var a,j;if(!(b=f&&(d!==O&&(h=void 0,i=[a]),c.rejectWith(h,i))}};b?k():(r.Deferred.getStackHook&&(k.stackTrace=r.Deferred.getStackHook()),a.setTimeout(k))}}return r.Deferred(function(a){c[0][3].add(g(0,a,r.isFunction(e)?e:N,a.notifyWith)),c[1][3].add(g(0,a,r.isFunction(b)?b:N)),c[2][3].add(g(0,a,r.isFunction(d)?d:O))}).promise()},promise:function(a){return null!=a?r.extend(a,e):e}},f={};return r.each(c,function(a,b){var g=b[2],h=b[5];e[b[1]]=g.add,h&&g.add(function(){d=h},c[3-a][2].disable,c[0][2].lock),g.add(b[3].fire),f[b[0]]=function(){return f[b[0]+"With"](this===f?void 0:this,arguments),this},f[b[0]+"With"]=g.fireWith}),e.promise(f),b&&b.call(f,f),f},when:function(a){var b=arguments.length,c=b,d=Array(c),e=f.call(arguments),g=r.Deferred(),h=function(a){return function(c){d[a]=this,e[a]=arguments.length>1?f.call(arguments):c,--b||g.resolveWith(d,e)}};if(b<=1&&(P(a,g.done(h(c)).resolve,g.reject,!b),"pending"===g.state()||r.isFunction(e[c]&&e[c].then)))return g.then();while(c--)P(e[c],h(c),g.reject);return g.promise()}});var Q=/^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/;r.Deferred.exceptionHook=function(b,c){a.console&&a.console.warn&&b&&Q.test(b.name)&&a.console.warn("jQuery.Deferred exception: "+b.message,b.stack,c)},r.readyException=function(b){a.setTimeout(function(){throw b})};var R=r.Deferred();r.fn.ready=function(a){return R.then(a)["catch"](function(a){r.readyException(a)}),this},r.extend({isReady:!1,readyWait:1,ready:function(a){(a===!0?--r.readyWait:r.isReady)||(r.isReady=!0,a!==!0&&--r.readyWait>0||R.resolveWith(d,[r]))}}),r.ready.then=R.then;function S(){d.removeEventListener("DOMContentLoaded",S), -a.removeEventListener("load",S),r.ready()}"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(r.ready):(d.addEventListener("DOMContentLoaded",S),a.addEventListener("load",S));var T=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===r.type(c)){e=!0;for(h in c)T(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,r.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(r(a),c)})),b))for(;h1,null,!0)},removeData:function(a){return this.each(function(){X.remove(this,a)})}}),r.extend({queue:function(a,b,c){var d;if(a)return b=(b||"fx")+"queue",d=W.get(a,b),c&&(!d||Array.isArray(c)?d=W.access(a,b,r.makeArray(c)):d.push(c)),d||[]},dequeue:function(a,b){b=b||"fx";var c=r.queue(a,b),d=c.length,e=c.shift(),f=r._queueHooks(a,b),g=function(){r.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return W.get(a,c)||W.access(a,c,{empty:r.Callbacks("once memory").add(function(){W.remove(a,[b+"queue",c])})})}}),r.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length\x20\t\r\n\f]+)/i,la=/^$|\/(?:java|ecma)script/i,ma={option:[1,""],thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};ma.optgroup=ma.option,ma.tbody=ma.tfoot=ma.colgroup=ma.caption=ma.thead,ma.th=ma.td;function na(a,b){var c;return c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[],void 0===b||b&&B(a,b)?r.merge([a],c):c}function oa(a,b){for(var c=0,d=a.length;c-1)e&&e.push(f);else if(j=r.contains(f.ownerDocument,f),g=na(l.appendChild(f),"script"),j&&oa(g),c){k=0;while(f=g[k++])la.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),o.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",o.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var ra=d.documentElement,sa=/^key/,ta=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,ua=/^([^.]*)(?:\.(.+)|)/;function va(){return!0}function wa(){return!1}function xa(){try{return d.activeElement}catch(a){}}function ya(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ya(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=wa;else if(!e)return a;return 1===f&&(g=e,e=function(a){return r().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=r.guid++)),a.each(function(){r.event.add(this,b,e,d,c)})}r.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.get(a);if(q){c.handler&&(f=c,c=f.handler,e=f.selector),e&&r.find.matchesSelector(ra,e),c.guid||(c.guid=r.guid++),(i=q.events)||(i=q.events={}),(g=q.handle)||(g=q.handle=function(b){return"undefined"!=typeof r&&r.event.triggered!==b.type?r.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(L)||[""],j=b.length;while(j--)h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n&&(l=r.event.special[n]||{},n=(e?l.delegateType:l.bindType)||n,l=r.event.special[n]||{},k=r.extend({type:n,origType:p,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&r.expr.match.needsContext.test(e),namespace:o.join(".")},f),(m=i[n])||(m=i[n]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,o,g)!==!1||a.addEventListener&&a.addEventListener(n,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),r.event.global[n]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,n,o,p,q=W.hasData(a)&&W.get(a);if(q&&(i=q.events)){b=(b||"").match(L)||[""],j=b.length;while(j--)if(h=ua.exec(b[j])||[],n=p=h[1],o=(h[2]||"").split(".").sort(),n){l=r.event.special[n]||{},n=(d?l.delegateType:l.bindType)||n,m=i[n]||[],h=h[2]&&new RegExp("(^|\\.)"+o.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&p!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,o,q.handle)!==!1||r.removeEvent(a,n,q.handle),delete i[n])}else for(n in i)r.event.remove(a,n+b[j],c,d,!0);r.isEmptyObject(i)&&W.remove(a,"handle events")}},dispatch:function(a){var b=r.event.fix(a),c,d,e,f,g,h,i=new Array(arguments.length),j=(W.get(this,"events")||{})[b.type]||[],k=r.event.special[b.type]||{};for(i[0]=b,c=1;c=1))for(;j!==this;j=j.parentNode||this)if(1===j.nodeType&&("click"!==a.type||j.disabled!==!0)){for(f=[],g={},c=0;c-1:r.find(e,this,null,[j]).length),g[e]&&f.push(d);f.length&&h.push({elem:j,handlers:f})}return j=this,i\x20\t\r\n\f]*)[^>]*)\/>/gi,Aa=/\s*$/g;function Ea(a,b){return B(a,"table")&&B(11!==b.nodeType?b:b.firstChild,"tr")?r(">tbody",a)[0]||a:a}function Fa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function Ga(a){var b=Ca.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ha(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(W.hasData(a)&&(f=W.access(a),g=W.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;c1&&"string"==typeof q&&!o.checkClone&&Ba.test(q))return a.each(function(e){var f=a.eq(e);s&&(b[0]=q.call(this,e,f.html())),Ja(f,b,c,d)});if(m&&(e=qa(b,a[0].ownerDocument,!1,a,d),f=e.firstChild,1===e.childNodes.length&&(e=f),f||d)){for(h=r.map(na(e,"script"),Fa),i=h.length;l")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=r.contains(a.ownerDocument,a);if(!(o.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||r.isXMLDoc(a)))for(g=na(h),f=na(a),d=0,e=f.length;d0&&oa(g,!i&&na(a,"script")),h},cleanData:function(a){for(var b,c,d,e=r.event.special,f=0;void 0!==(c=a[f]);f++)if(U(c)){if(b=c[W.expando]){if(b.events)for(d in b.events)e[d]?r.event.remove(c,d):r.removeEvent(c,d,b.handle);c[W.expando]=void 0}c[X.expando]&&(c[X.expando]=void 0)}}}),r.fn.extend({detach:function(a){return Ka(this,a,!0)},remove:function(a){return Ka(this,a)},text:function(a){return T(this,function(a){return void 0===a?r.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.appendChild(a)}})},prepend:function(){return Ja(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=Ea(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return Ja(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(r.cleanData(na(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null!=a&&a,b=null==b?a:b,this.map(function(){return r.clone(this,a,b)})},html:function(a){return T(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!Aa.test(a)&&!ma[(ka.exec(a)||["",""])[1].toLowerCase()]){a=r.htmlPrefilter(a);try{for(;c1)}});function _a(a,b,c,d,e){return new _a.prototype.init(a,b,c,d,e)}r.Tween=_a,_a.prototype={constructor:_a,init:function(a,b,c,d,e,f){this.elem=a,this.prop=c,this.easing=e||r.easing._default,this.options=b,this.start=this.now=this.cur(),this.end=d,this.unit=f||(r.cssNumber[c]?"":"px")},cur:function(){var a=_a.propHooks[this.prop];return a&&a.get?a.get(this):_a.propHooks._default.get(this)},run:function(a){var b,c=_a.propHooks[this.prop];return this.options.duration?this.pos=b=r.easing[this.easing](a,this.options.duration*a,0,1,this.options.duration):this.pos=b=a,this.now=(this.end-this.start)*b+this.start,this.options.step&&this.options.step.call(this.elem,this.now,this),c&&c.set?c.set(this):_a.propHooks._default.set(this),this}},_a.prototype.init.prototype=_a.prototype,_a.propHooks={_default:{get:function(a){var b;return 1!==a.elem.nodeType||null!=a.elem[a.prop]&&null==a.elem.style[a.prop]?a.elem[a.prop]:(b=r.css(a.elem,a.prop,""),b&&"auto"!==b?b:0)},set:function(a){r.fx.step[a.prop]?r.fx.step[a.prop](a):1!==a.elem.nodeType||null==a.elem.style[r.cssProps[a.prop]]&&!r.cssHooks[a.prop]?a.elem[a.prop]=a.now:r.style(a.elem,a.prop,a.now+a.unit)}}},_a.propHooks.scrollTop=_a.propHooks.scrollLeft={set:function(a){a.elem.nodeType&&a.elem.parentNode&&(a.elem[a.prop]=a.now)}},r.easing={linear:function(a){return a},swing:function(a){return.5-Math.cos(a*Math.PI)/2},_default:"swing"},r.fx=_a.prototype.init,r.fx.step={};var ab,bb,cb=/^(?:toggle|show|hide)$/,db=/queueHooks$/;function eb(){bb&&(d.hidden===!1&&a.requestAnimationFrame?a.requestAnimationFrame(eb):a.setTimeout(eb,r.fx.interval),r.fx.tick())}function fb(){return a.setTimeout(function(){ab=void 0}),ab=r.now()}function gb(a,b){var c,d=0,e={height:a};for(b=b?1:0;d<4;d+=2-b)c=ca[d],e["margin"+c]=e["padding"+c]=a;return b&&(e.opacity=e.width=a),e}function hb(a,b,c){for(var d,e=(kb.tweeners[b]||[]).concat(kb.tweeners["*"]),f=0,g=e.length;f1)},removeAttr:function(a){return this.each(function(){r.removeAttr(this,a)})}}),r.extend({attr:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return"undefined"==typeof a.getAttribute?r.prop(a,b,c):(1===f&&r.isXMLDoc(a)||(e=r.attrHooks[b.toLowerCase()]||(r.expr.match.bool.test(b)?lb:void 0)),void 0!==c?null===c?void r.removeAttr(a,b):e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:(a.setAttribute(b,c+""),c):e&&"get"in e&&null!==(d=e.get(a,b))?d:(d=r.find.attr(a,b), -null==d?void 0:d))},attrHooks:{type:{set:function(a,b){if(!o.radioValue&&"radio"===b&&B(a,"input")){var c=a.value;return a.setAttribute("type",b),c&&(a.value=c),b}}}},removeAttr:function(a,b){var c,d=0,e=b&&b.match(L);if(e&&1===a.nodeType)while(c=e[d++])a.removeAttribute(c)}}),lb={set:function(a,b,c){return b===!1?r.removeAttr(a,c):a.setAttribute(c,c),c}},r.each(r.expr.match.bool.source.match(/\w+/g),function(a,b){var c=mb[b]||r.find.attr;mb[b]=function(a,b,d){var e,f,g=b.toLowerCase();return d||(f=mb[g],mb[g]=e,e=null!=c(a,b,d)?g:null,mb[g]=f),e}});var nb=/^(?:input|select|textarea|button)$/i,ob=/^(?:a|area)$/i;r.fn.extend({prop:function(a,b){return T(this,r.prop,a,b,arguments.length>1)},removeProp:function(a){return this.each(function(){delete this[r.propFix[a]||a]})}}),r.extend({prop:function(a,b,c){var d,e,f=a.nodeType;if(3!==f&&8!==f&&2!==f)return 1===f&&r.isXMLDoc(a)||(b=r.propFix[b]||b,e=r.propHooks[b]),void 0!==c?e&&"set"in e&&void 0!==(d=e.set(a,c,b))?d:a[b]=c:e&&"get"in e&&null!==(d=e.get(a,b))?d:a[b]},propHooks:{tabIndex:{get:function(a){var b=r.find.attr(a,"tabindex");return b?parseInt(b,10):nb.test(a.nodeName)||ob.test(a.nodeName)&&a.href?0:-1}}},propFix:{"for":"htmlFor","class":"className"}}),o.optSelected||(r.propHooks.selected={get:function(a){var b=a.parentNode;return b&&b.parentNode&&b.parentNode.selectedIndex,null},set:function(a){var b=a.parentNode;b&&(b.selectedIndex,b.parentNode&&b.parentNode.selectedIndex)}}),r.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){r.propFix[this.toLowerCase()]=this});function pb(a){var b=a.match(L)||[];return b.join(" ")}function qb(a){return a.getAttribute&&a.getAttribute("class")||""}r.fn.extend({addClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).addClass(a.call(this,b,qb(this)))});if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])d.indexOf(" "+f+" ")<0&&(d+=f+" ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},removeClass:function(a){var b,c,d,e,f,g,h,i=0;if(r.isFunction(a))return this.each(function(b){r(this).removeClass(a.call(this,b,qb(this)))});if(!arguments.length)return this.attr("class","");if("string"==typeof a&&a){b=a.match(L)||[];while(c=this[i++])if(e=qb(c),d=1===c.nodeType&&" "+pb(e)+" "){g=0;while(f=b[g++])while(d.indexOf(" "+f+" ")>-1)d=d.replace(" "+f+" "," ");h=pb(d),e!==h&&c.setAttribute("class",h)}}return this},toggleClass:function(a,b){var c=typeof a;return"boolean"==typeof b&&"string"===c?b?this.addClass(a):this.removeClass(a):r.isFunction(a)?this.each(function(c){r(this).toggleClass(a.call(this,c,qb(this),b),b)}):this.each(function(){var b,d,e,f;if("string"===c){d=0,e=r(this),f=a.match(L)||[];while(b=f[d++])e.hasClass(b)?e.removeClass(b):e.addClass(b)}else void 0!==a&&"boolean"!==c||(b=qb(this),b&&W.set(this,"__className__",b),this.setAttribute&&this.setAttribute("class",b||a===!1?"":W.get(this,"__className__")||""))})},hasClass:function(a){var b,c,d=0;b=" "+a+" ";while(c=this[d++])if(1===c.nodeType&&(" "+pb(qb(c))+" ").indexOf(b)>-1)return!0;return!1}});var rb=/\r/g;r.fn.extend({val:function(a){var b,c,d,e=this[0];{if(arguments.length)return d=r.isFunction(a),this.each(function(c){var e;1===this.nodeType&&(e=d?a.call(this,c,r(this).val()):a,null==e?e="":"number"==typeof e?e+="":Array.isArray(e)&&(e=r.map(e,function(a){return null==a?"":a+""})),b=r.valHooks[this.type]||r.valHooks[this.nodeName.toLowerCase()],b&&"set"in b&&void 0!==b.set(this,e,"value")||(this.value=e))});if(e)return b=r.valHooks[e.type]||r.valHooks[e.nodeName.toLowerCase()],b&&"get"in b&&void 0!==(c=b.get(e,"value"))?c:(c=e.value,"string"==typeof c?c.replace(rb,""):null==c?"":c)}}}),r.extend({valHooks:{option:{get:function(a){var b=r.find.attr(a,"value");return null!=b?b:pb(r.text(a))}},select:{get:function(a){var b,c,d,e=a.options,f=a.selectedIndex,g="select-one"===a.type,h=g?null:[],i=g?f+1:e.length;for(d=f<0?i:g?f:0;d-1)&&(c=!0);return c||(a.selectedIndex=-1),f}}}}),r.each(["radio","checkbox"],function(){r.valHooks[this]={set:function(a,b){if(Array.isArray(b))return a.checked=r.inArray(r(a).val(),b)>-1}},o.checkOn||(r.valHooks[this].get=function(a){return null===a.getAttribute("value")?"on":a.value})});var sb=/^(?:focusinfocus|focusoutblur)$/;r.extend(r.event,{trigger:function(b,c,e,f){var g,h,i,j,k,m,n,o=[e||d],p=l.call(b,"type")?b.type:b,q=l.call(b,"namespace")?b.namespace.split("."):[];if(h=i=e=e||d,3!==e.nodeType&&8!==e.nodeType&&!sb.test(p+r.event.triggered)&&(p.indexOf(".")>-1&&(q=p.split("."),p=q.shift(),q.sort()),k=p.indexOf(":")<0&&"on"+p,b=b[r.expando]?b:new r.Event(p,"object"==typeof b&&b),b.isTrigger=f?2:3,b.namespace=q.join("."),b.rnamespace=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=e),c=null==c?[b]:r.makeArray(c,[b]),n=r.event.special[p]||{},f||!n.trigger||n.trigger.apply(e,c)!==!1)){if(!f&&!n.noBubble&&!r.isWindow(e)){for(j=n.delegateType||p,sb.test(j+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),i=h;i===(e.ownerDocument||d)&&o.push(i.defaultView||i.parentWindow||a)}g=0;while((h=o[g++])&&!b.isPropagationStopped())b.type=g>1?j:n.bindType||p,m=(W.get(h,"events")||{})[b.type]&&W.get(h,"handle"),m&&m.apply(h,c),m=k&&h[k],m&&m.apply&&U(h)&&(b.result=m.apply(h,c),b.result===!1&&b.preventDefault());return b.type=p,f||b.isDefaultPrevented()||n._default&&n._default.apply(o.pop(),c)!==!1||!U(e)||k&&r.isFunction(e[p])&&!r.isWindow(e)&&(i=e[k],i&&(e[k]=null),r.event.triggered=p,e[p](),r.event.triggered=void 0,i&&(e[k]=i)),b.result}},simulate:function(a,b,c){var d=r.extend(new r.Event,c,{type:a,isSimulated:!0});r.event.trigger(d,null,b)}}),r.fn.extend({trigger:function(a,b){return this.each(function(){r.event.trigger(a,b,this)})},triggerHandler:function(a,b){var c=this[0];if(c)return r.event.trigger(a,b,c,!0)}}),r.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(a,b){r.fn[b]=function(a,c){return arguments.length>0?this.on(b,null,a,c):this.trigger(b)}}),r.fn.extend({hover:function(a,b){return this.mouseenter(a).mouseleave(b||a)}}),o.focusin="onfocusin"in a,o.focusin||r.each({focus:"focusin",blur:"focusout"},function(a,b){var c=function(a){r.event.simulate(b,a.target,r.event.fix(a))};r.event.special[b]={setup:function(){var d=this.ownerDocument||this,e=W.access(d,b);e||d.addEventListener(a,c,!0),W.access(d,b,(e||0)+1)},teardown:function(){var d=this.ownerDocument||this,e=W.access(d,b)-1;e?W.access(d,b,e):(d.removeEventListener(a,c,!0),W.remove(d,b))}}});var tb=a.location,ub=r.now(),vb=/\?/;r.parseXML=function(b){var c;if(!b||"string"!=typeof b)return null;try{c=(new a.DOMParser).parseFromString(b,"text/xml")}catch(d){c=void 0}return c&&!c.getElementsByTagName("parsererror").length||r.error("Invalid XML: "+b),c};var wb=/\[\]$/,xb=/\r?\n/g,yb=/^(?:submit|button|image|reset|file)$/i,zb=/^(?:input|select|textarea|keygen)/i;function Ab(a,b,c,d){var e;if(Array.isArray(b))r.each(b,function(b,e){c||wb.test(a)?d(a,e):Ab(a+"["+("object"==typeof e&&null!=e?b:"")+"]",e,c,d)});else if(c||"object"!==r.type(b))d(a,b);else for(e in b)Ab(a+"["+e+"]",b[e],c,d)}r.param=function(a,b){var c,d=[],e=function(a,b){var c=r.isFunction(b)?b():b;d[d.length]=encodeURIComponent(a)+"="+encodeURIComponent(null==c?"":c)};if(Array.isArray(a)||a.jquery&&!r.isPlainObject(a))r.each(a,function(){e(this.name,this.value)});else for(c in a)Ab(c,a[c],b,e);return d.join("&")},r.fn.extend({serialize:function(){return r.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var a=r.prop(this,"elements");return a?r.makeArray(a):this}).filter(function(){var a=this.type;return this.name&&!r(this).is(":disabled")&&zb.test(this.nodeName)&&!yb.test(a)&&(this.checked||!ja.test(a))}).map(function(a,b){var c=r(this).val();return null==c?null:Array.isArray(c)?r.map(c,function(a){return{name:b.name,value:a.replace(xb,"\r\n")}}):{name:b.name,value:c.replace(xb,"\r\n")}}).get()}});var Bb=/%20/g,Cb=/#.*$/,Db=/([?&])_=[^&]*/,Eb=/^(.*?):[ \t]*([^\r\n]*)$/gm,Fb=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,Gb=/^(?:GET|HEAD)$/,Hb=/^\/\//,Ib={},Jb={},Kb="*/".concat("*"),Lb=d.createElement("a");Lb.href=tb.href;function Mb(a){return function(b,c){"string"!=typeof b&&(c=b,b="*");var d,e=0,f=b.toLowerCase().match(L)||[];if(r.isFunction(c))while(d=f[e++])"+"===d[0]?(d=d.slice(1)||"*",(a[d]=a[d]||[]).unshift(c)):(a[d]=a[d]||[]).push(c)}}function Nb(a,b,c,d){var e={},f=a===Jb;function g(h){var i;return e[h]=!0,r.each(a[h]||[],function(a,h){var j=h(b,c,d);return"string"!=typeof j||f||e[j]?f?!(i=j):void 0:(b.dataTypes.unshift(j),g(j),!1)}),i}return g(b.dataTypes[0])||!e["*"]&&g("*")}function Ob(a,b){var c,d,e=r.ajaxSettings.flatOptions||{};for(c in b)void 0!==b[c]&&((e[c]?a:d||(d={}))[c]=b[c]);return d&&r.extend(!0,a,d),a}function Pb(a,b,c){var d,e,f,g,h=a.contents,i=a.dataTypes;while("*"===i[0])i.shift(),void 0===d&&(d=a.mimeType||b.getResponseHeader("Content-Type"));if(d)for(e in h)if(h[e]&&h[e].test(d)){i.unshift(e);break}if(i[0]in c)f=i[0];else{for(e in c){if(!i[0]||a.converters[e+" "+i[0]]){f=e;break}g||(g=e)}f=f||g}if(f)return f!==i[0]&&i.unshift(f),c[f]}function Qb(a,b,c,d){var e,f,g,h,i,j={},k=a.dataTypes.slice();if(k[1])for(g in a.converters)j[g.toLowerCase()]=a.converters[g];f=k.shift();while(f)if(a.responseFields[f]&&(c[a.responseFields[f]]=b),!i&&d&&a.dataFilter&&(b=a.dataFilter(b,a.dataType)),i=f,f=k.shift())if("*"===f)f=i;else if("*"!==i&&i!==f){if(g=j[i+" "+f]||j["* "+f],!g)for(e in j)if(h=e.split(" "),h[1]===f&&(g=j[i+" "+h[0]]||j["* "+h[0]])){g===!0?g=j[e]:j[e]!==!0&&(f=h[0],k.unshift(h[1]));break}if(g!==!0)if(g&&a["throws"])b=g(b);else try{b=g(b)}catch(l){return{state:"parsererror",error:g?l:"No conversion from "+i+" to "+f}}}return{state:"success",data:b}}r.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:tb.href,type:"GET",isLocal:Fb.test(tb.protocol),global:!0,processData:!0,async:!0,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":Kb,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"},converters:{"* text":String,"text html":!0,"text json":JSON.parse,"text xml":r.parseXML},flatOptions:{url:!0,context:!0}},ajaxSetup:function(a,b){return b?Ob(Ob(a,r.ajaxSettings),b):Ob(r.ajaxSettings,a)},ajaxPrefilter:Mb(Ib),ajaxTransport:Mb(Jb),ajax:function(b,c){"object"==typeof b&&(c=b,b=void 0),c=c||{};var e,f,g,h,i,j,k,l,m,n,o=r.ajaxSetup({},c),p=o.context||o,q=o.context&&(p.nodeType||p.jquery)?r(p):r.event,s=r.Deferred(),t=r.Callbacks("once memory"),u=o.statusCode||{},v={},w={},x="canceled",y={readyState:0,getResponseHeader:function(a){var b;if(k){if(!h){h={};while(b=Eb.exec(g))h[b[1].toLowerCase()]=b[2]}b=h[a.toLowerCase()]}return null==b?null:b},getAllResponseHeaders:function(){return k?g:null},setRequestHeader:function(a,b){return null==k&&(a=w[a.toLowerCase()]=w[a.toLowerCase()]||a,v[a]=b),this},overrideMimeType:function(a){return null==k&&(o.mimeType=a),this},statusCode:function(a){var b;if(a)if(k)y.always(a[y.status]);else for(b in a)u[b]=[u[b],a[b]];return this},abort:function(a){var b=a||x;return e&&e.abort(b),A(0,b),this}};if(s.promise(y),o.url=((b||o.url||tb.href)+"").replace(Hb,tb.protocol+"//"),o.type=c.method||c.type||o.method||o.type,o.dataTypes=(o.dataType||"*").toLowerCase().match(L)||[""],null==o.crossDomain){j=d.createElement("a");try{j.href=o.url,j.href=j.href,o.crossDomain=Lb.protocol+"//"+Lb.host!=j.protocol+"//"+j.host}catch(z){o.crossDomain=!0}}if(o.data&&o.processData&&"string"!=typeof o.data&&(o.data=r.param(o.data,o.traditional)),Nb(Ib,o,c,y),k)return y;l=r.event&&o.global,l&&0===r.active++&&r.event.trigger("ajaxStart"),o.type=o.type.toUpperCase(),o.hasContent=!Gb.test(o.type),f=o.url.replace(Cb,""),o.hasContent?o.data&&o.processData&&0===(o.contentType||"").indexOf("application/x-www-form-urlencoded")&&(o.data=o.data.replace(Bb,"+")):(n=o.url.slice(f.length),o.data&&(f+=(vb.test(f)?"&":"?")+o.data,delete o.data),o.cache===!1&&(f=f.replace(Db,"$1"),n=(vb.test(f)?"&":"?")+"_="+ub++ +n),o.url=f+n),o.ifModified&&(r.lastModified[f]&&y.setRequestHeader("If-Modified-Since",r.lastModified[f]),r.etag[f]&&y.setRequestHeader("If-None-Match",r.etag[f])),(o.data&&o.hasContent&&o.contentType!==!1||c.contentType)&&y.setRequestHeader("Content-Type",o.contentType),y.setRequestHeader("Accept",o.dataTypes[0]&&o.accepts[o.dataTypes[0]]?o.accepts[o.dataTypes[0]]+("*"!==o.dataTypes[0]?", "+Kb+"; q=0.01":""):o.accepts["*"]);for(m in o.headers)y.setRequestHeader(m,o.headers[m]);if(o.beforeSend&&(o.beforeSend.call(p,y,o)===!1||k))return y.abort();if(x="abort",t.add(o.complete),y.done(o.success),y.fail(o.error),e=Nb(Jb,o,c,y)){if(y.readyState=1,l&&q.trigger("ajaxSend",[y,o]),k)return y;o.async&&o.timeout>0&&(i=a.setTimeout(function(){y.abort("timeout")},o.timeout));try{k=!1,e.send(v,A)}catch(z){if(k)throw z;A(-1,z)}}else A(-1,"No Transport");function A(b,c,d,h){var j,m,n,v,w,x=c;k||(k=!0,i&&a.clearTimeout(i),e=void 0,g=h||"",y.readyState=b>0?4:0,j=b>=200&&b<300||304===b,d&&(v=Pb(o,y,d)),v=Qb(o,v,y,j),j?(o.ifModified&&(w=y.getResponseHeader("Last-Modified"),w&&(r.lastModified[f]=w),w=y.getResponseHeader("etag"),w&&(r.etag[f]=w)),204===b||"HEAD"===o.type?x="nocontent":304===b?x="notmodified":(x=v.state,m=v.data,n=v.error,j=!n)):(n=x,!b&&x||(x="error",b<0&&(b=0))),y.status=b,y.statusText=(c||x)+"",j?s.resolveWith(p,[m,x,y]):s.rejectWith(p,[y,x,n]),y.statusCode(u),u=void 0,l&&q.trigger(j?"ajaxSuccess":"ajaxError",[y,o,j?m:n]),t.fireWith(p,[y,x]),l&&(q.trigger("ajaxComplete",[y,o]),--r.active||r.event.trigger("ajaxStop")))}return y},getJSON:function(a,b,c){return r.get(a,b,c,"json")},getScript:function(a,b){return r.get(a,void 0,b,"script")}}),r.each(["get","post"],function(a,b){r[b]=function(a,c,d,e){return r.isFunction(c)&&(e=e||d,d=c,c=void 0),r.ajax(r.extend({url:a,type:b,dataType:e,data:c,success:d},r.isPlainObject(a)&&a))}}),r._evalUrl=function(a){return r.ajax({url:a,type:"GET",dataType:"script",cache:!0,async:!1,global:!1,"throws":!0})},r.fn.extend({wrapAll:function(a){var b;return this[0]&&(r.isFunction(a)&&(a=a.call(this[0])),b=r(a,this[0].ownerDocument).eq(0).clone(!0),this[0].parentNode&&b.insertBefore(this[0]),b.map(function(){var a=this;while(a.firstElementChild)a=a.firstElementChild;return a}).append(this)),this},wrapInner:function(a){return r.isFunction(a)?this.each(function(b){r(this).wrapInner(a.call(this,b))}):this.each(function(){var b=r(this),c=b.contents();c.length?c.wrapAll(a):b.append(a)})},wrap:function(a){var b=r.isFunction(a);return this.each(function(c){r(this).wrapAll(b?a.call(this,c):a)})},unwrap:function(a){return this.parent(a).not("body").each(function(){r(this).replaceWith(this.childNodes)}),this}}),r.expr.pseudos.hidden=function(a){return!r.expr.pseudos.visible(a)},r.expr.pseudos.visible=function(a){return!!(a.offsetWidth||a.offsetHeight||a.getClientRects().length)},r.ajaxSettings.xhr=function(){try{return new a.XMLHttpRequest}catch(b){}};var Rb={0:200,1223:204},Sb=r.ajaxSettings.xhr();o.cors=!!Sb&&"withCredentials"in Sb,o.ajax=Sb=!!Sb,r.ajaxTransport(function(b){var c,d;if(o.cors||Sb&&!b.crossDomain)return{send:function(e,f){var g,h=b.xhr();if(h.open(b.type,b.url,b.async,b.username,b.password),b.xhrFields)for(g in b.xhrFields)h[g]=b.xhrFields[g];b.mimeType&&h.overrideMimeType&&h.overrideMimeType(b.mimeType),b.crossDomain||e["X-Requested-With"]||(e["X-Requested-With"]="XMLHttpRequest");for(g in e)h.setRequestHeader(g,e[g]);c=function(a){return function(){c&&(c=d=h.onload=h.onerror=h.onabort=h.onreadystatechange=null,"abort"===a?h.abort():"error"===a?"number"!=typeof h.status?f(0,"error"):f(h.status,h.statusText):f(Rb[h.status]||h.status,h.statusText,"text"!==(h.responseType||"text")||"string"!=typeof h.responseText?{binary:h.response}:{text:h.responseText},h.getAllResponseHeaders()))}},h.onload=c(),d=h.onerror=c("error"),void 0!==h.onabort?h.onabort=d:h.onreadystatechange=function(){4===h.readyState&&a.setTimeout(function(){c&&d()})},c=c("abort");try{h.send(b.hasContent&&b.data||null)}catch(i){if(c)throw i}},abort:function(){c&&c()}}}),r.ajaxPrefilter(function(a){a.crossDomain&&(a.contents.script=!1)}),r.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/\b(?:java|ecma)script\b/},converters:{"text script":function(a){return r.globalEval(a),a}}}),r.ajaxPrefilter("script",function(a){void 0===a.cache&&(a.cache=!1),a.crossDomain&&(a.type="GET")}),r.ajaxTransport("script",function(a){if(a.crossDomain){var b,c;return{send:function(e,f){b=r(" + + + + + + diff --git a/v1/taffy/docs/readme.md b/v1/taffy/docs/readme.md index 9f1e912..f63b2a8 100644 --- a/v1/taffy/docs/readme.md +++ b/v1/taffy/docs/readme.md @@ -1,32 +1,146 @@ -Taffy Logo +

+ GitHub + Releases + 💬 #taffy on CFML Slack + Apache-2.0 +

-# Taffy +# Write REST APIs in CFML — without the boilerplate. -The REST Web Service framework for ColdFusion and Lucee +**Taffy** is a full-featured REST framework for ColdFusion and Lucee. Drop a +CFC into your `/resources/` folder, add a URI annotation, and you have an API. +Content negotiation, caching hooks, CORS, JSONP, an interactive dashboard, +OpenAPI JSON, and custom serializers — all included. -- [Download Taffy 3.3.0.zip](https://github.com/atuttle/Taffy/archive/v3.3.0.zip) -- [GitHub](https://github.com/atuttle/Taffy) -- Join us in the **#taffy** chat room on the [CFML Slack](https://cfml-slack.herokuapp.com/) +

+ Download v4.0.0 + Quickstart → + Read the Docs +

-# Documentation +## Why Taffy? -Nobody has time to keep every framework and every dependency up to date. Sometimes you want to reference the old docs! That's why Taffy tries really hard to maintain our old docs and carry them forward with us. Below is a list of all version-specific Taffy docs releases. +
    +
  • + One-file APIs + A working API fits in a tweet. Seriously — inheritance and convention do the heavy lifting. +
  • +
  • + 🧭Convention over config + URI lives on the CFC. HTTP verbs map to CFC methods. That's the contract. +
  • +
  • + 🎛Built-in dashboard + Interactive API explorer at your index.cfm. Try every endpoint from a browser without writing a client. +
  • +
  • + 🧬Content negotiation + JSON, XML, JSONP, custom serializers — chosen by Accept header or extension. You pick the defaults. +
  • +
  • + 📘OpenAPI out of the box + Auto-generated OpenAPI/Swagger JSON for every route, new in v4. Point your favorite tooling at it and go. +
  • +
  • + 🧱Pluggable everything + Bring your own bean factory, serializer, status reporter, or caching strategy. The hooks are there. +
  • +
+ +## Quickstart: Your First API + +Three files. That's the whole API. + +**Application.cfc** + +```cfscript +component extends="taffy.core.api" {} +``` + +**index.cfm** + +``` + +``` + +**/resources/hello.cfc** + +```cfscript +component extends="taffy.core.resource" taffy_uri="/hello" { + + function get(){ + return rep( [ "hello", "world" ] ); + } + +} +``` + +Point a browser at `index.cfm` and you get the Taffy dashboard. Hit +`/hello` and you get JSON. Add a `post()` method — that's your POST handler. +Add `taffy_uri="/hello/{name}"` — now `name` is an argument. + +[Read the full Getting Started guide →](https://github.com/atuttle/Taffy/wiki/Getting-Started) + +## Current Release + +> **Taffy 4.0.0** is the latest stable release. +> [Release notes](https://github.com/atuttle/Taffy/releases/tag/v4.0.0) · +> [Download](https://github.com/atuttle/Taffy/archive/v4.0.0.zip) · +> [Docs](4.0.0.md) + +## All Versions + +Taffy keeps every version's docs online forever — because nobody has time to +keep every framework and every dependency up to date. If you're still on an +older version, the docs that shipped with it still work. -- [v3.5.0](3.5.0.md) -- [v3.4.0](3.4.0.md) -- [v3.3.0](3.3.0.md) -- [v3.2.0](3.2.0.md) -- [v3.1.0](3.1.0.md) -- [v3.0.0](3.0.0.md) -- [v2.2.4](2.2.4.md) -- [v2.2.3](2.2.3.md) -- [v2.2.0](2.2.0.md) -- [v2.1.0](2.1.0.md) -- [v2.0.1](2.0.1.md) -- [v2.0.0](2.0.0.md) +### Taffy 4.x -# Other Resources + -In 2012 I presented a comparison of REST frameworks for CFML at the cf.Objective() conference. [This is all of the source code I used to make that comparison, as well as my slides from the talk.](https://github.com/atuttle/CF-REST-Comparison#coldfusion-rest-comparison) +### Taffy 3.x + + + +### Taffy 2.x + + + +## Community + +- 💬 Join **#taffy** on the [CFML Slack](https://cfml-slack.net/) +- 🐛 [Report issues on GitHub](https://github.com/atuttle/Taffy/issues) +- 🙋 [Contribute](https://github.com/atuttle/Taffy/blob/master/CONTRIBUTING.md) +- 📜 [Changelog](https://github.com/atuttle/Taffy/releases) + +## Other Resources + +
+ REST Assured — A Pragmatic Approach to API Design +
+

Need to level up on REST fundamentals?

+

Taffy's author wrote a book on API design. REST Assured — A Pragmatic Approach to API Design covers the parts every framework leaves out.

+

Get the book →

+
+
diff --git a/v1/taffy/lib/README.TXT b/v1/taffy/lib/README.TXT deleted file mode 100644 index 4344470..0000000 --- a/v1/taffy/lib/README.TXT +++ /dev/null @@ -1,3 +0,0 @@ -Files in the /lib folder exist solely for the purpose of running the tests. -You do not need to keep them for your installation. You can delete everything -except /core and /bonus, but I would recommend you keep /examples around too. \ No newline at end of file diff --git a/v1/taffy/lib/ant-contrib-1.0b3.jar b/v1/taffy/lib/ant-contrib-1.0b3.jar deleted file mode 100644 index 062537661a514c2ce97d18948f4f25f7226cc1a0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 224277 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 z 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%0DDNlc$iKGo<(eUp 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

0zGh%HPCY&11) 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

|GCe!26TzVG{ac?zaTA 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%0A()8 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%0A^g?Ks`({&>Fj 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%0DeiWr50{;3 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 S+;al|(4pZZ*n6;7lK%tB`z)LQ diff --git a/v1/taffy/package.json b/v1/taffy/package.json index cacea1a..d2b634b 100644 --- a/v1/taffy/package.json +++ b/v1/taffy/package.json @@ -1,21 +1,14 @@ { - "name": "cfml-taffy", - "scripts": { - "less": "lessc dashboard/dash.less --clean-css=\"--s1 --advanced\" > dashboard/dash.css" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/atuttle/Taffy.git" - }, - "author": "Adam Tuttle ", - "license": "MIT", - "bugs": { - "url": "https://github.com/atuttle/Taffy/issues" - }, - "homepage": "https://taffy.io", - "devDependencies": { - "less": "^4.1.1", - "less-plugin-clean-css": "^1.5.1" - }, - "version": "3.6.0" + "name": "cfml-taffy", + "version": "3.8.0", + "author": "Adam Tuttle ", + "license": "MIT", + "homepage": "https://taffy.io", + "repository": { + "type": "git", + "url": "git+https://github.com/atuttle/Taffy.git" + }, + "bugs": { + "url": "https://github.com/atuttle/Taffy/issues" + } } diff --git a/v1/taffy/server-lucee5.json b/v1/taffy/server-lucee5.json new file mode 100644 index 0000000..533fa5e --- /dev/null +++ b/v1/taffy/server-lucee5.json @@ -0,0 +1,12 @@ +{ + "name":"taffy-lucee5", + "web":{ + "http":{ + "port":8085 + } + }, + "app":{ + "cfengine":"lucee@5" + }, + "openBrowser":false +} diff --git a/v1/taffy/server-lucee6.json b/v1/taffy/server-lucee6.json new file mode 100644 index 0000000..91b2a33 --- /dev/null +++ b/v1/taffy/server-lucee6.json @@ -0,0 +1,12 @@ +{ + "name":"taffy-lucee6", + "web":{ + "http":{ + "port":8086 + } + }, + "app":{ + "cfengine":"lucee@6" + }, + "openBrowser":false +} diff --git a/v1/taffy/server-lucee7.json b/v1/taffy/server-lucee7.json new file mode 100644 index 0000000..ad52daa --- /dev/null +++ b/v1/taffy/server-lucee7.json @@ -0,0 +1,12 @@ +{ + "name":"taffy-lucee7", + "web":{ + "http":{ + "port":8087 + } + }, + "app":{ + "cfengine":"lucee@7" + }, + "openBrowser":false +} diff --git a/v1/taffy/server.json b/v1/taffy/server.json deleted file mode 100644 index 186a831..0000000 --- a/v1/taffy/server.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "app":{ - "cfengine":"" - } -} \ No newline at end of file diff --git a/v1/taffy/tests/Application.cfc b/v1/taffy/tests/Application.cfc index 3d493d8..310bff6 100644 --- a/v1/taffy/tests/Application.cfc +++ b/v1/taffy/tests/Application.cfc @@ -1,80 +1,46 @@ - - - this.name = "Taffy_testSuite"; - this.dirPath = getDirectoryFromPath(getCurrentTemplatePath()); - this.mappings["/resources"] = this.dirPath & "resources/"; - this.mappings["/mxunit"] = this.dirPath & "testbox/system/compat/"; - this.mappings["/testbox"] = this.dirPath & "testbox/"; - this.mappings["/bugLog"] = this.dirPath & "BugLogHQ/"; - this.mappings["/Hoth"] = this.dirPath & "Hoth/"; - this.mappings["/di1"] = this.dirPath & "di1/"; +component { - this.system = createObject("java", "java.lang.System"); - this.datasources["bugLog"] = { - class: (structKeyExists(server, "lucee")) ? 'org.gjt.mm.mysql.Driver' : 'com.mysql.jdbc.Driver', - connectionString: 'jdbc:mysql://localhost:3306/buglog?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT&useLegacyDatetimeCode=false', - url: 'jdbc:mysql://localhost:3306/buglog?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT&useLegacyDatetimeCode=false', - username: this.system.getenv("DB_USER"), - password: this.system.getenv("DB_PASS"), - driver: "other" + this.name = "TaffyTestHarness_" & hash(getCurrentTemplatePath()); + this.sessionManagement = false; + + // Set up mappings for tests + variables.testsPath = getDirectoryFromPath(getCurrentTemplatePath()); + // Strip trailing slash before calling getDirectoryFromPath to reliably get parent dir across engines + variables.rootPath = getDirectoryFromPath(left(variables.testsPath, len(variables.testsPath) - 1)); + + this.mappings["/taffy"] = variables.rootPath; + this.mappings["/testbox"] = variables.testsPath & "testbox"; + this.mappings["/tests"] = variables.testsPath; + this.mappings["/resources"] = variables.testsPath & "resources"; + + // Also set component paths for Lucee 6 compatibility + this.componentPaths = [ + { + "physical": variables.rootPath, + "archive": "", + "primary": "physical", + "inspectTemplate": "always" + } + ]; + + function onApplicationStart() { + // Initialize minimal Taffy context for tests that need it + application._taffy = { + settings: { + serializer: "core.nativeJsonSerializer", + noDataSends204NoContent: false + }, + factory: new core.factory(), + compat: { + queryToArray: "missing", + queryToStruct: "missing" + } }; + return true; + } + function onRequestStart(targetPath) { + return true; + } - variables.framework = {}; - variables.framework.disableDashboard = false; - variables.framework.reloadKey = "reload"; - variables.framework.unhandledPaths = "/Taffy/tests/someFolder,/Taffy/tests/tests,/tests/someFolder,/tests/tests,BugLogHQ"; - variables.framework.serializer = "nativeJsonSerializer"; - variables.framework.useEtags = true; - variables.framework.globalHeaders = {}; - variables.framework.globalHeaders["x-foo-globalheader"] = "snafu"; - variables.framework.exposeHeaders = true; - - variables.framework.environments = {}; - variables.framework.environments.test = {}; - variables.framework.environments.test.reloadPassword = 'dontpanic'; - - function getCacheKey(cfc, requestArguments, matchedURI) { - if(structKeyExists(requestArguments, "default")) { - return super.getCacheKey(argumentCollection = arguments); - } - - return lCase(arguments.cfc & "_" & listSort(structKeyList(arguments.requestArguments), "textnocase")); - } - - function getEnvironment(){ - return "test"; - } - - function onRequest(string target) { - if (arguments.target contains "/BugLogHQ/") { - return true; - } else { - super.onRequest(arguments.target); - } - } - - function onTaffyRequest(verb, cfc, requestArguments, mimeExt, headers, methodMetadata, matchedURI) { - var local = {}; - - //pass data into a resource by modifying requestArguments - if (structKeyExists(arguments.requestArguments, "hulk") and arguments.requestArguments.hulk eq "smash"){ - arguments.requestArguments.dataFromOTR = "who let the hulk out?!"; - } - - //get basic auth data, if any, and pass it into the resources - local.credentials = getBasicAuthCredentials(); - arguments.requestArguments.username = local.credentials.username; - arguments.requestArguments.password = local.credentials.password; - - if (structKeyExists(arguments.requestArguments, "refuse") and arguments.requestArguments.refuse) - { - return noData().withStatus(405); - } - else - { - return true; - } - } - - +} diff --git a/v1/taffy/tests/fixtures/SampleData.cfc b/v1/taffy/tests/fixtures/SampleData.cfc new file mode 100644 index 0000000..c094ce6 --- /dev/null +++ b/v1/taffy/tests/fixtures/SampleData.cfc @@ -0,0 +1,55 @@ +component { + + /** + * Returns a sample query for testing queryToArray/queryToStruct + */ + function getSampleQuery() { + return queryNew( + "id,name,email,active", + "integer,varchar,varchar,bit", + [ + { id: 1, name: "John Doe", email: "john@example.com", active: true }, + { id: 2, name: "Jane Smith", email: "jane@example.com", active: true }, + { id: 3, name: "Bob Wilson", email: "bob@example.com", active: false } + ] + ); + } + + /** + * Returns a single-row query for testing queryToStruct + */ + function getSingleRowQuery() { + return queryNew( + "id,name,email", + "integer,varchar,varchar", + [{ id: 1, name: "Test User", email: "test@example.com" }] + ); + } + + /** + * Returns sample struct data + */ + function getSampleStruct() { + return { + id: 123, + name: "Test Item", + tags: ["tag1", "tag2"], + metadata: { + created: now(), + version: "1.0" + } + }; + } + + /** + * Returns sample array data + */ + function getSampleArray() { + return [ + { id: 1, value: "first" }, + { id: 2, value: "second" }, + { id: 3, value: "third" } + ]; + } + +} diff --git a/v1/taffy/tests/helpers/MetadataHelper.cfc b/v1/taffy/tests/helpers/MetadataHelper.cfc new file mode 100644 index 0000000..69a6763 --- /dev/null +++ b/v1/taffy/tests/helpers/MetadataHelper.cfc @@ -0,0 +1,18 @@ +component { + + /** + * Walks the metadata chain to check if an object extends a given class. + * Works around Lucee's isInstanceOf() bug with mapped paths. + */ + public boolean function extendsClass(required any obj, required string className) { + if (!isObject(arguments.obj)) return false; + var meta = getMetadata(arguments.obj); + while (structKeyExists(meta, "name")) { + if (listLast(meta.name, ".") == listLast(arguments.className, ".")) return true; + if (!structKeyExists(meta, "extends")) break; + meta = meta.extends; + } + return false; + } + +} diff --git a/v1/taffy/tests/index.cfm b/v1/taffy/tests/index.cfm deleted file mode 100644 index e69de29..0000000 diff --git a/v1/taffy/tests/lib/Hoth/HothReporter.cfc b/v1/taffy/tests/lib/Hoth/HothReporter.cfc deleted file mode 100644 index f243e4c..0000000 --- a/v1/taffy/tests/lib/Hoth/HothReporter.cfc +++ /dev/null @@ -1,147 +0,0 @@ -/** - Aaron Greenlee - http://aarongreenlee.com/ - - This work is licensed under a Creative Commons Attribution-Share-Alike 3.0 - Unported License. - - // Original Info ----------------------------------------------------------- - Author : Aaron Greenlee - Created : 01/12/2011 - - HothReporter offers a simple Web UI to report the errors observed by Hoth. - - // Modifications :--------------------------------------------------------- - -*/ -component -name='HothReporter' -accessors=false -output="false" -{ - public Hoth.HothReporter function init (HothConfig) - { - // If a config object was not provided we - // will use our default. - variables.Config = (structKeyExists(arguments, 'HothConfig')) - ? arguments.HothConfig - : new Hoth.config.HothConfig(); - - VARIABLES._NAME = 'Hoth_' & variables.Config.getApplicationName(); - - variables.exceptionKeys = ['detail','type','tagcontext','stacktrace','message'];// Required exception keys - variables.logPathIsRelative = variables.Config.getLogPathIsRelative(); - variables.paths.LogPath = variables.Config.getLogPathExpanded(); // Get the root location for our logging. - variables.paths.Exceptions = variables.Config.getPath('exceptions'); // Track the unique exceptions. - variables.paths.Incidents = variables.Config.getPath('incidents'); // Track the hits per exception. - variables.paths.Report = variables.Config.getPath('exceptionReport'); // The actual report - variables.paths.Activity = variables.Config.getPath('exceptionReportActivity'); // Track when we save things. Helps understand volume. - //variables.paths.Index = variables.Config.getPath('exceptionIndex'); // Tracks the exception keys to prevent duplication - - return this; - } - - /** Quick report. Really a work in process. - * @exception Accepts a hash value or 'all' - **/ - public struct function report (required string exception) - { - if (arguments.exception=='all') - { - return generateExceptionIndex(); - } else { - local.filepath = variables.paths.Exceptions & '/' & arguments.exception; - - local.exception = (fileExists(local.filepath)) - ? fileRead(local.filepath) - : serializeJSON ({'message'="That report no longer exists."}); - - return deserializeJSON (local.exception); - } - } - - /** Quick report. Really a work in process. - * @exception Accepts a hash value or 'all' - **/ - public array function delete (required string exception) - { - - local.response = []; - if (arguments.exception == 'all') - { - lock name=VARIABLES._NAME timeout=variables.Config.getTimeToLock() type="exclusive" { - directoryDelete(variables.paths.Exceptions, true); - directoryDelete(variables.paths.Incidents, true); - directoryCreate(variables.paths.Exceptions); - directoryCreate(variables.paths.Incidents); - } - } else { local.exceptionPath = variables.paths.Exceptions & '/' & arguments.exception; - local.incidentPath = variables.paths.Incidents & '/' & arguments.exception; - - local.response = []; - - if (fileExists(local.exceptionPath)) - { - fileDelete(local.exceptionPath); - arrayAppend(local.response, "Exception file deleted."); - } else { - arrayAppend(local.response, "Exception file did not exist!"); - } - if (fileExists(local.incidentPath)) - { - fileDelete(local.incidentPath); - arrayAppend(local.response, "Incident record file deleted."); - } else { - arrayAppend(local.response, "Incident record file not exist!"); - } - return local.response; - } - } - - /** Return the report's view **/ - public string function getReportView () { - local.view = fileRead(expandPath('/Hoth') & '/views/report.html'); - - // Replace the Hoth URL - return replaceNoCase( - local.view - ,'${HOTH_REPORT_URL}' - ,variables.Config.getHothReportURL()); - } - - // ------------------------------------------------------------------------- - private struct function generateExceptionIndex() { - // Read our file system - local.exceptions = directoryList (variables.paths.Exceptions,false); - local.incidents = directoryList (variables.paths.Exceptions,false); - - local.report = {}; - for (i=1;i LTE ArrayLen(local.exceptions);i=i+1) { - - local.instance = {}; - local.instance.filename = - listLast(local.exceptions[i],'\/'); - - if (left(local.instance.filename, 1) != '_') - { - //local.instance.exceptionDetail = - //fileRead (local.exceptions[i]); - - if (!fileExists(variables.paths.Incidents & '/' & local.instance.filename)) - { - local.instances = ''; - } else { - local.instances = - fileRead(variables.paths.Incidents & '/' & local.instance.filename); - } - - local.instance.incidentcount = listLen(local.instances,chr(10)); - - // Save our report - local.report[local.instance.filename] = local.instance; - } - } - - return local.report; - } -} \ No newline at end of file diff --git a/v1/taffy/tests/lib/Hoth/HothTracker.cfc b/v1/taffy/tests/lib/Hoth/HothTracker.cfc deleted file mode 100644 index 26d6a65..0000000 --- a/v1/taffy/tests/lib/Hoth/HothTracker.cfc +++ /dev/null @@ -1,264 +0,0 @@ -/** - Aaron Greenlee - http://aarongreenlee.com/ - - This work is licensed under a Creative Commons Attribution-Share-Alike 3.0 - Unported License. - - // Original Info ----------------------------------------------------------- - Author : Aaron Greenlee - Created : 10/01/2010 - - HothTracker is responsible for accepting a exception, tracking the frequency - of the exception and alerting developers for new, unique exceptions. - - // Modifications :--------------------------------------------------------- - Modified : 12/13/2010 9:52:41 AM by Aaron Greenlee. - - Now supporting ColdBox 3.0 RC1 -*/ -component -name='HothTracker' -accessors=false -{ - - public Hoth.HothTracker function init (HothConfig) { - // If a config object was not provided we - // will use our default. - variables.Config = (structKeyExists(arguments, 'HothConfig')) - ? arguments.HothConfig - : new Hoth.object.HothConfig(); - - VARIABLES._NAME = 'Hoth_' & variables.Config.getApplicationName(); - - variables.exceptionKeys = ['detail','type','tagcontext','stacktrace','message']; // Required exception keys - variables.paths.LogPath = variables.Config.getLogPathExpanded(); // Get the root location for our logging. - variables.paths.Exceptions = variables.Config.getPath('exceptions'); // Track the unique exceptions. - variables.paths.Incidents = variables.Config.getPath('incidents'); // Track the hits per exception. - variables.paths.Report = variables.Config.getPath('exceptionReport'); // The actual report - variables.paths.Activity = variables.Config.getPath('exceptionReportActivity'); // Track when we save things. Helps understand volume. - //variables.paths.Index = variables.Config.getPath('exceptionIndex'); // Tracks the exception keys to prevent duplication - - verifyDirectoryStructure(); - - try { - // For the life of this HothTracker, keep the ApplicationManager. - variables.HothApplicationManager = new Hoth.object.HothApplicationManager(HothConfig); - // Because the entire application db file is locked, we only want to - // learn about this application when the HothTracker is created. The - // actual amount of work done within the manager is small, but, it is - // does block all other processes for all other Hoth instances, so, we - // want to reduce calls to it to this constructor. - variables.HothApplicationManager.learnApplication(arguments.HothConfig); - } catch (any e) { - //writeDump(e);abort; - } - return this; - } - - /** Track an exception. - @ExceptionStructure A ColdFusion cfcatch or a supported object from a Framework or Application. */ - public boolean function track (any Exception) { - local.ExceptionStructure = parseException(arguments.Exception); - - // If we did not parse what we are supposed to - // track, we will abort. - if (!local.ExceptionStructure.validException) - return false; - - // ------------------------------------------------------------------------------ - try { - // ------------------------------------------------------------------------------ - local.e = { - detail = structKeyExists(local.ExceptionStructure,'detail') ? local.ExceptionStructure.detail : '_noDetail' - ,message = structKeyExists(local.ExceptionStructure,'message') ? local.ExceptionStructure.message : '_noMessage' - ,stack = structKeyExists(local.ExceptionStructure,'stacktrace') ? local.ExceptionStructure.stacktrace : '_no_stacktrace' - ,context = structKeyExists(local.ExceptionStructure,'tagcontext') ? local.ExceptionStructure.tagcontext : '_no_tagcontext' - ,format = structKeyExists(local.ExceptionStructure,'format') ? local.ExceptionStructure.format: '_no_format' - ,url = CGI.HTTP_HOST & CGI.path_info - ,client = CGI.HTTP_USER_AGENT - }; - - // Generate JSON for hashing - local.json = {}; - local.k = ''; - for(local.k in local.e) - local.json[k] = serializeJSON(local.e[local.k]); - - // Hash a unique key for the content of each property within the exception - local.index = {}; - local.index.stack = ( len(local.e.stack) > 0) ? hash(lcase(local.e.stack),'SHA') : '_no_stack'; - local.index.key = lcase(local.index.stack); - - local.saveDetails = false; - - // Index the exception, count occurances and save details. - // Lock is unique to the exception. - lock name=local.index.key timeout=variables.Config.getTimeToLock() type="exclusive" { - local.filename = local.index.key & '.log'; - local.exceptionFile = variables.paths.Exceptions & '/' & local.filename; - local.incidentsFile = variables.paths.Incidents & '/' & local.filename; - - local.exceptionIsKnown = fileExists(local.exceptionFile); - - if (!local.exceptionIsKnown) - fileWrite(local.exceptionFile ,serializeJSON(local.e),'UTF-8'); - - // Create an incident if the file does not exist - if (!fileExists(local.incidentsFile)) { - fileWrite(local.incidentsFile ,now() & '#chr(13)#','UTF-8'); - } else { - local.file = fileOpen(local.incidentsFile,'append','utf-8'); - fileWriteLine(local.file, now() & '|' & local.e.url ); - fileClose(local.file); - } - } - - // Outside the lock, send mail if requested - if (!local.exceptionIsKnown && variables.Config.getEmailNewExceptions() ) { - - local.INetAddress = createObject( 'java', 'java.net.InetAddress' ); - - local.url = (len(CGI.QUERY_STRING) > 0) - ? CGI.http_host & CGI.path_info & '?' & Cgi.QUERY_STRING - : CGI.http_host & CGI.path_info; - - local.emailBody = [ - "Hoth tracked a new exception (" & local.index.key & ")." - ,"Message: " & local.e.message - ,"Machine Name: " & local.INetAddress.getLocalHost().getHostName() - ,"Address: " & local.url - ]; - - local.Mail = new Mail( subject='Hoth Exception (' & variables.Config.getApplicationName() & ') ' & local.index.key - ,to=variables.Config.getEmailNewExceptionsTo() - ,from=variables.Config.getEmailNewExceptionsFrom()); - - // Attach the file - if ( variables.Config.getEmailNewExceptionsFile() ) { - local.Mail.addParam(file=local.exceptionFile); - ArrayAppend( local.emailBody, "To view the attached exception info, copy and paste into FireBug's console (x = exception) and press CRTL+Enter." ); - } - - // Show exception as HTML inline? - if ( variables.Config.getEmailExceptionsAsHTML() ) { - local.Mail.setType( "html" ); - savecontent variable="local.emailBody" { - writeOutput( arrayToList( local.emailBody, "
" ) ); - writeOutput( "
Exception Details:
"); - writeDump( local.e ); - } - local.Mail.setBody( local.emailBody ); - } - else { - local.Mail.setBody( arrayToList( local.emailBody, "#chr(10)##chr(13)#" ) ); - } - - local.mail.Send(); - } - // ------------------------------------------------------------------------------ - } catch (any e) { - return false; - } - // ------------------------------------------------------------------------------ - return true; - } - - // Private Methods Follow ------------------------------------------------------- - /** Parse an exception provided by a framework or supported application. - Hoth is easy to support. Just provide a Struct with at least the following keys: - 'detail,type,tagContext,StackTrace,Message' - Or an object with the same information that Hoth can extract. */ - private struct function parseException(any Exception) { - local.result = { validException = false }; - - // Return the meta data for our passed exception - local.md = getMetaData(Exception); - - // Inspect the class tree to understand what type of object - // we are working with. - local.classTree = GetClassHeirarchy(local.md); - - // Was our object built with ColdFusion? If so, it is custom. - // If not, the object is considered to be native and generated by CF. - local.exceptionType = ( - listContainsNoCase(local.classTree, 'coldfusion.runtime.AttributeCollection', ' ') - ) ? 'Custom' : 'Native'; - - if (local.exceptionType == 'Native') - { - local.result.detail = (structKeyExists(arguments.Exception, 'detail')) ? arguments.Exception.detail : 'undefined'; - local.result.message = (structKeyExists(arguments.Exception, 'message')) ? arguments.Exception.message : 'undefined'; - local.result.stacktrace = (structKeyExists(arguments.Exception, 'stacktrace')) ? arguments.Exception.stacktrace : 'undefined'; - local.result.tagcontext = (structKeyExists(arguments.Exception, 'tagContext')) ? arguments.Exception.tagContext : 'undefined'; - local.result.validException = true; - local.result.format = 'Native'; - - // ADDED by Benoit Hediard to get real detail and message in FW1 - if (local.result.message == "Event handler exception." && structKeyExists(arguments.Exception, "Cause")) { - local.result.detail = (structKeyExists(arguments.Exception.Cause, 'detail')) ? arguments.Exception.Cause.detail : 'undefined'; - local.result.message = (structKeyExists(arguments.Exception.Cause, 'message')) ? arguments.Exception.Cause.message : 'undefined'; - }; - return local.result; - } else { - //detail,type,tagcontext,stacktrace,message - switch(local.md.fullname) { - // ColdBox Excepiont - case 'coldbox.system.beans.ExceptionBean' : - case 'coldbox.system.web.context.ExceptionBean' : - local.result.detail = arguments.Exception.getDetail(); - local.result.message = arguments.Exception.getMessage(); - local.result.stacktrace = arguments.Exception.getStackTrace(); - local.result.tagcontext = arguments.Exception.getTagContext(); - local.result.validException = true; - local.result.format = 'ColdBox'; - break; - // Unknown Exception Passed - default : - local.result.validException = false; - local.result.format = 'Unknown'; - break; - /*case 'MachII.util.Exception' : - local.result = arguments.Exception.getCaughtException(); - local.result.validException = true; - break;*/ - } - } - - return local.result; - } - - /** Inspect the class heirarchy to return a string showing the class tree. - Original code is borrowed from Dominic Watson at the following address. - Rewritten for for CF9+/Railo features. - http://fusion.dominicwatson.co.uk/2007/09/coldfusion-objects-are-java-objects.html **/ - private function GetClassHeirarchy(obj) { - local.thisClass = obj.GetClass(); - local.sReturn = thisClass.GetName(); - - do{ - local.thisClass = local.thisClass.GetSuperClass(); - local.sReturn &= " " & thisClass.GetName(); - } while(CompareNoCase(thisClass.GetName(), 'java.lang.Object')); - - return local.sReturn; - } - - /** Verify the desired directory structure exsits. */ - private void function verifyDirectoryStructure() { - // Verify our index diectory exists - - /* Ensure our directory structure is as expected. */ - lock name=VARIABLES._NAME timeout=variables.Config.getTimeToLock() type="exclusive" { - if (!directoryExists(variables.paths.Exceptions)) { - directoryCreate(variables.paths.Exceptions); - fileWrite(variables.paths.Exceptions & '/_readme.txt','Hoth: The files within this directory contain the complete details for each unique exception.'); - } - if (!directoryExists(variables.paths.Incidents)) { - directoryCreate(variables.paths.Incidents); - fileWrite(variables.paths.Incidents & '/_readme.txt','Hoth: The files within this directory contain the details about the volume of errors for each unique exception.'); - } - } - - return; - } -} diff --git a/v1/taffy/tests/lib/Hoth/Report.cfc b/v1/taffy/tests/lib/Hoth/Report.cfc deleted file mode 100644 index dc6b7b0..0000000 --- a/v1/taffy/tests/lib/Hoth/Report.cfc +++ /dev/null @@ -1,41 +0,0 @@ -// This CFC offers no protection--thus, anyone can access this. -// You can implement this by renaming the CFC with a UUID--that can secure -// this through obscurity. But, I prefer the approach shown in the ColdBox -// example. That is what I use. I have not tried this code :( - -component -{ - /** Loads the Web UI (HTML) **/ - remote function index () returnformat='plain' { - local.HothReport = new Hoth.HothReporter( new config.HothConfig() ); - return local.HothReport.getReportView(); - } - - /** Access Hoth report data as JSON. - @exception If not provided a list of exceptions will be returned. - If provided, the value should be an exception hash which - modified the behavior to return information for only - that exception. **/ - remote function report (string exception) returnformat='JSON' { - local.report = (structKeyExists(arguments, 'exception') - ? arguments.exception - : 'all'); - - local.HothReport = new Hoth.HothReporter( new config.HothConfig() ); - return local.HothReport.report(local.report); - } - - /** Delete a report. **/ - remote function delete (string exception)returnformat='JSON' { - if (!structKeyExists(arguments, 'exception')) - { - // We can delete all exceptions at once! - arguments.exception = 'all'; - } - - local.HothReport = new Hoth.HothReporter( new config.HothConfig() ); - - // Delete! - return local.HothReporter.delete(arguments.exception); - } -} \ No newline at end of file diff --git a/v1/taffy/tests/lib/Hoth/config/HothConfig.cfc b/v1/taffy/tests/lib/Hoth/config/HothConfig.cfc deleted file mode 100644 index 1c3b93d..0000000 --- a/v1/taffy/tests/lib/Hoth/config/HothConfig.cfc +++ /dev/null @@ -1,79 +0,0 @@ -/** - Aaron Greenlee - http://aarongreenlee.com/ - - This work is licensed under a Creative Commons Attribution-Share-Alike 3.0 - Unported License. - - // Original Info ----------------------------------------------------------- - Author : Aaron Greenlee - Created : 10/01/2010 - - Default configuration for Hoth. - -*/ -component - implements='Hoth.object.iHothConfig' - extends='Hoth.object.CoreConfig' - accessors=true { - - // ------------------------------------------------------------------------- - // BASIC HOTH SETTINGS (required) - // ------------------------------------------------------------------------- - /** What is the name of your application? */ - property name='applicationName' default='HothDefaultConfig'; - - /** How many seconds should we lock file operations? - For most operations this is exclusive to a unique exception. */ - property name='timeToLock' default='1'; - - /** Where would you like Hoth to save exception data? - This folder should be empty when you start. */ - property name='logPath' default='/Hoth/examples/Example_Logs'; - - /** Is the log file location relative to the webroot? - This folder should be empty when you start. */ - property name='logPathIsRelative' default='true'; - - // ------------------------------------------------------------------------- - // HOTH EMAIL SETTINGS (required) - // ------------------------------------------------------------------------- - /** Would you like new exceptions to be emailed to you? */ - property name='EmailNewExceptions' default='false'; - - /** What address(es) should receive these e-mails? */ - property name='EmailNewExceptionsTo' default='you@yourdomain.com'; - - /** What address would you like these emails sent from? */ - property name='EmailNewExceptionsFrom' default='hoth@yourdomain.com'; - - /** Would you like the raw JSON attached to the e-mail? */ - property name='EmailNewExceptionsFile' default='false'; - - /** Would you like HTML emails which contain the exception? */ - property name='EmailExceptionsAsHTML' default='false'; - - // ------------------------------------------------------------------------- - // HOTH REPORT SETTINGS (required) - // ------------------------------------------------------------------------- - - /** How you access the Hoth reports is up to you. When the reports are - generated Hoth needs to know how to build links so you can navigate - the report and get information from the server. - - You are responsible for deciding how you wish to access reports. Once - you have figured that out, please, write the full URL here. - **/ - property - name='HothReportURL' - default='http://office/lib/Hoth/examples/ColdFusion/HothReportUI.cfc'; - - // ------------------------------------------------------------------------- - // Constructor - // ------------------------------------------------------------------------- - public function init() - { - super.init(); - return this; - } -} \ No newline at end of file diff --git a/v1/taffy/tests/lib/Hoth/db/.gitignore b/v1/taffy/tests/lib/Hoth/db/.gitignore deleted file mode 100644 index 22e5eb3..0000000 --- a/v1/taffy/tests/lib/Hoth/db/.gitignore +++ /dev/null @@ -1 +0,0 @@ -/*.hoth diff --git a/v1/taffy/tests/lib/Hoth/db/readme.txt b/v1/taffy/tests/lib/Hoth/db/readme.txt deleted file mode 100644 index 1e9ebf6..0000000 --- a/v1/taffy/tests/lib/Hoth/db/readme.txt +++ /dev/null @@ -1,3 +0,0 @@ -This folder is populated by Hoth to keep track of all applications that -use this instance of Hoth so Hoth can find the log files for your -applications when generating reports. \ No newline at end of file diff --git a/v1/taffy/tests/lib/Hoth/extras/ColdBoxInterceptor.cfc b/v1/taffy/tests/lib/Hoth/extras/ColdBoxInterceptor.cfc deleted file mode 100644 index a841946..0000000 --- a/v1/taffy/tests/lib/Hoth/extras/ColdBoxInterceptor.cfc +++ /dev/null @@ -1,98 +0,0 @@ -/* --------------------------------------------------------------------- -I configure and load Hoth into the ColdBox cache --------------------------------------------------------------------- -Define settings in ColdBox.cfc for example: - interceptors = [ - //Autowire - { - class="coldbox.system.interceptors.Autowire", - properties={} - }, - //SES - { - class="coldbox.system.interceptors.SES", - properties={} - }, - //HothTracker - { - class="hoth.extras.ColdBoxInterceptor", - properties={ - EmailNewExceptions = true, - EmailNewExceptionsFile = true, - EmailNewExceptionsTo = "kaboom@mysite.com", - EmailNewExceptionsFrom = "server@mysite.com" - } - } - ]; --------------------------------------------------------------------- -*/ -component -{ - - /* CONSTRUCTOR - ------------------------------------------- */ - - /** - * This is the configuration method for the interceptor - */ - void function Configure() - { - // check for required settings - if ( !propertyExists( "EmailNewExceptionsTo" ) ) - { - getPlugin( "logger" ).fatal( "hoth.extras.ColdBoxInterceptor.Configure", "The required 'EmailNewExceptionsTo' property has not been defined" ); - throw( - type="hoth.extras.ColdBoxInterceptor" - , message="The required 'EmailNewExceptionsTo' property has not been defined" - ); - } - - // Use ColdBox settings if not specified - if ( !propertyExists( "applicationName" ) ) - { - setProperty( "applicationName", getSetting( "AppName" ) & " (" & getSetting( "Environment" ) & ")" ); - } - if ( !propertyExists( "logPath" ) ) - { - setProperty( "logPath", getSetting( "ApplicationPath" ) & "logs/hoth" ); - setProperty( "logPathIsRelative", false ); - } - - // Optional settings - if ( !propertyExists( "cacheKeyName" ) ) - { - setProperty( "cacheKeyName", "hothtracker" ); - } - } - - /* INTERCEPTION POINTS - ------------------------------------------- */ - - void function afterAspectsLoad( required any event, required struct interceptData ) - { - var HothConfig = ""; - var HothTracker = ""; - var key = ""; - var properties = getProperties(); - - HothConfig = new hoth.config.HothConfig(); - - for ( key in properties ) - { - // use evaluate to dynamically called setters - if ( StructKeyExists( HothConfig, "set" & key ) ) - { - evaluate( "HothConfig.set#key#( properties[ key ] )" ); - } - } - - HothTracker = new Hoth.HothTracker( HothConfig ); - - // store in ColdBox Cache - getColdboxOCM().set( getProperty( 'cacheKeyName' ), HothTracker, 0 ); - - getPlugin( "logger" ).info( "hoth.extras.ColdBoxInterceptor", "HothTracker configured and loaded in ColdBox cache using key '#getProperty( 'cacheKeyName' )#'" ); - } - -} \ No newline at end of file diff --git a/v1/taffy/tests/lib/Hoth/logs/readme.txt b/v1/taffy/tests/lib/Hoth/logs/readme.txt deleted file mode 100644 index 488bac8..0000000 --- a/v1/taffy/tests/lib/Hoth/logs/readme.txt +++ /dev/null @@ -1,4 +0,0 @@ -This is the default location for Hoth logs. - -You should provide a better location in your Hoth Config object that -is unique to your application. diff --git a/v1/taffy/tests/lib/Hoth/object/CoreConfig.cfc b/v1/taffy/tests/lib/Hoth/object/CoreConfig.cfc deleted file mode 100644 index 789a5e2..0000000 --- a/v1/taffy/tests/lib/Hoth/object/CoreConfig.cfc +++ /dev/null @@ -1,74 +0,0 @@ -/** - Aaron Greenlee - http://aarongreenlee.com/ - - This work is licensed under a Creative Commons Attribution-Share-Alike 3.0 - Unported License. - - // Original Info ----------------------------------------------------------- - Author : Aaron Greenlee - Created : 10/01/2010 - - Core configuration object for Hoth. This object provides all the - functionality for a Hoth Config Object. Individual implementations should - extend this object and provide their own values within the property - declaration. - - // ------------------------------------------------------------------------- - Modified : 12/13/2010 10:04:06 AM by Aaron Greenlee. - - Added support for global settings. - -*/ -component -accessors='true' -{ - - /** Construct a configuration object for Hoth. */ - public function init () - { - local.md = getMetadata(this); - local.n = arrayLen(local.md.properties); - for (local.i=1; local.i <= local.n; local.i++) { - local.fn = this['set' & local.md.properties[local.i].name]; - local.fn(local.md.properties[local.i]['default']); - } - return this; - } - - public void function setGlobalDatabasePath(required string path) { - variables.GlobalDatabasePath = arguments.path; - } - public string function getGlobalDatabasePath() { - return (structKeyExists(variables, 'GlobalDatabasePath')) - ? variables.GlobalDatabasePath - : '/Hoth/db/'; - } - - /** Expands a path **/ - public string function getLogPathExpanded () - { - if (!structKeyExists(variables, 'logPathIsRelative')) { - variables.logPathIsRelative = false; - } - return variables.logPathIsRelative ? expandPath( getLogPath() ) : getLogPath(); - } - - /** Return a path for Hoth. */ - public string function getPath (name) - { - switch (arguments.name) { - // Sub-Directories - case 'incidents' : - case 'exceptions' : - return getLogPathExpanded() & '/' & lcase(arguments.name); - break; - - // Files - case 'exceptionIndex' : - case 'exceptionReport' : - case 'exceptionReportActivity' : - return getLogPathExpanded() & '/' & lcase(arguments.name) & '.log'; - break; - } - } -} \ No newline at end of file diff --git a/v1/taffy/tests/lib/Hoth/object/HothApplicationManager.cfc b/v1/taffy/tests/lib/Hoth/object/HothApplicationManager.cfc deleted file mode 100644 index b23f96e..0000000 --- a/v1/taffy/tests/lib/Hoth/object/HothApplicationManager.cfc +++ /dev/null @@ -1,118 +0,0 @@ -/** - Aaron Greenlee - http://aarongreenlee.com/ - - This work is licensed under a Creative Commons Attribution-Share-Alike 3.0 - Unported License. - - // Original Info ----------------------------------------------------------- - Author : Aaron Greenlee - Created : 12/13/2010 - - Responsible for helping Hoth report for multiple applications. -*/ -component -name = 'HothApplicationManager' -accessors = true -{ - property name='applications' type='array'; - - // The filename that holds application knowledge. - VARIABLES.APP_LOCK_KEY = 'HothApplicationDBFileLock'; - - /** Constructor. - * @HothConfig Requires a HothConfig Object. - */ - public Hoth.object.HothApplicationManager function init( - required HothConfig - ){ - - setApplications( loadApplicationsFromDisk(HothConfig) ); - - return this; - } - - /** To allow for easy reporting, Hoth needs to be able to track new - applications (or really, new log paths). When a new instance of - HothTracker is created, this method will be called. **/ - public boolean function learnApplication( - required HothConfig - ){ - // Prevent any other threads from saving our new application - lock - name=VARIABLES.APP_LOCK_KEY - timeout=arguments.HothConfig.getTimeToLock() - type="exclusive" - { - local.knownApplications = - loadApplicationsFromDisk(argumentCollection=arguments); - - for(local.index in local.knownApplications) - { - // Confirm our keys exist - if (structKeyExists(local.index, 'logPath')) - { - // If we find the same logPath, we know about this - // application and need to exit. - if (local.index.logPath == arguments.HothConfig.getLogPath()) - { - return false; - } - } - } - - // We did not find out application path within the file. - // Create the struct and append it to our array. - local.applicationDataToSave = - { - 'applicationName' = arguments.HothConfig.getApplicationName() - ,'logPath' = arguments.HothConfig.getLogPath() - ,'created' = now() - }; - arrayAppend( - local.knownApplications - ,local.applicationDataToSave - ); - - // Save the contents of the entire array, replacing the entire file - local.path = arguments.HothConfig.getGlobalDatabasePath(); - fileWrite( - expandPath(arguments.HothConfig.getGlobalDatabasePath() & 'applications.hoth') - ,serializeJSON(local.knownApplications) - ,'UTF-8' - ); - } - - return true; - } - - /** Loads applications already observed by Hoth from disk. - * This process should be locked by the calling method. - * @HothConfig Requires a HothConfig Object. */ - private array function loadApplicationsFromDisk ( - required HothConfig - ){ - local.path = arguments.HothConfig.getGlobalDatabasePath(); - local.appfile = expandPath(arguments.HothConfig.getGlobalDatabasePath() & 'applications.hoth'); - - // Return an empty array if the appFile does not exist. - if (!fileExists( local.appfile ) ) - { - return []; - } - - local.applicationsFound = fileRead( local.appfile ); - - // Delete the database if the file is invalid. - if (!isJSON(local.applicationsFound)) - { - fileDelete( local.appfile ); - return []; - } - - // Convert the file to our desired structure - local.parsedDB = deserializeJSON(local.applicationsFound); - - return local.parsedDB; - } -} \ No newline at end of file diff --git a/v1/taffy/tests/lib/Hoth/object/HothTime.cfc b/v1/taffy/tests/lib/Hoth/object/HothTime.cfc deleted file mode 100644 index 46541af..0000000 --- a/v1/taffy/tests/lib/Hoth/object/HothTime.cfc +++ /dev/null @@ -1,30 +0,0 @@ -component -{ - /** - * Returns the number of seconds since UTC January 1, 1970, 00:00:00 - * (Epoch time). - * - * @param DateTime Date/time object you want converted to - * Epoch time.(Required) - * - * @return Returns a numeric value. - * @author Rob Brooks-Bilson (rbils@amkor.com) - * @version 1, June 21, 2002 - */ - function GetEpochTimeFromLocal() { - local.datetime = 0; - - if ( arrayLen(arguments) == 0) - { - local.datetime = Now(); - } else { - local.datetime = arguments[1]; - } - - return - DateDiff( - "s" - ,DateConvert("utc2Local", "January 1 1970 00:00") - ,datetime); - } -} \ No newline at end of file diff --git a/v1/taffy/tests/lib/Hoth/object/iHothConfig.cfc b/v1/taffy/tests/lib/Hoth/object/iHothConfig.cfc deleted file mode 100644 index ac03e66..0000000 --- a/v1/taffy/tests/lib/Hoth/object/iHothConfig.cfc +++ /dev/null @@ -1,19 +0,0 @@ -/** - Aaron Greenlee - http://aarongreenlee.com/ - - This work is licensed under a Creative Commons Attribution-Share-Alike 3.0 - Unported License. - - // Original Info ----------------------------------------------------------- - Author : Aaron Greenlee - Created : 10/01/2010 - - Interface for a Hoth Config Object. - -*/ -interface { - public function init (); - public string function getLogPathExpanded(); - public string function getPath (name); -} \ No newline at end of file diff --git a/v1/taffy/tests/lib/bugLog/bugLogListener.cfc b/v1/taffy/tests/lib/bugLog/bugLogListener.cfc deleted file mode 100644 index 20165be..0000000 --- a/v1/taffy/tests/lib/bugLog/bugLogListener.cfc +++ /dev/null @@ -1,457 +0,0 @@ - - - - - - - - - - - - - - - - - - var cacheTTL = 300; // timeout in minutes for cache entries - - variables.oConfig = arguments.config; // global configuration - variables.instanceName = arguments.instanceName; - - logMessage("Starting BugLogListener (#instanceName#) service..."); - - // load settings - variables.maxLogSize = arguments.config.getSetting("service.maxLogSize"); - - // load DAO Factory - variables.oDAOFactory = createObject("component","bugLog.components.DAOFactory").init( variables.oConfig ); - - // load the finder objects - variables.oAppFinder = createObject("component","bugLog.components.appFinder").init( variables.oDAOFactory.getDAO("application") ); - variables.oHostFinder = createObject("component","bugLog.components.hostFinder").init( variables.oDAOFactory.getDAO("host") ); - variables.oSeverityFinder = createObject("component","bugLog.components.severityFinder").init( variables.oDAOFactory.getDAO("severity") ); - variables.oSourceFinder = createObject("component","bugLog.components.sourceFinder").init( variables.oDAOFactory.getDAO("source") ); - variables.oUserFinder = createObject("component","bugLog.components.userFinder").init( variables.oDAOFactory.getDAO("user") ); - - // load the rule processor - variables.oRuleProcessor = createObject("component","bugLog.components.ruleProcessor").init(); - - // create cache instances - variables.oAppCache = createObject("component","bugLog.components.lib.cache.cacheService").init(50, cacheTTL, false); - variables.oHostCache = createObject("component","bugLog.components.lib.cache.cacheService").init(50, cacheTTL, false); - variables.oSeverityCache = createObject("component","bugLog.components.lib.cache.cacheService").init(10, cacheTTL, false); - variables.oSourceCache = createObject("component","bugLog.components.lib.cache.cacheService").init(5, cacheTTL, false); - variables.oUserCache = createObject("component","bugLog.components.lib.cache.cacheService").init(50, cacheTTL, false); - - // load scheduler - variables.scheduler = createObject("component","bugLog.components.schedulerService").init( variables.oConfig, variables.instanceName ); - - // load the mailer service - variables.mailerService = createObject("component","bugLog.components.MailerService").init( variables.oConfig ); - - // load rules - loadRules(); - - // configure history purging - configureHistoryPurging(); - - // configure the digest sender - configureDigest(); - - // record the date at which the service started - variables.startedOn = Now(); - - logMessage("BugLogListener Service (#instanceName#) Started"); - - - - - - - - - - var bean = arguments.entryBean; - var oEntry = 0; - var oApp = 0; - var oHost = 0; - var oSeverity = 0; - var oSource = 0; - var oDF = variables.oDAOFactory; - - // get autocreate settings - var autoCreateApp = allowAutoCreate("application"); - var autoCreateHost = allowAutoCreate("host"); - var autoCreateSeverity = allowAutoCreate("severity"); - var autoCreateSource = allowAutoCreate("source"); - - // extract related objects from bean - oApp = getApplicationFromBean( bean, autoCreateApp ); - oHost = getHostFromBean( bean, autoCreateHost ); - oSeverity = getSeverityFromBean( bean, autoCreateSeverity ); - oSource = getSourceFromBean( bean, autoCreateSource ); - - // create entry - oEntry = createObject("component","bugLog.components.entry").init( oDF.getDAO("entry") ); - oEntry.setDateTime(bean.getdateTime()); - oEntry.setMessage(bean.getmessage()); - oEntry.setApplicationID(oApp.getApplicationID()); - oEntry.setSourceID(oSource.getSourceID()); - oEntry.setSeverityID(oSeverity.getSeverityID()); - oEntry.setHostID(oHost.getHostID()); - oEntry.setExceptionMessage(bean.getexceptionMessage()); - oEntry.setExceptionDetails(bean.getexceptionDetails()); - oEntry.setCFID(bean.getcfid()); - oEntry.setCFTOKEN(bean.getcftoken()); - oEntry.setUserAgent(bean.getuserAgent()); - oEntry.setTemplatePath(bean.gettemplate_Path()); - oEntry.setHTMLReport(bean.getHTMLReport()); - oEntry.setCreatedOn(bean.getReceivedOn()); - - // save entry - oEntry.save(); - - // process rules - variables.oRuleProcessor.processRules(bean, oEntry); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // validate API - if(getConfig().getSetting("service.requireAPIKey",false)) { - if(arguments.apiKey eq "") { - throw(message="Invalid API Key",type="bugLog.invalidAPIKey"); - } - var masterKey = getConfig().getSetting("service.APIKey"); - if(arguments.apiKey neq masterKey) { - var user = getUserByAPIKey(arguments.apiKey); - if(!user.getIsAdmin() and arrayLen(user.getAllowedApplications())) { - // key is good, but since the user is a non-admin - // we need to validate the user can post bugs to the requested - // application. - var app = getApplicationFromBean( entryBean, false ); - if(!user.isApplicationAllowed(app)) { - throw(message="Application not allowed",type="applicationNotAllowed"); - } - } - } - } - - // validate application - if(!allowAutoCreate("application")) { - getApplicationFromBean( entryBean, false ); - } - - // validate host - if(!allowAutoCreate("host")) { - getHostFromBean( entryBean, false ); - } - - // validte severity - if(!allowAutoCreate("severity")) { - getSeverityFromBean( entryBean, false ); - } - - // validate source - if(!allowAutoCreate("source")) { - getSourceFromBean( entryBean, false ); - } - - return true; - - - - - - - - - - - - - - - - - - var key = ""; - var bean = arguments.entryBean; - var oApp = 0; - var oDF = variables.oDAOFactory; - - key = bean.getApplicationCode(); - try { - // first we try to get it from the cache - oApp = variables.oAppCache.retrieve( key ); - - } catch(cacheService.itemNotFound e) { - // entry not in cache, so we get it from DB - try { - oApp = variables.oAppFinder.findByCode( key ); - - } catch(appFinderException.ApplicationCodeNotFound e) { - // code does not exist, so we need to create it (if autocreate enabled) - if(!arguments.createIfNeeded) throw(message="Invalid Application",type="invalidApplication"); - oApp = createObject("component","bugLog.components.app").init( oDF.getDAO("application") ); - oApp.setCode( key ); - oApp.setName( key ); - oApp.save(); - } - - // store entry in cache - variables.oAppCache.store( key, oApp ); - } - - - - - - - - - var key = ""; - var bean = arguments.entryBean; - var oHost = 0; - var oDF = variables.oDAOFactory; - - key = bean.getHostName(); - - try { - // first we try to get it from the cache - oHost = variables.oHostCache.retrieve( key ); - - } catch(cacheService.itemNotFound e) { - // entry not in cache, so we get it from DB - try { - oHost = variables.oHostFinder.findByName( key ); - - } catch(hostFinderException.HostNameNotFound e) { - // code does not exist, so we need to create it (if autocreate enabled) - if(!arguments.createIfNeeded) throw(message="Invalid Host",type="invalidHost"); - oHost = createObject("component","bugLog.components.host").init( oDF.getDAO("host") ); - oHost.setHostName(key); - oHost.save(); - } - - // store entry in cache - variables.oHostCache.store( key, oHost ); - } - - - - - - - - - var key = ""; - var bean = arguments.entryBean; - var oSeverity = 0; - var oDF = variables.oDAOFactory; - - key = bean.getSeverityCode(); - - try { - // first we try to get it from the cache - oSeverity = variables.oSeverityCache.retrieve( key ); - - } catch(cacheService.itemNotFound e) { - // entry not in cache, so we get it from DB - try { - oSeverity = variables.oSeverityFinder.findByCode( key ); - - } catch(severityFinderException.codeNotFound e) { - // code does not exist, so we need to create it (if autocreate enabled) - if(!arguments.createIfNeeded) throw(message="Invalid Severity",type="invalidSeverity"); - oSeverity = createObject("component","bugLog.components.severity").init( oDF.getDAO("severity") ); - oSeverity.setCode( key ); - oSeverity.setName( key ); - oSeverity.save(); - } - - // store entry in cache - variables.oSeverityCache.store( key, oSeverity ); - } - - - - - - - - var oUser = 0; - - try { - // first we try to get it from the cache - oUser = variables.oUserCache.retrieve( apiKey ); - - } catch(cacheService.itemNotFound e) { - // entry not in cache, so we get it from DB - try { - oUser = variables.oUserFinder.findByAPIKey( apiKey ); - - var qryUserApps = oDAOFactory.getDAO("userApplication").search(userID = oUser.getUserID()); - var apps = oAppFinder.findByIDList(valueList(qryUserApps.applicationID)); - oUser.setAllowedApplications(apps); - - } catch(sourceFinderException.usernameNotFound e) { - // code does not exist, so we need to create it (if autocreate enabled) - throw(message="Invalid API Key",type="bugLog.invalidAPIKey"); - } - - // store entry in cache - variables.oUserCache.store( key, oUser ); - } - - return oUser; - - - - - - - - var key = ""; - var bean = arguments.entryBean; - var oSource = 0; - var oDF = variables.oDAOFactory; - - key = bean.getSourceName(); - - try { - // first we try to get it from the cache - oSource = variables.oSourceCache.retrieve( key ); - - } catch(cacheService.itemNotFound e) { - // entry not in cache, so we get it from DB - try { - oSource = variables.oSourceFinder.findByName( key ); - - } catch(sourceFinderException.codeNotFound e) { - // code does not exist, so we need to create it (if autocreate enabled) - if(!arguments.createIfNeeded) throw(message="Invalid Source",type="invalidSource"); - oSource = createObject("component","bugLog.components.source").init( oDF.getDAO("source") ); - oSource.setName( key ); - oSource.save(); - } - - // store entry in cache - variables.oSourceCache.store( key, oSource ); - } - - - - - - - var oRule = 0; - var oExtensionsService = 0; - var aRules = arrayNew(1); - var i = 0; - var dao = 0; - var thisRule = 0; - - // clear all existing rules - variables.oRuleProcessor.flushRules(); - - // get the rule definitions from the extensions service - dao = variables.oDAOFactory.getDAO("extension"); - oExtensionsService = createObject("component","bugLog.components.extensionsService").init( dao ); - aRules = oExtensionsService.getRules(); - - // create rule objects and load them into the rule processor - for(i=1; i lte arrayLen(aRules);i=i+1) { - thisRule = aRules[i]; - - if(thisRule.enabled) { - oRule = - thisRule.instance - .setListener(this) - .setDAOFactory( variables.oDAOFactory ) - .setMailerService( variables.mailerService ); - - // add rule to processor - variables.oRuleProcessor.addRule(oRule); - } - } - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/v1/taffy/tests/lib/di1/ioc.cfc b/v1/taffy/tests/lib/di1/ioc.cfc deleted file mode 100644 index fbb145c..0000000 --- a/v1/taffy/tests/lib/di1/ioc.cfc +++ /dev/null @@ -1,874 +0,0 @@ -component { - variables._fw1_version = "3.5.0"; - variables._di1_version = "1.1.1"; -/* - Copyright (c) 2010-2015, Sean Corfield - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. -*/ - - // CONSTRUCTOR - - public any function init( any folders, struct config = { } ) { - variables.folderList = folders; - variables.folderArray = folders; - if ( isSimpleValue( folders ) ) { - variables.folderArray = listToArray( folders ); - } else { - variables.folderList = arrayToList( folders ); - } - var n = arrayLen( variables.folderArray ); - for ( var i = 1; i <= n; ++i ) { - variables.folderArray[ i ] = trim( variables.folderArray[ i ] ); - } - variables.config = config; - variables.beanInfo = { }; - variables.beanCache = { }; - variables.resolutionCache = { }; - variables.initMethodCache = { }; - variables.settersInfo = { }; - variables.autoExclude = [ - '/WEB-INF', '/Application.cfc', // never manage these! - '/Application.lc', '/Application.lucee', - // assume default name for intermediary: - '/MyApplication.cfc', - '/MyApplication.lc', '/MyApplication.lucee', - 'framework.cfc', 'ioc.cfc', // legacy FW/1 / DI/1 - // recent FW/1 + DI/1 + AOP/1 exclusions: - '/framework/aop.cfc', '/framework/beanProxy.cfc', - '/framework/ioc.cfc', '/framework/WireBoxAdapter.cfc', - '/framework/one.cfc', - // and Clojure-related exclusions: - '/framework/cfmljure.cfc', '/framework/cljcontroller.cfc', - '/framework/ioclj.cfc' - ]; - variables.listeners = 0; - setupFrameworkDefaults(); - if ( structKeyExists( variables.config, 'loadListener' ) ) { - this.onLoad( variables.config.loadListener ); - } - return this; - } - - // PUBLIC METHODS - - // programmatically register an alias - public any function addAlias( string aliasName, string beanName ) { - discoverBeans(); - variables.beanInfo[ aliasName ] = variables.beanInfo[ beanName ]; - return this; - } - - - // programmatically register new beans with the factory (add a singleton name/value pair) - public any function addBean( string beanName, any beanValue ) { - discoverBeans(); - variables.beanInfo[ beanName ] = { - name = beanName, value = beanValue, isSingleton = true - }; - return this; - } - - - // return true if the factory (or a parent factory) knows about the requested bean - public boolean function containsBean( string beanName ) { - discoverBeans(); - return structKeyExists( variables.beanInfo, beanName ) || - ( structKeyExists( variables, 'parent' ) && variables.parent.containsBean( beanName ) ); - } - - - // programmatically register new beans with the factory (add an actual CFC) - public any function declareBean( string beanName, string dottedPath, boolean isSingleton = true, struct overrides = { } ) { - discoverBeans(); - var singleDir = ''; - if ( listLen( dottedPath, '.' ) > 1 ) { - var cfc = listLast( dottedPath, '.' ); - var dottedPart = left( dottedPath, len( dottedPath ) - len( cfc ) - 1 ); - singleDir = singular( listLast( dottedPart, '.' ) ); - } - var basePath = replace( dottedPath, '.', '/', 'all' ); - var cfcPath = expandPath( '/' & basePath & '.cfc' ); - var expPath = cfcPath; - if ( !fileExists( expPath ) ) expPath = expandPath( '/' & basePath & '.lc' ); - if ( !fileExists( expPath ) ) expPath = expandPath( '/' & basePath & '.lucee' ); - if ( !fileExists( expPath ) ) throw "Unable to find source file for #dottedPath#: expands to #cfcPath#"; - var cfcPath = replace( expPath, chr(92), '/', 'all' ); - var metadata = { - name = beanName, qualifier = singleDir, isSingleton = isSingleton, - path = cfcPath, cfc = dottedPath, metadata = cleanMetadata( dottedPath ), - overrides = overrides - }; - variables.beanInfo[ beanName ] = metadata; - return this; - } - - public any function factoryBean( string beanName, any factory, string methodName, array args = [ ], struct overrides = { } ) { - discoverBeans(); - var metadata = { - name = beanName, isSingleton = false, // really? - factory = factory, method = methodName, args = args, - overrides = overrides - }; - variables.beanInfo[ beanName ] = metadata; - return this; - } - - - // return the requested bean, fully populated - public any function getBean( string beanName ) { - discoverBeans(); - if ( structKeyExists( variables.beanInfo, beanName ) ) { - return resolveBean( beanName ); - } else if ( structKeyExists( variables, 'parent' ) ) { - return variables.parent.getBean( beanName ); - } else { - throw 'bean not found: #beanName#'; - } - } - - // convenience API for metaprogramming perhaps? - public any function getBeanInfo( string beanName = '', boolean flatten = false, - string regex = '' ) { - discoverBeans(); - if ( len( beanName ) ) { - // ask about a specific bean: - if ( structKeyExists( variables.beanInfo, beanName ) ) { - return variables.beanInfo[ beanName ]; - } - if ( structKeyExists( variables, 'parent' ) ) { - return parentBeanInfo( beanName ); - } - throw 'bean not found: #beanName#'; - } else { - var result = { beanInfo = { } }; - if ( structKeyExists( variables, 'parent' ) ) { - if ( flatten || len( regex ) ) { - structAppend( result.beanInfo, parentBeanInfoList( flatten ).beanInfo ); - structAppend( result.beanInfo, variables.beanInfo ); - } else { - result.beanInfo = variables.beanInfo; - result.parent = parentBeanInfoList( flatten ); - }; - } else { - result.beanInfo = variables.beanInfo; - } - if ( len( regex ) ) { - var matched = { }; - for ( var name in result.beanInfo ) { - if ( REFind( regex, name ) ) { - matched[ name ] = result.beanInfo[ name ]; - } - } - result.beanInfo = matched; - } - return result; - } - } - - - // return a copy of the DI/1 configuration - public struct function getConfig() { - // note: we only make a shallow copy - return structCopy( variables.config ); - } - - - // return the DI/1 version - public string function getVersion() { - return variables.config.version; - } - - - // return true iff bean is known to be a singleton - public boolean function isSingleton( string beanName ) { - discoverBeans(); - if ( structKeyExists( variables.beanInfo, beanName ) ) { - return variables.beanInfo[ beanName ].isSingleton; - } else if ( structKeyExists( variables, 'parent' ) ) { - try { - return variables.parent.isSingleton( beanName ); - } catch ( any e ) { - return false; // parent doesn't know the bean therefore is it not singleton - } - } else { - return false; // we don't know the bean therefore it is not a managed singleton - } - } - - - // given a bean (by name, by type or by value), call the named - // setters with the specified property values - public any function injectProperties( any bean, struct properties ) { - if ( isSimpleValue( bean ) ) { - if ( containsBean( bean ) ) bean = getBean( bean ); - else bean = construct( bean ); - } - for ( var property in properties ) { - if ( !isNull( properties[ property ] ) ) { - var args = { }; - args[ property ] = properties[ property ]; - evaluate( 'bean.set#property#( argumentCollection = args )' ); - } - } - return bean; - } - - - // empty the cache and reload all the singleton beans - // note: this does not reload the parent - if you have parent/child factories you - // are responsible for dealing with that logic (it's safe to reload a child but - // if you reload the parent, you must reload *all* child factories to ensure - // things stay consistent!) - public any function load() { - discoverBeans(); - variables.beanCache = { }; - variables.resolutionCache = { }; - variables.initMethodCache = { }; - for ( var key in variables.beanInfo ) { - if ( !structKeyExists( variables.beanInfo[ key ], "isSingleton" ) ) - throw "internal error: bean #key# has no isSingleton flag!"; - if ( variables.beanInfo[ key ].isSingleton ) { - getBean( key ); - } - } - return this; - } - - - // add a listener for processing after a (re)load of the factory - // called with just the factory, should be a plain function - public any function onLoad( any listener ) { - var head = { next = variables.listeners, listener = listener }; - variables.listeners = head; - return this; - } - - - // set the parent bean factory - public any function setParent( any parent ) { - variables.parent = parent; - return this; - } - - // PRIVATE METHODS - - private boolean function beanIsTransient( string singleDir, string dir, string beanName ) { - return singleDir == 'bean' || - structKeyExists( variables.transients, dir ) || - ( structKeyExists( variables.config, "singletonPattern" ) && - refindNoCase( variables.config.singletonPattern, beanName ) == 0 ) || - ( structKeyExists( variables.config, "transientPattern" ) && - refindNoCase( variables.config.transientPattern, beanName ) > 0 ); - } - - - private any function cachable( string beanName) { - var newObject = false; - var info = variables.beanInfo[ beanName ]; - if ( info.isSingleton ) { - // cache on the qualified bean name: - var qualifiedName = beanName; - if ( structKeyExists( info, 'name' ) && structKeyExists( info, 'qualifier' ) ) { - qualifiedName = info.name & info.qualifier; - } - if ( !structKeyExists( variables.beanCache, qualifiedName ) ) { - variables.beanCache[ qualifiedName ] = construct( info.cfc ); - newObject = true; - } - return { bean = variables.beanCache[ qualifiedName ], newObject = newObject }; - } else { - return { bean = construct( info.cfc ), newObject = true }; - } - } - - - private struct function cleanMetadata( string cfc ) { - var baseMetadata = metadata( cfc ); - var iocMeta = { setters = { }, pruned = false, type = baseMetadata.type }; - var md = { extends = baseMetadata }; - do { - md = md.extends; - // gather up setters based on metadata: - var implicitSetters = false; - // we have implicit setters if: accessors="true" or persistent="true" - if ( structKeyExists( md, 'persistent' ) && isBoolean( md.persistent ) ) { - implicitSetters = md.persistent; - } - if ( structKeyExists( md, 'accessors' ) && isBoolean( md.accessors ) ) { - implicitSetters = implicitSetters || md.accessors; - } - if ( structKeyExists( md, 'properties' ) ) { - // due to a bug in ACF9.0.1, we cannot use var property in md.properties, - // instead we must use an explicit loop index... ugh! - var n = arrayLen( md.properties ); - for ( var i = 1; i <= n; ++i ) { - var property = md.properties[ i ]; - if ( implicitSetters && - ( !structKeyExists( property, 'setter' ) || - isBoolean( property.setter ) && property.setter ) ) { - if ( structKeyExists( property, 'type' ) && - property.type != 'any' ) { - iocMeta.setters[ property.name ] = 'typed'; - } else { - iocMeta.setters[ property.name ] = 'implicit'; - } - } - } - } - // still looking for a constructor? - if ( !structKeyExists( iocMeta, 'constructor' ) ) { - if ( structKeyExists( md, 'functions' ) ) { - // due to a bug in ACF9.0.1, we cannot use var property in md.functions, - // instead we must use an explicit loop index... ugh! - var n = arrayLen( md.functions ); - for ( var i = 1; i <= n; ++i ) { - var func = md.functions[ i ]; - if ( func.name == 'init' ) { - iocMeta.constructor = { }; - if ( structKeyExists( func, 'parameters' ) ) { - // due to a bug in ACF9.0.1, we cannot use var arg in func.parameters, - // instead we must use an explicit loop index... ugh! - var m = arrayLen( func.parameters ); - for ( var j = 1; j <= m; ++j ) { - var arg = func.parameters[ j ]; - iocMeta.constructor[ arg.name ] = structKeyExists( arg, 'required' ) ? arg.required : false; - } - } - } - } - } - } - } while ( structKeyExists( md, 'extends' ) ); - return iocMeta; - } - - - // in case an extension point wants to override actual construction: - private any function construct( string dottedPath ) { - return createObject( 'component', dottedPath ); - } - - - // in case an extension point wants to override actual metadata retrieval: - private any function metadata( string dottedPath ) { - try { - return getComponentMetadata( dottedPath ); - } catch ( any e ) { - var except = "Unable to getComponentMetadata(#dottedPath#) because: " & - e.message & ( len( e.detail ) ? " (#e.detail#)" : "" ); - throw except; - } - } - - - private string function deduceDottedPath( string baseMapping, string basePath ) { - if ( right( basePath, 1 ) == '/' && len( basePath ) > 1 ) { - basePath = left( basePath, len( basePath ) - 1 ); - } - var cfcPath = left( baseMapping, 1 ) == '/' ? - ( len( baseMapping ) > 1 ? right( baseMapping, len( baseMapping ) - 1 ) : '' ) : - getFileFromPath( baseMapping ); - if ( right( cfcPath, 1 ) == '/' && len( cfcPath ) > 1 ) { - cfcPath = left( cfcPath, len( cfcPath ) - 1 ); - } - var expPath = basePath; - var notFound = true; - var dotted = ''; - do { - var mapped = cfcPath; - if ( len( mapped ) && left( mapped, 1 ) != '.' ) mapped = '/' & mapped; - var mappedPath = replace( expandpath( mapped ), chr(92), '/', 'all' ); - if ( mappedPath == basePath ) { - dotted = replace( cfcPath, '/', '.', 'all' ); - notFound = false; - break; - } - var prevPath = expPath; - expPath = replace( getDirectoryFromPath( expPath ), chr(92), '/', 'all' ); - if ( right( expPath, 1 ) == '/' && len( expPath ) > 1 ) { - expPath = left( expPath, len( expPath ) - 1 ); - } - var progress = prevPath != expPath; - var piece = listLast( expPath, '/' ); - cfcPath = piece & '/' & cfcPath; - } while ( progress ); - if ( notFound ) { - throw 'unable to deduce dot-relative path for: #baseMapping# (#basePath#) root #expandPath("/")#'; - } - return dotted; - } - - - private void function discoverBeans() { - if ( structKeyExists( variables, 'discoveryComplete' ) ) return; - lock name="#application.applicationName#_ioc1_#variables.folderList#" type="exclusive" timeout="30" { - if ( structKeyExists( variables, 'discoveryComplete' ) ) return; - variables.pathMapCache = { }; - for ( var f in variables.folderArray ) { - discoverBeansInFolder( replace( f, chr(92), '/', 'all' ) ); - } - variables.discoveryComplete = true; - } - onLoadEvent(); - } - - - private void function discoverBeansInFolder( string mapping ) { - var folder = replace( expandPath( mapping ), chr(92), '/', 'all' ); - var dotted = deduceDottedPath( mapping, folder ); - var cfcs = [ ]; - try { - cfcs = directoryList( folder, variables.config.recurse, 'path', '*.cfc' ); - var lcs = directoryList( folder, variables.config.recurse, 'path', '*.lc' ); - for ( var l in lcs ) arrayAppend( cfcs, l ); - lcs = directoryList( folder, variables.config.recurse, 'path', '*.lucee' ); - for ( l in lcs ) arrayAppend( cfcs, l ); - } catch ( any e ) { - // assume bad path - ignore it, cfcs is empty list - } - for ( var cfcOSPath in cfcs ) { - var cfcPath = replace( cfcOSPath, chr(92), '/', 'all' ); - // watch out for excluded paths: - var excludePath = false; - for ( var pattern in variables.config.exclude ) { - if ( findNoCase( pattern, cfcPath ) ) { - excludePath = true; - break; - } - } - if ( excludePath ) continue; - var relPath = right( cfcPath, len( cfcPath ) - len( folder ) ); - var extN = 1 + len( listLast( cfcPath, "." ) ); - relPath = left( relPath, len( relPath ) - extN ); - var dir = listLast( getDirectoryFromPath( cfcPath ), '/' ); - var singleDir = singular( dir ); - var beanName = listLast( relPath, '/' ); - var dottedPath = dotted & replace( relPath, '/', '.', 'all' ); - try { - var metadata = { - name = beanName, qualifier = singleDir, isSingleton = !beanIsTransient( singleDir, dir, beanName ), - path = cfcPath, cfc = dottedPath, metadata = cleanMetadata( dottedPath ) - }; - if ( structKeyExists( metadata.metadata, "type" ) && metadata.metadata.type == "interface" ) { - continue; - } - if ( structKeyExists( variables.beanInfo, beanName ) ) { - if ( variables.config.omitDirectoryAliases ) { - throw '#beanName# is not unique (and omitDirectoryAliases is true)'; - } - structDelete( variables.beanInfo, beanName ); - variables.beanInfo[ beanName & singleDir ] = metadata; - } else { - variables.beanInfo[ beanName ] = metadata; - if ( !variables.config.omitDirectoryAliases ) { - variables.beanInfo[ beanName & singleDir ] = metadata; - } - } - } catch ( any e ) { - // wrap the exception so we can add bean name for debugging - // this trades off any stack trace information for the bean name but - // since we are only trying to get metadata, the latter should be - // more useful than the former - var except = "Problem with metadata for #beanName# (#dottedPath#) because: " & - e.message & ( len( e.detail ) ? " (#e.detail#)" : "" ); - } - } - } - - - private struct function findSetters( any cfc, struct iocMeta ) { - var liveMeta = { setters = iocMeta.setters }; - if ( !iocMeta.pruned ) { - // need to prune known setters of transients: - var prunable = { }; - for ( var known in iocMeta.setters ) { - if ( !isSingleton( known ) ) { - prunable[ known ] = true; - } - } - for ( known in prunable ) { - structDelete( iocMeta.setters, known ); - } - iocMeta.pruned = true; - } - // gather up explicit setters: - for ( var member in cfc ) { - var method = cfc[ member ]; - var n = len( member ); - if ( isCustomFunction( method ) && left( member, 3 ) == 'set' && n > 3 ) { - var property = right( member, n - 3 ); - if ( !isSingleton( property ) ) { - // ignore properties that we know to be transients... - continue; - } - if ( !structKeyExists( liveMeta.setters, property ) ) { - liveMeta.setters[ property ] = 'explicit'; - } - } - } - return liveMeta; - } - - - private any function forceCache( any bean, string beanName) { - var info = variables.beanInfo[ beanName ]; - if ( info.isSingleton ) { - // cache on the qualified bean name: - var qualifiedName = beanName; - if ( structKeyExists( info, 'name' ) && structKeyExists( info, 'qualifier' ) ) { - qualifiedName = info.name & info.qualifier; - } - variables.beanCache[ qualifiedName ] = bean; - } - } - - - private boolean function isConstant ( string beanName ) { - return structKeyExists( variables.beanInfo, beanName ) && - structKeyExists( variables.beanInfo[ beanName ], 'value' ); - } - - - private void function logMissingBean( string beanName, string resolvingBeanName = '' ) { - var sys = createObject( 'java', 'java.lang.System' ); - if ( len( resolvingBeanName ) ) { - sys.out.println( 'bean not found: #beanName#; while resolving #resolvingBeanName#' ); - } else { - sys.out.println( 'bean not found: #beanName#' ); - } - } - - - private void function missingBean( string beanName, string resolvingBeanName = '' ) { - if ( variables.config.strict ) { - if ( len( resolvingBeanName ) ) { - throw 'bean not found: #beanName#; while resolving #resolvingBeanName#'; - } else { - throw 'bean not found: #beanName#'; - } - } else { - logMissingBean( beanName, resolvingBeanName ); - } - } - - - private void function onLoadEvent() { - var head = variables.listeners; - while ( isStruct( head ) ) { - if ( isCustomFunction( head.listener ) || - ( listFirst( server.coldfusion.productVersion ) >= 10 && - isClosure( head.listener ) ) ) { - head.listener( this ); - } else if ( isObject( head.listener ) ) { - head.listener.onLoad( this ); - } else if ( isSimpleValue( head.listener ) && - containsBean( head.listener ) ) { - getBean( head.listener ).onLoad( this ); - } else { - throw "invalid onLoad listener registered: #head.listener.toString()#"; - } - head = head.next; - } - } - - - private any function parentBeanInfo( string beanName ) { - // intended to be adaptable to whatever the parent is: - if ( structKeyExists( variables.parent, 'getBeanInfo' ) ) { - // smells like DI/1 or compatible: - return variables.parent.getBeanInfo( beanName ); - } - if ( structKeyExists( variables.parent, 'getBeanDefinition' ) ) { - // smells like ColdSpring or compatible: - return variables.parent.getBeanDefinition( beanName ); - } - // unknown: - return { }; - } - - - private any function parentBeanInfoList( boolean flatten ) { - // intended to be adaptable to whatever the parent is: - if ( structKeyExists( variables.parent, 'getBeanInfo' ) ) { - // smells like DI/1 or compatible: - return variables.parent.getBeanInfo( flatten = flatten ); - } - if ( structKeyExists( variables.parent, 'getBeanDefinitionList' ) ) { - // smells like ColdSpring or compatible: - return variables.parent.getBeanDefinitionList(); - } - // unknown - return { }; - } - - - private any function resolveBean( string beanName ) { - // do enough resolution to create and initialization this bean - // returns a struct of the bean and a struct of beans and setters still to run - // construction phase: - var partialBean = resolveBeanCreate( beanName, { injection = { }, dependencies = { } } ); - if ( structKeyExists( variables.resolutionCache, beanName ) && - variables.resolutionCache[ beanName ] ) { - // fully resolved, no action needed this time - } else { - var checkForPostInjection = structKeyExists( variables.config, 'initMethod' ); - var initMethod = checkForPostInjection ? variables.config.initMethod : ''; - var postInjectables = { }; - // injection phase: - // now perform all of the injection: - for ( var name in partialBean.injection ) { - var injection = partialBean.injection[ name ]; - if ( checkForPostInjection && !isConstant( name ) && structKeyExists( injection.bean, initMethod ) ) { - postInjectables[ name ] = true; - } - for ( var property in injection.setters ) { - if ( injection.setters[ property ] == 'typed' && - variables.config.omitTypedProperties ) { - // we do not inject typed properties! - continue; - } - var args = { }; - if ( structKeyExists( injection.overrides, property ) ) { - args[ property ] = injection.overrides[ property ]; - } else if ( structKeyExists( partialBean.injection, property ) ) { - args[ property ] = partialBean.injection[ property ].bean; - } else if ( structKeyExists( variables, 'parent' ) && variables.parent.containsBean( property ) ) { - args[ property ] = variables.parent.getBean( property ); - } else { - missingBean( property, beanName ); - continue; - } - evaluate( 'injection.bean.set#property#( argumentCollection = args )' ); - } - } - // post-injection, pre-init-method phase: - for ( name in partialBean.injection ) { - injection = partialBean.injection[ name ]; - setupInitMethod( name, injection.bean ); - } - // see if anything needs post-injection, init-method calls: - for ( var postName in postInjectables ) { - callInitMethod( postName, postInjectables, partialBean, initMethod ); - } - variables.resolutionCache[ beanName ] = isSingleton( beanName ); - } - return partialBean.bean; - } - - - private void function callInitMethod( string name, struct injectables, struct info, string method ) { - - if ( injectables[ name ] ) { - injectables[ name ] = false; // this ensures we don't try to init the same - // bean twice - and also breaks circular dependencies... - if ( structKeyExists( info.dependencies, name ) ) { - for ( var depName in info.dependencies[ name ] ) { - if ( structKeyExists( injectables, depName ) && - injectables[ depName ] ) { - callInitMethod( depName, injectables, info, method ); - } - } - } - if ( structKeyExists( variables.initMethodCache, name ) && - variables.initMethodCache[ name ] ) { - } else { - variables.initMethodCache[ name ] = isSingleton( name ); - var bean = info.injection[ name ].bean; - evaluate( 'bean.#method#()' ); - } - } - } - - - private struct function resolveBeanCreate( string beanName, struct accumulator ) { - var bean = 0; - if ( structKeyExists( variables.beanInfo, beanName ) ) { - var info = variables.beanInfo[ beanName ]; - accumulator.dependencies[ beanName ] = { }; - if ( structKeyExists( info, 'cfc' ) ) { -/*******************************************************/ - var metaBean = cachable( beanName ); - var overrides = structKeyExists( info, 'overrides' ) ? info.overrides : { }; - bean = metaBean.bean; - if ( metaBean.newObject ) { - if ( structKeyExists( info.metadata, 'constructor' ) ) { - var args = { }; - for ( var arg in info.metadata.constructor ) { - accumulator.dependencies[ beanName ][ arg ] = true; - var argBean = { }; - // handle known required arguments - if ( info.metadata.constructor[ arg ] ) { - var beanMissing = true; - if ( structKeyExists( overrides, arg ) ) { - args[ arg ] = overrides[ arg ]; - beanMissing = false; - } else if ( containsBean( arg ) ) { - argBean = resolveBeanCreate( arg, accumulator ); - if ( structKeyExists( argBean, 'bean' ) ) { - args[ arg ] = argBean.bean; - beanMissing = false; - } - } - if ( beanMissing ) { - throw 'bean not found: #arg#; while resolving constructor arguments for #beanName#'; - } - } else { - if ( structKeyExists( overrides, arg ) ) { - args[ arg ] = overrides[ arg ]; - } else if ( containsBean( arg ) ) { - // optional but present - argBean = resolveBeanCreate( arg, accumulator ); - if ( structKeyExists( argBean, 'bean' ) ) { - args[ arg ] = argBean.bean; - } - } else { - // optional but not present - } - } - } - var __ioc_newBean = evaluate( 'bean.init( argumentCollection = args )' ); - // if the constructor returns anything, it becomes the bean - // this allows for smart constructors that return things other - // than the CFC being created, such as implicit factory beans - // and automatic singletons etc (rare practices in CFML but...) - if ( !isNull( __ioc_newBean ) ) { - bean = __ioc_newBean; - forceCache( bean, beanName ); - } - } - } -/*******************************************************/ - if ( !structKeyExists( accumulator.injection, beanName ) ) { - if ( !structKeyExists( variables.settersInfo, beanName ) ) { - variables.settersInfo[ beanName ] = findSetters( bean, info.metadata ); - } - var setterMeta = { - setters = variables.settersInfo[ beanName ].setters, - bean = bean, - overrides = overrides - }; - accumulator.injection[ beanName ] = setterMeta; - for ( var property in setterMeta.setters ) { - accumulator.dependencies[ beanName ][ property ] = true; - if ( structKeyExists( overrides, property ) ) { - // skip resolution because we'll inject override - } else { - resolveBeanCreate( property, accumulator ); - } - } - } - accumulator.bean = bean; - } else if ( isConstant( beanName ) ) { - accumulator.bean = info.value; - accumulator.injection[ beanName ] = { bean = info.value, setters = { } }; - } else if ( structKeyExists( info, 'factory' ) ) { - var fmBean = isSimpleValue( info.factory ) ? this.getBean( info.factory ) : info.factory; - var nArgs = arrayLen( info.args ); - var argStruct = { }; - for ( var i = 1; i <= nArgs; ++i ) { - var argName = info.args[ i ]; - if ( structKeyExists( info.overrides, argName ) ) { - argStruct[ i ] = info.overrides[ argName ]; - } else { - argStruct[ i ] = this.getBean( argName ); - } - } - accumulator.bean = evaluate( 'fmBean.#info.method#(argumentCollection=argStruct)' ); - accumulator.injection[ beanName ] = { bean = accumulator.bean, setters = { } }; - } else { - throw 'internal error: invalid metadata for #beanName#'; - } - } else if ( structKeyExists( variables, 'parent' ) && variables.parent.containsBean( beanName ) ) { - bean = variables.parent.getBean( beanName ); - accumulator.injection[ beanName ] = { bean = bean, setters = { } }; - accumulator.bean = bean; - } else { - missingBean( beanName ); - } - return accumulator; - } - - - private void function setupFrameworkDefaults() { - param name = "variables.config.recurse" default = true; - param name = "variables.config.strict" default = false; - - if ( !structKeyExists( variables.config, 'exclude' ) ) { - variables.config.exclude = [ ]; - } - for ( var elem in variables.autoExclude ) { - arrayAppend( variables.config.exclude, replace( elem, chr(92), '/', 'all' ) ); - } - - // install bean factory constant: - variables.beanInfo.beanFactory = { value = this, isSingleton = true }; - if ( structKeyExists( variables.config, 'constants' ) ) { - for ( var beanName in variables.config.constants ) { - variables.beanInfo[ beanName ] = { value = variables.config.constants[ beanName ], isSingleton = true }; - } - } - - variables.transients = { }; - if ( structKeyExists( variables.config, 'transients' ) ) { - for ( var transientFolder in variables.config.transients ) { - variables.transients[ transientFolder ] = true; - } - } - - if ( structKeyExists( variables.config, 'singletonPattern' ) && - structKeyExists( variables.config, 'transientPattern' ) ) { - throw 'singletonPattern and transientPattern are mutually exclusive'; - } - - if ( !structKeyExists( variables.config, 'omitTypedProperties' ) ) { - variables.config.omitTypedProperties = false; - } - if ( !structKeyExists( variables.config, 'omitDirectoryAliases' ) ) { - variables.config.omitDirectoryAliases = false; - } - if ( !structKeyExists( variables.config, 'singulars' ) ) { - variables.config.singulars = { }; - } - if ( !structKeyExists( variables.config, 'liberal' ) ) { - variables.config.liberal = false; - } - - variables.config.version = variables._di1_version; - } - - - // hook for extension points to process beans after they have been - // constructed and injected, but before init-method is called on anything - private void function setupInitMethod( string name, any bean ) { - } - - - private string function singular( string plural ) { - if ( structKeyExists( variables.config.singulars, plural ) ) { - return variables.config.singulars[ plural ]; - } - var single = plural; - var n = len( plural ); - var last = right( plural, 1 ); - if ( last == 's' ) { - if ( variables.config.liberal && n > 3 && right( plural, 3 ) == 'ies' ) { - single = left( plural, n - 3 ) & 'y'; - } else { - single = left( plural, n - 1 ); - } - } - return single; - } - -} diff --git a/v1/taffy/tests/resources/BasicAuth.cfc b/v1/taffy/tests/resources/BasicAuth.cfc deleted file mode 100644 index d1e5ea4..0000000 --- a/v1/taffy/tests/resources/BasicAuth.cfc +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - \ No newline at end of file diff --git a/v1/taffy/tests/resources/ConflictingURI.cfc b/v1/taffy/tests/resources/ConflictingURI.cfc deleted file mode 100644 index 7deeec0..0000000 --- a/v1/taffy/tests/resources/ConflictingURI.cfc +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/v1/taffy/tests/resources/EchoMember.cfc b/v1/taffy/tests/resources/EchoMember.cfc deleted file mode 100644 index f689161..0000000 --- a/v1/taffy/tests/resources/EchoMember.cfc +++ /dev/null @@ -1,27 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/v1/taffy/tests/resources/EchoMethodTunnelMember.cfc b/v1/taffy/tests/resources/EchoMethodTunnelMember.cfc deleted file mode 100644 index 01ff99e..0000000 --- a/v1/taffy/tests/resources/EchoMethodTunnelMember.cfc +++ /dev/null @@ -1,38 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/v1/taffy/tests/resources/EchoRegexMember.cfc b/v1/taffy/tests/resources/EchoRegexMember.cfc deleted file mode 100644 index 88b619b..0000000 --- a/v1/taffy/tests/resources/EchoRegexMember.cfc +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/v1/taffy/tests/resources/EchoURIAlias.cfc b/v1/taffy/tests/resources/EchoURIAlias.cfc deleted file mode 100644 index 2bfb6bb..0000000 --- a/v1/taffy/tests/resources/EchoURIAlias.cfc +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - diff --git a/v1/taffy/tests/resources/MockMultiTokenResource.cfc b/v1/taffy/tests/resources/MockMultiTokenResource.cfc new file mode 100644 index 0000000..23cf909 --- /dev/null +++ b/v1/taffy/tests/resources/MockMultiTokenResource.cfc @@ -0,0 +1,14 @@ +component extends="core.resource" taffy:uri="/users/{userId}/orders/{orderId}" { + + /** + * GET /users/{userId}/orders/{orderId} - Returns order for a user + */ + function get(required string userId, required string orderId) { + return rep({ + userId: arguments.userId, + orderId: arguments.orderId, + method: "GET" + }); + } + +} diff --git a/v1/taffy/tests/resources/MockSimpleResource.cfc b/v1/taffy/tests/resources/MockSimpleResource.cfc new file mode 100644 index 0000000..c5fe290 --- /dev/null +++ b/v1/taffy/tests/resources/MockSimpleResource.cfc @@ -0,0 +1,18 @@ +component extends="core.resource" taffy:uri="/simple" { + + /** + * GET /simple - Returns a simple response + */ + function get() { + return rep({ message: "Hello from simple resource", method: "GET" }); + } + + /** + * POST /simple - Creates something + */ + function post(string name = "") { + return rep({ message: "Created", name: arguments.name, method: "POST" }) + .withStatus(201, "Created"); + } + +} diff --git a/v1/taffy/tests/resources/MockTokenResource.cfc b/v1/taffy/tests/resources/MockTokenResource.cfc new file mode 100644 index 0000000..70b053e --- /dev/null +++ b/v1/taffy/tests/resources/MockTokenResource.cfc @@ -0,0 +1,24 @@ +component extends="core.resource" taffy:uri="/items/{id}" { + + /** + * GET /items/{id} - Returns an item by ID + */ + function get(required string id) { + return rep({ id: arguments.id, name: "Item #arguments.id#", method: "GET" }); + } + + /** + * PUT /items/{id} - Updates an item + */ + function put(required string id, string name = "") { + return rep({ id: arguments.id, name: arguments.name, updated: true, method: "PUT" }); + } + + /** + * DELETE /items/{id} - Deletes an item + */ + function delete(required string id) { + return rep({ id: arguments.id, deleted: true, method: "DELETE" }); + } + +} diff --git a/v1/taffy/tests/resources/MockVerbOverrideResource.cfc b/v1/taffy/tests/resources/MockVerbOverrideResource.cfc new file mode 100644 index 0000000..659d252 --- /dev/null +++ b/v1/taffy/tests/resources/MockVerbOverrideResource.cfc @@ -0,0 +1,24 @@ +component extends="core.resource" taffy:uri="/custom" { + + /** + * Standard GET method + */ + function get() { + return rep({ message: "Standard GET", method: "GET" }); + } + + /** + * Custom PATCH method using taffy_verb metadata + */ + function updatePartial() taffy_verb="PATCH" { + return rep({ message: "Custom PATCH handler", method: "PATCH" }); + } + + /** + * Custom OPTIONS method using taffy_verb metadata (underscore style) + */ + function handleOptions() taffy_verb="OPTIONS" { + return rep({ message: "Custom OPTIONS handler", method: "OPTIONS" }); + } + +} diff --git a/v1/taffy/tests/resources/acceptFileUpload.cfc b/v1/taffy/tests/resources/acceptFileUpload.cfc deleted file mode 100644 index 55d59f8..0000000 --- a/v1/taffy/tests/resources/acceptFileUpload.cfc +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/v1/taffy/tests/resources/customJsonSerializer.cfc b/v1/taffy/tests/resources/customJsonSerializer.cfc deleted file mode 100644 index 3a0a676..0000000 --- a/v1/taffy/tests/resources/customJsonSerializer.cfc +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/v1/taffy/tests/resources/dependency1.cfc b/v1/taffy/tests/resources/dependency1.cfc deleted file mode 100644 index db88a17..0000000 --- a/v1/taffy/tests/resources/dependency1.cfc +++ /dev/null @@ -1 +0,0 @@ - diff --git a/v1/taffy/tests/resources/dependency2.cfc b/v1/taffy/tests/resources/dependency2.cfc deleted file mode 100644 index db88a17..0000000 --- a/v1/taffy/tests/resources/dependency2.cfc +++ /dev/null @@ -1 +0,0 @@ - diff --git a/v1/taffy/tests/resources/exceptionMember.cfc b/v1/taffy/tests/resources/exceptionMember.cfc deleted file mode 100644 index f0f8ddf..0000000 --- a/v1/taffy/tests/resources/exceptionMember.cfc +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/v1/taffy/tests/resources/uriAliasDoesntBeginWithForwardSlash.cfc b/v1/taffy/tests/resources/uriAliasDoesntBeginWithForwardSlash.cfc deleted file mode 100644 index 79851bb..0000000 --- a/v1/taffy/tests/resources/uriAliasDoesntBeginWithForwardSlash.cfc +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/v1/taffy/tests/resources/uriConflict.cfc b/v1/taffy/tests/resources/uriConflict.cfc deleted file mode 100644 index 5a073e7..0000000 --- a/v1/taffy/tests/resources/uriConflict.cfc +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/v1/taffy/tests/resources/uriDoesntBeginWithForwardSlash.cfc b/v1/taffy/tests/resources/uriDoesntBeginWithForwardSlash.cfc deleted file mode 100644 index 16e785e..0000000 --- a/v1/taffy/tests/resources/uriDoesntBeginWithForwardSlash.cfc +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - \ No newline at end of file diff --git a/v1/taffy/tests/resourcesError/ErrorMember.cfc b/v1/taffy/tests/resourcesError/ErrorMember.cfc deleted file mode 100644 index 6fb5259..0000000 --- a/v1/taffy/tests/resourcesError/ErrorMember.cfc +++ /dev/null @@ -1,5 +0,0 @@ - - - - - \ No newline at end of file diff --git a/v1/taffy/tests/runner.cfm b/v1/taffy/tests/runner.cfm new file mode 100644 index 0000000..2ada9cf --- /dev/null +++ b/v1/taffy/tests/runner.cfm @@ -0,0 +1,23 @@ + +/** + * TestBox Runner for Taffy Framework Tests + * + * Run this file via browser or use CommandBox: + * box testbox run + */ + +// Create TestBox instance +testBox = new testbox.system.TestBox(); + +// Run all specs in the specs directory +results = testBox.run( + directory = { + recurse: true, + mapping: "tests.specs" + }, + reporter = url.reporter ?: "simple" +); + +// Output the results +writeOutput(results); + diff --git a/v1/taffy/tests/someFolder/someOtherFile.cfm b/v1/taffy/tests/someFolder/someOtherFile.cfm deleted file mode 100644 index cb465d8..0000000 --- a/v1/taffy/tests/someFolder/someOtherFile.cfm +++ /dev/null @@ -1 +0,0 @@ -I am some non-framework-related file. woot. \ No newline at end of file diff --git a/v1/taffy/tests/specs/e2e/EndToEndSpec.cfc b/v1/taffy/tests/specs/e2e/EndToEndSpec.cfc new file mode 100644 index 0000000..23d8567 --- /dev/null +++ b/v1/taffy/tests/specs/e2e/EndToEndSpec.cfc @@ -0,0 +1,173 @@ +component extends="testbox.system.BaseSpec" { + + function beforeAll() { + // Build base URL from the server running these tests + var port = cgi.server_port; + var host = cgi.server_name; + if (!len(host) || host == "") host = "localhost"; + variables.baseURL = "http://#host#:#port#/tests/testapi/index.cfm"; + } + + /** + * Helper: make an HTTP request to the test API + */ + private struct function apiRequest( + required string uri, + string method = "GET", + string body = "", + struct headers = {} + ) { + var result = {}; + var fullURL = variables.baseURL & "?endpoint=" & arguments.uri; + + cfhttp(url=fullURL, method=arguments.method, result="result", timeout=10, charset="utf-8") { + cfhttpparam(type="header", name="Content-Type", value="application/json"); + cfhttpparam(type="header", name="Accept", value="application/json"); + for (var h in arguments.headers) { + cfhttpparam(type="header", name=h, value=arguments.headers[h]); + } + if (len(arguments.body)) { + cfhttpparam(type="body", value=arguments.body); + } + } + + result.data = {}; + if (structKeyExists(result, "fileContent")) { + var body = result.fileContent; + if (!isSimpleValue(body)) { + body = toString(body); + } + body = trim(body); + if (len(body) && isJSON(body)) { + result.data = deserializeJSON(body); + } + } + return result; + } + + function run() { + + describe("End-to-End HTTP Tests", function() { + + describe("GET requests", function() { + + it("should return 200 for a valid GET request", function() { + var res = apiRequest("/echo"); + expect(res.status_code).toBe(200); + expect(res.data.method).toBe("GET"); + expect(res.data.message).toBe("echo"); + }); + + it("should extract URI token from path", function() { + var res = apiRequest("/echo/42"); + expect(res.status_code).toBe(200); + expect(res.data.id).toBe("42"); + expect(res.data.method).toBe("GET"); + }); + + it("should extract multiple URI tokens", function() { + var res = apiRequest("/echo/10/child/20"); + expect(res.status_code).toBe(200); + expect(res.data.parentId).toBe("10"); + expect(res.data.childId).toBe("20"); + }); + + it("should return JSON content type", function() { + var res = apiRequest("/echo"); + expect(res.responseheader["Content-Type"]).toInclude("application/json"); + }); + + }); + + describe("POST requests", function() { + + it("should return 201 Created", function() { + var res = apiRequest( + uri = "/echo", + method = "POST", + body = '{"name":"test","value":"123"}' + ); + expect(res.status_code).toBe(201); + expect(res.data.method).toBe("POST"); + }); + + it("should deserialize JSON request body", function() { + var res = apiRequest( + uri = "/echo", + method = "POST", + body = '{"name":"widget","value":"abc"}' + ); + expect(res.data.name).toBe("widget"); + expect(res.data.value).toBe("abc"); + }); + + }); + + describe("PUT requests", function() { + + it("should handle PUT with URI token and body", function() { + var res = apiRequest( + uri = "/echo/55", + method = "PUT", + body = '{"name":"updated"}' + ); + expect(res.status_code).toBe(200); + expect(res.data.method).toBe("PUT"); + expect(res.data.id).toBe("55"); + expect(res.data.name).toBe("updated"); + }); + + }); + + describe("DELETE requests", function() { + + it("should handle DELETE with URI token", function() { + var res = apiRequest(uri="/echo/99", method="DELETE"); + expect(res.status_code).toBe(200); + expect(res.data.method).toBe("DELETE"); + expect(res.data.id).toBe("99"); + }); + + it("should return custom response headers", function() { + var res = apiRequest(uri="/echo/99", method="DELETE"); + expect(res.responseheader["X-Deleted-Id"]).toBe("99"); + }); + + }); + + describe("Error responses", function() { + + it("should return 404 for unknown URI", function() { + var res = apiRequest("/nonexistent/path"); + expect(res.status_code).toBe(404); + }); + + it("should return 405 for unsupported HTTP method", function() { + // /echo/{parentId}/child/{childId} only supports GET + var res = apiRequest(uri="/echo/1/child/2", method="DELETE"); + expect(res.status_code).toBe(405); + }); + + }); + + describe("X-HTTP-Method-Override", function() { + + it("should support method tunneling via header", function() { + var res = apiRequest( + uri = "/echo/77", + method = "POST", + headers = { "X-HTTP-Method-Override": "PUT" }, + body = '{"name":"tunneled"}' + ); + expect(res.data.method).toBe("PUT"); + expect(res.data.id).toBe("77"); + expect(res.data.name).toBe("tunneled"); + }); + + }); + + }); + + } + +} diff --git a/v1/taffy/tests/specs/e2e/OpenApiSpec.cfc b/v1/taffy/tests/specs/e2e/OpenApiSpec.cfc new file mode 100644 index 0000000..5de7b7d --- /dev/null +++ b/v1/taffy/tests/specs/e2e/OpenApiSpec.cfc @@ -0,0 +1,84 @@ +component extends="testbox.system.BaseSpec" { + + function beforeAll() { + var port = cgi.server_port; + var host = cgi.server_name; + if (!len(host) || host == "") host = "localhost"; + variables.baseURL = "http://#host#:#port#/tests/testapi/index.cfm"; + } + + private struct function fetchSpec(string param = "openapi") { + var result = {}; + cfhttp(url="#variables.baseURL#?#arguments.param#", method="GET", result="result", timeout=10, charset="utf-8"); + return result; + } + + function run() { + + describe("OpenAPI 3.1 spec endpoint", function() { + + it("returns JSON with openapi version 3.1.0", function() { + var res = fetchSpec("openapi"); + expect(res.status_code).toBe(200); + expect(isJSON(res.fileContent)).toBeTrue("Expected JSON, got: " & left(res.fileContent, 300)); + var spec = deserializeJSON(res.fileContent); + expect(spec.openapi).toBe("3.1.0"); + }); + + it("includes info.title and info.version", function() { + var spec = deserializeJSON(fetchSpec().fileContent); + expect(spec).toHaveKey("info"); + expect(spec.info).toHaveKey("title"); + expect(spec.info).toHaveKey("version"); + }); + + it("documents /echo/{id} with GET, PUT, DELETE", function() { + var spec = deserializeJSON(fetchSpec().fileContent); + expect(spec).toHaveKey("paths"); + expect(spec.paths).toHaveKey("/echo/{id}"); + var echo = spec.paths["/echo/{id}"]; + expect(echo).toHaveKey("get"); + expect(echo).toHaveKey("put"); + expect(echo).toHaveKey("delete"); + }); + + it("marks path token 'id' as required in:path on GET", function() { + var spec = deserializeJSON(fetchSpec().fileContent); + var params = spec.paths["/echo/{id}"].get.parameters; + var found = false; + for (var i = 1; i <= arrayLen(params); i++) { + if (params[i].name == "id" && params[i]["in"] == "path" && params[i].required == true) { + found = true; + break; + } + } + expect(found).toBeTrue("Expected required path parameter 'id' on GET /echo/{id}"); + }); + + it("emits requestBody with json + form-urlencoded for PUT body params", function() { + var spec = deserializeJSON(fetchSpec().fileContent); + var put = spec.paths["/echo/{id}"].put; + expect(put).toHaveKey("requestBody"); + expect(put.requestBody.content).toHaveKey("application/json"); + expect(put.requestBody.content).toHaveKey("application/x-www-form-urlencoded"); + var props = put.requestBody.content["application/json"].schema.properties; + expect(props).toHaveKey("name"); + }); + + it("includes responses.200 for each operation", function() { + var spec = deserializeJSON(fetchSpec().fileContent); + expect(spec.paths["/echo/{id}"].get).toHaveKey("responses"); + expect(spec.paths["/echo/{id}"].get.responses).toHaveKey("200"); + }); + + it("accepts ?swagger alias", function() { + var res = fetchSpec("swagger"); + expect(res.status_code).toBe(200); + expect(deserializeJSON(res.fileContent).openapi).toBe("3.1.0"); + }); + + }); + + } + +} diff --git a/v1/taffy/tests/specs/integration/ConfigurationSpec.cfc b/v1/taffy/tests/specs/integration/ConfigurationSpec.cfc new file mode 100644 index 0000000..1c9708d --- /dev/null +++ b/v1/taffy/tests/specs/integration/ConfigurationSpec.cfc @@ -0,0 +1,228 @@ +component extends="testbox.system.BaseSpec" { + + function beforeAll() { + // Save existing application context so we can restore it after + if (structKeyExists(application, "_taffy")) { + variables.savedTaffy = duplicate(application._taffy); + } + // Create a fresh API instance and bootstrap it to populate application._taffy with defaults + variables.api = new core.api(); + variables.api.onApplicationStart(); + variables.settings = application._taffy.settings; + } + + function afterAll() { + // Restore original application context + if (structKeyExists(variables, "savedTaffy")) { + application._taffy = variables.savedTaffy; + } + } + + function run() { + + describe("Configuration", function() { + + describe("Default settings", function() { + + it("should have reloadKey default of 'reload'", function() { + expect(settings.reloadKey).toBe("reload"); + }); + + it("should have reloadPassword default of 'true'", function() { + expect(settings.reloadPassword).toBe("true"); + }); + + it("should have reloadOnEveryRequest default of false", function() { + expect(settings.reloadOnEveryRequest).toBeFalse(); + }); + + it("should have disableDashboard default of false", function() { + expect(settings.disableDashboard).toBeFalse(); + }); + + it("should have disabledDashboardRedirect default of empty string", function() { + expect(settings.disabledDashboardRedirect).toBe(""); + }); + + it("should have showDocsWhenDashboardDisabled default of false", function() { + expect(settings.showDocsWhenDashboardDisabled).toBeFalse(); + }); + + it("should have returnExceptionsAsJson default of false", function() { + expect(settings.returnExceptionsAsJson).toBeFalse(); + }); + + it("should have exposeTaffyHeaders default of true", function() { + expect(settings.exposeTaffyHeaders).toBeTrue(); + }); + + it("should have allowCrossDomain default of false", function() { + expect(settings.allowCrossDomain).toBeFalse(); + }); + + it("should have useEtags default of false", function() { + expect(settings.useEtags).toBeFalse(); + }); + + it("should have jsonp default of false", function() { + expect(settings.jsonp).toBeFalse(); + }); + + it("should have noDataSends204NoContent default of false", function() { + expect(settings.noDataSends204NoContent).toBeFalse(); + }); + + it("should have endpointURLParam default of 'endpoint'", function() { + expect(settings.endpointURLParam).toBe("endpoint"); + }); + + it("should have debugKey default of 'debug'", function() { + expect(settings.debugKey).toBe("debug"); + }); + + it("should have unhandledPaths default of '/flex2gateway'", function() { + expect(settings.unhandledPaths).toBe("/flex2gateway"); + }); + + it("should have globalHeaders default to empty struct", function() { + expect(settings.globalHeaders).toBeStruct(); + expect(structIsEmpty(settings.globalHeaders)).toBeTrue(); + }); + + it("should have exceptionLogAdapter default of LogToDevNull", function() { + expect(settings.exceptionLogAdapter).toBe("taffy.bonus.LogToDevNull"); + }); + + it("should have allowGoogleFonts default of true", function() { + expect(settings.allowGoogleFonts).toBeTrue(); + }); + + }); + + describe("Serializer configuration", function() { + + it("should use nativeJsonSerializer by default", function() { + expect(settings.serializer).toBe("taffy.core.nativeJsonSerializer"); + }); + + it("should have nativeJsonSerializer extend baseSerializer", function() { + var serializer = new core.nativeJsonSerializer(); + expect(new tests.helpers.MetadataHelper().extendsClass(serializer, "baseSerializer")).toBeTrue(); + }); + + }); + + describe("Deserializer configuration", function() { + + it("should use nativeJsonDeserializer by default", function() { + expect(settings.deserializer).toBe("taffy.core.nativeJsonDeserializer"); + }); + + it("should have nativeJsonDeserializer extend baseDeserializer", function() { + var deserializer = new core.nativeJsonDeserializer(); + expect(new tests.helpers.MetadataHelper().extendsClass(deserializer, "baseDeserializer")).toBeTrue(); + }); + + it("should support JSON content type via getFromJson", function() { + var deserializer = new core.nativeJsonDeserializer(); + var meta = getMetadata(deserializer); + var hasJsonSupport = false; + for (var func in meta.functions) { + if (func.name == "getFromJson") { + hasJsonSupport = true; + break; + } + } + expect(hasJsonSupport).toBeTrue(); + }); + + it("should support form-urlencoded content type via getFromForm", function() { + var deserializer = new core.baseDeserializer(); + var meta = getMetadata(deserializer); + var hasFormSupport = false; + for (var func in meta.functions) { + if (func.name == "getFromForm") { + hasFormSupport = true; + break; + } + } + expect(hasFormSupport).toBeTrue(); + }); + + }); + + describe("MIME type configuration", function() { + + it("should detect mime types from serializer metadata", function() { + var serializer = new core.nativeJsonSerializer(); + var meta = getMetadata(serializer); + + var jsonMime = ""; + for (var func in meta.functions) { + if (func.name == "getAsJson") { + if (structKeyExists(func, "taffy:mime")) { + jsonMime = func["taffy:mime"]; + } else if (structKeyExists(func, "taffy_mime")) { + jsonMime = func["taffy_mime"]; + } + break; + } + } + expect(jsonMime).toInclude("application/json"); + }); + + it("should identify default mime type from serializer", function() { + var serializer = new core.nativeJsonSerializer(); + var meta = getMetadata(serializer); + + var isDefault = false; + for (var func in meta.functions) { + if (func.name == "getAsJson") { + if (structKeyExists(func, "taffy:default")) { + isDefault = func["taffy:default"]; + } else if (structKeyExists(func, "taffy_default")) { + isDefault = func["taffy_default"]; + } + break; + } + } + expect(isDefault).toBeTrue(); + }); + + }); + + describe("Version", function() { + + it("should report version 4.0.0", function() { + expect(application._taffy.version).toBe("4.0.0"); + }); + + }); + + describe("Unhandled paths regex", function() { + + it("should convert unhandledPaths to regex", function() { + expect(structKeyExists(settings, "unhandledPathsRegex")).toBeTrue(); + expect(len(settings.unhandledPathsRegex)).toBeGT(0); + }); + + it("should match the default /flex2gateway path", function() { + expect(reFindNoCase("^(" & settings.unhandledPathsRegex & ")", "/flex2gateway")).toBeGT(0); + }); + + }); + + describe("Content types", function() { + + it("should have registered supported content types", function() { + expect(structKeyExists(application._taffy, "contentTypes")).toBeTrue(); + expect(application._taffy.contentTypes).toBeStruct(); + }); + + }); + + }); + + } + +} diff --git a/v1/taffy/tests/specs/integration/HTTPMethodsSpec.cfc b/v1/taffy/tests/specs/integration/HTTPMethodsSpec.cfc new file mode 100644 index 0000000..c87432c --- /dev/null +++ b/v1/taffy/tests/specs/integration/HTTPMethodsSpec.cfc @@ -0,0 +1,220 @@ +component extends="testbox.system.BaseSpec" { + + function beforeAll() { + // Initialize application scope with minimal settings required by resource.cfc + application._taffy = { + settings: { + serializer: "core.nativeJsonSerializer", + noDataSends204NoContent: false + }, + factory: new core.factory(), + compat: { + queryToArray: "missing", + queryToStruct: "missing" + } + }; + } + + function run() { + + describe("HTTP Methods", function() { + + describe("Standard HTTP verb mapping", function() { + + it("should recognize GET method in resource", function() { + var resource = new tests.resources.MockSimpleResource(); + var meta = getMetadata(resource); + var hasGet = false; + for (var func in meta.functions) { + if (func.name == "get") { + hasGet = true; + break; + } + } + expect(hasGet).toBeTrue(); + }); + + it("should recognize POST method in resource", function() { + var resource = new tests.resources.MockSimpleResource(); + var meta = getMetadata(resource); + var hasPost = false; + for (var func in meta.functions) { + if (func.name == "post") { + hasPost = true; + break; + } + } + expect(hasPost).toBeTrue(); + }); + + it("should recognize PUT method in resource", function() { + var resource = new tests.resources.MockTokenResource(); + var meta = getMetadata(resource); + var hasPut = false; + for (var func in meta.functions) { + if (func.name == "put") { + hasPut = true; + break; + } + } + expect(hasPut).toBeTrue(); + }); + + it("should recognize DELETE method in resource", function() { + var resource = new tests.resources.MockTokenResource(); + var meta = getMetadata(resource); + var hasDelete = false; + for (var func in meta.functions) { + if (func.name == "delete") { + hasDelete = true; + break; + } + } + expect(hasDelete).toBeTrue(); + }); + + }); + + describe("taffy:verb metadata override", function() { + + it("should recognize taffy:verb=PATCH on custom method", function() { + var resource = new tests.resources.MockVerbOverrideResource(); + var meta = getMetadata(resource); + var patchFunc = ""; + for (var func in meta.functions) { + if (func.name == "updatePartial") { + patchFunc = func; + break; + } + } + expect(patchFunc).notToBeEmpty(); + var hasVerbMeta = structKeyExists(patchFunc, "taffy:verb") + || structKeyExists(patchFunc, "taffy_verb"); + expect(hasVerbMeta).toBeTrue(); + + var verbValue = structKeyExists(patchFunc, "taffy:verb") + ? patchFunc["taffy:verb"] + : patchFunc["taffy_verb"]; + expect(verbValue).toBe("PATCH"); + }); + + it("should recognize taffy_verb (underscore style) on custom method", function() { + var resource = new tests.resources.MockVerbOverrideResource(); + var meta = getMetadata(resource); + var optionsFunc = ""; + for (var func in meta.functions) { + if (func.name == "handleOptions") { + optionsFunc = func; + break; + } + } + expect(optionsFunc).notToBeEmpty(); + var hasVerbMeta = structKeyExists(optionsFunc, "taffy:verb") + || structKeyExists(optionsFunc, "taffy_verb"); + expect(hasVerbMeta).toBeTrue(); + }); + + }); + + describe("Resource taffy:uri metadata", function() { + + it("should have taffy:uri on MockSimpleResource", function() { + var resource = new tests.resources.MockSimpleResource(); + var meta = getMetadata(resource); + var hasUri = structKeyExists(meta, "taffy:uri") + || structKeyExists(meta, "taffy_uri"); + expect(hasUri).toBeTrue(); + }); + + it("should have correct URI pattern on MockTokenResource", function() { + var resource = new tests.resources.MockTokenResource(); + var meta = getMetadata(resource); + var uri = structKeyExists(meta, "taffy:uri") + ? meta["taffy:uri"] + : meta["taffy_uri"]; + expect(uri).toBe("/items/{id}"); + }); + + it("should have correct URI pattern on MockMultiTokenResource", function() { + var resource = new tests.resources.MockMultiTokenResource(); + var meta = getMetadata(resource); + var uri = structKeyExists(meta, "taffy:uri") + ? meta["taffy:uri"] + : meta["taffy_uri"]; + expect(uri).toBe("/users/{userId}/orders/{orderId}"); + }); + + }); + + describe("Resource inheritance", function() { + + it("should extend core.resource", function() { + var resource = new tests.resources.MockSimpleResource(); + expect(new tests.helpers.MetadataHelper().extendsClass(resource, "resource")).toBeTrue(); + }); + + it("should have access to rep() method from parent", function() { + var resource = new tests.resources.MockSimpleResource(); + expect(resource).toHaveKey("rep"); + }); + + it("should have access to representationOf() method from parent", function() { + var resource = new tests.resources.MockSimpleResource(); + expect(resource).toHaveKey("representationOf"); + }); + + }); + + describe("Resource method invocation", function() { + + it("should execute GET and return serializer", function() { + var resource = new tests.resources.MockSimpleResource(); + var result = resource.get(); + expect(new tests.helpers.MetadataHelper().extendsClass(result, "baseSerializer")).toBeTrue(); + expect(result.getData().method).toBe("GET"); + }); + + it("should execute POST with arguments", function() { + var resource = new tests.resources.MockSimpleResource(); + var result = resource.post(name = "TestItem"); + expect(new tests.helpers.MetadataHelper().extendsClass(result, "baseSerializer")).toBeTrue(); + expect(result.getData().name).toBe("TestItem"); + expect(result.getStatus()).toBe(201); + }); + + it("should execute GET with token parameter", function() { + var resource = new tests.resources.MockTokenResource(); + var result = resource.get(id = "123"); + expect(result.getData().id).toBe("123"); + expect(result.getData().method).toBe("GET"); + }); + + it("should execute PUT with token and body parameters", function() { + var resource = new tests.resources.MockTokenResource(); + var result = resource.put(id = "456", name = "Updated"); + expect(result.getData().id).toBe("456"); + expect(result.getData().name).toBe("Updated"); + expect(result.getData().updated).toBeTrue(); + }); + + it("should execute DELETE with token parameter", function() { + var resource = new tests.resources.MockTokenResource(); + var result = resource.delete(id = "789"); + expect(result.getData().id).toBe("789"); + expect(result.getData().deleted).toBeTrue(); + }); + + it("should execute GET with multiple tokens", function() { + var resource = new tests.resources.MockMultiTokenResource(); + var result = resource.get(userId = "1", orderId = "2"); + expect(result.getData().userId).toBe("1"); + expect(result.getData().orderId).toBe("2"); + }); + + }); + + }); + + } + +} diff --git a/v1/taffy/tests/specs/integration/HooksSpec.cfc b/v1/taffy/tests/specs/integration/HooksSpec.cfc new file mode 100644 index 0000000..40f00b9 --- /dev/null +++ b/v1/taffy/tests/specs/integration/HooksSpec.cfc @@ -0,0 +1,239 @@ +component extends="testbox.system.BaseSpec" { + + function run() { + + describe("Hooks", function() { + + describe("onTaffyRequest hook", function() { + + it("should be defined in api.cfc", function() { + var api = new core.api(); + expect(api).toHaveKey("onTaffyRequest"); + }); + + it("should accept required parameters", function() { + var api = new core.api(); + var meta = getMetadata(api); + var hookFunc = ""; + for (var func in meta.functions) { + if (func.name == "onTaffyRequest") { + hookFunc = func; + break; + } + } + expect(hookFunc).notToBeEmpty(); + expect(hookFunc.parameters).toBeArray(); + + // Should have all expected parameters + var paramNames = []; + for (var param in hookFunc.parameters) { + arrayAppend(paramNames, param.name); + } + expect(arrayFindNoCase(paramNames, "verb")).toBeGT(0); + expect(arrayFindNoCase(paramNames, "cfc")).toBeGT(0); + expect(arrayFindNoCase(paramNames, "requestArguments")).toBeGT(0); + expect(arrayFindNoCase(paramNames, "mimeExt")).toBeGT(0); + expect(arrayFindNoCase(paramNames, "headers")).toBeGT(0); + expect(arrayFindNoCase(paramNames, "methodMetadata")).toBeGT(0); + expect(arrayFindNoCase(paramNames, "matchedURI")).toBeGT(0); + }); + + it("should return true by default", function() { + var api = new core.api(); + var result = api.onTaffyRequest( + verb = "GET", + cfc = "testResource", + requestArguments = {}, + mimeExt = "json", + headers = {}, + methodMetadata = {}, + matchedURI = "/test" + ); + expect(result).toBeTrue(); + }); + + }); + + describe("onTaffyRequestEnd hook", function() { + + it("should be defined in api.cfc", function() { + var api = new core.api(); + expect(api).toHaveKey("onTaffyRequestEnd"); + }); + + it("should accept required parameters", function() { + var api = new core.api(); + var meta = getMetadata(api); + var hookFunc = ""; + for (var func in meta.functions) { + if (func.name == "onTaffyRequestEnd") { + hookFunc = func; + break; + } + } + expect(hookFunc).notToBeEmpty(); + + var paramNames = []; + for (var param in hookFunc.parameters) { + arrayAppend(paramNames, param.name); + } + + // Should include response-related parameters + expect(arrayFindNoCase(paramNames, "parsedResponse")).toBeGT(0); + expect(arrayFindNoCase(paramNames, "originalResponse")).toBeGT(0); + expect(arrayFindNoCase(paramNames, "statusCode")).toBeGT(0); + }); + + it("should return true by default", function() { + var api = new core.api(); + var result = api.onTaffyRequestEnd( + verb = "GET", + cfc = "testResource", + requestArguments = {}, + mimeExt = "json", + headers = {}, + methodMetadata = {}, + matchedURI = "/test", + parsedResponse = '{"test":true}', + originalResponse = { test: true }, + statusCode = 200 + ); + expect(result).toBeTrue(); + }); + + }); + + describe("Caching hooks", function() { + + it("should have validCacheExists hook", function() { + var api = new core.api(); + expect(api).toHaveKey("validCacheExists"); + }); + + it("validCacheExists should return false by default", function() { + var api = new core.api(); + var result = api.validCacheExists(cacheKey = "test-key"); + expect(result).toBeFalse(); + }); + + it("should have setCachedResponse hook", function() { + var api = new core.api(); + expect(api).toHaveKey("setCachedResponse"); + }); + + it("should have getCachedResponse hook", function() { + var api = new core.api(); + expect(api).toHaveKey("getCachedResponse"); + }); + + it("should have getCacheKey hook", function() { + var api = new core.api(); + expect(api).toHaveKey("getCacheKey"); + }); + + it("getCacheKey should generate key from request params", function() { + var api = new core.api(); + var requestArgs = { id: 123 }; + var result = api.getCacheKey( + cfc = "testResource", + requestArguments = requestArgs, + matchedURI = "/items/{id}" + ); + expect(result).toInclude("/items/{id}"); + }); + + }); + + describe("getEnvironment hook", function() { + + it("should be defined in api.cfc", function() { + var api = new core.api(); + expect(api).toHaveKey("getEnvironment"); + }); + + it("should return empty string by default", function() { + var api = new core.api(); + var result = api.getEnvironment(); + expect(result).toBe(""); + }); + + }); + + describe("Hook extensibility", function() { + + it("should allow overriding onTaffyRequest in subclass", function() { + // Any class extending core.api can override hooks + var api = new core.api(); + // The base api has the hook that can be overridden + expect(api).toHaveKey("onTaffyRequest"); + // Verify it's a function that can be overridden + expect(isCustomFunction(api.onTaffyRequest)).toBeTrue(); + }); + + }); + + describe("Basic auth helper", function() { + + it("should have getBasicAuthCredentials method", function() { + var api = new core.api(); + expect(api).toHaveKey("getBasicAuthCredentials"); + }); + + it("getBasicAuthCredentials should return struct with username and password", function() { + var api = new core.api(); + var result = api.getBasicAuthCredentials(); + expect(result).toBeStruct(); + expect(result).toHaveKey("username"); + expect(result).toHaveKey("password"); + }); + + it("should return empty credentials when no auth header", function() { + var api = new core.api(); + var result = api.getBasicAuthCredentials(); + expect(result.username).toBe(""); + expect(result.password).toBe(""); + }); + + }); + + describe("Helper methods", function() { + + it("should have getHostname helper", function() { + var api = new core.api(); + expect(api).toHaveKey("getHostname"); + var hostname = api.getHostname(); + expect(len(hostname)).toBeGT(0); + }); + + it("should have addHeaders helper", function() { + var api = new core.api(); + expect(api).toHaveKey("addHeaders"); + }); + + it("should have rep helper for responses", function() { + var api = new core.api(); + expect(api).toHaveKey("rep"); + }); + + it("should have representationOf helper", function() { + var api = new core.api(); + expect(api).toHaveKey("representationOf"); + }); + + it("should have noData helper", function() { + var api = new core.api(); + expect(api).toHaveKey("noData"); + }); + + it("should have noContent helper", function() { + var api = new core.api(); + expect(api).toHaveKey("noContent"); + }); + + }); + + }); + + } + +} diff --git a/v1/taffy/tests/specs/integration/ResponseHandlingSpec.cfc b/v1/taffy/tests/specs/integration/ResponseHandlingSpec.cfc new file mode 100644 index 0000000..64b96ed --- /dev/null +++ b/v1/taffy/tests/specs/integration/ResponseHandlingSpec.cfc @@ -0,0 +1,252 @@ +component extends="testbox.system.BaseSpec" { + + function beforeAll() { + // Set up minimal application context + application._taffy = { + settings: { + serializer: "core.nativeJsonSerializer", + noDataSends204NoContent: false + }, + factory: new core.factory(), + compat: { + queryToArray: "missing", + queryToStruct: "missing" + } + }; + } + + function run() { + + describe("Response Handling", function() { + + describe("Status codes", function() { + + it("should default to 200 OK", function() { + var resource = new tests.resources.MockSimpleResource(); + var result = resource.get(); + expect(result.getStatus()).toBe(200); + expect(result.getStatusText()).toBe("OK"); + }); + + it("should support 201 Created", function() { + var resource = new tests.resources.MockSimpleResource(); + var result = resource.post(name = "Test"); + expect(result.getStatus()).toBe(201); + expect(result.getStatusText()).toBe("Created"); + }); + + it("should support 404 Not Found", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setData({ error: "Resource not found" }).withStatus(404); + expect(serializer.getStatus()).toBe(404); + expect(serializer.getStatusText()).toBe("Not Found"); + }); + + it("should support 400 Bad Request", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setData({ error: "Invalid input" }).withStatus(400); + expect(serializer.getStatus()).toBe(400); + expect(serializer.getStatusText()).toBe("Bad Request"); + }); + + it("should support 500 Internal Server Error", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setData({ error: "Something went wrong" }).withStatus(500); + expect(serializer.getStatus()).toBe(500); + expect(serializer.getStatusText()).toBe("Internal Server Error"); + }); + + it("should support custom status text", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.withStatus(299, "Custom Success"); + expect(serializer.getStatus()).toBe(299); + expect(serializer.getStatusText()).toBe("Custom Success"); + }); + + }); + + describe("Response headers", function() { + + it("should set custom headers", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setData({ id: 123 }) + .withHeaders({ "X-Request-Id": "abc123" }); + var headers = serializer.getHeaders(); + expect(headers["X-Request-Id"]).toBe("abc123"); + }); + + it("should set Location header for created resources", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setData({ id: 456 }) + .withStatus(201) + .withHeaders({ "Location": "/items/456" }); + expect(serializer.getHeaders()["Location"]).toBe("/items/456"); + }); + + it("should set multiple headers", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.withHeaders({ + "X-Rate-Limit": "100", + "X-Rate-Remaining": "99", + "X-Cache-Control": "no-cache" + }); + var headers = serializer.getHeaders(); + expect(headers["X-Rate-Limit"]).toBe("100"); + expect(headers["X-Rate-Remaining"]).toBe("99"); + expect(headers["X-Cache-Control"]).toBe("no-cache"); + }); + + }); + + describe("JSON serialization", function() { + + it("should serialize response data as JSON", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setData({ message: "Hello", count: 42 }); + var json = serializer.getAsJson(); + expect(isJSON(json)).toBeTrue(); + var parsed = deserializeJSON(json); + expect(parsed.message).toBe("Hello"); + expect(parsed.count).toBe(42); + }); + + it("should serialize nested structures", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setData({ + user: { + name: "John", + email: "john@example.com" + }, + permissions: ["read", "write"] + }); + var json = serializer.getAsJson(); + var parsed = deserializeJSON(json); + expect(parsed.user.name).toBe("John"); + expect(parsed.permissions).toBeArray(); + }); + + it("should serialize array responses", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setData([ + { id: 1, name: "Item 1" }, + { id: 2, name: "Item 2" } + ]); + var json = serializer.getAsJson(); + var parsed = deserializeJSON(json); + expect(parsed).toBeArray(); + expect(arrayLen(parsed)).toBe(2); + }); + + it("should handle boolean values correctly", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setData({ + active: true, + deleted: false + }); + var json = serializer.getAsJson(); + var parsed = deserializeJSON(json); + expect(parsed.active).toBeTrue(); + expect(parsed.deleted).toBeFalse(); + }); + + }); + + describe("noData() and noContent()", function() { + + it("noData() should return empty response when setting is false", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setNoDataSends204NoContent(false); + var result = serializer.noData(); + // Should still be 200 with empty data + expect(result.getStatus()).toBe(200); + }); + + it("noData() should return 204 when setting is true", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setNoDataSends204NoContent(true); + var result = serializer.noData(); + expect(result.getStatus()).toBe(204); + }); + + it("noContent() should return 204", function() { + var serializer = new core.nativeJsonSerializer(); + var result = serializer.noContent(); + expect(result.getStatus()).toBe(204); + expect(result.getStatusText()).toBe("No Content"); + }); + + it("noContent() should set Content-Type to text/plain", function() { + var serializer = new core.nativeJsonSerializer(); + var result = serializer.noContent(); + var headers = result.getHeaders(); + expect(headers["Content-Type"]).toBe("text/plain"); + }); + + }); + + describe("Response type detection", function() { + + it("should identify textual response type", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setData({ message: "test" }); + expect(serializer.getType()).toBe("textual"); + }); + + it("should identify filename response type", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setFileName("/path/to/file.pdf"); + expect(serializer.getType()).toBe("filename"); + }); + + it("should identify filedata response type", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setFileData(toBinary(toBase64("test data"))); + expect(serializer.getType()).toBe("filedata"); + }); + + it("should identify imagedata response type", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setImageData(toBinary(toBase64("image data"))); + expect(serializer.getType()).toBe("imagedata"); + }); + + }); + + describe("File streaming responses", function() { + + it("should configure file download response", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setFileName("/path/to/report.pdf") + .withMime("application/pdf"); + + expect(serializer.getFileName()).toBe("/path/to/report.pdf"); + expect(serializer.getFileMime()).toBe("application/pdf"); + expect(serializer.getType()).toBe("filename"); + }); + + it("should configure binary data response", function() { + var binaryData = toBinary(toBase64("PDF content here")); + var serializer = new core.nativeJsonSerializer(); + serializer.setFileData(binaryData) + .withMime("application/pdf"); + + expect(serializer.getFileData()).toBe(binaryData); + expect(serializer.getFileMime()).toBe("application/pdf"); + }); + + it("should configure file delete after download", function() { + var serializer = new core.nativeJsonSerializer(); + serializer.setFileName("/tmp/temp-report.pdf") + .withMime("application/pdf") + .andDelete(true); + + expect(serializer.getDeleteFile()).toBeTrue(); + }); + + }); + + }); + + } + +} diff --git a/v1/taffy/tests/specs/integration/URIMatchingSpec.cfc b/v1/taffy/tests/specs/integration/URIMatchingSpec.cfc new file mode 100644 index 0000000..63a1b07 --- /dev/null +++ b/v1/taffy/tests/specs/integration/URIMatchingSpec.cfc @@ -0,0 +1,169 @@ +component extends="testbox.system.BaseSpec" { + + function beforeAll() { + // Initialize application scope with minimal settings required by resource.cfc + application._taffy = { + settings: { + serializer: "core.nativeJsonSerializer", + noDataSends204NoContent: false + }, + factory: new core.factory(), + compat: { + queryToArray: "missing", + queryToStruct: "missing" + } + }; + // Create a mock API instance for testing URI methods + variables.api = new core.api(); + } + + function run() { + + describe("URI Matching", function() { + + describe("convertURItoRegex()", function() { + + it("should convert simple static URI to regex", function() { + var result = makePublic(api, "convertURItoRegex").convertURItoRegex("/users"); + expect(result).toBeStruct(); + expect(result).toHaveKey("uriRegex"); + expect(result).toHaveKey("tokens"); + expect(result.tokens).toBeArray(); + expect(arrayLen(result.tokens)).toBe(0); + }); + + it("should extract single token from URI", function() { + var result = makePublic(api, "convertURItoRegex").convertURItoRegex("/users/{id}"); + expect(arrayLen(result.tokens)).toBe(1); + expect(result.tokens[1]).toBe("id"); + }); + + it("should extract multiple tokens from URI", function() { + var result = makePublic(api, "convertURItoRegex").convertURItoRegex("/users/{userId}/orders/{orderId}"); + expect(arrayLen(result.tokens)).toBe(2); + expect(result.tokens[1]).toBe("userId"); + expect(result.tokens[2]).toBe("orderId"); + }); + + it("should handle mixed static and token segments", function() { + var result = makePublic(api, "convertURItoRegex").convertURItoRegex("/api/v1/users/{id}/profile"); + expect(arrayLen(result.tokens)).toBe(1); + expect(result.tokens[1]).toBe("id"); + }); + + it("should generate regex that matches expected URIs", function() { + var result = makePublic(api, "convertURItoRegex").convertURItoRegex("/items/{id}"); + var regex = result.uriRegex; + + // Should match /items/123 + expect(reFindNoCase(regex, "/items/123")).toBeGT(0); + // Should match /items/abc + expect(reFindNoCase(regex, "/items/abc")).toBeGT(0); + // Should match with format extension + expect(reFindNoCase(regex, "/items/123.json")).toBeGT(0); + }); + + it("should support custom regex patterns in tokens", function() { + // Taffy supports {tokenName:regex} syntax + var result = makePublic(api, "convertURItoRegex").convertURItoRegex("/users/{id:[0-9]+}"); + expect(result.tokens[1]).toBe("id"); + // The regex should only match numeric IDs + var regex = result.uriRegex; + expect(reFindNoCase(regex, "/users/123")).toBeGT(0); + }); + + }); + + describe("URI regex matching", function() { + + it("should match exact static path", function() { + var result = makePublic(api, "convertURItoRegex").convertURItoRegex("/simple"); + expect(reFindNoCase(result.uriRegex, "/simple")).toBeGT(0); + }); + + it("should match path with trailing slash", function() { + var result = makePublic(api, "convertURItoRegex").convertURItoRegex("/simple"); + expect(reFindNoCase(result.uriRegex, "/simple/")).toBeGT(0); + }); + + it("should match path with format extension", function() { + var result = makePublic(api, "convertURItoRegex").convertURItoRegex("/items/{id}"); + expect(reFindNoCase(result.uriRegex, "/items/123.json")).toBeGT(0); + expect(reFindNoCase(result.uriRegex, "/items/abc.xml")).toBeGT(0); + }); + + it("should not match unrelated paths", function() { + var result = makePublic(api, "convertURItoRegex").convertURItoRegex("/users/{id}"); + expect(reFindNoCase(result.uriRegex, "/items/123")).toBe(0); + }); + + it("should handle deeply nested URIs", function() { + var result = makePublic(api, "convertURItoRegex").convertURItoRegex("/api/v1/users/{userId}/orders/{orderId}/items/{itemId}"); + expect(arrayLen(result.tokens)).toBe(3); + expect(reFindNoCase(result.uriRegex, "/api/v1/users/1/orders/2/items/3")).toBeGT(0); + }); + + }); + + describe("Token value extraction", function() { + + it("should extract token values from matched URI", function() { + var uriConfig = makePublic(api, "convertURItoRegex").convertURItoRegex("/users/{id}"); + var matchResult = reFindNoSuck(uriConfig.uriRegex, "/users/123"); + expect(matchResult).toBeArray(); + expect(arrayLen(matchResult)).toBeGTE(1); + expect(matchResult[1]).toBe("123"); + }); + + it("should extract multiple token values", function() { + var uriConfig = makePublic(api, "convertURItoRegex").convertURItoRegex("/users/{userId}/orders/{orderId}"); + var matchResult = reFindNoSuck(uriConfig.uriRegex, "/users/42/orders/99"); + expect(arrayLen(matchResult)).toBeGTE(2); + expect(matchResult[1]).toBe("42"); + expect(matchResult[2]).toBe("99"); + }); + + }); + + describe("sortURIMatchOrder()", function() { + + it("should sort URIs for proper matching order", function() { + var endpoints = { + "^/users/([^\/]+)": { srcUri: "/users/{id}" }, + "^/users": { srcUri: "/users" }, + "^/users/([^\/]+)/profile": { srcUri: "/users/{id}/profile" } + }; + var result = makePublic(api, "sortURIMatchOrder").sortURIMatchOrder(endpoints); + expect(result).toBeArray(); + // More specific patterns should be sorted appropriately + expect(arrayLen(result)).toBe(3); + }); + + }); + + }); + + } + + /** + * Reimplementation of reFindNoSuck for testing + */ + private function reFindNoSuck(required string pattern, required string data, numeric startPos = 1) { + var local = {}; + local.awesome = []; + local.sucky = reFindNoCase(arguments.pattern, arguments.data, arguments.startPos, true); + if (!isArray(local.sucky.len) || arrayLen(local.sucky.len) == 0) { + return []; + } + for (local.i = 1; local.i <= arrayLen(local.sucky.len); local.i++) { + if (local.sucky.len[local.i] > 0 && local.sucky.pos[local.i] > 0) { + local.matchBody = mid(arguments.data, local.sucky.pos[local.i], local.sucky.len[local.i]); + if (local.matchBody != arguments.data) { + arrayAppend(local.awesome, local.matchBody); + } + } + } + return local.awesome; + } + +} diff --git a/v1/taffy/tests/specs/unit/BaseDeserializerSpec.cfc b/v1/taffy/tests/specs/unit/BaseDeserializerSpec.cfc new file mode 100644 index 0000000..1edd965 --- /dev/null +++ b/v1/taffy/tests/specs/unit/BaseDeserializerSpec.cfc @@ -0,0 +1,80 @@ +component extends="testbox.system.BaseSpec" { + + function run() { + + describe("BaseDeserializer", function() { + + beforeEach(function() { + variables.deserializer = new core.baseDeserializer(); + }); + + describe("getFromForm()", function() { + + it("should parse simple form data", function() { + var body = "name=John&age=30"; + var result = deserializer.getFromForm(body); + expect(result.name).toBe("John"); + expect(result.age).toBe("30"); + }); + + it("should parse URL-encoded values", function() { + var body = "name=John%20Doe&city=New%20York"; + var result = deserializer.getFromForm(body); + expect(result.name).toBe("John Doe"); + expect(result.city).toBe("New York"); + }); + + it("should handle empty values", function() { + var body = "name=John&nickname="; + var result = deserializer.getFromForm(body); + expect(result.name).toBe("John"); + expect(result.nickname).toBe(""); + }); + + it("should handle multiple values for same key as list", function() { + var body = "color=red&color=blue&color=green"; + var result = deserializer.getFromForm(body); + expect(result.color).toInclude("red"); + expect(result.color).toInclude("blue"); + expect(result.color).toInclude("green"); + }); + + it("should handle special characters when URL encoded", function() { + var body = "query=" & urlEncodedFormat("foo=bar&baz=qux"); + var result = deserializer.getFromForm(body); + expect(result.query).toBe("foo=bar&baz=qux"); + }); + + it("should handle plus signs as spaces", function() { + // Note: urlDecode handles + as space + var body = "name=John+Doe"; + var result = deserializer.getFromForm(body); + expect(result.name).toBe("John Doe"); + }); + + }); + + describe("taffy:mime metadata", function() { + + it("should have taffy:mime for application/x-www-form-urlencoded", function() { + var metadata = getMetadata(deserializer); + var func = ""; + for (var f in metadata.functions) { + if (f.name == "getFromForm") { + func = f; + break; + } + } + expect(func).notToBeEmpty(); + var hasMime = structKeyExists(func, "taffy:mime") + || structKeyExists(func, "taffy_mime"); + expect(hasMime).toBeTrue(); + }); + + }); + + }); + + } + +} diff --git a/v1/taffy/tests/specs/unit/BaseSerializerSpec.cfc b/v1/taffy/tests/specs/unit/BaseSerializerSpec.cfc new file mode 100644 index 0000000..1f721ae --- /dev/null +++ b/v1/taffy/tests/specs/unit/BaseSerializerSpec.cfc @@ -0,0 +1,325 @@ +component extends="testbox.system.BaseSpec" { + + function run() { + + describe("BaseSerializer", function() { + + beforeEach(function() { + variables.serializer = new core.baseSerializer(); + }); + + describe("setData() and getData()", function() { + + it("should store and retrieve simple string data", function() { + var data = "Hello World"; + serializer.setData(data); + expect(serializer.getData()).toBe(data); + }); + + it("should store and retrieve struct data", function() { + var data = { name: "Test", value: 123 }; + serializer.setData(data); + var result = serializer.getData(); + expect(result.name).toBe("Test"); + expect(result.value).toBe(123); + }); + + it("should store and retrieve array data", function() { + var data = [1, 2, 3, 4, 5]; + serializer.setData(data); + expect(serializer.getData()).toBeArray(); + expect(arrayLen(serializer.getData())).toBe(5); + }); + + it("should return this for method chaining", function() { + var result = serializer.setData("test"); + expect(new tests.helpers.MetadataHelper().extendsClass(result, "baseSerializer")).toBeTrue(); + }); + + it("should set type to textual (1) when setting data", function() { + serializer.setData("test"); + expect(serializer.getType()).toBe("textual"); + }); + + }); + + describe("withStatus()", function() { + + it("should set status code with default text", function() { + serializer.withStatus(200); + expect(serializer.getStatus()).toBe(200); + expect(serializer.getStatusText()).toBe("OK"); + }); + + it("should set status code 201 with Created text", function() { + serializer.withStatus(201); + expect(serializer.getStatus()).toBe(201); + expect(serializer.getStatusText()).toBe("Created"); + }); + + it("should set status code 404 with Not Found text", function() { + serializer.withStatus(404); + expect(serializer.getStatus()).toBe(404); + expect(serializer.getStatusText()).toBe("Not Found"); + }); + + it("should set status code 500 with Internal Server Error text", function() { + serializer.withStatus(500); + expect(serializer.getStatus()).toBe(500); + expect(serializer.getStatusText()).toBe("Internal Server Error"); + }); + + it("should allow custom status text", function() { + serializer.withStatus(418, "I'm a teapot - Custom"); + expect(serializer.getStatus()).toBe(418); + expect(serializer.getStatusText()).toBe("I'm a teapot - Custom"); + }); + + it("should use lookup table for known status codes", function() { + serializer.withStatus(418); + expect(serializer.getStatusText()).toBe("I'm a teapot"); + }); + + it("should return this for method chaining", function() { + var result = serializer.withStatus(200); + expect(new tests.helpers.MetadataHelper().extendsClass(result, "baseSerializer")).toBeTrue(); + }); + + it("should handle all 2xx status codes", function() { + serializer.withStatus(204); + expect(serializer.getStatusText()).toBe("No Content"); + + serializer.withStatus(206); + expect(serializer.getStatusText()).toBe("Partial Content"); + }); + + it("should handle 3xx redirect status codes", function() { + serializer.withStatus(301); + expect(serializer.getStatusText()).toBe("Moved Permanently"); + + serializer.withStatus(302); + expect(serializer.getStatusText()).toBe("Found"); + + serializer.withStatus(304); + expect(serializer.getStatusText()).toBe("Not Modified"); + }); + + it("should handle 4xx client error status codes", function() { + serializer.withStatus(400); + expect(serializer.getStatusText()).toBe("Bad Request"); + + serializer.withStatus(401); + expect(serializer.getStatusText()).toBe("Unauthorized"); + + serializer.withStatus(403); + expect(serializer.getStatusText()).toBe("Forbidden"); + + serializer.withStatus(405); + expect(serializer.getStatusText()).toBe("Method Not Allowed"); + + serializer.withStatus(422); + expect(serializer.getStatusText()).toBe("Unprocessable Entity"); + + serializer.withStatus(429); + expect(serializer.getStatusText()).toBe("Too Many Requests"); + }); + + it("should handle 5xx server error status codes", function() { + serializer.withStatus(501); + expect(serializer.getStatusText()).toBe("Not Implemented"); + + serializer.withStatus(502); + expect(serializer.getStatusText()).toBe("Bad Gateway"); + + serializer.withStatus(503); + expect(serializer.getStatusText()).toBe("Service Unavailable"); + + serializer.withStatus(504); + expect(serializer.getStatusText()).toBe("Gateway Timeout"); + }); + + }); + + describe("withHeaders()", function() { + + it("should set custom headers", function() { + var headers = { "X-Custom-Header": "value1", "X-Another": "value2" }; + serializer.withHeaders(headers); + var result = serializer.getHeaders(); + expect(result["X-Custom-Header"]).toBe("value1"); + expect(result["X-Another"]).toBe("value2"); + }); + + it("should return this for method chaining", function() { + var result = serializer.withHeaders({}); + expect(new tests.helpers.MetadataHelper().extendsClass(result, "baseSerializer")).toBeTrue(); + }); + + it("should return empty struct when no headers set", function() { + var result = serializer.getHeaders(); + expect(result).toBeStruct(); + expect(structIsEmpty(result)).toBeTrue(); + }); + + }); + + describe("noData()", function() { + + it("should return serializer instance when noDataSends204NoContent is false", function() { + serializer.setNoDataSends204NoContent(false); + var result = serializer.noData(); + expect(new tests.helpers.MetadataHelper().extendsClass(result, "baseSerializer")).toBeTrue(); + expect(result.getStatus()).toBe(200); + }); + + it("should return 204 status when noDataSends204NoContent is true", function() { + serializer.setNoDataSends204NoContent(true); + var result = serializer.noData(); + expect(result.getStatus()).toBe(204); + }); + + it("should default to false (no 204) without explicit configuration", function() { + var result = serializer.noData(); + expect(result.getStatus()).toBe(200); + }); + + }); + + describe("noContent()", function() { + + it("should set status to 204 No Content", function() { + var result = serializer.noContent(); + expect(result.getStatus()).toBe(204); + expect(result.getStatusText()).toBe("No Content"); + }); + + it("should set Content-Type header to text/plain", function() { + var result = serializer.noContent(); + var headers = result.getHeaders(); + expect(headers["Content-Type"]).toBe("text/plain"); + }); + + }); + + describe("File streaming methods", function() { + + describe("setFileName()", function() { + + it("should store filename for streaming", function() { + serializer.setFileName("/path/to/file.pdf"); + expect(serializer.getFileName()).toBe("/path/to/file.pdf"); + }); + + it("should set type to filename (2)", function() { + serializer.setFileName("/path/to/file.pdf"); + expect(serializer.getType()).toBe("filename"); + }); + + it("should return this for method chaining", function() { + var result = serializer.setFileName("/path/to/file.pdf"); + expect(new tests.helpers.MetadataHelper().extendsClass(result, "baseSerializer")).toBeTrue(); + }); + + }); + + describe("setFileData()", function() { + + it("should store binary data for streaming", function() { + var binaryData = toBinary(toBase64("test data")); + serializer.setFileData(binaryData); + expect(serializer.getFileData()).toBe(binaryData); + }); + + it("should set type to filedata (3)", function() { + serializer.setFileData(toBinary(toBase64("test"))); + expect(serializer.getType()).toBe("filedata"); + }); + + }); + + describe("setImageData()", function() { + + it("should store image data for streaming", function() { + var imageData = toBinary(toBase64("fake image data")); + serializer.setImageData(imageData); + expect(serializer.getImageData()).notToBeNull(); + }); + + it("should set type to imagedata (4)", function() { + serializer.setImageData(toBinary(toBase64("test"))); + expect(serializer.getType()).toBe("imagedata"); + }); + + it("should convert non-binary data to binary", function() { + serializer.setImageData("test string"); + expect(isBinary(serializer.getImageData())).toBeTrue(); + }); + + }); + + describe("withMime()", function() { + + it("should set mime type for file streaming", function() { + serializer.withMime("application/pdf"); + expect(serializer.getFileMime()).toBe("application/pdf"); + }); + + it("should return this for method chaining", function() { + var result = serializer.withMime("image/jpeg"); + expect(new tests.helpers.MetadataHelper().extendsClass(result, "baseSerializer")).toBeTrue(); + }); + + }); + + describe("andDelete()", function() { + + it("should set delete flag to true", function() { + serializer.andDelete(true); + expect(serializer.getDeleteFile()).toBeTrue(); + }); + + it("should set delete flag to false", function() { + serializer.andDelete(false); + expect(serializer.getDeleteFile()).toBeFalse(); + }); + + it("should return this for method chaining", function() { + var result = serializer.andDelete(true); + expect(new tests.helpers.MetadataHelper().extendsClass(result, "baseSerializer")).toBeTrue(); + }); + + }); + + }); + + describe("Method chaining", function() { + + it("should support fluent interface for multiple operations", function() { + var result = serializer + .setData({ message: "test" }) + .withStatus(201, "Created") + .withHeaders({ "X-Custom": "value" }); + + expect(result.getData().message).toBe("test"); + expect(result.getStatus()).toBe(201); + expect(result.getHeaders()["X-Custom"]).toBe("value"); + }); + + it("should support chaining for file streaming", function() { + var result = serializer + .setFileName("/path/to/file.pdf") + .withMime("application/pdf") + .andDelete(true); + + expect(result.getFileName()).toBe("/path/to/file.pdf"); + expect(result.getFileMime()).toBe("application/pdf"); + expect(result.getDeleteFile()).toBeTrue(); + }); + + }); + + }); + + } + +} diff --git a/v1/taffy/tests/specs/unit/FactorySpec.cfc b/v1/taffy/tests/specs/unit/FactorySpec.cfc new file mode 100644 index 0000000..469c482 --- /dev/null +++ b/v1/taffy/tests/specs/unit/FactorySpec.cfc @@ -0,0 +1,161 @@ +component extends="testbox.system.BaseSpec" { + + function run() { + + describe("Factory", function() { + + beforeEach(function() { + variables.factory = new core.factory(); + }); + + describe("init()", function() { + + it("should initialize with empty bean cache", function() { + expect(factory.beans).toBeStruct(); + expect(structIsEmpty(factory.beans)).toBeTrue(); + }); + + it("should initialize with empty transients cache", function() { + expect(factory.transients).toBeStruct(); + expect(structIsEmpty(factory.transients)).toBeTrue(); + }); + + it("should return this for method chaining", function() { + var result = factory.init(); + expect(new tests.helpers.MetadataHelper().extendsClass(result, "factory")).toBeTrue(); + }); + + }); + + describe("beanExists() / containsBean()", function() { + + it("should return false for non-existent bean", function() { + expect(factory.beanExists("nonExistent")).toBeFalse(); + expect(factory.containsBean("nonExistent")).toBeFalse(); + }); + + it("should return true for cached bean", function() { + factory.beans["testBean"] = { name: "test" }; + expect(factory.beanExists("testBean")).toBeTrue(); + expect(factory.containsBean("testBean")).toBeTrue(); + }); + + it("containsBean should be alias for beanExists", function() { + factory.beans["aliasTest"] = { name: "test" }; + expect(factory.containsBean("aliasTest")).toBe(factory.beanExists("aliasTest")); + }); + + }); + + describe("transientExists()", function() { + + it("should return false for non-existent transient", function() { + expect(factory.transientExists("nonExistent")).toBeFalse(); + }); + + it("should return true for cached transient", function() { + factory.transients["testTransient"] = "some.component.path"; + expect(factory.transientExists("testTransient")).toBeTrue(); + }); + + }); + + describe("getBean()", function() { + + it("should return cached bean if exists", function() { + var testObj = { name: "cached bean" }; + factory.beans["testBean"] = testObj; + var result = factory.getBean("testBean"); + expect(result.name).toBe("cached bean"); + }); + + it("should throw error for non-existent bean", function() { + expect(function() { + factory.getBean("nonExistent"); + }).toThrow("Taffy.Factory.BeanNotFound"); + }); + + }); + + describe("getBeanList()", function() { + + it("should return empty string when no beans", function() { + expect(factory.getBeanList()).toBe(""); + }); + + it("should return bean names as comma-separated list", function() { + factory.beans["bean1"] = {}; + factory.beans["bean2"] = {}; + var list = factory.getBeanList(); + expect(listLen(list)).toBe(2); + expect(listFindNoCase(list, "bean1")).toBeGT(0); + expect(listFindNoCase(list, "bean2")).toBeGT(0); + }); + + it("should include transients in the list", function() { + factory.beans["bean1"] = {}; + factory.transients["transient1"] = "some.path"; + var list = factory.getBeanList(); + expect(listLen(list)).toBe(2); + expect(listFindNoCase(list, "transient1")).toBeGT(0); + }); + + }); + + describe("loadBeansFromPath()", function() { + + it("should not throw error for non-existent path", function() { + // loadBeansFromPath should handle non-existent directories gracefully + expect(function() { + factory.loadBeansFromPath("/non/existent/path"); + }).notToThrow(); + }); + + it("should clear beans on full reload", function() { + factory.beans["existingBean"] = {}; + var taffyRef = { + status: { skippedResources: [] }, + beanList: "" + }; + factory.loadBeansFromPath( + beanPath = "/non/existent/path", + resourcesPath = "resources", + resourcesBasePath = "", + isFullReload = true, + taffyRef = taffyRef + ); + // After reload with non-existent path, beans should be cleared + expect(structIsEmpty(factory.beans)).toBeTrue(); + }); + + }); + + describe("External bean factory integration", function() { + + it("should accept external bean factory in init", function() { + var mockExternalFactory = { + containsBean: function(beanName) { return beanName == "externalBean"; }, + getBean: function(beanName) { return { name: "external" }; } + }; + factory.init(mockExternalFactory); + expect(structKeyExists(factory, "externalBeanFactory")).toBeTrue(); + }); + + it("should check external factory for beans when configured", function() { + var mockExternalFactory = { + containsBean: function(beanName) { return beanName == "externalBean"; }, + getBean: function(beanName) { return { name: "from external", source: "external" }; } + }; + factory.init(mockExternalFactory); + + // beanExists with includeExternal=true should find external beans + expect(factory.beanExists("externalBean", true, true)).toBeTrue(); + }); + + }); + + }); + + } + +} diff --git a/v1/taffy/tests/specs/unit/NativeJsonDeserializerSpec.cfc b/v1/taffy/tests/specs/unit/NativeJsonDeserializerSpec.cfc new file mode 100644 index 0000000..b9b4fcf --- /dev/null +++ b/v1/taffy/tests/specs/unit/NativeJsonDeserializerSpec.cfc @@ -0,0 +1,149 @@ +component extends="testbox.system.BaseSpec" { + + function run() { + + describe("NativeJsonDeserializer", function() { + + beforeEach(function() { + variables.deserializer = new core.nativeJsonDeserializer(); + }); + + describe("inheritance", function() { + + it("should extend baseDeserializer", function() { + expect(new tests.helpers.MetadataHelper().extendsClass(deserializer, "baseDeserializer")).toBeTrue(); + }); + + it("should have getFromForm from parent", function() { + expect(deserializer).toHaveKey("getFromForm"); + }); + + }); + + describe("getFromJson()", function() { + + it("should parse simple JSON object", function() { + var body = '{"name":"John","age":30}'; + var result = deserializer.getFromJson(body); + expect(result.name).toBe("John"); + expect(result.age).toBe(30); + }); + + it("should parse nested JSON objects", function() { + var body = '{"user":{"name":"John","email":"john@example.com"},"active":true}'; + var result = deserializer.getFromJson(body); + expect(result.user.name).toBe("John"); + expect(result.user.email).toBe("john@example.com"); + expect(result.active).toBeTrue(); + }); + + it("should parse JSON with arrays", function() { + var body = '{"items":[1,2,3],"tags":["a","b","c"]}'; + var result = deserializer.getFromJson(body); + expect(result.items).toBeArray(); + expect(arrayLen(result.items)).toBe(3); + expect(result.tags[1]).toBe("a"); + }); + + it("should handle boolean values", function() { + var body = '{"active":true,"deleted":false}'; + var result = deserializer.getFromJson(body); + expect(result.active).toBeTrue(); + expect(result.deleted).toBeFalse(); + }); + + it("should handle null values", function() { + var body = '{"value":null,"other":"test"}'; + var result = deserializer.getFromJson(body); + // Note: In Lucee, null values may not preserve the key in the struct + // We verify the deserializer doesn't throw an error and returns a struct + expect(result).toBeStruct(); + expect(result.other).toBe("test"); + }); + + it("should handle numeric values", function() { + var body = '{"integer":42,"decimal":3.14,"negative":-100}'; + var result = deserializer.getFromJson(body); + expect(result.integer).toBe(42); + expect(result.decimal).toBe(3.14); + expect(result.negative).toBe(-100); + }); + + it("should handle empty object", function() { + var body = '{}'; + var result = deserializer.getFromJson(body); + expect(result).toBeStruct(); + expect(structIsEmpty(result)).toBeTrue(); + }); + + it("should wrap non-struct JSON in _body key", function() { + // When JSON is an array at root level, wrap it + var body = '[1,2,3]'; + var result = deserializer.getFromJson(body); + expect(structKeyExists(result, "_body")).toBeTrue(); + expect(result._body).toBeArray(); + }); + + it("should wrap primitive JSON values in _body key", function() { + var body = '"just a string"'; + var result = deserializer.getFromJson(body); + expect(structKeyExists(result, "_body")).toBeTrue(); + expect(result._body).toBe("just a string"); + }); + + it("should handle complex nested structures", function() { + var body = '{ + "users": [ + {"id": 1, "name": "John", "roles": ["admin", "user"]}, + {"id": 2, "name": "Jane", "roles": ["user"]} + ], + "metadata": { + "total": 2, + "page": 1 + } + }'; + var result = deserializer.getFromJson(body); + expect(result.users).toBeArray(); + expect(arrayLen(result.users)).toBe(2); + expect(result.users[1].roles).toBeArray(); + expect(result.metadata.total).toBe(2); + }); + + it("should handle unicode characters", function() { + var body = '{"message":"Hello \u4e16\u754c"}'; + var result = deserializer.getFromJson(body); + expect(structKeyExists(result, "message")).toBeTrue(); + }); + + }); + + describe("taffy:mime metadata", function() { + + it("should have taffy:mime for application/json", function() { + var metadata = getMetadata(deserializer); + var func = ""; + for (var f in metadata.functions) { + if (f.name == "getFromJson") { + func = f; + break; + } + } + expect(func).notToBeEmpty(); + var hasMime = structKeyExists(func, "taffy:mime") + || structKeyExists(func, "taffy_mime"); + expect(hasMime).toBeTrue(); + + // Check the actual mime types + var mimeValue = structKeyExists(func, "taffy:mime") + ? func["taffy:mime"] + : func["taffy_mime"]; + expect(mimeValue).toInclude("application/json"); + }); + + }); + + }); + + } + +} diff --git a/v1/taffy/tests/specs/unit/NativeJsonSerializerSpec.cfc b/v1/taffy/tests/specs/unit/NativeJsonSerializerSpec.cfc new file mode 100644 index 0000000..3b863ab --- /dev/null +++ b/v1/taffy/tests/specs/unit/NativeJsonSerializerSpec.cfc @@ -0,0 +1,205 @@ +component extends="testbox.system.BaseSpec" { + + function beforeAll() { + // Initialize application scope with minimal settings + application._taffy = { + settings: { + serializer: "core.nativeJsonSerializer", + noDataSends204NoContent: false + }, + factory: new core.factory(), + compat: { + queryToArray: "missing", + queryToStruct: "missing" + } + }; + } + + function run() { + + describe("NativeJsonSerializer", function() { + + beforeEach(function() { + variables.serializer = new core.nativeJsonSerializer(); + }); + + describe("inheritance", function() { + + it("should extend baseSerializer", function() { + expect(new tests.helpers.MetadataHelper().extendsClass(serializer, "baseSerializer")).toBeTrue(); + }); + + it("should have all baseSerializer methods", function() { + expect(serializer).toHaveKey("setData"); + expect(serializer).toHaveKey("getData"); + expect(serializer).toHaveKey("withStatus"); + expect(serializer).toHaveKey("withHeaders"); + expect(serializer).toHaveKey("noData"); + expect(serializer).toHaveKey("noContent"); + }); + + }); + + describe("getAsJson()", function() { + + it("should serialize simple string to JSON", function() { + serializer.setData("Hello World"); + var result = serializer.getAsJson(); + expect(result).toBe('"Hello World"'); + }); + + it("should serialize struct to JSON", function() { + serializer.setData({ name: "Test", value: 123 }); + var result = serializer.getAsJson(); + var parsed = deserializeJSON(result); + expect(parsed.name).toBe("Test"); + expect(parsed.value).toBe(123); + }); + + it("should serialize array to JSON", function() { + serializer.setData([1, 2, 3]); + var result = serializer.getAsJson(); + var parsed = deserializeJSON(result); + expect(parsed).toBeArray(); + expect(arrayLen(parsed)).toBe(3); + }); + + it("should serialize nested structures to JSON", function() { + serializer.setData({ + user: { + name: "John", + roles: ["admin", "user"] + }, + active: true + }); + var result = serializer.getAsJson(); + var parsed = deserializeJSON(result); + expect(parsed.user.name).toBe("John"); + expect(parsed.user.roles).toBeArray(); + expect(parsed.active).toBeTrue(); + }); + + it("should serialize boolean values correctly", function() { + serializer.setData({ active: true, deleted: false }); + var result = serializer.getAsJson(); + var parsed = deserializeJSON(result); + expect(parsed.active).toBeTrue(); + expect(parsed.deleted).toBeFalse(); + }); + + it("should serialize null values", function() { + serializer.setData({ value: javacast("null", "") }); + var result = serializer.getAsJson(); + expect(result).toInclude("null"); + }); + + it("should handle empty struct", function() { + serializer.setData({}); + var result = serializer.getAsJson(); + expect(result).toBe("{}"); + }); + + it("should handle empty array", function() { + serializer.setData([]); + var result = serializer.getAsJson(); + expect(result).toBe("[]"); + }); + + it("should handle numeric values", function() { + serializer.setData({ + integer: 42, + decimal: 3.14, + negative: -100 + }); + var result = serializer.getAsJson(); + var parsed = deserializeJSON(result); + expect(parsed.integer).toBe(42); + expect(parsed.decimal).toBe(3.14); + expect(parsed.negative).toBe(-100); + }); + + }); + + describe("taffy:mime metadata", function() { + + it("should have taffy:mime metadata for application/json", function() { + var metadata = getMetadata(serializer); + var getAsJsonFunc = ""; + for (var func in metadata.functions) { + if (func.name == "getAsJson") { + getAsJsonFunc = func; + break; + } + } + expect(getAsJsonFunc).notToBeEmpty(); + var hasMime = structKeyExists(getAsJsonFunc, "taffy:mime") + || structKeyExists(getAsJsonFunc, "taffy_mime"); + expect(hasMime).toBeTrue(); + }); + + it("should be marked as default serializer", function() { + var metadata = getMetadata(serializer); + var getAsJsonFunc = ""; + for (var func in metadata.functions) { + if (func.name == "getAsJson") { + getAsJsonFunc = func; + break; + } + } + var hasDefault = structKeyExists(getAsJsonFunc, "taffy:default") + || structKeyExists(getAsJsonFunc, "taffy_default"); + expect(hasDefault).toBeTrue(); + }); + + }); + + describe("encode.string helper", function() { + + it("should force numeric strings to serialize as strings", function() { + // The forceString function adds chr(2) which is then stripped by getAsJson + // This ensures numeric-looking strings serialize as strings, not numbers + var resource = new core.resource(); + var forcedString = resource.forceString("12345"); + + // The chr(2) prefix forces CF to treat this as a string during serialization + expect(left(forcedString, 1)).toBe(chr(2)); + + // When serialized via nativeJsonSerializer, the chr(2) is stripped + serializer.setData({ value: forcedString }); + var result = serializer.getAsJson(); + // The value should be serialized as a string (with quotes), not a number + expect(result).toInclude('"'); + }); + + }); + + describe("combined operations", function() { + + it("should work with setData and status code", function() { + serializer.setData({ error: "Not found" }).withStatus(404); + var result = serializer.getAsJson(); + var parsed = deserializeJSON(result); + expect(parsed.error).toBe("Not found"); + expect(serializer.getStatus()).toBe(404); + }); + + it("should work with setData, status, and headers", function() { + serializer + .setData({ created: true }) + .withStatus(201) + .withHeaders({ "Location": "/items/123" }); + + var result = serializer.getAsJson(); + var parsed = deserializeJSON(result); + expect(parsed.created).toBeTrue(); + expect(serializer.getStatus()).toBe(201); + expect(serializer.getHeaders()["Location"]).toBe("/items/123"); + }); + + }); + + }); + + } + +} diff --git a/v1/taffy/tests/specs/unit/OpenApiSpec.cfc b/v1/taffy/tests/specs/unit/OpenApiSpec.cfc new file mode 100644 index 0000000..9b3146a --- /dev/null +++ b/v1/taffy/tests/specs/unit/OpenApiSpec.cfc @@ -0,0 +1,132 @@ +component extends="testbox.system.BaseSpec" { + + function beforeAll() { + variables.gen = new core.openapi(); + makePublic(variables.gen, "normalizePathTemplate"); + makePublic(variables.gen, "cfmlTypeToSchema"); + makePublic(variables.gen, "buildOperation"); + } + + function run() { + + describe("openapi generator", function() { + + describe("normalizePathTemplate", function() { + + it("leaves simple paths untouched", function() { + expect(gen.normalizePathTemplate("/users", [])).toBe("/users"); + }); + + it("leaves {name} tokens untouched", function() { + expect(gen.normalizePathTemplate("/users/{id}", ["id"])).toBe("/users/{id}"); + }); + + it("strips {name:regex} down to {name}", function() { + expect(gen.normalizePathTemplate("/users/{id:[0-9]+}", ["id"])).toBe("/users/{id}"); + }); + + it("strips greedy regex like {name:.+}", function() { + expect(gen.normalizePathTemplate("/files/{path:.+}", ["path"])).toBe("/files/{path}"); + }); + + it("handles nested braces in token regexes", function() { + expect(gen.normalizePathTemplate("/a/{b:[a-z]+(?:42){1}}", ["b"])).toBe("/a/{b}"); + }); + + it("rewrites multiple tokens in order", function() { + expect(gen.normalizePathTemplate("/events/{eventId:\d+}/attendees/{personId}", ["eventId", "personId"])) + .toBe("/events/{eventId}/attendees/{personId}"); + }); + + }); + + describe("cfmlTypeToSchema", function() { + + it("maps numeric to number", function() { + expect(gen.cfmlTypeToSchema("numeric")).toBe({ "type": "number" }); + }); + + it("maps boolean to boolean", function() { + expect(gen.cfmlTypeToSchema("boolean")).toBe({ "type": "boolean" }); + }); + + it("maps date to string/date-time", function() { + expect(gen.cfmlTypeToSchema("date")).toBe({ "type": "string", "format": "date-time" }); + }); + + it("maps uuid to string/uuid", function() { + expect(gen.cfmlTypeToSchema("uuid")).toBe({ "type": "string", "format": "uuid" }); + }); + + it("returns empty schema for 'any'", function() { + expect(gen.cfmlTypeToSchema("any")).toBe({}); + }); + + it("returns empty schema for unset type", function() { + expect(gen.cfmlTypeToSchema("")).toBe({}); + }); + + }); + + describe("buildOperation — path param handling", function() { + + // minimal fixtures + var mkEndpoint = function(beanName, srcUri, tokens, methods) { + return { beanName: beanName, srcUri: srcUri, tokens: tokens, methods: methods }; + }; + var mkFunc = function(name, parameters = []) { + return { name: name, parameters: parameters }; + }; + + it("backfills path tokens not declared as function args", function() { + var endpoint = mkEndpoint("MyResource", "/items/{id}", ["id"], { get: "get" }); + var func = mkFunc("get", []); // function declares NO args + var op = gen.buildOperation("get", func, endpoint, {}, ["application/json"]); + + expect(op).toHaveKey("parameters"); + expect(arrayLen(op.parameters)).toBe(1); + expect(op.parameters[1].name).toBe("id"); + expect(op.parameters[1]["in"]).toBe("path"); + expect(op.parameters[1].required).toBeTrue(); + }); + + it("uses token's original case when arg casing differs", function() { + var endpoint = mkEndpoint("AttendeesResource", "/attendees/{personId}", ["personId"], { put: "put" }); + // simulate CFML metadata that lowercased the arg name + var func = mkFunc("put", [ { name: "personid", type: "numeric", required: true } ]); + var op = gen.buildOperation("put", func, endpoint, {}, ["application/json"]); + + expect(op.parameters[1].name).toBe("personId"); + expect(op.parameters[1]["in"]).toBe("path"); + expect(op.parameters[1].schema).toBe({ "type": "number" }); + }); + + it("puts non-token args for GET into query", function() { + var endpoint = mkEndpoint("ItemsResource", "/items", [], { get: "get" }); + var func = mkFunc("get", [ { name: "limit", type: "numeric", required: false } ]); + var op = gen.buildOperation("get", func, endpoint, {}, ["application/json"]); + + expect(op.parameters[1].name).toBe("limit"); + expect(op.parameters[1]["in"]).toBe("query"); + expect(op.parameters[1].required).toBeFalse(); + }); + + it("puts non-token args for POST into requestBody with both json + form", function() { + var endpoint = mkEndpoint("ItemsResource", "/items", [], { post: "post" }); + var func = mkFunc("post", [ { name: "name", type: "string", required: true } ]); + var op = gen.buildOperation("post", func, endpoint, {}, ["application/json"]); + + expect(op).toHaveKey("requestBody"); + expect(op.requestBody.content).toHaveKey("application/json"); + expect(op.requestBody.content).toHaveKey("application/x-www-form-urlencoded"); + expect(op.requestBody.content["application/json"].schema.properties).toHaveKey("name"); + expect(op.requestBody.content["application/json"].schema.required).toBe(["name"]); + }); + + }); + + }); + + } + +} diff --git a/v1/taffy/tests/specs/unit/ResourceSpec.cfc b/v1/taffy/tests/specs/unit/ResourceSpec.cfc new file mode 100644 index 0000000..1929e3d --- /dev/null +++ b/v1/taffy/tests/specs/unit/ResourceSpec.cfc @@ -0,0 +1,207 @@ +component extends="testbox.system.BaseSpec" { + + function beforeAll() { + // Initialize application scope with minimal settings + application._taffy = { + settings: { + serializer: "core.nativeJsonSerializer", + noDataSends204NoContent: false + }, + factory: new core.factory(), + compat: { + queryToArray: "missing", + queryToStruct: "missing" + } + }; + + // Create sample data fixture + variables.sampleData = new tests.fixtures.SampleData(); + } + + function run() { + + describe("Resource", function() { + + beforeEach(function() { + variables.resource = new core.resource(); + }); + + describe("rep() / representationOf()", function() { + + it("should return a serializer instance with data", function() { + var result = resource.rep({ message: "test" }); + expect(new tests.helpers.MetadataHelper().extendsClass(result, "baseSerializer")).toBeTrue(); + expect(result.getData().message).toBe("test"); + }); + + it("rep() should be alias for representationOf()", function() { + var data = { id: 123 }; + var rep1 = resource.rep(data); + // Both should return serializer instances with same data + expect(rep1.getData().id).toBe(123); + }); + + it("should work with simple string data", function() { + var result = resource.rep("Hello World"); + expect(result.getData()).toBe("Hello World"); + }); + + it("should work with array data", function() { + var result = resource.rep([1, 2, 3]); + expect(result.getData()).toBeArray(); + expect(arrayLen(result.getData())).toBe(3); + }); + + it("should work with nested struct data", function() { + var data = { + user: { name: "John", age: 30 }, + roles: ["admin", "user"] + }; + var result = resource.rep(data); + expect(result.getData().user.name).toBe("John"); + expect(result.getData().roles).toBeArray(); + }); + + }); + + describe("encode.string()", function() { + + it("should add control character prefix to force string serialization", function() { + // forceString is public (no access modifier), encode.string is just a reference to it + var result = resource.forceString("12345"); + expect(left(result, 1)).toBe(chr(2)); + }); + + it("should preserve the original value after prefix", function() { + var result = resource.forceString("12345"); + expect(right(result, 5)).toBe("12345"); + }); + + it("should work with numeric-looking strings", function() { + var result = resource.forceString("00123"); + expect(len(result)).toBe(6); // chr(2) + "00123" + }); + + }); + + describe("qToArray() - internal query to array conversion", function() { + + beforeEach(function() { + makePublic(resource, "qToArray"); + }); + + it("should convert query to array of structs", function() { + var q = sampleData.getSampleQuery(); + var result = resource.qToArray(q); + expect(result).toBeArray(); + expect(arrayLen(result)).toBe(3); + }); + + it("should preserve column values in structs", function() { + var q = sampleData.getSampleQuery(); + var result = resource.qToArray(q); + // Find the row with id=1 + var found = false; + for (var row in result) { + if (row.id == 1) { + expect(row.name).toBe("John Doe"); + expect(row.email).toBe("john@example.com"); + found = true; + break; + } + } + expect(found).toBeTrue(); + }); + + it("should handle empty query", function() { + var q = queryNew("id,name", "integer,varchar"); + var result = resource.qToArray(q); + expect(result).toBeArray(); + expect(arrayLen(result)).toBe(0); + }); + + it("should support callback function for row transformation", function() { + var q = sampleData.getSingleRowQuery(); + var result = resource.qToArray(q, function(row) { + row.transformed = true; + return row; + }); + expect(result[1].transformed).toBeTrue(); + }); + + }); + + describe("qToStruct() - internal query to struct conversion", function() { + + beforeEach(function() { + makePublic(resource, "qToStruct"); + }); + + it("should convert single-row query to struct", function() { + var q = sampleData.getSingleRowQuery(); + var result = resource.qToStruct(q); + expect(result).toBeStruct(); + expect(result.id).toBe(1); + expect(result.name).toBe("Test User"); + }); + + it("should throw error for multi-row query", function() { + var q = sampleData.getSampleQuery(); // Has 3 rows + expect(function() { + resource.qToStruct(q); + }).toThrow(); + }); + + it("should handle query with all column types", function() { + var q = sampleData.getSingleRowQuery(); + var result = resource.qToStruct(q); + expect(structKeyExists(result, "id")).toBeTrue(); + expect(structKeyExists(result, "name")).toBeTrue(); + expect(structKeyExists(result, "email")).toBeTrue(); + }); + + it("should support callback function for value transformation", function() { + var q = sampleData.getSingleRowQuery(); + var result = resource.qToStruct(q, function(colName, value) { + if (colName == "name") { + return uCase(value); + } + return value; + }); + expect(result.name).toBe("TEST USER"); + }); + + }); + + describe("method chaining with rep()", function() { + + it("should support chaining with withStatus()", function() { + var result = resource.rep({ created: true }).withStatus(201); + expect(result.getStatus()).toBe(201); + expect(result.getData().created).toBeTrue(); + }); + + it("should support chaining with withHeaders()", function() { + var result = resource.rep({ data: "test" }) + .withHeaders({ "X-Custom": "value" }); + expect(result.getHeaders()["X-Custom"]).toBe("value"); + }); + + it("should support full fluent chain", function() { + var result = resource.rep({ id: 123 }) + .withStatus(201, "Created") + .withHeaders({ "Location": "/items/123" }); + + expect(result.getData().id).toBe(123); + expect(result.getStatus()).toBe(201); + expect(result.getStatusText()).toBe("Created"); + expect(result.getHeaders()["Location"]).toBe("/items/123"); + }); + + }); + + }); + + } + +} diff --git a/v1/taffy/tests/testapi/Application.cfc b/v1/taffy/tests/testapi/Application.cfc new file mode 100644 index 0000000..ba94d84 --- /dev/null +++ b/v1/taffy/tests/testapi/Application.cfc @@ -0,0 +1,27 @@ +component extends="taffy.core.api" { + + this.name = "TaffyE2ETestAPI_" & hash(getCurrentTemplatePath()); + this.sessionManagement = false; + + variables.testApiPath = getDirectoryFromPath(getCurrentTemplatePath()); + variables.rootPath = getDirectoryFromPath(left(variables.testApiPath, len(variables.testApiPath) - 1)); + variables.rootPath = getDirectoryFromPath(left(variables.rootPath, len(variables.rootPath) - 1)); + + this.mappings["/taffy"] = variables.rootPath; + this.mappings["/resources"] = variables.testApiPath & "resources"; + + variables.framework = { + disableDashboard: true, + disabledDashboardRedirect: "", + returnExceptionsAsJson: true + }; + + function onApplicationStart() { + return super.onApplicationStart(); + } + + function onRequestStart(targetPath) { + return super.onRequestStart(targetPath); + } + +} diff --git a/v1/taffy/tests/testapi/index.cfm b/v1/taffy/tests/testapi/index.cfm new file mode 100644 index 0000000..477ffa0 --- /dev/null +++ b/v1/taffy/tests/testapi/index.cfm @@ -0,0 +1 @@ + diff --git a/v1/taffy/tests/testapi/resources/EchoMemberResource.cfc b/v1/taffy/tests/testapi/resources/EchoMemberResource.cfc new file mode 100644 index 0000000..93df1a6 --- /dev/null +++ b/v1/taffy/tests/testapi/resources/EchoMemberResource.cfc @@ -0,0 +1,17 @@ +component extends="taffy.core.resource" taffy:uri="/echo/{id}" output="false" { + + function get(required string id) output="false" { + return rep({ method: "GET", id: arguments.id }); + } + + function put(required string id, string name = "") output="false" { + return rep({ method: "PUT", id: arguments.id, name: arguments.name }); + } + + function delete(required string id) output="false" { + return rep({ method: "DELETE", id: arguments.id }) + .withStatus(200) + .withHeaders({ "X-Deleted-Id": arguments.id }); + } + +} diff --git a/v1/taffy/tests/testapi/resources/EchoMultiTokenResource.cfc b/v1/taffy/tests/testapi/resources/EchoMultiTokenResource.cfc new file mode 100644 index 0000000..0f67906 --- /dev/null +++ b/v1/taffy/tests/testapi/resources/EchoMultiTokenResource.cfc @@ -0,0 +1,7 @@ +component extends="taffy.core.resource" taffy:uri="/echo/{parentId}/child/{childId}" output="false" { + + function get(required string parentId, required string childId) output="false" { + return rep({ method: "GET", parentId: arguments.parentId, childId: arguments.childId }); + } + +} diff --git a/v1/taffy/tests/testapi/resources/EchoResource.cfc b/v1/taffy/tests/testapi/resources/EchoResource.cfc new file mode 100644 index 0000000..8b171dc --- /dev/null +++ b/v1/taffy/tests/testapi/resources/EchoResource.cfc @@ -0,0 +1,12 @@ +component extends="taffy.core.resource" taffy:uri="/echo" output="false" { + + function get() output="false" { + return rep({ method: "GET", message: "echo" }); + } + + function post(string name = "" taffy_minlength="1" taffy_maxlength="255", string value = "" taffy_maxlength="500") output="false" { + return rep({ method: "POST", name: arguments.name, value: arguments.value }) + .withStatus(201); + } + +} diff --git a/v1/taffy/tests/tests/Application.cfc b/v1/taffy/tests/tests/Application.cfc deleted file mode 100644 index eda8f78..0000000 --- a/v1/taffy/tests/tests/Application.cfc +++ /dev/null @@ -1,29 +0,0 @@ - - - - - - - - - - - - - - - //remove bugLogHQ Application.cfc so we can override datasource definition - if (fileExists("#this.parentDirectory#/BugLogHQ/Application.cfc")) { - fileDelete("#this.parentDirectory#/BugLogHQ/Application.cfc"); - } - - - - - - - - - - - diff --git a/v1/taffy/tests/tests/DirectoryTestSuite.cfc b/v1/taffy/tests/tests/DirectoryTestSuite.cfc deleted file mode 100644 index 5f58a86..0000000 --- a/v1/taffy/tests/tests/DirectoryTestSuite.cfc +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - var explorer = createObject("component", "CFIDE.componentutils.cfcexplorer"); - var target = explorer.normalizePath(arguments.path); - var cfcs = explorer.getcfcs(refreshCache); //true == refresh cache - var cfc = ""; - var i = 1 ; - var package = ""; - var cfcpath = ""; - - for(i = 1; i lte arraylen(cfcs); i = i+1){ - cfc = cfcs[i]; - //Assumes that CF always stores path info with fwd slash - //and strip last element to get path. - cfcpath = ListDeleteAt(cfc.path, listlen(cfc.path,"/"), "/"); - - //Array of structs. Doesn't seem possible to do binary search - if(cfcpath eq target){ - - package = cfc.package; - break; - } - } - - return package; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/v1/taffy/tests/tests/HttpAntRunner.cfc b/v1/taffy/tests/tests/HttpAntRunner.cfc deleted file mode 100644 index bb09dfe..0000000 --- a/v1/taffy/tests/tests/HttpAntRunner.cfc +++ /dev/null @@ -1,92 +0,0 @@ - - - - - - - - - - - - - - - - if(arguments.type is "testcase"){ - suite = createObject("component","mxunit.framework.TestSuite").TestSuite(); - suite.addAll(arguments.value); - results = suite.run(); - } - if(arguments.type is "dir"){ - //To Do: add args for recursion, includes, and excludes - if(not isBoolean(arguments.recurse)){ - arguments.recurse = false; - } - - results = createObject("component","DirectoryTestSuite").run(directory=arguments.value, componentPath=arguments.componentPath, recurse=arguments.recurse, excludes=arguments.excludes); - } - //package name for JUnit reports - results.setPackage(arguments.packagename); - - - - - - - - - - - - - - - #trim(arguments.results.getHTMLResults())# - - - #trim(arguments.results.getXMLResults())# - - - #trim(arguments.results.getJUnitXMLResults())# - - #trim(arguments.results.getJUnitXMLResults())# - - - - - - - - - - - - - - - - - if(arguments.type is "testcase"){ - suite = createObject("component","mxunit.framework.TestSuite").TestSuite(); - suite.addAll(arguments.value); - results = suite.run(); - } - if(arguments.type is "dir"){ - //To Do: add args for recursion, includes, and excludes - if(not isBoolean(arguments.recurse)){ - arguments.recurse = false; - } - - results = createObject("component","DirectoryTestSuite").run(directory=arguments.value, componentPath=arguments.componentPath, recurse=arguments.recurse, excludes=arguments.excludes); - } - //package name for JUnit reports - results.setPackage(arguments.packagename); - - - - - - - \ No newline at end of file diff --git a/v1/taffy/tests/tests/RemoteFacade.cfc b/v1/taffy/tests/tests/RemoteFacade.cfc deleted file mode 100644 index 43cefa9..0000000 --- a/v1/taffy/tests/tests/RemoteFacade.cfc +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/v1/taffy/tests/tests/TestConflict.cfc b/v1/taffy/tests/tests/TestConflict.cfc deleted file mode 100644 index a24ea62..0000000 --- a/v1/taffy/tests/tests/TestConflict.cfc +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - function beforeTests(){ - variables.taffy = createObject("component","taffy.tests.Application"); - makePublic(variables.taffy, "getBeanFactory"); - variables.factory = variables.taffy.getBeanFactory(); - variables.factory.loadBeansFromPath( expandPath('/taffy/tests/resourcesConflict'), 'taffy.tests.resourcesConflict', expandPath('/taffy/tests/resourcesConflict'), true, variables.taffy); - - } - - function test_conflicting_URIs_get_skipped() { - assertTrue(checkIfOneSkippedRessourceContainsExpectedException("errorCode", "taffy.resources.DuplicateUriPattern"), "Conflicting URIs not showing in errors"); - } - - - - diff --git a/v1/taffy/tests/tests/TestCore.cfc b/v1/taffy/tests/tests/TestCore.cfc deleted file mode 100644 index f72cd94..0000000 --- a/v1/taffy/tests/tests/TestCore.cfc +++ /dev/null @@ -1,645 +0,0 @@ - - - - - - - - function beforeTests(){ - variables.taffy = createObject("component","taffy.tests.Application"); - makePublic(variables.taffy, "getBeanFactory"); - variables.factory = variables.taffy.getBeanFactory(); - variables.factory.loadBeansFromPath( expandPath('/taffy/tests/resources'), 'taffy.tests.resources', expandPath('/taffy/tests/resources'), true ); - } - - function test_properly_notifies_unimplemented_mimes(){ - makePublic(variables.taffy, "mimeSupported"); - // debug(variables.taffy); - // debug(application); - assertFalse(taffy.mimeSupported("DoesNotExist"), "When given a mime type that should not exist, Taffy reported that it did."); - } - - function test_properly_notifies_implemented_mimes(){ - makePublic(variables.taffy, "mimeSupported"); - makePublic(variables.taffy, "inspectMimeTypes"); - variables.taffy.inspectMimeTypes('taffy.core.nativeJsonSerializer', variables.taffy.getBeanFactory()); - assertTrue(taffy.mimeSupported("json")); - assertTrue(taffy.mimeSupported("text/json")); - assertTrue(taffy.mimeSupported("application/json")); - } - - function test_returns_access_control_expose_headers_header(){ - local.result = apiCall("get", "/echo/foo.json", ""); - - assertTrue(structKeyExists(local.result.responseHeader, "Access-Control-Expose-Headers")); - debug(local.result.responseHeader["Access-Control-Expose-Headers"]); - assertTrue(findNoCase("Etag", local.result.responseHeader["Access-Control-Expose-Headers"])); - } - - function test_returns_etag_header(){ - //both requests should yield the same etag header - local.result = apiCall("get", "/echo/foo.json", ""); - local.result2 = apiCall("get", "/echo/foo.json", ""); - - assertTrue(structKeyExists(local.result.responseHeader, "Etag")); - assertTrue(structKeyExists(local.result2.responseHeader, "Etag")); - assertEquals(local.result2.responseHeader.etag, local.result.responseHeader.etag); - } - - function test_returns_304_when_not_modified(){ - local.result = apiCall("get", "/echo/foo.json", ""); - assertTrue(structKeyExists(local.result.responseHeader, "Etag")); - - local.h = {}; - local.h['if-none-match'] = local.result.responseHeader.etag; - local.result = apiCall("get", "/echo/foo.json", "", local.h); - debug(local.result); - assertEquals(304, val(local.result.responseHeader.status_code)); - } - - function test_json_result_is_json(){ - local.result = apiCall ("get","/echo/2.json","bar=foo"); - // debug(local.result); - assertTrue(isJson(local.result.fileContent), "Expected JSON content back but was not able to identify it as such."); - } - - function test_custom_status_is_returned(){ - local.result = apiCall("get", "/echo/1.json?foo=bar", ""); - // debug(local.result); - // debug(application); - assertEquals(999, local.result.responseHeader.status_code, "Expected status code 999 but got something else."); - } - - function test_custom_headers_work(){ - local.result = apiCall("get", "/echo/-1.json", ""); - // debug(local.result); - assertTrue(structKeyExists(local.result.responseHeader, "x-dude"), "Expected response header `x-dude` but it was not included."); - } - - function test_global_headers_work(){ - local.result = apiCall("get", "/echo/1.json", ""); - // debug(local.result); - assertTrue(structKeyExists(local.result.responseHeader, "x-foo-globalheader"), "Expected response header `x-foo-globalheader` but it was not included."); - } - - function test_deserializer_inspection_finds_all_content_types(){ - makePublic(variables.taffy, "getSupportedContentTypes"); - local.result = variables.taffy.getSupportedContentTypes("taffy.core.baseDeserializer"); - // debug(local.result); - assertTrue(structKeyExists(local.result, "application/x-www-form-urlencoded")); - local.result = variables.taffy.getSupportedContentTypes("taffy.core.nativeJsonDeserializer"); - // debug(local.result); - assertTrue(structKeyExists(local.result, "application/json")); - assertTrue(structKeyExists(local.result, "text/json")); - assertTrue(structKeyExists(local.result, "application/x-www-form-urlencoded")); - } - - function test_deserializer_support_detection_works(){ - makePublic(variables.taffy, "contentTypeIsSupported"); - // debug(application._taffy.contentTypes); - assertTrue(variables.taffy.contentTypeIsSupported("application/json")); - assertTrue(variables.taffy.contentTypeIsSupported("application/json;v=1")); - assertFalse(variables.taffy.contentTypeIsSupported("application/does-not-exist")); - } - - function test_uri_regexes_are_correct(){ - makePublic(variables.taffy, "convertURItoRegex"); - - local.result = taffy.convertURItoRegex("/a/{abc}/b"); - // debug(local.result); - assertEquals( "^/a/([^\/]+)/b((?:\.)[^\.\?\/]+)?\/?$", local.result["uriregex"], "Resulted regex did not match expected. (assert 1)"); - assertEquals( 1, arrayLen(local.result["tokens"]), "assert 2" ); - assertEquals( "abc", local.result["tokens"][1], "assert 3" ); - - local.result2 = taffy.convertURItoRegex("/a/{abc}"); - // debug(local.result2); - assertEquals( "^/a/(?:(?:([^\/\.]+)(?:\.)([a-za-z0-9]+))\/?|([^\/\.]+))((?:\.)[^\.\?\/]+)?\/?$", local.result2["uriregex"], "Resulted regex did not match expected."); - assertEquals( 1, arrayLen(local.result2["tokens"]) ); - assertEquals( "abc", local.result2["tokens"][1] ); - - //custom regexes for tokens - local.result3 = taffy.convertURItoRegex("/a/{b:[a-z]+(?:42){1}}"); - // debug(local.result3); - assertEquals( "^/a/([a-z]+(?:42){1})((?:\.)[^\.\?\/]+)?\/?$", local.result3["uriregex"], "Resulted regex did not match expected. (assert 7)"); - assertEquals( 1, arrayLen(local.result3["tokens"]), "assert 8" ); - assertEquals( "b", local.result3["tokens"][1], "assert 9" ); - - local.result4 = taffy.convertURItoRegex("/a/{b:[0-4]{1,7}(?:aaa){1}}/c/{d:\d+}"); - // debug(local.result4); - assertEquals( "^/a/([0-4]{1,7}(?:aaa){1})/c/(\d+)((?:\.)[^\.\?\/]+)?\/?$", local.result4["uriregex"], "Resulted regex did not match expected. (assert 10)"); - assertEquals( 2, arrayLen(local.result4["tokens"]), "assert 11" ); - assertEquals( "b", local.result4["tokens"][1], "assert 12" ); - assertEquals( "d", local.result4["tokens"][2], "assert 13" ); - } - - function test_uri_matching_works_with_extension(){ - makePublic(variables.taffy, "matchURI"); - local.result = variables.taffy.matchURI("/echo/3.json"); - // debug(local.result); - assertEquals('^/echo/(?:(?:([^\/\.]+)(?:\.)([a-za-z0-9]+))\/?|([^\/\.]+))((?:\.)[^\.\?\/]+)?\/?$', local.result); - } - - function test_uri_matching_works_without_extension(){ - makePublic(variables.taffy, "matchURI"); - local.result = variables.taffy.matchURI("/echo/3"); - // debug(local.result); - assertEquals('^/echo/(?:(?:([^\/\.]+)(?:\.)([a-za-z0-9]+))\/?|([^\/\.]+))((?:\.)[^\.\?\/]+)?\/?$', local.result); - } - - function test_uri_matching_works_with_trailing_slash_with_extension(){ - makePublic(variables.taffy, "matchURI"); - local.result = variables.taffy.matchURI("/echo/3.json/"); - // debug(local.result); - assertEquals('^/echo/(?:(?:([^\/\.]+)(?:\.)([a-za-z0-9]+))\/?|([^\/\.]+))((?:\.)[^\.\?\/]+)?\/?$', local.result); - } - - function test_uri_matching_works_with_trailing_slash_without_extension(){ - makePublic(variables.taffy, "matchURI"); - local.result = variables.taffy.matchURI("/echo/3/"); - // debug(local.result); - assertEquals('^/echo/(?:(?:([^\/\.]+)(?:\.)([a-za-z0-9]+))\/?|([^\/\.]+))((?:\.)[^\.\?\/]+)?\/?$', local.result); - } - - function test_uri_matching_is_sorted_so_static_URIs_take_priority_over_tokens(){ - makePublic(variables.taffy, "matchURI"); - local.result = variables.taffy.matchURI("/echo/3"); - // debug(local.result); - assertEquals('^/echo/(?:(?:([^\/\.]+)(?:\.)([a-za-z0-9]+))\/?|([^\/\.]+))((?:\.)[^\.\?\/]+)?\/?$', local.result); - local.result = variables.taffy.matchURI("/echo/towel"); - // debug(local.result); - assertEquals('^/echo/towel((?:\.)[^\.\?\/]+)?\/?$', local.result); - } - - function test_request_parsing_works(){ - makePublic(variables.taffy,"buildRequestArguments"); - local.result = variables.taffy.buildRequestArguments( - regex = '/echo/([^\/\.]+)$', - tokenNamesArray = listToArray("id"), - uri = '/echo/16', - queryString = 'foo=bar&bar=foo', - headers = structNew() - ); - // debug(local.result); - assertTrue(structKeyExists(local.result, "foo") && local.result.foo == "bar", "Missing or incorrect value for key `foo`."); - assertTrue(structKeyExists(local.result, "bar") && local.result.bar == "foo", "Missing or incorrect value for key `bar`."); - assertTrue(structKeyExists(local.result, "id") && local.result.id == 16, "Missing or incorrect value for key `id`."); - } - - function test_properly_decodes_urlEncoded_put_request_body(){ - local.result = apiCall("put", "/echo/99.json", "foo=bar&check=mate"); - // debug(local.result); - if (!isJson(local.result.fileContent)){ - // debug(local.result.fileContent); - fail("Result was not JSON"); - return local.result.fileContent; - } - local.result = deserializeJSON(local.result.fileContent); - assertTrue(structKeyExists(local.result, "foo") && local.result.foo == "bar", "Missing or incorrect value for key `foo`."); - assertTrue(structKeyExists(local.result, "check") && local.result.check == "mate", "Missing or incorrect value for key `check`."); - } - - function test_properly_decodes_json_put_request_body(){ - local.result = apiCall("put", "/echo/99.json", '{"foo":"bar"}'); - // debug(local.result); - if (!isJson(local.result.fileContent)){ - fail("Result was not JSON"); - return; - } - local.result = deserializeJSON(local.result.fileContent); - // debug(local.result); - assertTrue(structKeyExists(local.result, "foo") && local.result.foo == "bar", "Missing or incorrect value for key `foo`."); - } - - function test_properly_decodes_json_post_request_body(){ - local.result = apiCall("post", "/echo/99.json", '{"foo":"bar"}'); - // debug(local.result); - if (!isJson(local.result.fileContent)){ - fail("Result was not JSON"); - return; - } - local.result = deserializeJSON(local.result.fileContent); - // debug(local.result); - assertTrue(structKeyExists(local.result, "foo") && local.result.foo == "bar", "Missing or incorrect value for key `foo`."); - } - - function test_returns_error_when_requested_mime_not_supported(){ - local.h = structNew(); - local.h['Accept'] = "application/NOPE"; - local.result = apiCall ("get","/echo/2","foo=bar", local.h); - // debug(local.result); - assertEquals(400, local.result.responseHeader.status_code); - assertEquals("Requested mime type is not supported (application/NOPE)", local.result.responseHeader.explanation); - } - - function test_extension_takes_precedence_over_accept_header(){ - local.headers = structNew(); - local.headers["Accept"] = "text/xml"; - local.result = apiCall("get","/echo/2.json","foo=bar",local.headers); - // debug(local.result); - assertEquals(999, local.result.responseHeader.status_code); - assertTrue(isJson(local.result.fileContent)); - } - - function test_allows_regex_as_final_url_value(){ - makePublic(variables.taffy, "buildRequestArguments"); - local.headers = structNew(); - local.headers.Accept = "application/json"; - local.tokenArray = arrayNew(1); - arrayAppend(local.tokenArray, "id"); - local.result = variables.taffy.buildRequestArguments( - "^/echo/([a-zA-Z0-9_\-\.\+]+@[a-zA-Z0-9_\-\.]+\.?[a-zA-Z]+)((?:\.)[^\.\?]+)?$", - local.tokenArray, - "/echo/foo@bar.com", - "", - local.headers - ); - // debug(local.result); - assertTrue(local.result._taffy_mime eq "json", "Did not detect desired return format correctly."); - - //full integration test for a@b.c.json - local.result = apiCall("get", "/echo_regex/12345.json", "", {}); - // debug(local.result); - assert(isJson(local.result.fileContent), "response was not json"); - local.response = deserializeJSON(local.result.fileContent); - assertEquals("12345", local.response.id); - - //full integration test for a@b.c (no .json, but with headers) - local.result = apiCall("get", "/echo_regex/12345", "", local.headers); - // debug(local.result); - assert(isJson(local.result.fileContent), "response was not json"); - local.response = deserializeJSON(local.result.fileContent); - assertEquals("12345", local.response.id); - } - - function test_returns_405_for_unimplemented_verbs(){ - local.result = apiCall("delete", "/echo/2.json", "foo=bar"); - // debug(local.result); - assertEquals(405, local.result.responseHeader.status_code); - } - - function test_test_onTaffyRequest_allow(){ - local.result = apiCall("get","/echo/12.json","refuse=false"); - // debug(local.result); - assertEquals(999,local.result.responseHeader.status_code); - } - - function test_onTaffyRequest_deny(){ - local.result = apiCall("get","/echo/12.json","refuse=true"); - // debug(local.result); - assertEquals(405,local.result.responseHeader.status_code); - } - - function test_getCacheKey_customBehavior() { - local.result = variables.taffy.getCacheKey( - "EchoMember", - { "foo": "bar" }, - "/echo/12.json" - ); - - assertEquals("echomember_foo", local.result); - } - - function test_getCacheKey_defaultBehavior() { - local.args = { - cfc: "EchoMember", - requestArguments: { "default": true }, - matchedURI: "/echo/12.json" - }; - - local.result = variables.taffy.getCacheKey(argumentCollection = local.args); - - // ACF and Lucee generate hash code differently - assertEquals("/echo/12.json_#local.args.requestArguments.hashCode()#", local.result); - } - - function test_external_file_request_passes_through(){ - local.result = getUrl('http://#CGI.SERVER_NAME#:#CGI.SERVER_PORT##replace(cgi.script_name, "/tests/tests/run.cfm", "/tests/someFolder/someOtherFile.cfm")#'); - debug(local.result); - assertTrue(findNoCase('woot', local.result.fileContent), "Was not able to get the DMZ file."); - } - - function test_tunnel_PUT_through_POST(){ - var local = {}; - - local.headers["X-HTTP-Method-Override"] = "PUT"; - local.result = apiCall("post","/echo/tunnel/12.json","", local.headers); - // debug(local.result); - assertEquals(200,local.result.responseHeader.status_code); - - local.deserializedContent = deserializeJSON( local.result.fileContent ); - // debug( local.deserializedContent ); - assertEquals("put", local.deserializedContent.actualMethod); - } - - function test_tunnel_DELETE_through_POST(){ - var local = {}; - - local.headers["X-HTTP-Method-Override"] = "DELETE"; - local.result = apiCall("post","/echo/tunnel/12.json","", local.headers); - // debug(local.result); - assertEquals(200,local.result.responseHeader.status_code); - - local.deserializedContent = deserializeJSON( local.result.fileContent ); - // debug( local.deserializedContent ); - assertEquals("delete", local.deserializedContent.actualMethod); - } - - function test_put_body_is_mime_content(){ - var local = {}; - - local.result = apiCall( - "put", - "/echo/12.json", - '{"foo":"The quick brown fox jumped over the lazy dog."}' - ); - // debug(local.result); - assertEquals(200,local.result.responseHeader.status_code); - - local.deserializedContent = deserializeJSON( local.result.fileContent ); - // debug( local.deserializedContent ); - - // The service response should contain only the ID parameter, and not anything parsed from the body - assertEquals("foo,id,password,username", listSort(structKeylist(local.deserializedContent), "textnocase")); - assertEquals(12, local.deserializedContent["id"]); - assertEquals("The quick brown fox jumped over the lazy dog.", local.deserializedContent["foo"]); - } - - function test_put_body_is_url_encoded_params(){ - var local = {}; - local.result = apiCall( - "put", - "/echo/12.json", - "foo=yankee&bar=hotel&baz=foxtrot" - ); - // debug(local.result); - assertEquals(200,local.result.responseHeader.status_code); - - local.deserializedContent = deserializeJSON( local.result.fileContent ); - // debug( local.deserializedContent ); - - // The service response should contain the ID parameter and all parsed form fields from the body - local.sortedKeys = listSort(structKeylist(local.deserializedContent), "textnocase"); - //because apparently railo includes fieldnames when ACF doesn't... - assertTrue("bar,baz,foo,id,password,username" eq local.sortedKeys or "bar,baz,fieldnames,foo,id,password,username" eq local.sortedKeys); - assertEquals(12, local.deserializedContent["id"]); - assertEquals("yankee", local.deserializedContent["foo"]); - assertEquals("hotel", local.deserializedContent["bar"]); - assertEquals("foxtrot", local.deserializedContent["baz"]); - } - - function test_get_queryString_keys_without_values_returns_empty_string() { - makePublic(variables.taffy, "buildRequestArguments"); - - var returnedArguments = variables.taffy.buildRequestArguments( - regex = "^/testResource/$", - tokenNamesArray = [], - uri = "/testResource/", - queryString = "keyOne=valueOne&keyTwo=&keyThree=valueThree", - headers = {} - ); - - assertEquals("", returnedArguments["keyTwo"]); - } - - function test_returns_allow_header_for_405(){ - local.result = apiCall("delete","/echo/12.json",""); - // debug(local.result); - assertEquals(405,local.result.responseHeader.status_code); - assertTrue(structKeyExists(local.result.responseHeader, "allow"),"Expected ALLOW header, but couldn't find it"); - } - - function test_returns_allow_header_for_get_200(){ - local.result = apiCall("get","/echo/tunnel/12.json",""); - // debug(local.result); - assertEquals(200,local.result.responseHeader.status_code); - assertTrue(structKeyExists(local.result.responseHeader, "allow"),"Expected ALLOW header, but couldn't find it"); - } - - function test_returns_allow_header_for_post_201(){ - local.result = apiCall("post","/echo/tunnel/12.json",""); - // debug(local.result); - assertEquals(201,local.result.responseHeader.status_code); - assertTrue(structKeyExists(local.result.responseHeader, "allow"),"Expected ALLOW header, but couldn't find it"); - } - - function test_returns_allow_header_for_put_200(){ - local.result = apiCall("put","/echo/tunnel/12.json",""); - // debug(local.result); - assertEquals(200,local.result.responseHeader.status_code); - assertTrue(structKeyExists(local.result.responseHeader, "allow"),"Expected ALLOW header, but couldn't find it"); - } - - function test_returns_allow_header_for_delete_200(){ - local.result = apiCall("delete","/echo/tunnel/12.json",""); - // debug(local.result); - assertEquals(200,local.result.responseHeader.status_code); - assertTrue(structKeyExists(local.result.responseHeader, "allow"),"Expected ALLOW header, but couldn't find it"); - } - - function test_can_pass_data_from_onTaffyRequest_to_resource(){ - local.result = apiCall("get", "/echo/dude.json", "hulk=smash"); - // debug(local.result); - local.body = deserializeJSON(local.result.fileContent); - assertTrue(structKeyExists(local.body, "dataFromOTR")); - assertTrue(local.body.dataFromOTR eq "who let the hulk out?!"); - } - - function test_reload_on_every_request_setting_works(){ - application._taffy.settings.reloadOnEveryRequest = false; - local.result = apiCall("get", "/echo/dude.json", ""); - // debug(local.result); - assertFalse(structKeyExists(local.result.responseheader, "X-TAFFY-RELOADED"), "Expected reload header to be missing, but it was sent."); - application._taffy.settings.reloadOnEveryRequest = true; - local.result2 = apiCall("get", "/echo/dude.json", ""); - // debug(local.result2); - assertTrue(structKeyExists(local.result2.responseheader, "X-TAFFY-RELOADED"), "Expected reload header to be sent, but it was missing."); - } - - function test_returns_error_when_resource_throws_exception(){ - local.result = apiCall("get", "/throwException.json", ""); - // debug(local.result); - assertEquals(500, local.result.responseHeader.status_code); - assertTrue( isJson( local.result.fileContent ), "Response body was not json" ); - } - - function test_basic_auth_credentials_found(){ - local.result = apiCall("get", "/basicauth.json", "", {}, "Towel:42"); - // debug(local.result); - assertTrue(isJson(local.result.fileContent)); - local.data = deserializeJSON(local.result.fileContent); - assertTrue(structKeyExists(local.data, "username")); - assertEquals("Towel", local.data.username); - assertTrue(structKeyExists(local.data, "password")); - assertEquals("42", local.data.password); - } - - function test_getHostname_returns_not_blank(){ - local.hostname = variables.taffy.getHostname(); - // debug(local.hostname); - assertNotEquals( "", local.hostname ); - } - - function test_envConfig_is_applied(){ - // debug( application._taffy.settings.reloadPassword ); - assertEquals( "dontpanic", application._taffy.settings.reloadPassword ); - } - - function test_use_endpointURLParam_in_GET(){ - local.result = apiCall('get','?#application._taffy.settings.endpointURLParam#=/echo/2606.json',''); - - // debug(local.result); - assertEquals(999,val(local.result.statusCode)); - } - - function test_use_endpointURLParam_in_POST(){ - local.result = apiCall('post','?#application._taffy.settings.endpointURLParam#=/echo/2606.json','bar=foo'); - - // debug(local.result); - assertEquals(200,val(local.result.statusCode)); - } - - function test_use_endpointURLParam_in_PUT(){ - local.result = apiCall('put','?#application._taffy.settings.endpointURLParam#=/echo/2606.json','bar=foo'); - - // debug(local.result); - assertEquals(200,val(local.result.statusCode)); - } - - function test_use_endpointURLParam_in_DELETE(){ - local.result = apiCall('delete','?#application._taffy.settings.endpointURLParam#=/echo/tunnel/2606.json',''); - - // debug(local.result); - assertEquals(200,val(local.result.statusCode)); - } - - function test_allows_dashboard_when_enabled(){ - var restore = application._taffy.settings.disableDashboard; - application._taffy.settings.disableDashboard = false; - local.result = apiCall("get", "/", ""); - // debug(local.result); - assertEquals(200, val(local.result.statusCode)); - - application._taffy.settings.disableDashboard = restore; - } - - function test_returns_403_at_root_when_dashboard_disabled_with_no_redirect(){ - var restore = application._taffy.settings.disableDashboard; - application._taffy.settings.disableDashboard = true; - local.result = apiCall("get", "/", ""); - // debug(local.result); - assertEquals(403, val(local.result.statusCode)); - - application._taffy.settings.disableDashboard = restore; - } - - function test_returns_302_at_root_when_dashboard_disabled_with_redirect(){ - var restore1 = application._taffy.settings.disableDashboard; - var restore2 = application._taffy.settings.disabledDashboardRedirect; - application._taffy.settings.disableDashboard = true; - application._taffy.settings.disabledDashboardRedirect = 'https://google.com'; - local.result = apiCall("get", "/", ""); - // debug(local.result); - assertEquals(302, val(local.result.statusCode)); - assertTrue(structKeyExists(local.result.responseHEader, "location")); - assertEquals(application._taffy.settings.disabledDashboardRedirect, local.result.responseHeader.location); - - application._taffy.settings.disableDashboard = restore1; - application._taffy.settings.disabledDashboardRedirect = restore2; - } - - function test_properly_returns_wrapped_jsonp(){ - application._taffy.settings.jsonp = "callback"; - local.result = apiCall("get", "/echo/dude.json?callback=zomg", ''); - // debug(local.result); - assertEquals('zomg(', left(local.result.fileContent, 5), "Does not begin with call to jsonp callback"); - assertEquals(");", right(local.result.fileContent, 2), "Does not end with `);`"); - } - - function test_properly_handles_arbitrary_cors_headers(){ - //see: https://github.com/atuttle/Taffy/issues/144 - application._taffy.settings.allowCrossDomain = true; - local.h = { "Access-Control-Request-Headers" = "goat, pigeon, man-bear-pig", "Origin":"http://#cgi.server_name#/"}; - local.result = apiCall("get", "/echo/dude.json", "", local.h); - //debug(local.result); - assertTrue(local.result.responseHeader["Access-Control-Allow-Headers"] contains "goat"); - assertTrue(local.result.responseHeader["Access-Control-Allow-Headers"] contains "pigeon"); - assertTrue(local.result.responseHeader["Access-Control-Allow-Headers"] contains "man-bear-pig"); - } - - function test_properly_handles_arbitrary_cors_headers_on_error(){ - //see: https://github.com/atuttle/Taffy/issues/159 - application._taffy.settings.allowCrossDomain = true; - local.h = { "Access-Control-Request-Headers" = "goat, pigeon, man-bear-pig", "Origin":"http://#cgi.server_name#/"}; - local.result = apiCall("get", "/throwException.json", "", local.h); - // debug(local.result); - assertTrue(structKeyExists(local.result.responseHeader, "Access-Control-Allow-Origin")); - assertTrue(structKeyExists(local.result.responseHeader, "Access-Control-Allow-Methods")); - assertTrue(structKeyExists(local.result.responseHeader, "Access-Control-Allow-Headers")); - assertTrue(local.result.responseHeader["Access-Control-Allow-Headers"] contains "goat"); - assertTrue(local.result.responseHeader["Access-Control-Allow-Headers"] contains "pigeon"); - assertTrue(local.result.responseHeader["Access-Control-Allow-Headers"] contains "man-bear-pig"); - } - - function test_non_struct_json_body_sent_to_resource_as_underscore_body(){ - //see: https://github.com/atuttle/Taffy/issues/169 - local.result = apiCall("post", "/echo/5", "[1,2,3]"); - // debug(local.result); - local.response = deserializeJSON(local.result.fileContent); - assertTrue(structKeyExists(local.response, "_body")); - assertTrue(isArray(local.response._body)); - assertTrue(arrayLen(local.response._body) == 3); - } - - function test_comma_delim_list_of_uris_for_alias(){ - - //works with /echo_alias/{ID} - local.result = apiCall("get", "/echo_alias/4", ""); - //debug(local.result); - - assertEquals(200, val(local.result.statusCode)); - assertEquals(serializeJSON({ID="4"}), local.result.fileContent); - - //works with /echo_alias - local.result = apiCall("get", "/echo_alias", ""); - // debug(local.result); - assertEquals(200, val(local.result.statusCode)); - assertEquals(serializeJSON({ID="0"}), local.result.fileContent); - - //works with /echo_alias/ (trailing slash) - local.result = apiCall("get", "/echo_alias/", ""); - // debug(local.result); - assertEquals(200, val(local.result.statusCode)); - assertEquals(serializeJSON({ID="0"}), local.result.fileContent); - - //works with /echo_alias?ID=x - local.result = apiCall("get", "/echo_alias", "ID=2"); - // debug(local.result); - assertEquals(200, val(local.result.statusCode)); - assertEquals(serializeJSON({ID="2"}), local.result.fileContent); - } - - - - - - - - - - - - - - - - - - - - - - - diff --git a/v1/taffy/tests/tests/TestDI1Factory.cfc b/v1/taffy/tests/tests/TestDI1Factory.cfc deleted file mode 100644 index 893d273..0000000 --- a/v1/taffy/tests/tests/TestDI1Factory.cfc +++ /dev/null @@ -1,94 +0,0 @@ -component extends="base" { - - - function setup(){ - reloadFramework(); - } - - function teardown() { - reloadFramework(); - } - - function beforeTests(){ - - } - - - function test_loads_directory_named_resources() { - // Setup external factory to read resource directory. Ignore resources that were designed to cause errors. - local.config = { - exclude = ["uriDoesnt","uriAliasDoesnt","conflict"] - }; - - local.beanFactory = createObject("component", "di1.ioc").init(["/taffy/tests/resources"], local.config); - - - // Setup Taffy with new bean factory to use and call 'onApplicationStart' to properly initialize. - local.taffy = createObject("component","taffy.tests.Application"); - - makePublic(local.taffy, "getExternalBeanFactory"); - makePublic(local.taffy, "getBeanListFromExternalFactory"); - - injectMethod(local.taffy, this, "_getVariables", "getVariables"); - - local.vars = local.taffy.getVariables(); - local.vars.framework.beanFactory = local.beanFactory; - - local.taffy.onApplicationStart(); - - - // Grab the resource list and compare. - local.resourceList = local.taffy.getBeanListFromExternalFactory(local.taffy.getExternalBeanFactory()); - - structDelete(local.vars.framework, "beanFactory"); - - local.taffy.onApplicationStart(); - - debug("Available resources from external factory: '" & replace(local.resourceList, ",", ", ", "all") & "'"); - assert(listLen(local.resourceList) gt 0, "No resources were loaded from the external factory."); - } - - - function test_loads_explicit_named_resources() { - // Setup external factory to read resource directory. Ignore resources that were designed to cause errors. - local.config = { - exclude = ["uriDoesnt","uriAliasDoesnt","conflict"], - omitDirectoryAliases = true - }; - - local.beanFactory = createObject("component", "di1.ioc").init(["/taffy/tests/resources"], local.config); - - - // Setup Taffy with new bean factory to use and call 'onApplicationStart' to properly initialize. - local.taffy = createObject("component","taffy.tests.Application"); - - makePublic(local.taffy, "getExternalBeanFactory"); - makePublic(local.taffy, "getBeanListFromExternalFactory"); - - injectMethod(local.taffy, this, "_getVariables", "getVariables"); - - local.vars = local.taffy.getVariables(); - - local.vars.framework.beanFactory = local.beanFactory; - - local.taffy.onApplicationStart(); - - - // Grab the resource list and compare. - debug(local.beanFactory.getBeanInfo()); - local.resourceList = local.taffy.getBeanListFromExternalFactory(local.taffy.getExternalBeanFactory()); - - structDelete(local.vars.framework, "beanFactory"); - local.taffy.onApplicationStart(); - - debug("Available resources from external factory: '" & replace(local.resourceList, ",", ", ", "all") & "'"); - - //THIS TEST CURRENTLY FAILING DUE TO https://github.com/atuttle/Taffy/issues/276 - //assert(listLen(local.resourceList) gt 0, "No resources were loaded from the external factory."); - } - - - private function _getVariables(){ - return variables; - } -} diff --git a/v1/taffy/tests/tests/TestFactory.cfc b/v1/taffy/tests/tests/TestFactory.cfc deleted file mode 100644 index 6e7d32c..0000000 --- a/v1/taffy/tests/tests/TestFactory.cfc +++ /dev/null @@ -1,101 +0,0 @@ - - - - function setup() { - reloadFramework(); - } - - - function beforeTests(){ - request["_testsRunning"] = true; - variables.taffy = createObject("component","taffy.tests.Application"); - makePublic(variables.taffy, "getBeanFactory"); - variables.factory = variables.taffy.getBeanFactory(); - //debug(variables.factory); - variables.factory.loadBeansFromPath( expandPath('/taffy/tests/resources'), 'taffy.tests.resources', expandPath('/taffy/tests/resources'), true, variables.taffy); - } - - function test_throws_on_getBean_not_exists(){ - var local = {}; - local.nonExistentBean = "does_not_exist"; - - try{ - local.result = variables.factory.getBean(local.nonExistentBean); - fail("Expected 'Bean Not Found' exception to be thrown, but none was."); - } catch (Taffy.Factory.BeanNotFound e) { - //debug(e); - assertTrue(findNoCase('not found', e.message) gt 0, "TaffyFactory exception message did not contain the words 'not found'."); - } - } - - function test_autowires_properties_in_beans(){ - variables.factory.loadBeansFromPath( expandPath('/taffy/tests/resources'), 'taffy.tests.resources', expandPath('/taffy/tests/resources'), true ); - local.bean = variables.factory.getBean( 'EchoMember' ); - // debug(local.bean); - assertTrue( structKeyExists(local.bean, "dependency1") ); - assertFalse( isSimpleValue(local.bean.dependency1) ); - } - - function test_autowires_setters_in_beans(){ - variables.factory.loadBeansFromPath( expandPath('/taffy/tests/resources'), 'taffy.tests.resources', expandPath('/taffy/tests/resources'), true ); - local.bean = variables.factory.getBean( 'EchoRegexMember' ); - // debug(local.bean); - assertTrue( structKeyExists(local.bean, "dependency2") ); - assertFalse( isSimpleValue(local.bean.dependency2) ); - } - - function test_autowires_properties_in_transients(){ - variables.factory.loadBeansFromPath( expandPath('/taffy/tests/resources'), 'taffy.tests.resources', expandPath('/taffy/tests/resources'), true ); - local.bean = variables.factory.getBean( 'CustomJsonSerializer' ); - // debug(local.bean); - assertTrue( structKeyExists(local.bean, "dependency1") ); - assertFalse( isSimpleValue(local.bean.dependency1) ); - } - - function test_autowires_setters_in_transients(){ - variables.factory.loadBeansFromPath( expandPath('/taffy/tests/resources'), 'taffy.tests.resources', expandPath('/taffy/tests/resources'), true ); - local.bean = variables.factory.getBean( 'CustomJsonSerializer' ); - // debug(local.bean); - assertTrue( structKeyExists(local.bean, "dependency2") ); - assertFalse( isSimpleValue(local.bean.dependency2) ); - } - - function test_skips_resources_with_errors(){ - variables.factory.loadBeansFromPath( expandPath('/taffy/tests/resourcesError'), 'taffy.tests.resourcesError', expandPath('/taffy/tests/resourcesError'), true ); - // debug(variables.taffy.status); - assertTrue(structKeyExists(variables.taffy.status, "skippedResources")); - } - - function test_lists_skipped_resources(){ - variables.factory.loadBeansFromPath( expandPath('/taffy/tests/resourcesError'), 'taffy.tests.resourcesError', expandPath('/taffy/tests/resourcesError'), true, variables.taffy); - debug(variables.taffy.status); - assertTrue(structKeyExists(variables.taffy.status, "skippedResources")); - assertTrue( arrayLen(variables.taffy.status.skippedResources) gt 0 ); - } - - function test_clears_skipped_resources_on_reload(){ - variables.factory.loadBeansFromPath( expandPath('/taffy/tests/resourcesError'), 'taffy.tests.resourcesError', expandPath('/taffy/tests/resourcesError'), true, variables.taffy ); - // debug(variables.taffy.status); - assertTrue(structKeyExists(variables.taffy.status, "skippedResources")); - assertTrue( arrayLen(variables.taffy.status.skippedResources) gt 0 ); - - variables.factory.loadBeansFromPath( expandPath('/taffy/tests/resources'), 'taffy.tests.resources', expandPath('/taffy/tests/resources'), true, variables.taffy ); - // debug(variables.taffy.status); - assertTrue(structKeyExists(variables.taffy.status, "skippedResources")); - assertTrue( ArrayLen(variables.taffy.status.skippedResources) eq 0, "Expected skipped resources array to be empty but it wasn't" ); - } - - function test_treats_CRCs_as_transients(){ - var local = {}; - //this resource+method explicitly sets response status of 999 - local.result = apiCall("get", "/echo/2.json", "foo=bar"); - // debug(local.result); - assertEquals(999, local.result.responseHeader.status_code); - //this resource+method usees the default response status => 200=passing test, 999=failing test - local.result = apiCall("get", "/echo/tunnel/2.json", "foo=bar"); - // debug(local.result); - assertEquals(200, local.result.responseHeader.status_code); - } - - - diff --git a/v1/taffy/tests/tests/TestLoggers.cfc b/v1/taffy/tests/tests/TestLoggers.cfc deleted file mode 100644 index c2e0edd..0000000 --- a/v1/taffy/tests/tests/TestLoggers.cfc +++ /dev/null @@ -1,63 +0,0 @@ - - - - function test_hoth(){ - var mockHoth = getMockBox().createMock(className="Hoth.HothTracker", callLogging=true); - var hothAdapter = ''; - var fakeError = {}; - var callLog = {}; - //setup the behaviors we're expecting the adapter to run - //mockHoth.track('{struct}'); - mockHoth.$('track', true); - //create hoth adapter to test - hothAdapter = createObject("component", "taffy.bonus.LogToHoth").init( - "Taffy.examples.api_Hoth.resources.HothConfig", - mockHoth - ); - - //fake error - fakeError.message = "This is a test error"; - fakeError.detail = "Rubber Baby Buggy Bumper"; - hothAdapter.saveLog(fakeError); - - callLog = mockHoth.$callLog(); - debug(callLog); - assertTrue(structKeyExists(callLog, "track"), "should call track method"); - assertTrue(isStruct(callLog.track[1][1]), "args should be a struct"); - assertEquals(callLog.track[1][1].message, fakeError.message); - - } - - function test_BugLogHQ(){ - var blhqSettings = { bugLogListener = "http://#cgi.server_name#:#cgi.server_port#/tests/BugLogHQ/listeners/bugLogListenerREST.cfm" }; - var mockBLHQ = new bugLog.client.bugLogService(argumentCollection=blhqSettings); - var blhqAdapter = ''; - var fakeError = {}; - fakeError.message = "This is a test error"; - fakeError.detail = "Rubber Baby Buggy Bumper"; - - if (structKeyExists(server, "coldfusion") && structKeyExists(server.coldfusion, "productversion")) { - if (val(listFirst(server.coldfusion.productversion)) < 11) { - //datasource definition will only work on CF11+ - return; - } - } - - - mockBLHQ.init(argumentCollection=blhqSettings); - - blhqAdapter = createObject("component", "taffy.bonus.LogToBugLogHQ").init( - config=blhqSettings, - tracker=mockBLHQ - ); - - //fake error - fakeError.message = "This is a test error"; - fakeError.detail = "Rubber Baby Buggy Bumper"; - blhqAdapter.saveLog(fakeError); - - - } - - - diff --git a/v1/taffy/tests/tests/TestRepresentations.cfc b/v1/taffy/tests/tests/TestRepresentations.cfc deleted file mode 100644 index e04c4bd..0000000 --- a/v1/taffy/tests/tests/TestRepresentations.cfc +++ /dev/null @@ -1,40 +0,0 @@ - - - function setup(){ - variables.serializer = createObject("component", "taffy.core.baseSerializer"); - } - - function test_setData_getData(){ - variables.serializer.setData(10); - assertEquals(10, variables.serializer.getData()); - } - - function test_noData_returns_empty_rep_obj(){ - local.result = variables.serializer.noData(); - local.meta = getMetaData(local.result); - // debug(local.meta); - // debug(local.result.getData()); - assertEquals('taffy.core.baseSerializer', local.meta.fullname); - assertEquals("", local.result.getData()); - } - - function test_withStatus_getStatus(){ - variables.serializer.withStatus(42); - assertEquals(42, variables.serializer.getStatus()); - } - - function test_withStatus_getStatusText(){ - variables.serializer.withStatus(404, "Not Found"); - assertEquals("Not Found", variables.serializer.getStatusText()); - variables.serializer.withStatus(418); - assertEquals("I'm a teapot", variables.serializer.getStatusText()); - } - - function test_withHeaders_getHeaders(){ - local.h = {}; - local.h['x-dude'] = 'dude!'; - variables.serializer.withHeaders(local.h); - assertEquals(true, structKeyExists(variables.serializer.getHeaders(), "x-dude")); - } - - diff --git a/v1/taffy/tests/tests/TestResource.cfc b/v1/taffy/tests/tests/TestResource.cfc deleted file mode 100644 index 1b80eef..0000000 --- a/v1/taffy/tests/tests/TestResource.cfc +++ /dev/null @@ -1,50 +0,0 @@ -component extends="base" { - - - - function beforeTests(){ - variables.taffy = createObject("component","taffy.tests.Application"); - variables.resource = createObject("component", "taffy.core.resource"); - } - - function test_representationOf_returns_repClass(){ - application._taffy.settings.serializer = "taffy.core.nativeJsonSerializer"; - makePublic(variables.resource, "representationOf"); - local.result = variables.resource.representationOf(10); - local.meta = getMetadata(local.result); - // debug(local.meta); - assertEquals(true, eventuallyInherits(local.meta, 'taffy.core.baseSerializer')); - } - - function test_queryToArray_respects_column_case(){ - makePublic(variables.resource, "queryToArray"); - local.before = QueryNew("Foo,Bar"); - queryAddRow(local.before); - querySetCell(local.before, "Foo", 42, 1); - querySetCell(local.before, "Bar", "fubar", 1); - // debug(local.before); - local.after = variables.resource.queryToArray(local.before); - // debug(local.after); - local.keyList = structKeyList(local.after[1]); - local.serialized = serializeJSON(local.after); - // debug(local.serialized); - - assertTrue( (local.keyList eq "Foo,Bar" or local.keyList eq "Bar,Foo"), 'column name case is not as expected'); - assertTrue( (local.serialized eq '[{"Foo":42,"Bar":"fubar"}]') or (local.serialized eq '[{"Bar":"fubar","Foo":42}]') ); - } - - - - /* recursive method used to check entire inheritance tree to find that a certain parent class exists somewhere within it */ - private boolean function eventuallyInherits(required struct md, required string class) { - if (structKeyExists(md, "fullname") && md.fullname eq class) { - return true; - } else { - if (structKeyExists(md, "extends")) { - return eventuallyInherits(md.extends, class); - } else { - return false; - } - } - } -} diff --git a/v1/taffy/tests/tests/base.cfc b/v1/taffy/tests/tests/base.cfc deleted file mode 100644 index 8fd5a88..0000000 --- a/v1/taffy/tests/tests/base.cfc +++ /dev/null @@ -1,83 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/v1/taffy/tests/tests/index.cfm b/v1/taffy/tests/tests/index.cfm deleted file mode 100644 index a07a3d5..0000000 --- a/v1/taffy/tests/tests/index.cfm +++ /dev/null @@ -1,10 +0,0 @@ - - - - - #results.getResultsOutput('extjs')# diff --git a/v1/taffy/tests/tests/list.cfm b/v1/taffy/tests/tests/list.cfm deleted file mode 100644 index 85d3797..0000000 --- a/v1/taffy/tests/tests/list.cfm +++ /dev/null @@ -1,19 +0,0 @@ - - - testsDir = expandPath('/Taffy/tests/tests'); - componentPath = 'Taffy.tests.tests'; - - suite = createObject('mxunit.framework.TestSuite'); - files = createObject('mxunit.runner.DirectoryTestSuite').getTests(directory=testsDir, componentPath=componentPath); - - for (i = 1; i <= arrayLen(files); i++){ - suite.addAll(files[i]); - } - - tests = suite.suites(); - - for (t in tests){ - tests[t] = tests[t].methods; - } - -#serializeJson(tests)# diff --git a/v1/taffy/tests/tests/run.cfm b/v1/taffy/tests/tests/run.cfm deleted file mode 100644 index 3fcaecc..0000000 --- a/v1/taffy/tests/tests/run.cfm +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - - -Test Environment: - - Adobe ColdFusion #server.coldfusion.productversion# - - Lucee #server.lucee.version# - - Railo #server.railo.version# - - #server.coldfusion.productname# - - on #server.os.name# #server.os.version# - - running Java #system.getProperty("java.version")# - - - - - - - - - - - - - -#r.run()# -#trim(resultOutput)# - - - - - - - - -
ReRun - - diff --git a/v1/taffy/tests/tests/upload.png b/v1/taffy/tests/tests/upload.png deleted file mode 100644 index ba88fc58ab11de8ab613f8b7acc08efde278b35a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 71315 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 BHnso& diff --git a/v1/taffy/verify/index.cfm b/v1/taffy/verify/index.cfm index 5505109..8435729 100644 --- a/v1/taffy/verify/index.cfm +++ b/v1/taffy/verify/index.cfm @@ -13,7 +13,7 @@ }catch(any e){ o("

❌ PROBLEM with #comp#

"); o("

We're having trouble locating and verifying taffy.core.api. Click to expand the error below and try to resolve it. - If you get stuck, the best place to ask for help is in the CFML Slack, + If you get stuck, the best place to ask for help is in the CFML Slack, in the ##taffy channel.

"); writeDump(var: e, label: "ERROR for #comp#", expand: false); return false;