diff --git a/.github/known_hosts b/.github/known_hosts new file mode 100644 index 0000000..e7b86a0 --- /dev/null +++ b/.github/known_hosts @@ -0,0 +1,4 @@ +104.236.66.244 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBBNiDodt9vD6R4Tkj6MjXpwWb1sYr6JMo/b8Aek4cHaPtHuyVWWVIXmF8e7H0oQCzJ4sixTePkjkf6xK31zz+1Y= +104.236.66.244 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCrINr29cQcqeVqpaBk36cQBv0tdCZ8SM7RIyW1uUHhxwRRd8RWbjGatLQhXELJGlSMLhrUf1KzfzCmXj/4L/l03TffeSDuGWJpxusTI93knKN+mWT69+IudkvIymQnCjaVio/MDOhwRLfkxE0nFGLdj8MbRJA35w/P6qbzIvwjKkHgw6VkbBS1c/4jEjsshIk+Z4P1GPiSw8lwscB8EjpZbOnhOWDYHaZUEpujdGbeIIKK31T/HSgFznEjZGuJmgLXnIf5+2h+WXrjeMljVVe613PNHrydBaR/7JxmWZIltoXyzL7ZDR9wZUQ47DumyMm07BtpQ+LZRCbeAvK+Smrt +68.183.148.118 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDCq8NG9rifxGhkfA2/E4zXluAzMneDy4iSCOoaQkOXL8IugY4gmsIN0XGM40F1/p5CxfLPVLGU6ssT4vblFaCnnbUF6c522NZhIfDKpulJaFHesdmtinyHGkPBSgOWibm0ay2dsMfWOEPc95u0/CA1oeJ/OdNh4bq4jWFbbEndQ9nIBs9wOJxBXrGMHB3GFQhuEG/vU5iqVAlp3CNdpEY4IjGLlfO63pPxEQRc6MDQ7ILr1DuolOly4me4Inh63pb13ARduWHvqqzc7jf2yhnusworUaRIbZJhYKVcoZyJ0DHglh+Y5yIv2tRVEIyL5edY8YPMAb9mxAILr9dpfUFP +68.183.148.118 ecdsa-sha2-nistp256 AAAAE2VjZHNhLXNoYTItbmlzdHAyNTYAAAAIbmlzdHAyNTYAAABBBNnXWiDC1zD8BL+LkIZfSHeZ87CPLJjHaPRltqDMlHJZXb9icnWH9yAwPu4J58CcxTTQpKVkG96q5PmvM/T1qgA= diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..fb9e80a --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,73 @@ +name: Deploy + +# Replaces Travis CI. Builds the uberjar, copies it to both engine hosts +# (api-bible-docs web + worker generator) and restarts the supervisor program. +# Requires org secret ANYCHART_BOT_KEY: the anychart-bot private key, authorized +# as root on both hosts (servers-conf SSH_KEYS). + +on: + push: + branches: [master, staging, bible] + workflow_dispatch: + +concurrency: + group: deploy-${{ github.ref_name }} + cancel-in-progress: false + +permissions: + contents: read + +env: + HOSTS: "104.236.66.244 68.183.148.118" + +jobs: + deploy: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Resolve target app + run: | + case "${GITHUB_REF_NAME}" in + master) echo "APP=docs-prod" >> "$GITHUB_ENV" ;; + staging) echo "APP=docs-stg" >> "$GITHUB_ENV" ;; + bible) echo "APP=bible-stg" >> "$GITHUB_ENV" ;; + *) echo "No deploy target for ${GITHUB_REF_NAME}"; exit 1 ;; + esac + + - uses: actions/setup-java@v4 + with: + distribution: temurin + java-version: "8" + + - uses: DeLaGuardo/setup-clojure@13.2 + with: + lein: 2.9.8 + + - uses: actions/cache@v4 + with: + path: ~/.m2 + key: m2-${{ hashFiles('project.clj') }} + restore-keys: m2- + + - name: Build uberjar + run: | + lein uberjar + + - name: Install SSH key + env: + ANYCHART_BOT_KEY: ${{ secrets.ANYCHART_BOT_KEY }} + run: | + test -n "$ANYCHART_BOT_KEY" || { echo "ANYCHART_BOT_KEY secret is not set"; exit 1; } + install -d -m 700 ~/.ssh + printf '%s\n' "$ANYCHART_BOT_KEY" > ~/.ssh/id_deploy + chmod 600 ~/.ssh/id_deploy + cp .github/known_hosts ~/.ssh/known_hosts + + - name: Copy jar and restart + run: | + SSH_OPTS="-i $HOME/.ssh/id_deploy -o IdentitiesOnly=yes -o BatchMode=yes -o StrictHostKeyChecking=yes" + for host in $HOSTS; do + scp $SSH_OPTS "target/uberjar/wiki-2.0-standalone.jar" "root@${host}:/apps/${APP}/docs-2.0-standalone.jar.new" + ssh $SSH_OPTS "root@${host}" "mv /apps/${APP}/docs-2.0-standalone.jar.new /apps/${APP}/docs-2.0-standalone.jar && supervisorctl restart ${APP} && supervisorctl status ${APP}" + done diff --git a/.travis.yml b/.travis.yml index 61b0e55..3aea333 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,6 @@ language: clojure +jdk: + - openjdk8 script: lein uberjar sudo: false branches: @@ -6,6 +8,11 @@ branches: - master - staging - bible +addons: + ssh_known_hosts: + - github.com + - 104.236.66.244 + - 68.183.148.118 cache: directories: - "$HOME/.m2" @@ -19,9 +26,7 @@ after_success: - if [ "$TRAVIS_BRANCH" == "staging" ]; then export APP="docs-stg"; fi - if [ "$TRAVIS_BRANCH" == "bible" ]; then export APP="bible-stg"; fi - echo "Deploying to $SERVER" -- mv .travis/known_hosts ~/.ssh/known_hosts - mv .travis/id_rsa.pub ~/.ssh/id_rsa.pub -- chmod 400 ~/.ssh/known_hosts - chmod 400 ~/.ssh/id_rsa - chmod 400 ~/.ssh/id_rsa.pub - ssh-add ~/.ssh/id_rsa @@ -29,6 +34,12 @@ after_success: - scp target/uberjar/wiki-2.0-standalone.jar root@68.183.148.118:/apps/$APP/docs-2.0-standalone.jar - ssh root@104.236.66.244 "supervisorctl restart $APP" - ssh root@68.183.148.118 "supervisorctl restart $APP" + notifications: - slack: - secure: GlKpceHLcrwqZ/k3hhYyAkZEE/g6Hrv/I7XwEebXt3sCExalhHP8kDDtQdEJuDlo7juz7c8yN14PCb7QBOJoYs64YR1JhYz4BNGpp4BTdEs3W22rzGJEpmrJNIL2M4YeC5st0F8tmDTcgfL/lt2yiIjyZEXrxmkg0r1HW3OP8F8= + webhooks: + urls: + - $webhook_url + on_start: always + on_success: always + on_failure: always + on_error: always diff --git a/.travis/known_hosts b/.travis/known_hosts index b3332c3..56a3491 100644 --- a/.travis/known_hosts +++ b/.travis/known_hosts @@ -1,2 +1,2 @@ -68.183.148.118 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDrtZ80jQmfkMKC1SAmsMrkBsACczPKX92XRhPcHKu7OADjS9J9sj0avbyywH/ViVPh/oQKoAkjRcqlWKge8uYuKM1+usZ4vCSWj1911pp0/tHydvdajtijOVVTs1IyWYb0AmJeauFsvaMrANI6QWul3XE7wpUcegXEIloC4se03UbhFnGwqWkpZgM+07f0bGPljiuO6YZdFUlCg0hVibfo58xEfdNKWClrMr/BFMWZzYz7FBcmyYirwRQ7xx44i6jevb4Ocpg7BsPEiaLVrwItANBONmilQhxh7q/7OolCwOX9x5J0C6oaYsGviejw3MNf9/der4Erjf5pTOP/zY6H +104.131.17.78 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDrtZ80jQmfkMKC1SAmsMrkBsACczPKX92XRhPcHKu7OADjS9J9sj0avbyywH/ViVPh/oQKoAkjRcqlWKge8uYuKM1+usZ4vCSWj1911pp0/tHydvdajtijOVVTs1IyWYb0AmJeauFsvaMrANI6QWul3XE7wpUcegXEIloC4se03UbhFnGwqWkpZgM+07f0bGPljiuO6YZdFUlCg0hVibfo58xEfdNKWClrMr/BFMWZzYz7FBcmyYirwRQ7xx44i6jevb4Ocpg7BsPEiaLVrwItANBONmilQhxh7q/7OolCwOX9x5J0C6oaYsGviejw3MNf9/der4Erjf5pTOP/zY6H 104.236.66.244 ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQCrINr29cQcqeVqpaBk36cQBv0tdCZ8SM7RIyW1uUHhxwRRd8RWbjGatLQhXELJGlSMLhrUf1KzfzCmXj/4L/l03TffeSDuGWJpxusTI93knKN+mWT69+IudkvIymQnCjaVio/MDOhwRLfkxE0nFGLdj8MbRJA35w/P6qbzIvwjKkHgw6VkbBS1c/4jEjsshIk+Z4P1GPiSw8lwscB8EjpZbOnhOWDYHaZUEpujdGbeIIKK31T/HSgFznEjZGuJmgLXnIf5+2h+WXrjeMljVVe613PNHrydBaR/7JxmWZIltoXyzL7ZDR9wZUQ47DumyMm07BtpQ+LZRCbeAvK+Smrt diff --git a/client-new/Gruntfile.js b/client-new/Gruntfile.js index 4be3dd3..a6ee822 100644 --- a/client-new/Gruntfile.js +++ b/client-new/Gruntfile.js @@ -1,63 +1,84 @@ -module.exports = function(grunt) { - grunt.loadNpmTasks('grunt-contrib-less'); - grunt.loadNpmTasks('grunt-contrib-uglify'); - grunt.loadNpmTasks('grunt-contrib-cssmin'); - grunt.loadNpmTasks('grunt-contrib-copy'); +module.exports = function (grunt) { + grunt.loadNpmTasks("grunt-contrib-less"); + grunt.loadNpmTasks("grunt-contrib-uglify"); + grunt.loadNpmTasks("grunt-contrib-cssmin"); + grunt.loadNpmTasks("grunt-contrib-copy"); grunt.initConfig({ - pkg: grunt.file.readJSON('package.json'), + pkg: grunt.file.readJSON("package.json"), less: { production: { options: { paths: ["bower_components/bootstrap/less", "src/less"], - cleancss: true + cleancss: true, }, files: { - "styles-less.css": "src/less/styles.less" - } - } + "styles-less.css": "src/less/styles.less", + }, + }, }, cssmin: { target: { files: { - "../resources/public/main.css": - ["styles-less.css", - "src/prettify-tomorrow.css"] - } - } + "../resources/public/main.css": [ + "styles-less.css", + "src/prettify-tomorrow.css", + ], + }, + }, }, uglify: { build: { - files: [{ - src: ['bower_components/jquery/dist/jquery.min.js', - //'bower_components/jquery-custom-content-scroller/jquery.mCustomScrollbar.min.js', - 'bower_components/bootstrap/dist/js/bootstrap.min.js', - 'bower_components/google-code-prettify/bin/prettify.min.js', - 'js/*.js'], - dest: '../resources/public/main.min.js' - }, { - src: ['bower_components/jquery/dist/jquery.min.js', - 'bower_components/bootstrap/dist/js/bootstrap.min.js', - 'bower_components/google-code-prettify/bin/prettify.min.js', - 'local_js/*.js'], - dest: '../resources/public/local_main.min.js' - }] - } + files: [ + { + src: [ + "bower_components/jquery/dist/jquery.min.js", + //'bower_components/jquery-custom-content-scroller/jquery.mCustomScrollbar.min.js', + "bower_components/bootstrap/dist/js/bootstrap.min.js", + "bower_components/google-code-prettify/bin/prettify.min.js", + "js/*.js", + ], + dest: "../resources/public/main.min.js", + }, + { + src: [ + "bower_components/jquery/dist/jquery.min.js", + "bower_components/bootstrap/dist/js/bootstrap.min.js", + "bower_components/google-code-prettify/bin/prettify.min.js", + "local_js/*.js", + ], + dest: "../resources/public/local_main.min.js", + }, + ], + }, }, copy: { main: { files: [ - {expand: true, flatten: true, src: ["./media/i/*"], dest: '../resources/public/i/'}, { expand: true, flatten: true, - src: ["./media/fonts/*", "./bower_components/font-awesome/fonts/*"], - dest: '../resources/public/fonts' + src: ["./media/i/*"], + dest: "../resources/public/i/", + }, + { + expand: true, + flatten: true, + src: [ + "./media/fonts/*", + "./bower_components/font-awesome/fonts/*", + ], + dest: "../resources/public/fonts", }, - ] - } - } + ], + }, + }, }); - grunt.registerTask('default', ['less', 'cssmin', 'copy', 'uglify', 'uglify_local']) + grunt.registerTask("default", [ + "less", + "cssmin", + "copy", + "uglify" /* , 'uglify_local' */, + ]); }; diff --git a/client-new/src/less/styles.less b/client-new/src/less/styles.less index 1750cf3..aa7d9ef 100644 --- a/client-new/src/less/styles.less +++ b/client-new/src/less/styles.less @@ -1104,37 +1104,54 @@ div.container-fluid .row { .footer-inner { margin: 0; padding: 14px 0 0; - a.soc-network { - display: inline-block; - &:hover, &:focus { - text-decoration: none; - color: #fff; - .soc-network-icon { - border-color: #85caff; - color: #85caff; - } - } - .soc-network-icon { + text-align: center; + + .social-icons { + display: grid; + place-content: center; + grid-template-columns: repeat(auto-fit, 28px); + justify-content: space-evenly; + a.soc-network { display: inline-block; - margin-right: 7px; - vertical-align: middle; - width: 28px; - height: 28px; - text-align: center; - border-radius: 50%; - color: #c3c3c3; - border: 1px solid #c3c3c3; - &.fb { - font-size: 16px; - line-height: 25px; - } - &.tw { - font-size: 17px; - line-height: 26px; + + &:hover, &:focus { + text-decoration: none; + color: #fff; + .soc-network-icon { + border-color: #85caff; + color: #85caff; + } } - &.in { - font-size: 15px; - line-height: 24px; + .soc-network-icon { + display: grid; + place-content: center; + width: 28px; + height: 28px; + border-radius: 50%; + color: #c3c3c3; + border: 1px solid #c3c3c3; + &.fb { + font-size: 16px; + + .sn-mini-icon { + position: relative; + top: -1px; + } + } + &.tw { + font-size: 17px; + } + &.in { + font-size: 15px; + + .sn-mini-icon { + position: relative; + top: -1px; + } + } + &.md { + font-size: 10px; + } } } } diff --git a/client-new/styles-less.css b/client-new/styles-less.css index ce19418..7a2abda 100644 --- a/client-new/styles-less.css +++ b/client-new/styles-less.css @@ -7385,42 +7385,55 @@ div.container-fluid .row { .footer .footer-inner { margin: 0; padding: 14px 0 0; + text-align: center; +} +.footer .footer-inner .social-icons { + display: grid; + place-content: center; + grid-template-columns: repeat(auto-fit, 28px); + justify-content: space-evenly; } -.footer .footer-inner a.soc-network { +.footer .footer-inner .social-icons a.soc-network { display: inline-block; } -.footer .footer-inner a.soc-network:hover, -.footer .footer-inner a.soc-network:focus { +.footer .footer-inner .social-icons a.soc-network:hover, +.footer .footer-inner .social-icons a.soc-network:focus { text-decoration: none; color: #fff; } -.footer .footer-inner a.soc-network:hover .soc-network-icon, -.footer .footer-inner a.soc-network:focus .soc-network-icon { +.footer .footer-inner .social-icons a.soc-network:hover .soc-network-icon, +.footer .footer-inner .social-icons a.soc-network:focus .soc-network-icon { border-color: #85caff; color: #85caff; } -.footer .footer-inner a.soc-network .soc-network-icon { - display: inline-block; - margin-right: 7px; - vertical-align: middle; +.footer .footer-inner .social-icons a.soc-network .soc-network-icon { + display: grid; + place-content: center; width: 28px; height: 28px; - text-align: center; border-radius: 50%; color: #c3c3c3; border: 1px solid #c3c3c3; } -.footer .footer-inner a.soc-network .soc-network-icon.fb { +.footer .footer-inner .social-icons a.soc-network .soc-network-icon.fb { font-size: 16px; - line-height: 25px; } -.footer .footer-inner a.soc-network .soc-network-icon.tw { +.footer .footer-inner .social-icons a.soc-network .soc-network-icon.fb .sn-mini-icon { + position: relative; + top: -1px; +} +.footer .footer-inner .social-icons a.soc-network .soc-network-icon.tw { font-size: 17px; - line-height: 26px; } -.footer .footer-inner a.soc-network .soc-network-icon.in { +.footer .footer-inner .social-icons a.soc-network .soc-network-icon.in { font-size: 15px; - line-height: 24px; +} +.footer .footer-inner .social-icons a.soc-network .soc-network-icon.in .sn-mini-icon { + position: relative; + top: -1px; +} +.footer .footer-inner .social-icons a.soc-network .soc-network-icon.md { + font-size: 10px; } .footer .footer-inner p { padding: 14px 0 7px 0; diff --git a/project.clj b/project.clj index 171afe4..77d817d 100644 --- a/project.clj +++ b/project.clj @@ -3,24 +3,24 @@ [version-clj "0.1.2"] ;; general [com.stuartsierra/component "0.3.2"] - [clj-time "0.15.0"] + [clj-time "0.15.1"] [com.climate/claypoole "1.1.4"] [toml "0.1.3"] ;; templates - [selmer "1.12.2"] + [selmer "1.12.3"] [hiccup "1.0.5"] ;; html [enlive "1.1.6"] [org.apache.commons/commons-lang3 "3.8.1"] [com.anychart/playground-samples-parser "0.2.6"] - [com.anychart/link-checker "0.2.10"] + [com.anychart/link-checker "0.3.1"] [org.jsoup/jsoup "1.11.3"] [garden "1.3.6"] ;; web [http-kit "2.3.0"] [compojure "1.6.1"] [ring/ring-json "0.4.0"] - [ring/ring-core "1.7.0"] + [ring/ring-core "1.7.1"] [com.rpl/specter "1.1.1"] ;; logging [com.taoensso/timbre "4.10.0"] @@ -33,7 +33,7 @@ [clojure.jdbc/clojure.jdbc-c3p0 "0.3.3"] [honeysql "0.9.4"] ;; markdown - [markdown-clj "1.0.4"] + [markdown-clj "1.0.5"] ;; filesystem [me.raynes/fs "1.4.6"] [cpath-clj "0.1.2"] diff --git a/resources/public/admin/main.js b/resources/public/admin/main.js index a26e0e8..c5bdb89 100644 --- a/resources/public/admin/main.js +++ b/resources/public/admin/main.js @@ -56,7 +56,7 @@ init = (e) => { type: "POST", url: `/_rebuild_`, data: { version: selectedVersion(), - linkChecker: true + linkchecker: true }, success: rebuildSuccessFn, error: errorFn }); diff --git a/resources/public/local_main.min.js b/resources/public/local_main.min.js index 37af970..6bf8048 100644 --- a/resources/public/local_main.min.js +++ b/resources/public/local_main.min.js @@ -1,5 +1,5 @@ function fixHeaders(){$($("#page-content > .row > .col-lg-17 > h1").get(0)).detach().prependTo("#page-content")}function supports_html5_storage(){try{return"localStorage"in window&&null!==window.localStorage}catch(a){return!1}}function getOpenFolders(){var a=window.storage.getItem("anychart_docs_local");return null!=a?JSON.parse(a):null}function saveOpenFolders(a){window.storage.setItem("anychart_docs_local",JSON.stringify(a))}function expandCurrentMenu(a,b){$menu.find(".active").removeClass("active"),b=b.split("/");for(var c=[],d=b.length-1;d>=0&&b[d]!=version;d--)c.push(b[d]);c=c.reverse();for(var e,f,g="",d=0;dul");h.length&&!h.is(":visible")&&(h.toggle(),e.find("i").removeClass("ac-folder").addClass("ac-folder-open"),addFolder(e.attr("href").substr(a.length)))}e.addClass("active")}function addFolder(a){-1==open_folders.indexOf(a)&&(open_folders.push(a),saveOpenFolders(open_folders))}function removeFolder(a){var b=open_folders.indexOf(a);b>-1?(open_folders.splice(b,1),removeFolder(a)):saveOpenFolders(open_folders)}function addListeners(a){$menu.find("a>i.ac-folder").each(function(){var b=$(this),c=b.parent(),d=c.parent().find(">ul"),e=c.attr("href").substr(a.length);c.click(function(){return d.is(":visible")?addFolder(e):removeFolder(e),!1})})}function openFolders(a,b){for(var c=0;cul");e.length&&!e.is(":visible")&&(e.toggle(),$el.find("i").removeClass("ac-folder").addClass("ac-folder-open"))}}function initFolders(){open_folders=getOpenFolders(),null===open_folders&&(open_folders=[])}function highlightCode(){$("#page-content pre").addClass("prettyprint"),prettyPrint()}function loadPage(a){if(page==a)return!0;if(page=a,-1!=a.indexOf("search?q=")){var b=a.substr(a.indexOf("search?q=")+"search?q=".length);return console.log(b),searchFor(b),!1}return expandMenu(location.pathname),$("#bar").hide(),$("#shadow").hide(),!1}function fixLinks(){$("#page-content a").each(function(){var a=$(this);if(a.attr("href")&&a.attr("href").match(/^[a-zA-Z]/gi)){if(0==a.attr("href").indexOf("#"))return;if(0==a.attr("href").indexOf("http://"))return;if(0==a.attr("href").indexOf("https://"))return}})}function initSearch(){$("#page-content button").click(function(){history.back()}),fixLinks()}function searchFor(a){a&&($("#page-content").html("Searching..."),$menu.find(".active").removeClass("active"),window.history.pushState(null,null,"/"+version+"/search?q="+a),$.post("/"+version+"/search-data",{q:a},function(b){$("#page-content").html('

Search results for '+a+"

"),b.length?$(b).each(function(){$("#page-content .col-lg-17").append('

'+this.title+"

"+this.sn+"

")}):$("#page-content").append("Nothing found"),initSearch()}))}function fixToc(){var a=0,b=$("#page-content .row .col-lg-17 > *");for("a"==b.get(a).tagName.toLowerCase()&&a++;"br"==b.get(a).tagName.toLowerCase();)a++;for("h1"==b.get(a).tagName.toLowerCase()&&a++;"br"==b.get(a).tagName.toLowerCase();)a++;for("div"==b.get(a).tagName.toLowerCase()&&a++;"br"==b.get(a).tagName.toLowerCase();)a++;var c=$(b.get(a));$("#table-of-content-large").html(""),"ul"==c.prop("tagName").toLowerCase()&&(c.addClass("table_of_content"),c.find("li").addClass("main"),$("#table-of-content-large").append(c.clone()))}if(!function(a,b){"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){function c(a){var b="length"in a&&a.length,c=_.type(a);return"function"===c||_.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}function d(a,b,c){if(_.isFunction(b))return _.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return _.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(ha.test(b))return _.filter(b,a,c);b=_.filter(b,a)}return _.grep(a,function(a){return U.call(b,a)>=0!==c})}function e(a,b){for(;(a=a[b])&&1!==a.nodeType;);return a}function f(a){var b=oa[a]={};return _.each(a.match(na)||[],function(a,c){b[c]=!0}),b}function g(){Z.removeEventListener("DOMContentLoaded",g,!1),a.removeEventListener("load",g,!1),_.ready()}function h(){Object.defineProperty(this.cache={},0,{get:function(){return{}}}),this.expando=_.expando+h.uid++}function i(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(ua,"-$1").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:ta.test(c)?_.parseJSON(c):c}catch(e){}sa.set(a,b,c)}else c=void 0;return c}function j(){return!0}function k(){return!1}function l(){try{return Z.activeElement}catch(a){}}function m(a,b){return _.nodeName(a,"table")&&_.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function n(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function o(a){var b=Ka.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function p(a,b){for(var c=0,d=a.length;d>c;c++)ra.set(a[c],"globalEval",!b||ra.get(b[c],"globalEval"))}function q(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(ra.hasData(a)&&(f=ra.access(a),g=ra.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)_.event.add(b,e,j[e][c])}sa.hasData(a)&&(h=sa.access(a),i=_.extend({},h),sa.set(b,i))}}function r(a,b){var c=a.getElementsByTagName?a.getElementsByTagName(b||"*"):a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&_.nodeName(a,b)?_.merge([a],c):c}function s(a,b){var c=b.nodeName.toLowerCase();"input"===c&&ya.test(a.type)?b.checked=a.checked:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}function t(b,c){var d,e=_(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:_.css(e[0],"display");return e.detach(),f}function u(a){var b=Z,c=Oa[a];return c||(c=t(a,b),"none"!==c&&c||(Na=(Na||_("