git-annex 5.20140421 → 5.20140517
raw patch · 361 files changed
+25051/−19807 lines, 361 filesbinary-added
Files
- Annex.hs +8/−0
- Annex/Ssh.hs +13/−2
- Assistant.hs +1/−3
- Assistant/CredPairCache.hs +53/−0
- Assistant/Monad.hs +3/−0
- Assistant/Threads/MountWatcher.hs +4/−0
- Assistant/Threads/NetWatcher.hs +15/−5
- Assistant/Threads/SanityChecker.hs +56/−0
- Assistant/Threads/Upgrader.hs +1/−17
- Assistant/Types/CredPairCache.hs +18/−0
- Assistant/Upgrade.hs +49/−0
- Assistant/WebApp/Bootstrap3.hs +284/−0
- Assistant/WebApp/Common.hs +6/−1
- Assistant/WebApp/Configurators/AWS.hs +9/−9
- Assistant/WebApp/Configurators/Delete.hs +3/−3
- Assistant/WebApp/Configurators/Edit.hs +5/−5
- Assistant/WebApp/Configurators/Fsck.hs +6/−5
- Assistant/WebApp/Configurators/IA.hs +4/−4
- Assistant/WebApp/Configurators/Local.hs +4/−4
- Assistant/WebApp/Configurators/Pairing.hs +2/−2
- Assistant/WebApp/Configurators/Preferences.hs +4/−4
- Assistant/WebApp/Configurators/Ssh.hs +136/−76
- Assistant/WebApp/Configurators/Unused.hs +2/−2
- Assistant/WebApp/Configurators/WebDAV.hs +9/−7
- Assistant/WebApp/Configurators/XMPP.hs +3/−3
- Assistant/WebApp/Form.hs +76/−2
- Assistant/WebApp/Gpg.hs +6/−5
- Assistant/WebApp/Page.hs +5/−7
- Assistant/WebApp/RepoList.hs +7/−7
- Assistant/WebApp/SideBar.hs +2/−2
- Assistant/WebApp/Types.hs +4/−2
- Build/Configure.hs +0/−5
- Build/DistributionUpdate.hs +1/−1
- Build/EvilSplicer.hs +5/−0
- CHANGELOG +24/−0
- COPYRIGHT +59/−18
- CmdLine/GitAnnex.hs +8/−2
- Command/Group.hs +7/−3
- Command/Map.hs +2/−1
- Makefile +2/−0
- Remote.hs +2/−3
- Remote/Bup.hs +3/−1
- Remote/Ddar.hs +229/−0
- Remote/Git.hs +10/−8
- Remote/Helper/Ssh.hs +9/−9
- Remote/List.hs +3/−3
- Types/Creds.hs +3/−1
- Types/GitConfig.hs +4/−0
- Utility/Applicative.hs +1/−1
- Utility/Base64.hs +1/−1
- Utility/Batch.hs +1/−1
- Utility/CoProcess.hs +2/−2
- Utility/CopyFile.hs +1/−1
- Utility/DBus.hs +3/−2
- Utility/Daemon.hs +11/−2
- Utility/Data.hs +1/−1
- Utility/DataUnits.hs +2/−2
- Utility/DirWatcher.hs +1/−1
- Utility/DirWatcher/FSEvents.hs +1/−1
- Utility/DirWatcher/INotify.hs +1/−1
- Utility/DirWatcher/Kqueue.hs +1/−1
- Utility/DirWatcher/Types.hs +1/−1
- Utility/DirWatcher/Win32Notify.hs +1/−1
- Utility/Directory.hs +2/−2
- Utility/DiskFree.hs +1/−1
- Utility/Dot.hs +1/−1
- Utility/Env.hs +1/−1
- Utility/Exception.hs +2/−2
- Utility/ExternalSHA.hs +1/−1
- Utility/FileMode.hs +1/−1
- Utility/FileSystemEncoding.hs +1/−1
- Utility/Format.hs +1/−1
- Utility/FreeDesktop.hs +1/−1
- Utility/Glob.hs +1/−1
- Utility/Gpg.hs +2/−2
- Utility/HumanNumber.hs +2/−2
- Utility/HumanTime.hs +2/−2
- Utility/InodeCache.hs +1/−1
- Utility/JSONStream.hs +1/−1
- Utility/LinuxMkLibs.hs +2/−2
- Utility/LogFile.hs +1/−1
- Utility/Lsof.hs +3/−3
- Utility/Matcher.hs +5/−5
- Utility/Metered.hs +1/−1
- Utility/Misc.hs +1/−1
- Utility/Monad.hs +1/−1
- Utility/Network.hs +1/−1
- Utility/NotificationBroadcaster.hs +1/−1
- Utility/OSX.hs +1/−1
- Utility/PID.hs +1/−1
- Utility/Parallel.hs +1/−1
- Utility/Path.hs +1/−1
- Utility/Percentage.hs +1/−1
- Utility/PosixFiles.hs +1/−1
- Utility/Process.hs +13/−24
- Utility/QuickCheck.hs +1/−1
- Utility/Quvi.hs +1/−1
- Utility/Rsync.hs +1/−1
- Utility/SRV.hs +1/−1
- Utility/SafeCommand.hs +1/−1
- Utility/Scheduled.hs +1/−1
- Utility/Shell.hs +1/−1
- Utility/SimpleProtocol.hs +1/−1
- Utility/SshConfig.hs +1/−1
- Utility/Tense.hs +1/−1
- Utility/ThreadLock.hs +1/−1
- Utility/ThreadScheduler.hs +1/−1
- Utility/Tmp.hs +1/−1
- Utility/Touch.hsc +1/−1
- Utility/URI.hs +1/−1
- Utility/Url.hs +1/−1
- Utility/UserInfo.hs +1/−1
- Utility/Verifiable.hs +1/−1
- Utility/WebApp.hs +1/−1
- Utility/WinLock.hs +1/−1
- Utility/WinProcess.hs +1/−1
- Utility/Yesod.hs +1/−0
- Utility/libdiskfree.c +1/−1
- Utility/libkqueue.c +1/−1
- debian/changelog +24/−0
- debian/control +2/−2
- debian/copyright +59/−18
- doc/Android/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment +0/−8
- doc/Android/comment_20_81940ea56ace3dcd5fa84dfccd88ad96._comment +1/−1
- doc/Android/oldcomments/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment +8/−0
- doc/assistant/comment_3_9bd3b532a5c026a1d664c898f8e335e6._comment +8/−0
- doc/assistant/comment_4_c546a24459ca29025f00e424353c40d2._comment +8/−0
- doc/assistant/comment_5_d17de359cdd46659170d373cd09c0979._comment +8/−0
- doc/assistant/release_notes.mdwn +8/−3
- doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_.mdwn +44/−0
- doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX.mdwn +3/−0
- doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__.mdwn +27/−0
- doc/bugs/Upgrade_Does_not_Complete_on_OS_X.mdwn +31/−0
- doc/bugs/Upgrade_impossible_om_Mac_OSX.mdwn +20/−0
- doc/bugs/android_autobuild_broken.mdwn +4/−0
- doc/bugs/bug_system_updates_when___34__done__34__.mdwn +24/−0
- doc/bugs/fails_to_get_content_from_bare_repo_on_windows.mdwn +140/−0
- doc/bugs/forget_corrupts_non-ascii_chars.mdwn +74/−0
- doc/bugs/git-annex_annex_repo_not_found.mdwn +23/−0
- doc/bugs/git-annex_auto_upgrade_is_redundant.mdwn +28/−0
- doc/bugs/git-annex_fails_to_initialize_under_Windows.mdwn +3/−0
- doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin.mdwn +38/−0
- doc/bugs/git-annex_ignores_GIT__95__SSH.mdwn +39/−0
- doc/bugs/git-annex_remotedeamon.mdwn +27/−0
- doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant.mdwn +136/−0
- doc/bugs/git_annex_enableremote_gcrypt_failure_leaves_a_remote.mdwn +31/−0
- doc/bugs/git_annex_info_listings_can_be_confusing.mdwn +33/−0
- doc/bugs/git_annex_list__47__whereis_and_uncommited_local_changes.mdwn +28/−0
- doc/bugs/git_annex_sync___40__sync_content_without_--content_flag__41__.mdwn +32/−0
- doc/bugs/how_to_get_git-annex_shell_on_MAC__63__.mdwn +27/−0
- doc/bugs/mac_os_x_10.7_DMG_out_of_date.mdwn +16/−0
- doc/bugs/no_git-annex_shell_on_Windows.mdwn +28/−0
- doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids.mdwn +23/−0
- doc/bugs/ssh-askpass_locks_me_out_of_x_console.mdwn +27/−0
- doc/bugs/standalone_tarball_symlink_to_PATH_broken.mdwn +7/−0
- doc/bugs/wget_tarball_over_https_complains.mdwn +15/−0
- doc/contribute.mdwn +32/−10
- doc/design/assistant/polls/Android_default_directory.mdwn +1/−1
- doc/design/assistant/polls/prioritizing_special_remotes.mdwn +1/−1
- doc/design/assistant/sshpassword.mdwn +53/−0
- doc/design/assistant/syncing/efficiency.mdwn +4/−0
- doc/design/metadata/comment_6_fa51ae544b193122334dbae7960ab3d9._comment +15/−0
- doc/design/requests_routing.mdwn +100/−0
- doc/design/requests_routing/simroutes.hs +402/−0
- doc/design/roadmap.mdwn +5/−5
- doc/devblog/day_156__release_day.mdwn +14/−0
- doc/devblog/day_157__upgrade_checking.mdwn +22/−0
- doc/devblog/day_158__enroute_to_Brazil.mdwn +10/−0
- doc/devblog/day_159__tmp_file_cleanup.mdwn +12/−0
- doc/devblog/day_160__.mdwn +20/−0
- doc/devblog/day_161__routing_design.mdwn +13/−0
- doc/devblog/day_162__routing_sim_and_massive_contribution_landed.mdwn +17/−0
- doc/devblog/day_163__request_and_routing_design.mdwn +3/−0
- doc/devblog/day_164__back.mdwn +17/−0
- doc/devblog/day_165__sshpassword_merged.mdwn +18/−0
- doc/devblog/day_166__catching_up.mdwn +40/−0
- doc/forum/Basic_set_up_with_one_remote.mdwn +14/−0
- doc/forum/Checkout_only_some_files_with_the_assistant.mdwn +14/−0
- doc/forum/Distributing_data_to_a_set_of_drives.mdwn +1/−0
- doc/forum/Encrypted_Content_Remote_Daemon_.mdwn +1/−0
- doc/forum/Git-Annex_with_Asustor_NAS.mdwn +4/−0
- doc/forum/GitBlit_as_a_centralized_repository.mdwn +2/−0
- doc/forum/How_to_change_the_name_of_a_repo_on_S3__63__.mdwn +2/−0
- doc/forum/Problems_when_cloning_a_repository.mdwn +22/−0
- doc/forum/Special_remote_public_key_encryption_issue.mdwn +18/−0
- doc/forum/Storing_git_repos_in_git-annex.mdwn +27/−0
- doc/forum/Workflow_for_adding_files.mdwn +32/−0
- doc/forum/differenc_in_webapp_icons__63__.mdwn +4/−0
- doc/forum/folder_size_question.mdwn +3/−0
- doc/forum/git-annes_assistant_+_MAC_OSX_questions.mdwn +16/−0
- doc/forum/misctmp_filling_up.mdwn +11/−0
- doc/forum/remembering_state.mdwn +5/−0
- doc/forum/ssh_key_setup_woes_in_Android.mdwn +15/−0
- doc/git-annex.mdwn +16/−0
- doc/install/Android/comment_10_4b565e73f02f0e84bdf7e686b0d7bf5f._comment +8/−0
- doc/install/ArchLinux.mdwn +14/−15
- doc/install/Debian/comment_10_d5da996e106d2e4d8a822aa9bcc78596._comment +0/−12
- doc/install/Debian/comment_11_84283676da247c401bc9b4bb12c2b453._comment +0/−8
- doc/install/Debian/comment_12_0aca83b055d0a9dd8589c50250a8bbea._comment +0/−13
- doc/install/Debian/comment_13_167a091764e5e99ec0f35a65e95a22de._comment +0/−8
- doc/install/Debian/comment_16_89f67da4a4a6a626a7db9c6674b244b6._comment +11/−0
- doc/install/Debian/comment_17_ef7f3e88d61833e51f0302e938343818._comment +10/−0
- doc/install/Debian/comment_5_38e6399083e10a6a274f35bddc15d4ac._comment +0/−18
- doc/install/Debian/comment_6_2e7bbdbaabbfb9d89de22e913066e822._comment +0/−8
- doc/install/Debian/comment_9_97eaed998ffd1ed79585075ed5cff06e._comment +0/−8
- doc/install/Windows.mdwn +1/−1
- doc/news/version_5.20140402.mdwn +0/−34
- doc/news/version_5.20140517.mdwn +21/−0
- doc/not/comment_14_837e3699014b73e8f2bd2a668eea9eef._comment +23/−0
- doc/not/comment_15_ac7396ca125abb80a42f9aaaf61a6ab4._comment +10/−0
- doc/preferred_content/standard_groups.mdwn +2/−1
- doc/publicrepos.mdwn +1/−1
- doc/special_remotes.mdwn +1/−0
- doc/special_remotes/comment_22_308afc586b86c66bbb3437d63864d9cb._comment +16/−0
- doc/special_remotes/comment_23_0f5440e0e54cf7ac2a68b1ba115b0930._comment +10/−0
- doc/special_remotes/ddar.mdwn +40/−0
- doc/sync/comment_11_7683879f6982c0eb0aa39b66ff5a5ea9._comment +10/−0
- doc/sync/comment_12_2fea14fa314ddb7ab645a5cca5a95fd9._comment +14/−0
- doc/sync/comment_13_690f66be9cefe28844d8df653b7a0331._comment +10/−0
- doc/sync/comment_14_db342785a4dade30b5b75cb95031bed1._comment +8/−0
- doc/sync/comment_15_168e0ab10b4084e13df1a3058fa7e8a9._comment +8/−0
- doc/sync/comment_16_96096f994fc55f921f2b24b274f998f7._comment +8/−0
- doc/thanks.mdwn +3/−2
- doc/tips/file_manager_integration.mdwn +19/−0
- doc/tips/metadata_driven_views.mdwn +2/−2
- doc/tips/skydriveannex/comment_1_bf383481b2bbb962fbfe783b9f2f213a._comment +8/−0
- doc/tips/skydriveannex/comment_2_1f747018b35ab8accd2bf0905e6ad926._comment +8/−0
- doc/tips/skydriveannex/comment_3_8b9444006734262693f71e50a40eae1d._comment +19/−0
- doc/tips/skydriveannex/comment_4_8b01dc6ca1082a8c24ff65fec9d759d8._comment +8/−0
- doc/tips/skydriveannex/comment_5_1d220d96945d497f3a93b5d848eb3995._comment +8/−0
- doc/tips/skydriveannex/comment_6_a7a3afdc7eed9a0eda48dcb57f1e87c6._comment +12/−0
- doc/tips/what_to_do_when_a_repository_is_corrupted.mdwn +5/−0
- doc/todo/Allow_syncing_only_selected_branches.mdwn +8/−0
- doc/todo/Expose_auto-merge_for_manual__44___local_merges.mdwn +7/−0
- doc/todo/custom_f-droid_repo.mdwn +1/−1
- doc/todo/do_not_bug_me_about_intermediate_files.mdwn +1/−1
- doc/todo/read-only_removable_drives.mdwn +7/−0
- doc/videos.mdwn +1/−1
- doc/walkthrough/automatically_managing_content.mdwn +2/−2
- doc/walkthrough/using_ddar.mdwn +32/−0
- git-annex.1 +14/−0
- git-annex.cabal +1/−1
- standalone/android/Makefile +1/−0
- standalone/android/runshell +1/−0
- standalone/licences.gz binary
- standalone/linux/skel/git +1/−1
- standalone/linux/skel/git-annex +1/−1
- standalone/linux/skel/git-annex-shell +1/−1
- standalone/linux/skel/git-annex-webapp +1/−1
- standalone/linux/skel/git-receive-pack +1/−1
- standalone/linux/skel/git-shell +1/−1
- standalone/linux/skel/git-upload-pack +1/−1
- standalone/trustedkeys.gpg binary
- static/bootstrap-collapse.js +0/−138
- static/bootstrap-dropdown.js +0/−92
- static/bootstrap-modal.js +0/−210
- static/bootstrap-responsive.css +0/−815
- static/bootstrap.css +0/−4983
- static/css/bootstrap-theme.css +347/−0
- static/css/bootstrap.css +5785/−0
- static/fonts/glyphicons-halflings-regular.eot binary
- static/fonts/glyphicons-halflings-regular.svg +229/−0
- static/fonts/glyphicons-halflings-regular.ttf binary
- static/fonts/glyphicons-halflings-regular.woff binary
- static/glyphicons-halflings-white.png binary
- static/glyphicons-halflings.png binary
- static/jquery.full.js +0/−9404
- static/jquery.ui.core.js +0/−324
- static/jquery.ui.mouse.js +0/−169
- static/jquery.ui.sortable.js +0/−1250
- static/jquery.ui.widget.js +0/−521
- static/js/bootstrap.js +1951/−0
- static/js/jquery.full.js +9111/−0
- static/js/jquery.ui.core.js +320/−0
- static/js/jquery.ui.mouse.js +169/−0
- static/js/jquery.ui.sortable.js +1289/−0
- static/js/jquery.ui.widget.js +521/−0
- static/js/longpolling.js +46/−0
- static/longpolling.js +0/−46
- templates/actionbutton.hamlet +2/−1
- templates/configurators/addbox.com.hamlet +27/−23
- templates/configurators/adddrive.hamlet +36/−31
- templates/configurators/adddrive/combine.hamlet +21/−18
- templates/configurators/adddrive/encrypt.hamlet +27/−23
- templates/configurators/adddrive/setupmodal.hamlet +8/−6
- templates/configurators/addglacier.hamlet +37/−31
- templates/configurators/addia.hamlet +35/−31
- templates/configurators/addrepository.hamlet +4/−4
- templates/configurators/addrepository/archive.hamlet +4/−2
- templates/configurators/addrepository/cloud.hamlet +6/−3
- templates/configurators/addrepository/misc.hamlet +6/−3
- templates/configurators/addrepository/ssh.hamlet +2/−1
- templates/configurators/addrepository/xmppconnection.hamlet +4/−2
- templates/configurators/adds3.hamlet +32/−27
- templates/configurators/delete/currentrepository.hamlet +34/−32
- templates/configurators/delete/finished.hamlet +15/−14
- templates/configurators/delete/start.hamlet +13/−11
- templates/configurators/delete/xmpp.hamlet +12/−10
- templates/configurators/edit/nonannexremote.hamlet +17/−16
- templates/configurators/edit/repository.hamlet +36/−33
- templates/configurators/enableaws.hamlet +33/−29
- templates/configurators/enabledirectory.hamlet +11/−10
- templates/configurators/enableia.hamlet +25/−21
- templates/configurators/enablewebdav.hamlet +25/−21
- templates/configurators/fsck.cassius +1/−1
- templates/configurators/fsck.hamlet +31/−30
- templates/configurators/fsck/formcontent.hamlet +16/−10
- templates/configurators/fsck/preferencesform.hamlet +4/−3
- templates/configurators/genkeymodal.hamlet +12/−10
- templates/configurators/main.hamlet +9/−9
- templates/configurators/needconnection.hamlet +14/−12
- templates/configurators/needgcrypt.hamlet +11/−10
- templates/configurators/needglaciercli.hamlet +11/−10
- templates/configurators/newrepository.hamlet +14/−12
- templates/configurators/newrepository/combine.hamlet +20/−17
- templates/configurators/newrepository/first.hamlet +19/−17
- templates/configurators/newrepository/form.hamlet +9/−7
- templates/configurators/pairing/disabled.hamlet +6/−5
- templates/configurators/pairing/local/inprogress.hamlet +19/−18
- templates/configurators/pairing/local/prompt.hamlet +50/−47
- templates/configurators/pairing/xmpp/end.hamlet +32/−31
- templates/configurators/pairing/xmpp/friend/confirm.hamlet +12/−11
- templates/configurators/pairing/xmpp/friend/prompt.hamlet +12/−11
- templates/configurators/pairing/xmpp/self/prompt.hamlet +21/−20
- templates/configurators/pairing/xmpp/self/retry.hamlet +12/−11
- templates/configurators/preferences.hamlet +16/−13
- templates/configurators/rsync.net/add.hamlet +41/−38
- templates/configurators/rsync.net/encrypt.hamlet +47/−41
- templates/configurators/ssh/add.hamlet +25/−22
- templates/configurators/ssh/combine.hamlet +21/−18
- templates/configurators/ssh/confirm.hamlet +67/−63
- templates/configurators/ssh/enable.hamlet +27/−28
- templates/configurators/ssh/error.hamlet +13/−11
- templates/configurators/ssh/expiredpassword.hamlet +12/−0
- templates/configurators/ssh/setupmodal.hamlet +12/−11
- templates/configurators/ssh/testmodal.hamlet +8/−8
- templates/configurators/unused.hamlet +42/−38
- templates/configurators/unused/form.hamlet +2/−2
- templates/configurators/upgrade/android.hamlet +10/−9
- templates/configurators/xmpp.hamlet +42/−35
- templates/configurators/xmpp/buddylist.hamlet +8/−8
- templates/configurators/xmpp/disabled.hamlet +6/−5
- templates/configurators/xmpp/needcloudrepo.hamlet +18/−17
- templates/control/log.hamlet +7/−6
- templates/control/notrunning.hamlet +12/−9
- templates/control/repairrepository.hamlet +27/−24
- templates/control/repairrepository/done.hamlet +14/−13
- templates/control/repositoryswitcher.hamlet +15/−14
- templates/control/shutdown.hamlet +10/−8
- templates/controlmenu.hamlet +10/−5
- templates/dashboard/main.hamlet +7/−8
- templates/dashboard/transfers.cassius +6/−0
- templates/dashboard/transfers.hamlet +28/−30
- templates/documentation/about.hamlet +32/−31
- templates/documentation/repogroup.hamlet +61/−60
- templates/error.hamlet +14/−9
- templates/page.cassius +29/−0
- templates/page.hamlet +15/−9
- templates/repolist.hamlet +30/−21
- templates/sidebar/alert.hamlet +2/−1
- templates/sidebar/main.hamlet +1/−1
Annex.hs view
@@ -28,6 +28,7 @@ getGitConfig, changeGitConfig, changeGitRepo,+ getRemoteGitConfig, withCurrentState, ) where @@ -266,6 +267,13 @@ { repo = r , gitconfig = extractGitConfig r }++{- Gets the RemoteGitConfig from a remote, given the Git.Repo for that+ - remote. -}+getRemoteGitConfig :: Git.Repo -> Annex RemoteGitConfig+getRemoteGitConfig r = do+ g <- gitRepo+ return $ extractRemoteGitConfig g (Git.repoDescribe r) {- Converts an Annex action into an IO action, that runs with a copy - of the current Annex state.
Annex/Ssh.hs view
@@ -16,6 +16,8 @@ sshCachingTo, inRepoWithSshCachingTo, runSshCaching,+ sshAskPassEnv,+ runSshAskPass ) where import qualified Data.Map as M@@ -230,7 +232,7 @@ {- When this env var is set, git-annex runs ssh with parameters - to use the socket file that the env var contains. -- - This is a workaround for GiT_SSH not being able to contain+ - This is a workaround for GIT_SSH not being able to contain - additional parameters to pass to ssh. -} sshCachingEnv :: String sshCachingEnv = "GIT_ANNEX_SSHCACHING"@@ -268,8 +270,17 @@ where uncached = return g -runSshCaching :: [String] -> String -> IO ()+runSshCaching :: [String] -> FilePath -> IO () runSshCaching args sockfile = do let args' = toCommand (sshConnectionCachingParams sockfile) ++ args let p = proc "ssh" args' exitWith =<< waitForProcess . processHandle =<< createProcess p++{- When this env var is set, git-annex is being used as a ssh-askpass+ - program, and should read the password from the specified location,+ - and output it for ssh to read. -}+sshAskPassEnv :: String+sshAskPassEnv = "GIT_ANNEX_SSHASKPASS"++runSshAskPass :: FilePath -> IO ()+runSshAskPass passfile = putStrLn =<< readFile passfile
Assistant.hs view
@@ -84,9 +84,7 @@ fdToHandle =<< dup stdError let undaemonize a = do debugM desc $ "logging to " ++ logfile- Utility.Daemon.lockPidFile pidfile- Utility.LogFile.redirLog logfd- a+ Utility.Daemon.foreground logfd (Just pidfile) a start undaemonize $ case startbrowser of Nothing -> Nothing
+ Assistant/CredPairCache.hs view
@@ -0,0 +1,53 @@+{- git-annex assistant CredPair cache.+ -+ - Copyright 2014 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++{-# LANGUAGE BangPatterns #-}++module Assistant.CredPairCache (+ cacheCred,+ getCachedCred,+ expireCachedCred,+) where++import Assistant.Types.CredPairCache+import Types.Creds+import Assistant.Common+import Utility.ThreadScheduler++import qualified Data.Map as M+import Control.Concurrent++{- Caches a CredPair, but only for a limited time, after which it+ - will expire.+ -+ - Note that repeatedly caching the same CredPair+ - does not reset its expiry time.+ -}+cacheCred :: CredPair -> Seconds -> Assistant ()+cacheCred (login, password) expireafter = do+ cache <- getAssistant credPairCache+ liftIO $ do+ changeStrict cache $ M.insert login password+ void $ forkIO $ do+ threadDelaySeconds expireafter+ changeStrict cache $ M.delete login++getCachedCred :: Login -> Assistant (Maybe Password)+getCachedCred login = do+ cache <- getAssistant credPairCache+ liftIO $ M.lookup login <$> readMVar cache++expireCachedCred :: Login -> Assistant ()+expireCachedCred login = do+ cache <- getAssistant credPairCache+ liftIO $ changeStrict cache $ M.delete login++{- Update map strictly to avoid keeping references to old creds in memory. -}+changeStrict :: CredPairCache -> (M.Map Login Password -> M.Map Login Password) -> IO ()+changeStrict cache a = modifyMVar_ cache $ \m -> do+ let !m' = a m+ return m'
Assistant/Monad.hs view
@@ -44,6 +44,7 @@ import Assistant.Types.NetMessager import Assistant.Types.ThreadName import Assistant.Types.RemoteControl+import Assistant.Types.CredPairCache newtype Assistant a = Assistant { mkAssistant :: ReaderT AssistantData IO a } deriving (@@ -70,6 +71,7 @@ , buddyList :: BuddyList , netMessager :: NetMessager , remoteControl :: RemoteControl+ , credPairCache :: CredPairCache } newAssistantData :: ThreadState -> DaemonStatusHandle -> IO AssistantData@@ -89,6 +91,7 @@ <*> newBuddyList <*> newNetMessager <*> newRemoteControl+ <*> newCredPairCache runAssistant :: AssistantData -> Assistant a -> IO a runAssistant d a = runReaderT (mkAssistant a) d
Assistant/Threads/MountWatcher.hs view
@@ -63,7 +63,11 @@ wasmounted <- liftIO $ swapMVar mvar nowmounted handleMounts urlrenderer wasmounted nowmounted liftIO $ forM_ mountChanged $ \matcher ->+#if MIN_VERSION_dbus(0,10,7)+ void $ addMatch client matcher handleevent+#else listen client matcher handleevent+#endif , do liftAnnex $ warning "No known volume monitor available through dbus; falling back to mtab polling"
Assistant/Threads/NetWatcher.hs view
@@ -112,8 +112,13 @@ -} listenNMConnections :: Client -> (Bool -> IO ()) -> IO () listenNMConnections client setconnected =- listen client matcher $ \event -> mapM_ handle- (map dictionaryItems $ mapMaybe fromVariant $ signalBody event)+#if MIN_VERSION_dbus(0,10,7)+ void $ addMatch client matcher+#else+ listen client matcher+#endif+ $ \event -> mapM_ handle+ (map dictionaryItems $ mapMaybe fromVariant $ signalBody event) where matcher = matchAny { matchInterface = Just "org.freedesktop.NetworkManager"@@ -142,10 +147,10 @@ -} listenWicdConnections :: Client -> (Bool -> IO ()) -> IO () listenWicdConnections client setconnected = do- listen client connmatcher $ \event ->+ match connmatcher $ \event -> when (any (== wicd_success) (signalBody event)) $ setconnected True- listen client statusmatcher $ \event -> handle (signalBody event)+ match statusmatcher $ \event -> handle (signalBody event) where connmatcher = matchAny { matchInterface = Just "org.wicd.daemon"@@ -160,7 +165,12 @@ handle status | any (== wicd_disconnected) status = setconnected False | otherwise = noop-+ match matcher a = +#if MIN_VERSION_dbus(0,10,7)+ void $ addMatch client matcher a+#else+ listen client matcher a+#endif #endif handleConnection :: Assistant ()
Assistant/Threads/SanityChecker.hs view
@@ -46,6 +46,7 @@ #ifndef mingw32_HOST_OS import Utility.LogFile #endif+import Types.Key (keyBackendName) import Data.Time.Clock.POSIX import qualified Data.Text as T@@ -82,6 +83,10 @@ {- Fix up ssh remotes set up by past versions of the assistant. -} liftIO $ fixUpSshRemotes + {- Clean up old temp files. -}+ liftAnnex cleanOldTmpMisc+ liftAnnex cleanReallyOldTmp+ {- If there's a startup delay, it's done here. -} liftIO $ maybe noop (threadDelaySeconds . Seconds . fromIntegral . durationSeconds) startupdelay @@ -258,3 +263,54 @@ #else debug [show $ renderTense Past msg] #endif++{- Files may be left in misctmp by eg, an interrupted add of files+ - by the assistant, which hard links files to there as part of lockdown+ - checks. Delete these files if they're more than a day old.+ -+ - Note that this is not safe to run after the Watcher starts up, since it+ - will create such files, and due to hard linking they may have old+ - mtimes. So, this should only be called from the+ - sanityCheckerStartupThread, which runs before the Watcher starts up.+ -+ - Also, if a git-annex add is being run at the same time the assistant+ - starts up, its tmp files could be deleted. However, the watcher will+ - come along and add everything once it starts up anyway, so at worst+ - this would make the git-annex add fail unexpectedly.+ -}+cleanOldTmpMisc :: Annex ()+cleanOldTmpMisc = do+ now <- liftIO getPOSIXTime+ let oldenough = now - (60 * 60 * 24)+ tmp <- fromRepo gitAnnexTmpMiscDir+ liftIO $ mapM_ (cleanOld (<= oldenough)) =<< dirContentsRecursive tmp++{- While .git/annex/tmp is now only used for storing partially transferred+ - objects, older versions of git-annex used it for misctemp. Clean up any+ - files that might be left from that, by looking for files whose names+ - cannot be the key of an annexed object. Only delete files older than+ - 1 week old.+ -+ - Also, some remotes such as rsync may use this temp directory for storing+ - eg, encrypted objects that are being transferred. So, delete old+ - objects that use a GPGHMAC backend.+ -}+cleanReallyOldTmp :: Annex ()+cleanReallyOldTmp = do+ now <- liftIO getPOSIXTime+ let oldenough = now - (60 * 60 * 24 * 7)+ tmp <- fromRepo gitAnnexTmpObjectDir+ liftIO $ mapM_ (cleanjunk (<= oldenough)) =<< dirContentsRecursive tmp+ where+ cleanjunk check f = case fileKey (takeFileName f) of+ Nothing -> cleanOld check f+ Just k+ | "GPGHMAC" `isPrefixOf` keyBackendName k ->+ cleanOld check f+ | otherwise -> noop++cleanOld :: (POSIXTime -> Bool) -> FilePath -> IO ()+cleanOld check f = do+ mtime <- realToFrac . modificationTime <$> getFileStatus f+ when (check mtime) $+ nukeFile f
Assistant/Threads/Upgrader.hs view
@@ -18,11 +18,8 @@ import Assistant.DaemonStatus import Assistant.Alert import Utility.NotificationBroadcaster-import Utility.Tmp import qualified Annex import qualified Build.SysConfig-import qualified Utility.Url as Url-import qualified Annex.Url as Url import qualified Git.Version import Types.Distribution #ifdef WITH_WEBAPP@@ -62,7 +59,7 @@ checkUpgrade :: UrlRenderer -> Assistant () checkUpgrade urlrenderer = do debug [ "Checking if an upgrade is available." ]- go =<< getDistributionInfo+ go =<< downloadDistributionInfo where go Nothing = debug [ "Failed to check if upgrade is available." ] go (Just d) = do@@ -86,16 +83,3 @@ noop #endif )--getDistributionInfo :: Assistant (Maybe GitAnnexDistribution)-getDistributionInfo = do- uo <- liftAnnex Url.getUrlOptions- liftIO $ withTmpFile "git-annex.tmp" $ \tmpfile h -> do- hClose h- ifM (Url.downloadQuiet distributionInfoUrl tmpfile uo)- ( readish <$> readFileStrict tmpfile- , return Nothing- )--distributionInfoUrl :: String-distributionInfoUrl = fromJust Build.SysConfig.upgradelocation ++ ".info"
+ Assistant/Types/CredPairCache.hs view
@@ -0,0 +1,18 @@+{- git-annex assistant CredPair cache.+ -+ - Copyright 2014 Joey Hess <joey@kitenet.net>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Assistant.Types.CredPairCache where++import Types.Creds++import Control.Concurrent+import qualified Data.Map as M++type CredPairCache = MVar (M.Map Login Password)++newCredPairCache :: IO CredPairCache+newCredPairCache = newMVar M.empty
Assistant/Upgrade.hs view
@@ -32,7 +32,11 @@ import Utility.ThreadScheduler import Utility.Tmp import Utility.UserInfo+import Utility.Gpg import qualified Utility.Lsof as Lsof+import qualified Build.SysConfig+import qualified Utility.Url as Url+import qualified Annex.Url as Url import qualified Data.Map as M import Data.Tuple.Utils@@ -313,3 +317,48 @@ usingDistribution :: IO Bool usingDistribution = isJust <$> getEnv "GIT_ANNEX_STANDLONE_ENV"++downloadDistributionInfo :: Assistant (Maybe GitAnnexDistribution)+downloadDistributionInfo = do+ uo <- liftAnnex Url.getUrlOptions+ liftIO $ withTmpDir "git-annex.tmp" $ \tmpdir -> do+ let infof = tmpdir </> "info"+ let sigf = infof ++ ".sig"+ ifM (Url.downloadQuiet distributionInfoUrl infof uo+ <&&> Url.downloadQuiet distributionInfoSigUrl sigf uo+ <&&> verifyDistributionSig sigf)+ ( readish <$> readFileStrict infof+ , return Nothing+ )++distributionInfoUrl :: String+distributionInfoUrl = fromJust Build.SysConfig.upgradelocation ++ ".info"++distributionInfoSigUrl :: String+distributionInfoSigUrl = distributionInfoUrl ++ ".sig"++{- Verifies that a file from the git-annex distribution has a valid+ - signature. Pass the detached .sig file; the file to be verified should+ - be located next to it.+ -+ - The gpg keyring used to verify the signature is located in+ - trustedkeys.gpg, next to the git-annex program.+ -}+verifyDistributionSig :: FilePath -> IO Bool+verifyDistributionSig sig = do+ p <- readProgramFile+ if isAbsolute p+ then withTmpDir "git-annex-gpg.tmp" $ \gpgtmp -> do+ let trustedkeys = takeDirectory p </> "trustedkeys.gpg"+ boolSystem gpgcmd+ [ Param "--no-default-keyring"+ , Param "--no-auto-check-trustdb"+ , Param "--no-options"+ , Param "--homedir"+ , File gpgtmp+ , Param "--keyring"+ , File trustedkeys+ , Param "--verify"+ , File sig+ ]+ else return False
+ Assistant/WebApp/Bootstrap3.hs view
@@ -0,0 +1,284 @@+{-# LANGUAGE QuasiQuotes #-}+{-# LANGUAGE TypeFamilies #-}+{-# LANGUAGE OverloadedStrings #-}+{-# LANGUAGE CPP #-}+-- | Helper functions for creating forms when using Bootstrap v3.+-- This is a copy of the Yesod.Form.Bootstrap3 module that has been slightly+-- modified to be compatible with Yesod 1.0.1+module Assistant.WebApp.Bootstrap3+ ( -- * Rendering forms+ renderBootstrap3+ , BootstrapFormLayout(..)+ , BootstrapGridOptions(..)+ -- * Field settings+ , bfs+ , withPlaceholder+ , withAutofocus+ , withLargeInput+ , withSmallInput+ -- * Submit button+ , bootstrapSubmit+ , mbootstrapSubmit+ , BootstrapSubmit(..)+ ) where++import Control.Arrow (second)+import Control.Monad (liftM)+import Data.Text (Text)+import Data.String (IsString(..))+import Yesod.Core++import qualified Data.Text as T++import Yesod.Form.Types+import Yesod.Form.Functions++-- | Create a new 'FieldSettings' with the classes that are+-- required by Bootstrap v3.+--+-- Since: yesod-form 1.3.8+bfs :: RenderMessage site msg => msg -> FieldSettings site+bfs msg =+ FieldSettings (SomeMessage msg) Nothing Nothing Nothing [("class", "form-control")]+++-- | Add a placeholder attribute to a field. If you need i18n+-- for the placeholder, currently you\'ll need to do a hack and+-- use 'getMessageRender' manually.+--+-- Since: yesod-form 1.3.8+withPlaceholder :: Text -> FieldSettings site -> FieldSettings site+withPlaceholder placeholder fs = fs { fsAttrs = newAttrs }+ where newAttrs = ("placeholder", placeholder) : fsAttrs fs+++-- | Add an autofocus attribute to a field.+--+-- Since: yesod-form 1.3.8+withAutofocus :: FieldSettings site -> FieldSettings site+withAutofocus fs = fs { fsAttrs = newAttrs }+ where newAttrs = ("autofocus", "autofocus") : fsAttrs fs+++-- | Add the @input-lg@ CSS class to a field.+--+-- Since: yesod-form 1.3.8+withLargeInput :: FieldSettings site -> FieldSettings site+withLargeInput fs = fs { fsAttrs = newAttrs }+ where newAttrs = addClass "input-lg" (fsAttrs fs)+++-- | Add the @input-sm@ CSS class to a field.+--+-- Since: yesod-form 1.3.8+withSmallInput :: FieldSettings site -> FieldSettings site+withSmallInput fs = fs { fsAttrs = newAttrs }+ where newAttrs = addClass "input-sm" (fsAttrs fs)+++addClass :: Text -> [(Text, Text)] -> [(Text, Text)]+addClass klass [] = [("class", klass)]+addClass klass (("class", old):rest) = ("class", T.concat [old, " ", klass]) : rest+addClass klass (other :rest) = other : addClass klass rest+++-- | How many bootstrap grid columns should be taken (see+-- 'BootstrapFormLayout').+--+-- Since: yesod-form 1.3.8+data BootstrapGridOptions =+ ColXs !Int+ | ColSm !Int+ | ColMd !Int+ | ColLg !Int+ deriving (Eq, Ord, Show)++toColumn :: BootstrapGridOptions -> String+toColumn (ColXs 0) = ""+toColumn (ColSm 0) = ""+toColumn (ColMd 0) = ""+toColumn (ColLg 0) = ""+toColumn (ColXs columns) = "col-xs-" ++ show columns+toColumn (ColSm columns) = "col-sm-" ++ show columns+toColumn (ColMd columns) = "col-md-" ++ show columns+toColumn (ColLg columns) = "col-lg-" ++ show columns++toOffset :: BootstrapGridOptions -> String+toOffset (ColXs 0) = ""+toOffset (ColSm 0) = ""+toOffset (ColMd 0) = ""+toOffset (ColLg 0) = ""+toOffset (ColXs columns) = "col-xs-offset-" ++ show columns+toOffset (ColSm columns) = "col-sm-offset-" ++ show columns+toOffset (ColMd columns) = "col-md-offset-" ++ show columns+toOffset (ColLg columns) = "col-lg-offset-" ++ show columns++addGO :: BootstrapGridOptions -> BootstrapGridOptions -> BootstrapGridOptions+addGO (ColXs a) (ColXs b) = ColXs (a+b)+addGO (ColSm a) (ColSm b) = ColSm (a+b)+addGO (ColMd a) (ColMd b) = ColMd (a+b)+addGO (ColLg a) (ColLg b) = ColLg (a+b)+addGO a b | a > b = addGO b a+addGO (ColXs a) other = addGO (ColSm a) other+addGO (ColSm a) other = addGO (ColMd a) other+addGO (ColMd a) other = addGO (ColLg a) other+addGO (ColLg _) _ = error "Yesod.Form.Bootstrap.addGO: never here"+++-- | The layout used for the bootstrap form.+--+-- Since: yesod-form 1.3.8+data BootstrapFormLayout =+ BootstrapBasicForm+ | BootstrapInlineForm+ | BootstrapHorizontalForm+ { bflLabelOffset :: !BootstrapGridOptions+ , bflLabelSize :: !BootstrapGridOptions+ , bflInputOffset :: !BootstrapGridOptions+ , bflInputSize :: !BootstrapGridOptions+ }+ deriving (Show)+++-- | Render the given form using Bootstrap v3 conventions.+--+-- Sample Hamlet for 'BootstrapHorizontalForm':+--+-- > <form .form-horizontal role=form method=post action=@{ActionR} enctype=#{formEnctype}>+-- > ^{formWidget}+-- > ^{bootstrapSubmit MsgSubmit}+--+-- Since: yesod-form 1.3.8+#if MIN_VERSION_yesod(1,2,0)+renderBootstrap3 :: Monad m => BootstrapFormLayout -> FormRender m a+#else+renderBootstrap3 :: BootstrapFormLayout -> FormRender sub master a+#endif+renderBootstrap3 formLayout aform fragment = do+ (res, views') <- aFormToForm aform+ let views = views' []+ has (Just _) = True+ has Nothing = False+ widget = [whamlet|+#if MIN_VERSION_yesod(1,2,0)+ $newline never+#endif+ #{fragment}+ $forall view <- views+ <div .form-group :fvRequired view:.required :not $ fvRequired view:.optional :has $ fvErrors view:.has-error>+ $case formLayout+ $of BootstrapBasicForm+ $if nequals (fvId view) bootstrapSubmitId+ <label for=#{fvId view}>#{fvLabel view}+ ^{fvInput view}+ ^{helpWidget view}+ $of BootstrapInlineForm+ $if nequals (fvId view) bootstrapSubmitId+ <label .sr-only for=#{fvId view}>#{fvLabel view}+ ^{fvInput view}+ ^{helpWidget view}+ $of f@(BootstrapHorizontalForm _ _ _ _)+ $if nequals (fvId view) bootstrapSubmitId+ <label .control-label .#{toOffset (bflLabelOffset f)} .#{toColumn (bflLabelSize f)} for=#{fvId view}>#{fvLabel view}+ <div .#{toOffset (bflInputOffset f)} .#{toColumn (bflInputSize f)}>+ ^{fvInput view}+ ^{helpWidget view}+ $else+ <div .#{toOffset (addGO (bflInputOffset f) (addGO (bflLabelOffset f) (bflLabelSize f)))} .#{toColumn (bflInputSize f)}>+ ^{fvInput view}+ ^{helpWidget view}+ |]+ return (res, widget)+ where+ nequals a b = a /= b -- work around older hamlet versions not liking /=++-- | (Internal) Render a help widget for tooltips and errors.+#if MIN_VERSION_yesod(1,2,0)+helpWidget :: FieldView site -> WidgetT site IO ()+#else+helpWidget :: FieldView sub master -> GWidget sub master ()+#endif+helpWidget view = [whamlet|+ $maybe tt <- fvTooltip view+ <span .help-block>#{tt}+ $maybe err <- fvErrors view+ <span .help-block>#{err}+|]+++-- | How the 'bootstrapSubmit' button should be rendered.+--+-- Since: yesod-form 1.3.8+data BootstrapSubmit msg =+ BootstrapSubmit+ { bsValue :: msg+ -- ^ The text of the submit button.+ , bsClasses :: Text+ -- ^ Classes added to the @<button>@.+ , bsAttrs :: [(Text, Text)]+ -- ^ Attributes added to the @<button>@.+ } deriving (Show)++instance IsString msg => IsString (BootstrapSubmit msg) where+ fromString msg = BootstrapSubmit (fromString msg) " btn-default " []+++-- | A Bootstrap v3 submit button disguised as a field for+-- convenience. For example, if your form currently is:+--+-- > Person <$> areq textField "Name" Nothing+-- > <*> areq textField "Surname" Nothing+--+-- Then just change it to:+--+-- > Person <$> areq textField "Name" Nothing+-- > <*> areq textField "Surname" Nothing+-- > <* bootstrapSubmit "Register"+--+-- (Note that @<*@ is not a typo.)+--+-- Alternatively, you may also just create the submit button+-- manually as well in order to have more control over its+-- layout.+--+-- Since: yesod-form 1.3.8+#if MIN_VERSION_yesod(1,2,0)+bootstrapSubmit+ :: (RenderMessage site msg, HandlerSite m ~ site, MonadHandler m)+ => BootstrapSubmit msg -> AForm m ()+#else+bootstrapSubmit :: (RenderMessage master msg) => BootstrapSubmit msg -> AForm sub master ()+#endif+bootstrapSubmit = formToAForm . liftM (second return) . mbootstrapSubmit+++-- | Same as 'bootstrapSubmit' but for monadic forms. This isn't+-- as useful since you're not going to use 'renderBootstrap3'+-- anyway.+--+-- Since: yesod-form 1.3.8+#if MIN_VERSION_yesod(1,2,0)+mbootstrapSubmit+ :: (RenderMessage site msg, HandlerSite m ~ site, MonadHandler m)+ => BootstrapSubmit msg -> MForm m (FormResult (), FieldView site)+#else+mbootstrapSubmit :: (RenderMessage master msg) => BootstrapSubmit msg -> MForm sub master (FormResult (), FieldView sub master)+#endif+mbootstrapSubmit (BootstrapSubmit msg classes attrs) =+ let res = FormSuccess ()+ widget = [whamlet|<button class="btn #{classes}" type=submit *{attrs}>_{msg}|]+ fv = FieldView { fvLabel = ""+ , fvTooltip = Nothing+ , fvId = bootstrapSubmitId+ , fvInput = widget+ , fvErrors = Nothing+ , fvRequired = False }+ in return (res, fv)+++-- | A royal hack. Magic id used to identify whether a field+-- should have no label. A valid HTML4 id which is probably not+-- going to clash with any other id should someone use+-- 'bootstrapSubmit' outside 'renderBootstrap3'.+bootstrapSubmitId :: Text+bootstrapSubmitId = "b:ootstrap___unique__:::::::::::::::::submit-id"
Assistant/WebApp/Common.hs view
@@ -5,6 +5,8 @@ - Licensed under the GNU AGPL version 3 or higher. -} +{-# LANGUAGE CPP #-}+ module Assistant.WebApp.Common (module X) where import Assistant.Common as X@@ -13,6 +15,9 @@ import Assistant.WebApp.Form as X import Assistant.WebApp.Types as X import Assistant.WebApp.RepoId as X+#if MIN_VERSION_yesod(1,2,0) import Utility.Yesod as X hiding (textField, passwordField, insertBy, replace, joinPath, deleteBy, delete, insert, Key, Option)-+#else+import Utility.Yesod as X hiding (textField, passwordField, selectField, selectFieldList, insertBy, replace, joinPath, deleteBy, delete, insert, Key, Option)+#endif import Data.Text as X (Text)
Assistant/WebApp/Configurators/AWS.hs view
@@ -68,8 +68,8 @@ <$> accessKeyIDFieldWithHelp (T.pack . fst <$> defcreds) <*> secretAccessKeyField (T.pack . snd <$> defcreds) <*> datacenterField AWS.S3- <*> areq (selectFieldList storageclasses) "Storage class" (Just StandardRedundancy)- <*> areq textField "Repository name" (Just "S3")+ <*> areq (selectFieldList storageclasses) (bfs "Storage class") (Just StandardRedundancy)+ <*> areq textField (bfs "Repository name") (Just "S3") <*> enableEncryptionField where storageclasses :: [(Text, StorageClass)]@@ -84,7 +84,7 @@ <*> secretAccessKeyField (T.pack . snd <$> defcreds) <*> datacenterField AWS.Glacier <*> pure StandardRedundancy- <*> areq textField "Repository name" (Just "glacier")+ <*> areq textField (bfs "Repository name") (Just "glacier") <*> enableEncryptionField awsCredsAForm :: Maybe CredPair -> MkAForm AWSCreds@@ -93,7 +93,7 @@ <*> secretAccessKeyField (T.pack . snd <$> defcreds) accessKeyIDField :: Widget -> Maybe Text -> MkAForm Text-accessKeyIDField help = areq (textField `withNote` help) "Access Key ID"+accessKeyIDField help = areq (textField `withNote` help) (bfs "Access Key ID") accessKeyIDFieldWithHelp :: Maybe Text -> MkAForm Text accessKeyIDFieldWithHelp = accessKeyIDField help@@ -104,10 +104,10 @@ |] secretAccessKeyField :: Maybe Text -> MkAForm Text-secretAccessKeyField = areq passwordField "Secret Access Key"+secretAccessKeyField = areq passwordField (bfs "Secret Access Key") datacenterField :: AWS.Service -> MkAForm Text-datacenterField service = areq (selectFieldList list) "Datacenter" defregion+datacenterField service = areq (selectFieldList list) (bfs "Datacenter") defregion where list = M.toList $ AWS.regionMap service defregion = Just $ AWS.defaultRegion service@@ -120,7 +120,7 @@ postAddS3R = awsConfigurator $ do defcreds <- liftAnnex previouslyUsedAWSCreds ((result, form), enctype) <- liftH $- runFormPostNoToken $ renderBootstrap $ s3InputAForm defcreds+ runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout $ s3InputAForm defcreds case result of FormSuccess input -> liftH $ do let name = T.unpack $ repoName input@@ -143,7 +143,7 @@ postAddGlacierR = glacierConfigurator $ do defcreds <- liftAnnex previouslyUsedAWSCreds ((result, form), enctype) <- liftH $- runFormPostNoToken $ renderBootstrap $ glacierInputAForm defcreds+ runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout $ glacierInputAForm defcreds case result of FormSuccess input -> liftH $ do let name = T.unpack $ repoName input@@ -186,7 +186,7 @@ enableAWSRemote remotetype uuid = do defcreds <- liftAnnex previouslyUsedAWSCreds ((result, form), enctype) <- liftH $- runFormPostNoToken $ renderBootstrap $ awsCredsAForm defcreds+ runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout $ awsCredsAForm defcreds case result of FormSuccess creds -> liftH $ do m <- liftAnnex readRemoteLog
Assistant/WebApp/Configurators/Delete.hs view
@@ -89,8 +89,8 @@ havegitremotes <- haveremotes syncGitRemotes havedataremotes <- haveremotes syncDataRemotes ((result, form), enctype) <- liftH $- runFormPostNoToken $ renderBootstrap $ sanityVerifierAForm $- SanityVerifier magicphrase+ runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout $+ sanityVerifierAForm $ SanityVerifier magicphrase case result of FormSuccess _ -> liftH $ do dir <- liftAnnex $ fromRepo Git.repoPath@@ -122,7 +122,7 @@ sanityVerifierAForm :: SanityVerifier -> MkAForm SanityVerifier sanityVerifierAForm template = SanityVerifier- <$> areq checksanity "Confirm deletion?" Nothing+ <$> areq checksanity (bfs "Confirm deletion?") Nothing where checksanity = checkBool (\input -> SanityVerifier input == template) insane textField
Assistant/WebApp/Configurators/Edit.hs view
@@ -142,9 +142,9 @@ editRepositoryAForm :: Maybe Remote -> RepoConfig -> MkAForm RepoConfig editRepositoryAForm mremote def = RepoConfig <$> areq (if ishere then readonlyTextField else textField)- "Name" (Just $ repoName def)- <*> aopt textField "Description" (Just $ repoDescription def)- <*> areq (selectFieldList groups `withNote` help) "Repository group" (Just $ repoGroup def)+ (bfs "Name") (Just $ repoName def)+ <*> aopt textField (bfs "Description") (Just $ repoDescription def)+ <*> areq (selectFieldList groups `withNote` help) (bfs "Repository group") (Just $ repoGroup def) <*> associateddirectory <*> areq checkBoxField "Syncing enabled" (Just $ repoSyncable def) where@@ -166,7 +166,7 @@ associateddirectory = case repoAssociatedDirectory def of Nothing -> aopt hiddenField "" Nothing- Just d -> aopt textField "Associated directory" (Just $ Just d)+ Just d -> aopt textField (bfs "Associated directory") (Just $ Just d) getEditRepositoryR :: RepoId -> Handler Html getEditRepositoryR = postEditRepositoryR@@ -195,7 +195,7 @@ curr <- liftAnnex $ getRepoConfig uuid mremote liftAnnex $ checkAssociatedDirectory curr mremote ((result, form), enctype) <- liftH $- runFormPostNoToken $ renderBootstrap $ editRepositoryAForm mremote curr+ runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout $ editRepositoryAForm mremote curr case result of FormSuccess input -> liftH $ do setRepoConfig uuid mremote curr input
Assistant/WebApp/Configurators/Fsck.hs view
@@ -64,10 +64,10 @@ u <- liftAnnex getUUID repolist <- liftAssistant (getrepolist ru) runFormPostNoToken $ \msg -> do- (reposRes, reposView) <- mreq (selectFieldList repolist) "" (Just ru)- (durationRes, durationView) <- mreq intField "" (Just $ durationSeconds d `quot` 60 )- (timeRes, timeView) <- mreq (selectFieldList times) "" (Just t)- (recurranceRes, recurranceView) <- mreq (selectFieldList recurrances) "" (Just r)+ (reposRes, reposView) <- mreq (selectFieldList repolist) (bfs "") (Just ru)+ (durationRes, durationView) <- mreq intField (bfs "") (Just $ durationSeconds d `quot` 60 )+ (timeRes, timeView) <- mreq (selectFieldList times) (bfs "") (Just t)+ (recurranceRes, recurranceView) <- mreq (selectFieldList recurrances) (bfs "") (Just r) let form = do webAppFormAuthToken $(widgetFile "configurators/fsck/formcontent")@@ -175,7 +175,8 @@ runFsckPreferencesForm :: Handler ((FormResult FsckPreferences, Widget), Enctype) runFsckPreferencesForm = do prefs <- liftAnnex getFsckPreferences- runFormPostNoToken $ renderBootstrap $ fsckPreferencesAForm prefs+ runFormPostNoToken $ renderBootstrap3 formLayout $ fsckPreferencesAForm prefs+ where formLayout = BootstrapHorizontalForm (ColSm 0) (ColSm 2) (ColSm 0) (ColSm 10) showFsckPreferencesForm :: Widget showFsckPreferencesForm = do
Assistant/WebApp/Configurators/IA.hs view
@@ -83,8 +83,8 @@ iaInputAForm defcreds = IAInput <$> accessKeyIDFieldWithHelp (T.pack . fst <$> defcreds) <*> AWS.secretAccessKeyField (T.pack . snd <$> defcreds)- <*> areq (selectFieldList mediatypes) "Media Type" (Just MediaOmitted)- <*> areq (textField `withExpandableNote` ("Help", itemNameHelp)) "Item Name" Nothing+ <*> areq (selectFieldList mediatypes) (bfs "Media Type") (Just MediaOmitted)+ <*> areq (textField `withExpandableNote` ("Help", itemNameHelp)) (bfs "Item Name") Nothing where mediatypes :: [(Text, MediaType)] mediatypes = map (\t -> (T.pack $ showMediaType t, t)) [minBound..]@@ -126,7 +126,7 @@ postAddIAR = iaConfigurator $ do defcreds <- liftAnnex previouslyUsedIACreds ((result, form), enctype) <- liftH $- runFormPostNoToken $ renderBootstrap $ iaInputAForm defcreds+ runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout $ iaInputAForm defcreds case result of FormSuccess input -> liftH $ do let name = escapeBucket $ T.unpack $ itemName input@@ -165,7 +165,7 @@ enableIARemote uuid = do defcreds <- liftAnnex previouslyUsedIACreds ((result, form), enctype) <- liftH $- runFormPostNoToken $ renderBootstrap $ iaCredsAForm defcreds+ runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout $ iaCredsAForm defcreds case result of FormSuccess creds -> liftH $ do m <- liftAnnex readRemoteLog
Assistant/WebApp/Configurators/Local.hs view
@@ -143,7 +143,7 @@ newRepositoryForm :: FilePath -> Hamlet.Html -> MkMForm RepositoryPath newRepositoryForm defpath msg = do- (pathRes, pathView) <- mreq (repositoryPathField True) ""+ (pathRes, pathView) <- mreq (repositoryPathField True) (bfs "") (Just $ T.pack $ addTrailingPathSeparator defpath) let (err, errmsg) = case pathRes of FormMissing -> (False, "")@@ -217,10 +217,10 @@ remotename = takeFileName newrepopath selectDriveForm :: [RemovableDrive] -> Hamlet.Html -> MkMForm RemovableDrive-selectDriveForm drives = renderBootstrap $ RemovableDrive+selectDriveForm drives = renderBootstrap3 bootstrapFormLayout $ RemovableDrive <$> pure Nothing- <*> areq (selectFieldList pairs `withNote` onlywritable) "Select drive:" Nothing- <*> areq textField "Use this directory on the drive:"+ <*> areq (selectFieldList pairs `withNote` onlywritable) (bfs "Select drive:") Nothing+ <*> areq textField (bfs "Use this directory on the drive:") (Just $ T.pack gitAnnexAssistantDefaultDir) where pairs = zip (map describe drives) (map mountPoint drives)
Assistant/WebApp/Configurators/Pairing.hs view
@@ -265,8 +265,8 @@ promptSecret :: Maybe PairMsg -> (Text -> Secret -> Widget) -> Handler Html promptSecret msg cont = pairPage $ do ((result, form), enctype) <- liftH $- runFormPostNoToken $ renderBootstrap $- InputSecret <$> aopt textField "Secret phrase" Nothing+ runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout $+ InputSecret <$> aopt textField (bfs "Secret phrase") Nothing case result of FormSuccess v -> do let rawsecret = fromMaybe "" $ secretText v
Assistant/WebApp/Configurators/Preferences.hs view
@@ -36,13 +36,13 @@ prefsAForm :: PrefsForm -> MkAForm PrefsForm prefsAForm def = PrefsForm <$> areq (storageField `withNote` diskreservenote)- "Disk reserve" (Just $ diskReserve def)+ (bfs "Disk reserve") (Just $ diskReserve def) <*> areq (positiveIntField `withNote` numcopiesnote)- "Number of copies" (Just $ numCopies def)+ (bfs "Number of copies") (Just $ numCopies def) <*> areq (checkBoxField `withNote` autostartnote) "Auto start" (Just $ autoStart def) <*> areq (selectFieldList autoUpgradeChoices)- autoUpgradeLabel (Just $ autoUpgrade def)+ (bfs autoUpgradeLabel) (Just $ autoUpgrade def) <*> areq (checkBoxField `withNote` debugnote) "Enable debug logging" (Just $ debugEnabled def) where@@ -109,7 +109,7 @@ postPreferencesR = page "Preferences" (Just Configuration) $ do ((result, form), enctype) <- liftH $ do current <- liftAnnex getPrefs- runFormPostNoToken $ renderBootstrap $ prefsAForm current+ runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout $ prefsAForm current case result of FormSuccess new -> liftH $ do liftAnnex $ storePrefs new
Assistant/WebApp/Configurators/Ssh.hs view
@@ -1,6 +1,6 @@ {- git-annex assistant webapp configurator for ssh-based remotes -- - Copyright 2012-2013 Joey Hess <joey@kitenet.net>+ - Copyright 2012-2014 Joey Hess <joey@kitenet.net> - - Licensed under the GNU AGPL version 3 or higher. -}@@ -13,6 +13,7 @@ import Assistant.WebApp.Common import Assistant.WebApp.Gpg import Assistant.Ssh+import Annex.Ssh import Assistant.WebApp.MakeRemote import Logs.Remote import Remote@@ -25,9 +26,15 @@ import Annex.UUID import Logs.UUID import Assistant.RemoteControl+import Types.Creds+import Assistant.CredPairCache+import Config.Files+import Utility.Tmp+import Utility.FileMode+import Utility.ThreadScheduler+import Utility.Env #ifdef mingw32_HOST_OS-import Utility.Tmp import Utility.Rsync #endif @@ -42,11 +49,18 @@ data SshInput = SshInput { inputHostname :: Maybe Text , inputUsername :: Maybe Text+ , inputAuthMethod :: AuthMethod+ , inputPassword :: Maybe Text , inputDirectory :: Maybe Text , inputPort :: Int }- deriving (Show) +data AuthMethod+ = Password+ | CachedPassword+ | ExistingSshKey+ deriving (Eq, Show)+ {- SshInput is only used for applicative form prompting, this converts - the result of such a form into a SshData. -} mkSshData :: SshInput -> SshData@@ -66,6 +80,8 @@ mkSshInput s = SshInput { inputHostname = Just $ sshHostName s , inputUsername = sshUserName s+ , inputAuthMethod = if needsPubKey s then CachedPassword else ExistingSshKey+ , inputPassword = Nothing , inputDirectory = Just $ sshDirectory s , inputPort = sshPort s }@@ -76,11 +92,19 @@ sshInputAForm :: Field WebApp WebApp Text -> SshInput -> AForm WebApp WebApp SshInput #endif sshInputAForm hostnamefield def = SshInput- <$> aopt check_hostname "Host name" (Just $ inputHostname def)- <*> aopt check_username "User name" (Just $ inputUsername def)- <*> aopt textField "Directory" (Just $ Just $ fromMaybe (T.pack gitAnnexAssistantDefaultDir) $ inputDirectory def)- <*> areq intField "Port" (Just $ inputPort def)+ <$> aopt check_hostname (bfs "Host name") (Just $ inputHostname def)+ <*> aopt check_username (bfs "User name") (Just $ inputUsername def)+ <*> areq (selectFieldList authmethods) (bfs "Authenticate with") (Just $ inputAuthMethod def)+ <*> aopt passwordField (bfs "Password") Nothing+ <*> aopt textField (bfs "Directory") (Just $ Just $ fromMaybe (T.pack gitAnnexAssistantDefaultDir) $ inputDirectory def)+ <*> areq intField (bfs "Port") (Just $ inputPort def) where+ authmethods :: [(Text, AuthMethod)]+ authmethods =+ [ ("password", Password)+ , ("existing ssh key", ExistingSshKey)+ ]+ check_username = checkBool (all (`notElem` "/:@ \t") . T.unpack) bad_username textField @@ -121,11 +145,11 @@ postAddSshR = sshConfigurator $ do username <- liftIO $ T.pack <$> myUserName ((result, form), enctype) <- liftH $- runFormPostNoToken $ renderBootstrap $ sshInputAForm textField $- SshInput Nothing (Just username) Nothing 22+ runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout $ sshInputAForm textField $+ SshInput Nothing (Just username) Password Nothing Nothing 22 case result of FormSuccess sshinput -> do- s <- liftIO $ testServer sshinput+ s <- liftAssistant $ testServer sshinput case s of Left status -> showform form enctype status Right (sshdata, u) -> liftH $ redirect $ ConfirmSshR sshdata u@@ -173,13 +197,13 @@ case (mkSshInput . unmangle <$> getsshinput m, M.lookup "name" m) of (Just sshinput, Just reponame) -> sshConfigurator $ do ((result, form), enctype) <- liftH $- runFormPostNoToken $ renderBootstrap $ sshInputAForm textField sshinput+ runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout $ sshInputAForm textField sshinput case result of FormSuccess sshinput' | isRsyncNet (inputHostname sshinput') -> void $ liftH $ rsyncnetsetup sshinput' reponame | otherwise -> do- s <- liftIO $ testServer sshinput'+ s <- liftAssistant $ testServer sshinput' case s of Left status -> showform form enctype status Right (sshdata, _u) -> void $ liftH $ genericsetup@@ -205,44 +229,34 @@ commandWrapper :: String commandWrapper = "~/.ssh/git-annex-wrapper" -{- Test if we can ssh into the server.- -- - Two probe attempts are made. First, try sshing in using the existing- - configuration, but don't let ssh prompt for any password. If- - passwordless login is already enabled, use it. Otherwise,- - a special ssh key will need to be generated just for this server.+{- Test if we can ssh into the server, using the specified AuthMethod. - - Once logged into the server, probe to see if git-annex-shell, - git, and rsync are available. -- - Note that, ~/.ssh/git-annex-shell may be- - present, while git-annex-shell is not in PATH.+ - Note that ~/.ssh/git-annex-shell may be present, while+ - git-annex-shell is not in PATH. - Also, git and rsync may not be in PATH; as long as the commandWrapper - is present, assume it is able to be used to run them. - - Also probe to see if there is already a git repository at the location - with either an annex-uuid or a gcrypt-id set. (If not, returns NoUUID.) -}-testServer :: SshInput -> IO (Either ServerStatus (SshData, UUID))+testServer :: SshInput -> Assistant (Either ServerStatus (SshData, UUID)) testServer (SshInput { inputHostname = Nothing }) = return $ Left $ UnusableServer "Please enter a host name." testServer sshinput@(SshInput { inputHostname = Just hn }) = do- (status, u) <- probe [sshOpt "NumberOfPasswordPrompts" "0"]+ (status, u) <- probe case capabilities status of- [] -> do- (status', u') <- probe []- case capabilities status' of- [] -> return $ Left status'- cs -> ret cs True u'- cs -> ret cs False u+ [] -> return $ Left status+ cs -> do+ let sshdata = (mkSshData sshinput)+ { needsPubKey = inputAuthMethod sshinput /= ExistingSshKey+ , sshCapabilities = cs+ }+ return $ Right (sshdata, u) where- ret cs needspubkey u = do- let sshdata = (mkSshData sshinput)- { needsPubKey = needspubkey- , sshCapabilities = cs- }- return $ Right (sshdata, u)- probe extraopts = do+ probe = do let remotecommand = shellWrap $ intercalate ";" [ report "loggedin" , checkcommand "git-annex-shell"@@ -252,12 +266,13 @@ , checkcommand commandWrapper , getgitconfig (T.unpack <$> inputDirectory sshinput) ]- knownhost <- knownHost hn- let sshopts = filter (not . null) $ extraopts +++ knownhost <- liftIO $ knownHost hn+ let sshopts = {- If this is an already known host, let - ssh check it as usual. - Otherwise, trust the host key. -}- [ if knownhost then "" else sshOpt "StrictHostKeyChecking" "no"+ [ sshOpt "StrictHostKeyChecking" $+ if knownhost then "yes" else "no" , "-n" -- don't read from stdin , "-p", show (inputPort sshinput) , genSshHost@@ -265,7 +280,7 @@ (inputUsername sshinput) , remotecommand ]- parsetranscript . fst <$> sshTranscript sshopts Nothing+ parsetranscript . fst <$> sshAuthTranscript sshinput sshopts Nothing parsetranscript s = let cs = map snd $ filter (reported . fst) [ ("git-annex-shell", GitAnnexShellCapable)@@ -298,19 +313,84 @@ | not (null d) = "cd " ++ shellEscape d ++ " && git config --list" getgitconfig _ = "echo" -{- Runs a ssh command; if it fails shows the user the transcript,- - and if it succeeds, runs an action. -}-sshSetup :: [String] -> Maybe String -> Handler Html -> Handler Html-sshSetup opts input a = do- (transcript, ok) <- liftIO $ sshTranscript opts input+{- Runs a ssh command to set up the repository; if it fails shows+ - the user the transcript, and if it succeeds, runs an action. -}+sshSetup :: SshInput -> [String] -> Maybe String -> Handler Html -> Handler Html+sshSetup sshinput opts input a = do+ (transcript, ok) <- liftAssistant $ sshAuthTranscript sshinput opts input if ok- then a- else showSshErr transcript+ then do+ liftAssistant $ expireCachedCred $ getLogin sshinput+ a+ else sshErr sshinput transcript -showSshErr :: String -> Handler Html-showSshErr msg = sshConfigurator $- $(widgetFile "configurators/ssh/error")+sshErr :: SshInput -> String -> Handler Html+sshErr sshinput msg+ | inputAuthMethod sshinput == CachedPassword =+ ifM (liftAssistant $ isNothing <$> getCachedCred (getLogin sshinput))+ ( sshConfigurator $+ $(widgetFile "configurators/ssh/expiredpassword")+ , showerr+ )+ | otherwise = showerr+ where+ showerr = sshConfigurator $+ $(widgetFile "configurators/ssh/error") +{- Runs a ssh command, returning a transcript of its output.+ -+ - Depending on the SshInput, avoids using a password, or uses a+ - cached password. ssh is coaxed to use git-annex as SSH_ASKPASS+ - to get the password.+ -+ - Note that ssh will only use SSH_ASKPASS when DISPLAY is set and there+ - is no controlling terminal. On Unix, that is set up when the assistant+ - starts, by calling createSession. On Windows, all of stdin, stdout, and+ - stderr must be disconnected from the terminal. This is accomplished+ - by always providing input on stdin.+ -}+sshAuthTranscript :: SshInput -> [String] -> (Maybe String) -> Assistant (String, Bool)+sshAuthTranscript sshinput opts input = case inputAuthMethod sshinput of+ ExistingSshKey -> liftIO $ go [passwordprompts 0] Nothing+ CachedPassword -> setupAskPass+ Password -> do+ cacheCred (login, geti inputPassword) (Seconds $ 60 * 10)+ setupAskPass+ where+ login = getLogin sshinput+ geti f = maybe "" T.unpack (f sshinput)++ go extraopts env = processTranscript' "ssh" (extraopts ++ opts) env $+ Just (fromMaybe "" input)++ setupAskPass = do+ program <- liftIO readProgramFile+ v <- getCachedCred login+ liftIO $ case v of+ Nothing -> go [passwordprompts 0] Nothing+ Just pass -> withTmpFile "ssh" $ \passfile h -> do+ hClose h+ writeFileProtected passfile pass+ env <- getEnvironment+ let env' = addEntries+ [ ("SSH_ASKPASS", program)+ , (sshAskPassEnv, passfile)+ -- ssh does not use SSH_ASKPASS+ -- unless DISPLAY is set, and+ -- there is no controlling+ -- terminal.+ , ("DISPLAY", ":0")+ ] env+ go [passwordprompts 1] (Just env')+ + passwordprompts :: Int -> String+ passwordprompts = sshOpt "NumberOfPasswordPrompts" . show++getLogin :: SshInput -> Login+getLogin sshinput = geti inputUsername ++ "@" ++ geti inputHostname+ where+ geti f = maybe "" T.unpack (f sshinput)+ {- The UUID will be NoUUID when the repository does not already exist, - or was not a git-annex repository before. -} getConfirmSshR :: SshData -> UUID -> Handler Html@@ -343,7 +423,7 @@ getRetrySshR :: SshData -> Handler () getRetrySshR sshdata = do- s <- liftIO $ testServer $ mkSshInput sshdata+ s <- liftAssistant $ testServer $ mkSshInput sshdata redirect $ either (const $ ConfirmSshR sshdata NoUUID) (uncurry ConfirmSshR) s {- Making a new git repository. -}@@ -403,7 +483,7 @@ | otherwise = prepSsh' needsinit sshdata sshdata Nothing a prepSsh' :: Bool -> SshData -> SshData -> Maybe SshKeyPair -> (SshData -> Handler Html) -> Handler Html-prepSsh' needsinit origsshdata sshdata keypair a = sshSetup+prepSsh' needsinit origsshdata sshdata keypair a = sshSetup (mkSshInput origsshdata) [ "-p", show (sshPort origsshdata) , genSshHost (sshHostName origsshdata) (sshUserName origsshdata) , remoteCommand@@ -450,8 +530,8 @@ postAddRsyncNetR :: Handler Html postAddRsyncNetR = do ((result, form), enctype) <- runFormPostNoToken $- renderBootstrap $ sshInputAForm hostnamefield $- SshInput Nothing Nothing Nothing 22+ renderBootstrap3 bootstrapFormLayout $ sshInputAForm hostnamefield $+ SshInput Nothing Nothing Password Nothing Nothing 22 let showform status = inpage $ $(widgetFile "configurators/rsync.net/add") case result of@@ -476,6 +556,7 @@ go sshinput = do let reponame = genSshRepoName "rsync.net" (maybe "" T.unpack $ inputDirectory sshinput)+ prepRsyncNet sshinput reponame $ \sshdata -> inpage $ checkExistingGCrypt sshdata $ do secretkeys <- sortBy (comparing snd) . M.toList@@ -490,7 +571,7 @@ getMakeRsyncNetGCryptR sshdata NoRepoKey = whenGcryptInstalled $ withNewSecretKey $ getMakeRsyncNetGCryptR sshdata . RepoKey getMakeRsyncNetGCryptR sshdata (RepoKey keyid) = whenGcryptInstalled $- sshSetup [sshhost, gitinit] Nothing $ makeGCryptRepo keyid sshdata+ sshSetup (mkSshInput sshdata) [sshhost, gitinit] Nothing $ makeGCryptRepo keyid sshdata where sshhost = genSshHost (sshHostName sshdata) (sshUserName sshdata) gitinit = "git init --bare " ++ T.unpack (sshDirectory sshdata)@@ -514,11 +595,6 @@ - To append the ssh key to rsync.net's authorized_keys, their - documentation recommends a dd methodd, where the line is fed - in to ssh over stdin.- -- - On Windows, ssh password prompting happens on stdin, so cannot- - feed the key in that way. Instead, first rsync down any current- - authorized_keys file, then modifiy it, and then rsync it back up.- - This means 2 password prompts rather than one for Windows. -} prepRsyncNet :: SshInput -> String -> (SshData -> Handler Html) -> Handler Html prepRsyncNet sshinput reponame a = do@@ -536,7 +612,6 @@ , sshhost , cmd ]-#ifndef mingw32_HOST_OS {- I'd prefer to separate commands with && , but - rsync.net's shell does not support that. -} let remotecommand = intercalate ";"@@ -545,22 +620,7 @@ , "dd of=.ssh/authorized_keys oflag=append conv=notrunc" , "mkdir -p " ++ T.unpack (sshDirectory sshdata) ]- sshSetup (torsyncnet remotecommand) (Just $ sshPubKey keypair) (a sshdata)-#else- liftIO $ withTmpDir "rsyncnet" $ \tmpdir -> do- createDirectory $ tmpdir </> ".ssh"- (oldkeys, _) <- sshTranscript (torsyncnet "cat .ssh/authorized_keys") Nothing- writeFile (tmpdir </> ".ssh" </> "authorized_keys")- (sshPubKey keypair ++ "\n" ++ oldkeys)- liftIO $ putStrLn "May need to prompt for your rsync.net password one more time..."- void $ rsync- [ Param "-r"- , File $ tmpdir </> ".ssh/"- , Param $ sshhost ++ ":.ssh/"- ]- let remotecommand = "mkdir -p " ++ T.unpack (sshDirectory sshdata)- sshSetup (torsyncnet remotecommand) Nothing (a sshdata)-#endif+ sshSetup sshinput (torsyncnet remotecommand) (Just $ sshPubKey keypair) (a sshdata) isRsyncNet :: Maybe Text -> Bool isRsyncNet Nothing = False
Assistant/WebApp/Configurators/Unused.hs view
@@ -27,9 +27,9 @@ unusedForm :: UnusedForm -> Hamlet.Html -> MkMForm UnusedForm unusedForm def msg = do- (enableRes, enableView) <- mreq (selectFieldList enabledisable) ""+ (enableRes, enableView) <- mreq (selectFieldList enabledisable) (bfs "") (Just $ enableExpire def)- (whenRes, whenView) <- mreq intField ""+ (whenRes, whenView) <- mreq intField (bfs "") (Just $ expireWhen def) let form = do webAppFormAuthToken
Assistant/WebApp/Configurators/WebDAV.hs view
@@ -45,16 +45,16 @@ boxComAForm :: Maybe CredPair -> MkAForm WebDAVInput boxComAForm defcreds = WebDAVInput- <$> areq textField "Username or Email" (T.pack . fst <$> defcreds)- <*> areq passwordField "Box.com Password" (T.pack . snd <$> defcreds)+ <$> areq textField (bfs "Username or Email") (T.pack . fst <$> defcreds)+ <*> areq passwordField (bfs "Box.com Password") (T.pack . snd <$> defcreds) <*> areq checkBoxField "Share this account with other devices and friends?" (Just True)- <*> areq textField "Directory" (Just "annex")+ <*> areq textField (bfs "Directory") (Just "annex") <*> enableEncryptionField webDAVCredsAForm :: Maybe CredPair -> MkAForm WebDAVInput webDAVCredsAForm defcreds = WebDAVInput- <$> areq textField "Username or Email" (T.pack . fst <$> defcreds)- <*> areq passwordField "Password" (T.pack . snd <$> defcreds)+ <$> areq textField (bfs "Username or Email") (T.pack . fst <$> defcreds)+ <*> areq passwordField (bfs "Password") (T.pack . snd <$> defcreds) <*> pure False <*> pure T.empty <*> pure NoEncryption -- not used!@@ -66,7 +66,8 @@ postAddBoxComR = boxConfigurator $ do defcreds <- liftAnnex $ previouslyUsedWebDAVCreds "box.com" ((result, form), enctype) <- liftH $- runFormPostNoToken $ renderBootstrap $ boxComAForm defcreds+ runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout+ $ boxComAForm defcreds case result of FormSuccess input -> liftH $ makeWebDavRemote initSpecialRemote "box.com" (toCredPair input) $ M.fromList@@ -109,7 +110,8 @@ maybe (pure Nothing) previouslyUsedWebDAVCreds $ urlHost url ((result, form), enctype) <- liftH $- runFormPostNoToken $ renderBootstrap $ webDAVCredsAForm defcreds+ runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout $+ webDAVCredsAForm defcreds case result of FormSuccess input -> liftH $ makeWebDavRemote enableSpecialRemote name (toCredPair input) M.empty
Assistant/WebApp/Configurators/XMPP.hs view
@@ -99,7 +99,7 @@ xmppform next = xmppPage $ do ((result, form), enctype) <- liftH $ do oldcreds <- liftAnnex getXMPPCreds- runFormPostNoToken $ renderBootstrap $ xmppAForm $+ runFormPostNoToken $ renderBootstrap3 bootstrapFormLayout $ xmppAForm $ creds2Form <$> oldcreds let showform problem = $(widgetFile "configurators/xmpp") case result of@@ -162,8 +162,8 @@ xmppAForm :: (Maybe XMPPForm) -> MkAForm XMPPForm xmppAForm def = XMPPForm- <$> areq jidField "Jabber address" (formJID <$> def)- <*> areq passwordField "Password" Nothing+ <$> areq jidField (bfs "Jabber address") (formJID <$> def)+ <*> areq passwordField (bfs "Password") Nothing jidField :: MkField Text jidField = checkBool (isJust . parseJID) bad textField
Assistant/WebApp/Form.hs view
@@ -15,9 +15,18 @@ import Assistant.WebApp.Types import Assistant.Gpg +#if MIN_VERSION_yesod(1,2,0) import Yesod hiding (textField, passwordField) import Yesod.Form.Fields as F+#else+import Yesod hiding (textField, passwordField, selectField, selectFieldList)+import Yesod.Form.Fields as F hiding (selectField, selectFieldList)+import Data.String (IsString (..))+import Control.Monad (unless)+import Data.Maybe (listToMaybe)+#endif import Data.Text (Text)+import Assistant.WebApp.Bootstrap3 hiding (bfs) {- Yesod's textField sets the required attribute for required fields. - We don't want this, because many of the forms used in this webapp @@ -48,6 +57,54 @@ |] } +{- In older Yesod versions attrs is written into the <option> tag instead of the+ - surrounding <select>. This breaks the Bootstrap 3 layout of select fields as+ - it requires the "form-control" class on the <select> tag.+ - We need to change that to behave the same way as in newer versions.+ -}+#if ! MIN_VERSION_yesod(1,2,0)+selectFieldList :: (Eq a, RenderMessage master FormMessage, RenderMessage master msg) => [(msg, a)] -> Field sub master a+selectFieldList = selectField . optionsPairs++selectField :: (Eq a, RenderMessage master FormMessage) => GHandler sub master (OptionList a) -> Field sub master a+selectField = selectFieldHelper+ (\theId name attrs inside -> [whamlet|<select ##{theId} name=#{name} *{attrs}>^{inside}|]) -- outside+ (\_theId _name isSel -> [whamlet|<option value=none :isSel:selected>_{MsgSelectNone}|]) -- onOpt+ (\_theId _name _attrs value isSel text -> [whamlet|<option value=#{value} :isSel:selected>#{text}|]) -- inside++selectFieldHelper :: (Eq a, RenderMessage master FormMessage)+ => (Text -> Text -> [(Text, Text)] -> GWidget sub master () -> GWidget sub master ())+ -> (Text -> Text -> Bool -> GWidget sub master ())+ -> (Text -> Text -> [(Text, Text)] -> Text -> Bool -> Text -> GWidget sub master ())+ -> GHandler sub master (OptionList a) -> Field sub master a+selectFieldHelper outside onOpt inside opts' = Field+ { fieldParse = \x -> do+ opts <- opts'+ return $ selectParser opts x+ , fieldView = \theId name attrs val isReq -> do+ opts <- fmap olOptions $ lift opts'+ outside theId name attrs $ do+ unless isReq $ onOpt theId name $ not $ render opts val `elem` map optionExternalValue opts+ flip mapM_ opts $ \opt -> inside+ theId+ name+ ((if isReq then (("required", "required"):) else id) attrs)+ (optionExternalValue opt)+ ((render opts val) == optionExternalValue opt)+ (optionDisplay opt)+ }+ where+ render _ (Left _) = ""+ render opts (Right a) = maybe "" optionExternalValue $ listToMaybe $ filter ((== a) . optionInternalValue) opts+ selectParser _ [] = Right Nothing+ selectParser opts (s:_) = case s of+ "" -> Right Nothing+ "none" -> Right Nothing+ x -> case olReadExternal opts x of+ Nothing -> Left $ SomeMessage $ MsgInvalidEntry x+ Just y -> Right $ Just y+#endif+ {- Makes a note widget be displayed after a field. -} #if MIN_VERSION_yesod(1,2,0) withNote :: (Monad m, ToWidget (HandlerSite m) a) => Field m v -> a -> Field m v@@ -67,7 +124,7 @@ withExpandableNote :: Field sub master v -> (String, GWidget sub master ()) -> Field sub master v #endif withExpandableNote field (toggle, note) = withNote field $ [whamlet|-<a .btn data-toggle="collapse" data-target="##{ident}">#{toggle}</a>+<a .btn .btn-default data-toggle="collapse" data-target="##{ident}">#{toggle}</a> <div ##{ident} .collapse> ^{note} |]@@ -80,10 +137,27 @@ #else enableEncryptionField :: RenderMessage master FormMessage => AForm sub master EnableEncryption #endif-enableEncryptionField = areq (selectFieldList choices) "Encryption" (Just SharedEncryption)+enableEncryptionField = areq (selectFieldList choices) (bfs "Encryption") (Just SharedEncryption) where choices :: [(Text, EnableEncryption)] choices = [ ("Encrypt all data", SharedEncryption) , ("Disable encryption", NoEncryption) ]++{- Defines the layout used by the Bootstrap3 form helper -}+bootstrapFormLayout :: BootstrapFormLayout+bootstrapFormLayout = BootstrapHorizontalForm (ColSm 0) (ColSm 2) (ColSm 0) (ColSm 10)++{- Adds the form-control class used by Bootstrap3 for layout to a field+ - This is the same as Yesod.Form.Bootstrap3.bfs except it takes just a Text+ - parameter as I couldn't get the original bfs to compile due to type ambiguities.+ -}+bfs :: Text -> FieldSettings master+bfs msg = FieldSettings+ { fsLabel = SomeMessage msg+ , fsName = Nothing+ , fsId = Nothing+ , fsAttrs = [("class", "form-control")]+ , fsTooltip = Nothing+ }
Assistant/WebApp/Gpg.hs view
@@ -27,11 +27,12 @@ gpgKeyDisplay :: KeyId -> Maybe UserId -> Widget gpgKeyDisplay keyid userid = [whamlet| <span title="key id #{keyid}">- <i .icon-user></i> #- $maybe name <- userid- #{name}- $nothing- key id #{keyid}+ <span .glyphicon .glyphicon-user>+ \ + $maybe name <- userid+ #{name}+ $nothing+ key id #{keyid} |] genKeyModal :: Widget
Assistant/WebApp/Page.hs view
@@ -59,14 +59,12 @@ Nothing -> do navbar <- map navdetails <$> selectNavBar pageinfo <- widgetToPageContent $ do- addStylesheet $ StaticR bootstrap_css- addStylesheet $ StaticR bootstrap_responsive_css- addScript $ StaticR jquery_full_js- addScript $ StaticR bootstrap_dropdown_js- addScript $ StaticR bootstrap_modal_js- addScript $ StaticR bootstrap_collapse_js+ addStylesheet $ StaticR css_bootstrap_css+ addStylesheet $ StaticR css_bootstrap_theme_css+ addScript $ StaticR js_jquery_full_js+ addScript $ StaticR js_bootstrap_js when with_longpolling $- addScript $ StaticR longpolling_js+ addScript $ StaticR js_longpolling_js $(widgetFile "page") giveUrlRenderer $(Hamlet.hamletFile $ hamletTemplate "bootstrap") Just msg -> error msg
Assistant/WebApp/RepoList.hs view
@@ -113,10 +113,10 @@ repoListDisplay :: RepoSelector -> Widget repoListDisplay reposelector = do autoUpdate ident (NotifierRepoListR reposelector) (10 :: Int) (10 :: Int)- addScript $ StaticR jquery_ui_core_js- addScript $ StaticR jquery_ui_widget_js- addScript $ StaticR jquery_ui_mouse_js- addScript $ StaticR jquery_ui_sortable_js+ addScript $ StaticR js_jquery_ui_core_js+ addScript $ StaticR js_jquery_ui_widget_js+ addScript $ StaticR js_jquery_ui_mouse_js+ addScript $ StaticR js_jquery_ui_sortable_js repolist <- liftH $ repoList reposelector let addmore = nudgeAddMore reposelector@@ -223,17 +223,17 @@ {- Get uuid of the moved item, and the list it was moved within. -} moved <- fromjs <$> runInputGet (ireq textField "moved") list <- map fromjs <$> lookupGetParams "list[]"- liftAnnex $ go list =<< Remote.remoteFromUUID moved+ liftAnnex $ go list =<< repoIdRemote moved liftAssistant updateSyncRemotes where go _ Nothing = noop go list (Just remote) = do- rs <- catMaybes <$> mapM Remote.remoteFromUUID list+ rs <- catMaybes <$> mapM repoIdRemote list forM_ (reorderCosts remote rs) $ \(r, newcost) -> when (Remote.cost r /= newcost) $ setRemoteCost (Remote.repo r) newcost void remoteListRefresh- fromjs = toUUID . T.unpack+ fromjs = fromMaybe (RepoUUID NoUUID) . readish . T.unpack reorderCosts :: Remote -> [Remote] -> [(Remote, Cost)] reorderCosts remote rs = zip rs'' (insertCostAfter costs i)
Assistant/WebApp/SideBar.hs view
@@ -38,7 +38,7 @@ bootstrapclass :: AlertClass -> Text bootstrapclass Activity = "alert-info" bootstrapclass Warning = "alert"- bootstrapclass Error = "alert-error"+ bootstrapclass Error = "alert-danger" bootstrapclass Success = "alert-success" bootstrapclass Message = "alert-info" @@ -106,4 +106,4 @@ htmlIcon ConnectionIcon = bootstrapIcon "signal" bootstrapIcon :: Text -> Widget-bootstrapIcon name = [whamlet|<i .icon-#{name}></i>|]+bootstrapIcon name = [whamlet|<span .glyphicon .glyphicon-#{name}>|]
Assistant/WebApp/Types.hs view
@@ -73,8 +73,10 @@ defaultLayout content = do webapp <- getYesod pageinfo <- widgetToPageContent $ do- addStylesheet $ StaticR bootstrap_css- addStylesheet $ StaticR bootstrap_responsive_css+ addStylesheet $ StaticR css_bootstrap_css+ addStylesheet $ StaticR css_bootstrap_theme_css+ addScript $ StaticR js_jquery_full_js+ addScript $ StaticR js_bootstrap_js $(widgetFile "error") giveUrlRenderer $(hamletFile $ hamletTemplate "bootstrap")
Build/Configure.hs view
@@ -7,7 +7,6 @@ import System.Environment (getArgs) import Control.Monad.IfElse import Control.Monad-import System.IO import Build.TestConfig import Build.Version@@ -63,11 +62,7 @@ key = "sha" ++ show n search [] = return Nothing search (c:cmds) = do- putStr $ "(" ++ c- hFlush stdout sha <- externalSHA c n "/dev/null"- putStr $ ":" ++ show sha ++ ")"- hFlush stdout if sha == Right knowngood then return $ Just c else search cmds
Build/DistributionUpdate.hs view
@@ -96,7 +96,7 @@ void $ liftIO $ boolSystem "gpg" [ Param "-a" , Param $ "--default-key=" ++ signingKey- , Param "--sign"+ , Param "--detach-sign" , File f ] liftIO $ rename (f ++ ".asc") (f ++ ".sig")
Build/EvilSplicer.hs view
@@ -460,6 +460,11 @@ - - Nothing - -> foo+ -+ - -- This is not yet handled!+ - ComplexConstructor var var+ - var var+ - -> foo -} case_layout_multiline = parsecAndReplace $ do void newline
CHANGELOG view
@@ -1,3 +1,27 @@+git-annex (5.20140517) unstable; urgency=medium++ * webapp: Switched to bootstrap 3.+ Thanks, Sören Brunk.+ * Standalone builds now check gpg signatures before upgrading.+ * Simplified repository description line format. The remote name,+ if any, is always in square brackets after the description.+ * assistant: Clean up stale tmp files on startup.+ * webapp: Better ssh password prompting.+ * Depend on git-remote-gcrypt 0.20130908-6. Older versions+ fail when the assistant is run with no controlling tty.+ * Added ddar special remote.+ Thanks, Robie Basak.+ * webapp: Fixed drag and drop to reorder the list of remotes.+ * group: When no groups are specified to set, lists the current groups+ of a repository.+ * Add remote.$name.annex-shell configuration.+ Thanks, Fraser Tweedale + * Support symlinking git-annex and git-annex-shell+ from the Linux standalone bundle into PATH.+ Thanks, jlebar.++ -- Joey Hess <joeyh@debian.org> Sat, 17 May 2014 13:30:39 -0400+ git-annex (5.20140421) unstable; urgency=medium * assistant: Now detects immediately when other repositories push
COPYRIGHT view
@@ -7,11 +7,25 @@ Files: Assistant/WebApp.hs Assistant/WebApp/* templates/* static/* Copyright: © 2012-2014 Joey Hess <joey@kitenet.net>+ © 2014 Sören Brunk License: AGPL-3+ +Files: Remote/Ddar.hs+Copyright: © 2011 Joey Hess <joey@kitenet.net>+ © 2014 Robie Basak <robie@justgohome.co.uk>+License: GPL-3++ Files: Utility/ThreadScheduler.hs Copyright: 2011 Bas van Dijk & Roel van Dijk- 2012 Joey Hess <joey@kitenet.net>+ 2012, 2013 Joey Hess <joey@kitenet.net>+License: BSD-2-clause++Files: Utility/*+Copyright: 2012-2014 Joey Hess <joey@kitenet.net>+License: BSD-2-clause++Files: Utility/Gpg.hs Utility/DirWatcher*+Copyright: © 2010-2014 Joey Hess <joey@kitenet.net> License: GPL-3+ Files: doc/logo* */favicon.ico standalone/osx/git-annex.app/Contents/Resources/git-annex.icns standalone/android/icons/*@@ -88,23 +102,28 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Files: static/bootstrap* static/glyphicons-halflings*-Copyright: 2012 Twitter, Inc.-License: Apache-2.0- 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.- .- The complete text of the Apache License is distributed in- /usr/share/common-licenses/Apache-2.0 on Debian systems.+Files: static/*/bootstrap* static/*/glyphicons-halflings*+Copyright: 2012-2014 Twitter, Inc.+License: MIT+ Copyright (c) 2011-2014 Twitter, Inc+ .+ Permission is hereby granted, free of charge, to any person obtaining a copy+ of this software and associated documentation files (the "Software"), to deal+ in the Software without restriction, including without limitation the rights+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell+ copies of the Software, and to permit persons to whom the Software is+ furnished to do so, subject to the following conditions:+ .+ The above copyright notice and this permission notice shall be included in+ all copies or substantial portions of the Software.+ .+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN+ THE SOFTWARE. License: GPL-3+ The full text of version 3 of the GPL is distributed as doc/license/GPL in@@ -115,6 +134,28 @@ The full text of version 2.1 of the LGPL is distributed as doc/license/LGPL in this package's source, or in /usr/share/common-licenses/LGPL-2.1 on Debian systems.++License: BSD-2-clause+ Redistribution and use in source and binary forms, with or without+ modification, are permitted provided that the following conditions+ are met:+ 1. Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.+ 2. 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.+ .+ THIS SOFTWARE IS PROVIDED BY AUTHORS 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 AUTHORS OR 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. License: AGPL-3+ GNU AFFERO GENERAL PUBLIC LICENSE
CmdLine/GitAnnex.hs view
@@ -199,5 +199,11 @@ #ifdef WITH_EKG _ <- forkServer "localhost" 4242 #endif- maybe (dispatch True args cmds gitAnnexOptions [] header Git.CurrentRepo.get)- (runSshCaching args) =<< getEnv sshCachingEnv+ go envmodes+ where+ go [] = dispatch True args cmds gitAnnexOptions [] header Git.CurrentRepo.get+ go ((v, a):rest) = maybe (go rest) a =<< getEnv v+ envmodes =+ [ (sshCachingEnv, runSshCaching args)+ , (sshAskPassEnv, runSshAskPass)+ ]
Command/Group.hs view
@@ -26,10 +26,14 @@ start (name:g:[]) = do showStart "group" name u <- Remote.nameToUUID name- next $ perform u g+ next $ setGroup u g+start (name:[]) = do+ u <- Remote.nameToUUID name+ showRaw . unwords . S.toList =<< lookupGroups u+ stop start _ = error "Specify a repository and a group." -perform :: UUID -> Group -> CommandPerform-perform uuid g = do+setGroup :: UUID -> Group -> CommandPerform+setGroup uuid g = do groupChange uuid (S.insert g) next $ return True
Command/Map.hs view
@@ -203,7 +203,8 @@ configlist = Ssh.onRemote r (pipedconfig, Nothing) "configlist" [] [] manualconfiglist = do- sshparams <- Ssh.toRepo r [Param sshcmd]+ gc <- Annex.getRemoteGitConfig r+ sshparams <- Ssh.toRepo r gc [Param sshcmd] liftIO $ pipedconfig "ssh" sshparams where sshcmd = cddir ++ " && " ++
Makefile view
@@ -120,6 +120,7 @@ ln -sf git-annex "$(LINUXSTANDALONE_DEST)/bin/git-annex-shell" zcat standalone/licences.gz > $(LINUXSTANDALONE_DEST)/LICENSE cp doc/logo_16x16.png doc/logo.svg $(LINUXSTANDALONE_DEST)+ cp standalone/trustedkeys.gpg $(LINUXSTANDALONE_DEST) ./Build/Standalone "$(LINUXSTANDALONE_DEST)" @@ -150,6 +151,7 @@ ln -sf git-annex "$(OSXAPP_BASE)/git-annex-shell" gzcat standalone/licences.gz > $(OSXAPP_BASE)/LICENSE cp $(OSXAPP_BASE)/LICENSE tmp/build-dmg/LICENSE.txt+ cp standalone/trustedkeys.gpg $(OSXAPP_BASE) ./Build/Standalone $(OSXAPP_BASE)
Remote.hs view
@@ -87,9 +87,8 @@ addName :: String -> RemoteName -> String addName desc n- | desc == n = desc- | null desc = n- | otherwise = n ++ " (" ++ desc ++ ")"+ | desc == n || null desc = "[" ++ n ++ "]"+ | otherwise = desc ++ " [" ++ n ++ "]" {- When a name is specified, looks up the remote matching that name. - (Or it can be a UUID.) -}
Remote/Bup.hs view
@@ -13,6 +13,7 @@ import Data.ByteString.Lazy.UTF8 (fromString) import Common.Annex+import qualified Annex import Types.Remote import Types.Key import Types.Creds@@ -223,7 +224,8 @@ onBupRemote :: Git.Repo -> (FilePath -> [CommandParam] -> IO a) -> FilePath -> [CommandParam] -> Annex a onBupRemote r a command params = do- sshparams <- Ssh.toRepo r [Param $+ c <- Annex.getRemoteGitConfig r+ sshparams <- Ssh.toRepo r c [Param $ "cd " ++ dir ++ " && " ++ unwords (command : toCommand params)] liftIO $ a "ssh" sshparams where
+ Remote/Ddar.hs view
@@ -0,0 +1,229 @@+{- Using ddar as a remote. Based on bup and rsync remotes.+ -+ - Copyright 2011 Joey Hess <joey@kitenet.net>+ - Copyright 2014 Robie Basak <robie@justgohome.co.uk>+ -+ - Licensed under the GNU GPL version 3 or higher.+ -}++module Remote.Ddar (remote) where++import Control.Exception+import qualified Data.ByteString.Lazy as L+import qualified Data.Map as M+import System.IO.Error+import System.Process++import Data.String.Utils+import Common.Annex+import Types.Remote+import Types.Key+import Types.Creds+import qualified Git+import Config+import Config.Cost+import Remote.Helper.Special+import Remote.Helper.Encryptable+import Crypto+import Annex.Content+import Annex.Ssh+import Annex.UUID+import Utility.Metered++type DdarRepo = String++remote :: RemoteType+remote = RemoteType {+ typename = "ddar",+ enumerate = findSpecialRemotes "ddarrepo",+ generate = gen,+ setup = ddarSetup+}++gen :: Git.Repo -> UUID -> RemoteConfig -> RemoteGitConfig -> Annex (Maybe Remote)+gen r u c gc = do+ cst <- remoteCost gc $+ if ddarLocal ddarrepo+ then nearlyCheapRemoteCost+ else expensiveRemoteCost++ let new = Remote+ { uuid = u+ , cost = cst+ , name = Git.repoDescribe r+ , storeKey = store ddarrepo+ , retrieveKeyFile = retrieve ddarrepo+ , retrieveKeyFileCheap = retrieveCheap+ , removeKey = remove ddarrepo+ , hasKey = checkPresent ddarrepo+ , hasKeyCheap = ddarLocal ddarrepo+ , whereisKey = Nothing+ , remoteFsck = Nothing+ , repairRepo = Nothing+ , config = c+ , repo = r+ , gitconfig = gc+ , localpath = if ddarLocal ddarrepo && not (null ddarrepo)+ then Just ddarrepo+ else Nothing+ , remotetype = remote+ , availability = if ddarLocal ddarrepo then LocallyAvailable else GloballyAvailable+ , readonly = False+ }+ return $ Just $ encryptableRemote c+ (storeEncrypted new ddarrepo)+ (retrieveEncrypted ddarrepo)+ new+ where+ ddarrepo = fromMaybe (error "missing ddarrepo") $ remoteAnnexDdarRepo gc++ddarSetup :: Maybe UUID -> Maybe CredPair -> RemoteConfig -> Annex (RemoteConfig, UUID)+ddarSetup mu _ c = do+ u <- maybe (liftIO genUUID) return mu++ -- verify configuration is sane+ let ddarrepo = fromMaybe (error "Specify ddarrepo=") $+ M.lookup "ddarrepo" c+ c' <- encryptionSetup c++ -- The ddarrepo is stored in git config, as well as this repo's+ -- persistant state, so it can vary between hosts.+ gitConfigSpecialRemote u c' "ddarrepo" ddarrepo++ return (c', u)++pipeDdar :: [CommandParam] -> Maybe Handle -> Maybe Handle -> IO Bool+pipeDdar params inh outh = do+ p <- runProcess "ddar" (toCommand params)+ Nothing Nothing inh outh Nothing+ ok <- waitForProcess p+ case ok of+ ExitSuccess -> return True+ _ -> return False++store :: DdarRepo -> Key -> AssociatedFile -> MeterUpdate -> Annex Bool+store ddarrepo k _f _p = sendAnnex k (void $ remove ddarrepo k) $ \src -> do+ let params =+ [ Param "c"+ , Param "-N"+ , Param $ key2file k+ , Param ddarrepo+ , File src+ ]+ liftIO $ boolSystem "ddar" params++storeEncrypted :: Remote -> DdarRepo -> (Cipher, Key) -> Key -> MeterUpdate -> Annex Bool+storeEncrypted r ddarrepo (cipher, enck) k _p =+ sendAnnex k (void $ remove ddarrepo k) $ \src ->+ liftIO $ catchBoolIO $+ encrypt (getGpgEncParams r) cipher (feedFile src) $ \h ->+ pipeDdar params (Just h) Nothing+ where+ params =+ [ Param "c"+ , Param "-N"+ , Param $ key2file enck+ , Param ddarrepo+ , Param "-"+ ]++{- Convert remote DdarRepo to host and path on remote end -}+splitRemoteDdarRepo :: DdarRepo -> (String, String)+splitRemoteDdarRepo ddarrepo =+ (host, ddarrepo')+ where+ (host, remainder) = span (/= ':') ddarrepo+ ddarrepo' = drop 1 remainder++{- Return the command and parameters to use for a ddar call that may need to be+ - made on a remote repository. This will call ssh if needed. -}++ddarRemoteCall :: DdarRepo -> Char -> [CommandParam] -> Annex (String, [CommandParam])+ddarRemoteCall ddarrepo cmd params+ | ddarLocal ddarrepo = return ("ddar", localParams)+ | otherwise = do+ remoteCachingParams <- sshCachingOptions (host, Nothing) []+ return ("ssh", remoteCachingParams ++ remoteParams)+ where+ (host, ddarrepo') = splitRemoteDdarRepo ddarrepo+ localParams = Param [cmd] : Param ddarrepo : params+ remoteParams = Param host : Param "ddar" : Param [cmd] : Param ddarrepo' : params++{- Specialized ddarRemoteCall that includes extraction command and flags -}++ddarExtractRemoteCall :: DdarRepo -> Key -> Annex (String, [CommandParam])+ddarExtractRemoteCall ddarrepo k =+ ddarRemoteCall ddarrepo 'x' [Param "--force-stdout", Param $ key2file k]++retrieve :: DdarRepo -> Key -> AssociatedFile -> FilePath -> MeterUpdate -> Annex Bool+retrieve ddarrepo k _f d _p = do+ (cmd, params) <- ddarExtractRemoteCall ddarrepo k+ liftIO $ catchBoolIO $ withFile d WriteMode $ \h -> do+ let p = (proc cmd $ toCommand params){ std_out = UseHandle h }+ (_, _, _, pid) <- Common.Annex.createProcess p+ forceSuccessProcess p pid+ return True++retrieveCheap :: Key -> FilePath -> Annex Bool+retrieveCheap _ _ = return False++retrieveEncrypted :: DdarRepo -> (Cipher, Key) -> Key -> FilePath -> MeterUpdate -> Annex Bool+retrieveEncrypted ddarrepo (cipher, enck) _ f _p = do+ (cmd, params) <- ddarExtractRemoteCall ddarrepo enck+ let p = proc cmd $ toCommand params+ liftIO $ catchBoolIO $ withHandle StdoutHandle createProcessSuccess p $ \h -> do+ decrypt cipher (\toh -> L.hPut toh =<< L.hGetContents h) $+ readBytes $ L.writeFile f+ return True++remove :: DdarRepo -> Key -> Annex Bool+remove ddarrepo key = do+ (cmd, params) <- ddarRemoteCall ddarrepo 'd' [Param $ key2file key]+ liftIO $ boolSystem cmd params++ddarDirectoryExists :: DdarRepo -> Annex (Either String Bool)+ddarDirectoryExists ddarrepo+ | ddarLocal ddarrepo = do+ maybeStatus <- liftIO $ tryJust (guard . isDoesNotExistError) $ getFileStatus ddarrepo+ return $ case maybeStatus of+ Left _ -> Right False+ Right status -> Right $ isDirectory status+ | otherwise = do+ sshCachingParams <- sshCachingOptions (host, Nothing) []+ exitCode <- liftIO $ safeSystem "ssh" $ sshCachingParams ++ params+ case exitCode of+ ExitSuccess -> return $ Right True+ ExitFailure 1 -> return $ Right False+ ExitFailure code -> return $ Left $ "ssh call " +++ show (Data.String.Utils.join " " $ toCommand params) +++ " failed with status " ++ show code+ where+ (host, ddarrepo') = splitRemoteDdarRepo ddarrepo+ params =+ [ Param host+ , Param "test"+ , Param "-d"+ , Param ddarrepo'+ ]++{- Use "ddar t" to determine if a given key is present in a ddar archive -}+inDdarManifest :: DdarRepo -> Key -> Annex (Either String Bool)+inDdarManifest ddarrepo k = do+ (cmd, params) <- ddarRemoteCall ddarrepo 't' []+ let p = proc cmd $ toCommand params+ liftIO $ catchMsgIO $ withHandle StdoutHandle createProcessSuccess p $ \h -> do+ contents <- hGetContents h+ return $ elem k' $ lines contents+ where+ k' = key2file k++checkPresent :: DdarRepo -> Key -> Annex (Either String Bool)+checkPresent ddarrepo key = do+ directoryExists <- ddarDirectoryExists ddarrepo+ case directoryExists of+ Left e -> return $ Left e+ Right True -> inDdarManifest ddarrepo key+ Right False -> return $ Right False++ddarLocal :: DdarRepo -> Bool+ddarLocal = notElem ':'
Remote/Git.hs view
@@ -87,10 +87,9 @@ - cached UUID value. -} configRead :: Git.Repo -> Annex Git.Repo configRead r = do- g <- fromRepo id- let c = extractRemoteGitConfig g (Git.repoDescribe r)+ gc <- Annex.getRemoteGitConfig r u <- getRepoUUID r- case (repoCheap r, remoteAnnexIgnore c, u) of+ case (repoCheap r, remoteAnnexIgnore gc, u) of (_, True, _) -> return r (True, _, _) -> tryGitConfigRead r (False, _, NoUUID) -> tryGitConfigRead r@@ -197,7 +196,7 @@ ) case v of Left _ -> do- set_ignore "not usable by git-annex"+ set_ignore "not usable by git-annex" False return r Right r' -> do -- Cache when http remote is not bare for@@ -225,15 +224,18 @@ configlist_failed = case Git.remoteName r of Nothing -> return r Just n -> do- whenM (inRepo $ Git.Command.runBool [Param "fetch", Param "--quiet", Param n]) $- set_ignore "does not have git-annex installed"+ whenM (inRepo $ Git.Command.runBool [Param "fetch", Param "--quiet", Param n]) $ do+ set_ignore "does not have git-annex installed" True return r - set_ignore msg = do+ set_ignore msg longmessage = do let k = "annex-ignore" case Git.remoteName r of Nothing -> noop- Just n -> warning $ "Remote " ++ n ++ " " ++ msg ++ "; setting " ++ k+ Just n -> do+ warning $ "Remote " ++ n ++ " " ++ msg ++ "; setting " ++ k+ when longmessage $+ warning $ "This could be a problem with the git-annex installation on the remote. Please make sure that git-annex-shell is available in PATH when you ssh into the remote. Once you have fixed the git-annex installation, run: git config remote." ++ n ++ "." ++ k ++ " false" setremote k (Git.Config.boolConfig True) setremote k v = case Git.remoteName r of
Remote/Helper/Ssh.hs view
@@ -8,13 +8,13 @@ module Remote.Helper.Ssh where import Common.Annex+import qualified Annex import qualified Git import qualified Git.Url import Annex.UUID import Annex.Ssh import CmdLine.GitAnnexShell.Fields (Field, fieldName) import qualified CmdLine.GitAnnexShell.Fields as Fields-import Types.GitConfig import Types.Key import Remote.Helper.Messages import Utility.Metered@@ -26,11 +26,9 @@ {- Generates parameters to ssh to a repository's host and run a command. - Caller is responsible for doing any neccessary shellEscaping of the - passed command. -}-toRepo :: Git.Repo -> [CommandParam] -> Annex [CommandParam]-toRepo r sshcmd = do- g <- fromRepo id- let c = extractRemoteGitConfig g (Git.repoDescribe r)- let opts = map Param $ remoteAnnexSshOptions c+toRepo :: Git.Repo -> RemoteGitConfig -> [CommandParam] -> Annex [CommandParam]+toRepo r gc sshcmd = do+ let opts = map Param $ remoteAnnexSshOptions gc let host = fromMaybe (error "bad ssh url") $ Git.Url.hostuser r params <- sshCachingOptions (host, Git.Url.port r) opts return $ params ++ Param host : sshcmd@@ -41,16 +39,18 @@ git_annex_shell r command params fields | not $ Git.repoIsUrl r = return $ Just (shellcmd, shellopts ++ fieldopts) | Git.repoIsSsh r = do+ gc <- Annex.getRemoteGitConfig r u <- getRepoUUID r- sshparams <- toRepo r [Param $ sshcmd u ]+ sshparams <- toRepo r gc [Param $ sshcmd u gc] return $ Just ("ssh", sshparams) | otherwise = return Nothing where dir = Git.repoPath r shellcmd = "git-annex-shell" shellopts = Param command : File dir : params- sshcmd u = unwords $- shellcmd : map shellEscape (toCommand shellopts) +++ sshcmd u gc = unwords $+ fromMaybe shellcmd (remoteAnnexShell gc)+ : map shellEscape (toCommand shellopts) ++ uuidcheck u ++ map shellEscape (toCommand fieldopts) uuidcheck NoUUID = []
Remote/List.hs view
@@ -15,7 +15,6 @@ import qualified Annex import Logs.Remote import Types.Remote-import Types.GitConfig import Annex.UUID import Remote.Helper.Hooks import Remote.Helper.ReadOnly@@ -38,6 +37,7 @@ import qualified Remote.Tahoe #endif import qualified Remote.Glacier+import qualified Remote.Ddar import qualified Remote.Hook import qualified Remote.External @@ -59,6 +59,7 @@ , Remote.Tahoe.remote #endif , Remote.Glacier.remote+ , Remote.Ddar.remote , Remote.Hook.remote , Remote.External.remote ]@@ -92,8 +93,7 @@ remoteGen :: M.Map UUID RemoteConfig -> RemoteType -> Git.Repo -> Annex (Maybe Remote) remoteGen m t r = do u <- getRepoUUID r- g <- fromRepo id- let gc = extractRemoteGitConfig g (Git.repoDescribe r)+ gc <- Annex.getRemoteGitConfig r let c = fromMaybe M.empty $ M.lookup u m mrmt <- generate t r u c gc return $ adjustReadOnly . addHooks <$> mrmt
Types/Creds.hs view
@@ -9,4 +9,6 @@ type Creds = String -- can be any data that contains credentials -type CredPair = (String, String) -- login, password+type CredPair = (Login, Password)+type Login = String+type Password = String -- todo: use securemem
Types/GitConfig.hs view
@@ -119,6 +119,7 @@ {- These settings are specific to particular types of remotes - including special remotes. -}+ , remoteAnnexShell :: Maybe String , remoteAnnexSshOptions :: [String] , remoteAnnexRsyncOptions :: [String] , remoteAnnexRsyncUploadOptions :: [String]@@ -131,6 +132,7 @@ , remoteAnnexBupSplitOptions :: [String] , remoteAnnexDirectory :: Maybe FilePath , remoteAnnexGCrypt :: Maybe String+ , remoteAnnexDdarRepo :: Maybe String , remoteAnnexHookType :: Maybe String , remoteAnnexExternalType :: Maybe String {- A regular git remote's git repository config. -}@@ -150,6 +152,7 @@ , remoteAnnexAvailability = getmayberead "availability" , remoteAnnexBare = getmaybebool "bare" + , remoteAnnexShell = getmaybe "shell" , remoteAnnexSshOptions = getoptions "ssh-options" , remoteAnnexRsyncOptions = getoptions "rsync-options" , remoteAnnexRsyncDownloadOptions = getoptions "rsync-download-options"@@ -162,6 +165,7 @@ , remoteAnnexBupSplitOptions = getoptions "bup-split-options" , remoteAnnexDirectory = notempty $ getmaybe "directory" , remoteAnnexGCrypt = notempty $ getmaybe "gcrypt"+ , remoteAnnexDdarRepo = getmaybe "ddarrepo" , remoteAnnexHookType = notempty $ getmaybe "hooktype" , remoteAnnexExternalType = notempty $ getmaybe "externaltype" , remoteGitConfig = Nothing
Utility/Applicative.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.Applicative where
Utility/Base64.hs view
@@ -2,7 +2,7 @@ - - Copyright 2011 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.Base64 (toB64, fromB64Maybe, fromB64) where
Utility/Batch.hs view
@@ -2,7 +2,7 @@ - - Copyright 2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/CoProcess.hs view
@@ -3,7 +3,7 @@ - - Copyright 2012-2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}@@ -62,7 +62,7 @@ s <- readMVar ch restartable s (send $ coProcessTo s) $ const $ restartable s (hFlush $ coProcessTo s) $ const $- restartable s (receive $ coProcessFrom s) $+ restartable s (receive $ coProcessFrom s) return where restartable s a cont
Utility/CopyFile.hs view
@@ -2,7 +2,7 @@ - - Copyright 2010-2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/DBus.hs view
@@ -2,13 +2,14 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE OverloadedStrings, ScopedTypeVariables #-} module Utility.DBus where +import Utility.PartialPrelude import Utility.Exception import DBus.Client@@ -22,7 +23,7 @@ listServiceNames :: Client -> IO [ServiceName] listServiceNames client = do reply <- callDBus client "ListNames" []- return $ fromMaybe [] $ fromVariant (methodReturnBody reply !! 0)+ return $ fromMaybe [] $ fromVariant =<< headMaybe (methodReturnBody reply) callDBus :: Client -> MemberName -> [Variant] -> IO MethodReturn callDBus client name params = call_ client $
Utility/Daemon.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012-2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}@@ -36,7 +36,7 @@ _ <- forkProcess child1 out where- checkalreadyrunning f = maybe noop (const $ alreadyRunning) + checkalreadyrunning f = maybe noop (const alreadyRunning) =<< checkDaemon f child1 = do _ <- createSession@@ -54,6 +54,15 @@ wait =<< asyncWithUnmask (\unmask -> unmask a) out out = exitImmediately ExitSuccess++{- To run an action that is normally daemonized in the forground. -}+foreground :: Fd -> Maybe FilePath -> IO () -> IO ()+foreground logfd pidfile a = do+ maybe noop lockPidFile pidfile+ _ <- createSession+ redirLog logfd+ a+ exitImmediately ExitSuccess #endif {- Locks the pid file, with an exclusive, non-blocking lock,
Utility/Data.hs view
@@ -2,7 +2,7 @@ - - Copyright 2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.Data where
Utility/DataUnits.hs view
@@ -2,7 +2,7 @@ - - Copyright 2011 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause - - - And now a rant: @@ -111,7 +111,7 @@ | i < 0 = '-' : findUnit units' (negate i) | otherwise = findUnit units' i where- units' = reverse $ sort units -- largest first+ units' = sortBy (flip compare) units -- largest first findUnit (u@(Unit s _ _):us) i' | i' >= s = showUnit i' u
Utility/DirWatcher.hs view
@@ -6,7 +6,7 @@ - - Copyright 2012-2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/DirWatcher/FSEvents.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.DirWatcher.FSEvents where
Utility/DirWatcher/INotify.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.DirWatcher.INotify where
Utility/DirWatcher/Kqueue.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE ForeignFunctionInterface #-}
Utility/DirWatcher/Types.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.DirWatcher.Types where
Utility/DirWatcher/Win32Notify.hs view
@@ -2,7 +2,7 @@ - - Copyright 2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.DirWatcher.Win32Notify where
Utility/Directory.hs view
@@ -2,7 +2,7 @@ - - Copyright 2011-2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}@@ -43,7 +43,7 @@ - When the directory does not exist, no exception is thrown, - instead, [] is returned. -} dirContentsRecursive :: FilePath -> IO [FilePath]-dirContentsRecursive topdir = dirContentsRecursiveSkipping (const False) True topdir+dirContentsRecursive = dirContentsRecursiveSkipping (const False) True {- Skips directories whose basenames match the skipdir. -} dirContentsRecursiveSkipping :: (FilePath -> Bool) -> Bool -> FilePath -> IO [FilePath]
Utility/DiskFree.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012, 2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE ForeignFunctionInterface, CPP #-}
Utility/Dot.hs view
@@ -2,7 +2,7 @@ - - Copyright 2010 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.Dot where -- import qualified
Utility/Env.hs view
@@ -2,7 +2,7 @@ - - Copyright 2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/Exception.hs view
@@ -2,7 +2,7 @@ - - Copyright 2011-2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE ScopedTypeVariables #-}@@ -18,7 +18,7 @@ {- Catches IO errors and returns a Bool -} catchBoolIO :: IO Bool -> IO Bool-catchBoolIO a = catchDefaultIO False a+catchBoolIO = catchDefaultIO False {- Catches IO errors and returns a Maybe -} catchMaybeIO :: IO a -> IO (Maybe a)
Utility/ExternalSHA.hs view
@@ -5,7 +5,7 @@ - - Copyright 2011-2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.ExternalSHA (externalSHA) where
Utility/FileMode.hs view
@@ -2,7 +2,7 @@ - - Copyright 2010-2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/FileSystemEncoding.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012-2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/Format.hs view
@@ -2,7 +2,7 @@ - - Copyright 2010, 2011 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.Format (
Utility/FreeDesktop.hs view
@@ -7,7 +7,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.FreeDesktop (
Utility/Glob.hs view
@@ -5,7 +5,7 @@ - - Copyright 2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/Gpg.hs view
@@ -145,7 +145,7 @@ findPubKeys for = KeyIds . parse . lines <$> readStrict params where params = [Params "--with-colons --list-public-keys", Param for]- parse = catMaybes . map (keyIdField . split ":")+ parse = mapMaybe (keyIdField . split ":") keyIdField ("pub":_:_:_:f:_) = Just f keyIdField _ = Nothing @@ -195,7 +195,7 @@ Algo n -> show n , Just $ "Key-Length: " ++ show keysize , Just $ "Name-Real: " ++ userid- , Just $ "Expire-Date: 0"+ , Just "Expire-Date: 0" , if null passphrase then Nothing else Just $ "Passphrase: " ++ passphrase
Utility/HumanNumber.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012-2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.HumanNumber where@@ -17,5 +17,5 @@ int :: Integer (int, frac) = properFraction n remainder = round (frac * 10 ^ precision) :: Integer- pad0s s = (take (precision - length s) (repeat '0')) ++ s+ pad0s s = replicate (precision - length s) '0' ++ s striptrailing0s = reverse . dropWhile (== '0') . reverse
Utility/HumanTime.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012-2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.HumanTime (@@ -59,7 +59,7 @@ fromDuration :: Duration -> String fromDuration Duration { durationSeconds = d } | d == 0 = "0s"- | otherwise = concat $ map showunit $ go [] units d+ | otherwise = concatMap showunit $ go [] units d where showunit (u, n) | n > 0 = show n ++ [u]
Utility/InodeCache.hs view
@@ -2,7 +2,7 @@ - - Copyright 2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.InodeCache where
Utility/JSONStream.hs view
@@ -2,7 +2,7 @@ - - Copyright 2011 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.JSONStream (
Utility/LinuxMkLibs.hs view
@@ -2,7 +2,7 @@ - - Copyright 2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.LinuxMkLibs where@@ -49,7 +49,7 @@ - link to. Note that some of the libraries may not exist - (eg, linux-vdso.so) -} parseLdd :: String -> [FilePath]-parseLdd = catMaybes . map (getlib . dropWhile isSpace) . lines+parseLdd = mapMaybe (getlib . dropWhile isSpace) . lines where getlib l = headMaybe . words =<< lastMaybe (split " => " l)
Utility/LogFile.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/Lsof.hs view
@@ -2,10 +2,10 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} -{-# LANGUAGE BangPatterns, CPP #-}+{-# LANGUAGE CPP #-} module Utility.Lsof where @@ -110,7 +110,7 @@ {- Parses lsof's default output format. -} parseDefault :: LsofParser-parseDefault = catMaybes . map parseline . drop 1 . lines+parseDefault = mapMaybe parseline . drop 1 . lines where parseline l = case words l of (command : spid : _user : _fd : _type : _device : _size : _node : rest) ->
Utility/Matcher.hs view
@@ -12,7 +12,7 @@ - - Copyright 2011-2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE Rank2Types, KindSignatures #-}@@ -64,10 +64,10 @@ process m [] = m process m ts = uncurry process $ consume m ts - consume m ((One And):rest) = term (m `MAnd`) rest- consume m ((One Or):rest) = term (m `MOr`) rest- consume m ((One Not):rest) = term (\p -> m `MAnd` (MNot p)) rest- consume m ((One (Operation o)):rest) = (m `MAnd` MOp o, rest)+ consume m (One And:rest) = term (m `MAnd`) rest+ consume m (One Or:rest) = term (m `MOr`) rest+ consume m (One Not:rest) = term (\p -> m `MAnd` (MNot p)) rest+ consume m (One (Operation o):rest) = (m `MAnd` MOp o, rest) consume m (Group g:rest) = (process m g, rest) consume m (_:rest) = consume m rest consume m [] = (m, [])
Utility/Metered.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012, 2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE TypeSynonymInstances #-}
Utility/Misc.hs view
@@ -2,7 +2,7 @@ - - Copyright 2010-2011 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/Monad.hs view
@@ -2,7 +2,7 @@ - - Copyright 2010-2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.Monad where
Utility/Network.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.Network where
Utility/NotificationBroadcaster.hs view
@@ -8,7 +8,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.NotificationBroadcaster (
Utility/OSX.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.OSX where
Utility/PID.hs view
@@ -2,7 +2,7 @@ - - Copyright 2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/Parallel.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.Parallel where
Utility/Path.hs view
@@ -2,7 +2,7 @@ - - Copyright 2010-2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE PackageImports, CPP #-}
Utility/Percentage.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.Percentage (
Utility/PosixFiles.hs view
@@ -4,7 +4,7 @@ - - Copyright 2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/Process.hs view
@@ -3,7 +3,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP, Rank2Types #-}@@ -167,10 +167,10 @@ processTranscript cmd opts input = processTranscript' cmd opts Nothing input processTranscript' :: String -> [String] -> Maybe [(String, String)] -> (Maybe String) -> IO (String, Bool)+processTranscript' cmd opts environ input = do #ifndef mingw32_HOST_OS {- This implementation interleves stdout and stderr in exactly the order - the process writes them. -}-processTranscript' cmd opts environ input = do (readf, writef) <- createPipe readh <- fdToHandle readf writeh <- fdToHandle writef@@ -184,24 +184,13 @@ hClose writeh get <- mkreader readh-- -- now write and flush any input- case input of- Just s -> do- let inh = stdinHandle p- unless (null s) $ do- hPutStr inh s- hFlush inh- hClose inh- Nothing -> return ()-+ writeinput input p transcript <- get ok <- checkSuccessProcess pid return (transcript, ok) #else {- This implementation for Windows puts stderr after stdout. -}-processTranscript' cmd opts environ input = do p@(_, _, _, pid) <- createProcess $ (proc cmd opts) { std_in = if isJust input then CreatePipe else Inherit@@ -212,17 +201,9 @@ getout <- mkreader (stdoutHandle p) geterr <- mkreader (stderrHandle p)-- case input of- Just s -> do- let inh = stdinHandle p- unless (null s) $ do- hPutStr inh s- hFlush inh- hClose inh- Nothing -> return ()- + writeinput input p transcript <- (++) <$> getout <*> geterr+ ok <- checkSuccessProcess pid return (transcript, ok) #endif@@ -236,6 +217,14 @@ return $ do takeMVar v return s++ writeinput (Just s) p = do+ let inh = stdinHandle p+ unless (null s) $ do+ hPutStr inh s+ hFlush inh+ hClose inh+ writeinput Nothing _ = return () {- Runs a CreateProcessRunner, on a CreateProcess structure, that - is adjusted to pipe only from/to a single StdHandle, and passes
Utility/QuickCheck.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012-2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# OPTIONS_GHC -fno-warn-orphans #-}
Utility/Quvi.hs view
@@ -2,7 +2,7 @@ - - Copyright 2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE OverloadedStrings #-}
Utility/Rsync.hs view
@@ -2,7 +2,7 @@ - - Copyright 2010-2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.Rsync where
Utility/SRV.hs view
@@ -5,7 +5,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/SafeCommand.hs view
@@ -2,7 +2,7 @@ - - Copyright 2010-2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.SafeCommand where
Utility/Scheduled.hs view
@@ -2,7 +2,7 @@ - - Copyright 2013-2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.Scheduled (
Utility/Shell.hs view
@@ -2,7 +2,7 @@ - - Copyright 2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/SimpleProtocol.hs view
@@ -2,7 +2,7 @@ - - Copyright 2013-2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.SimpleProtocol (
Utility/SshConfig.hs view
@@ -2,7 +2,7 @@ - - Copyright 2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.SshConfig where
Utility/Tense.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE OverloadedStrings #-}
Utility/ThreadLock.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.ThreadLock where
Utility/ThreadScheduler.hs view
@@ -3,7 +3,7 @@ - Copyright 2012, 2013 Joey Hess <joey@kitenet.net> - Copyright 2011 Bas van Dijk & Roel van Dijk -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/Tmp.hs view
@@ -2,7 +2,7 @@ - - Copyright 2010-2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/Touch.hsc view
@@ -2,7 +2,7 @@ - - Copyright 2011 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE ForeignFunctionInterface #-}
Utility/URI.hs view
@@ -2,7 +2,7 @@ - - Copyright 2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/Url.hs view
@@ -2,7 +2,7 @@ - - Copyright 2011,2013 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/UserInfo.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE CPP #-}
Utility/Verifiable.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.Verifiable where
Utility/WebApp.hs view
@@ -2,7 +2,7 @@ - - Copyright 2012-2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE OverloadedStrings, CPP, RankNTypes #-}
Utility/WinLock.hs view
@@ -2,7 +2,7 @@ - - Copyright 2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} module Utility.WinLock (
Utility/WinProcess.hs view
@@ -2,7 +2,7 @@ - - Copyright 2014 Joey Hess <joey@kitenet.net> -- - Licensed under the GNU GPL version 3 or higher.+ - License: BSD-2-clause -} {-# LANGUAGE ForeignFunctionInterface #-}
Utility/Yesod.hs view
@@ -28,6 +28,7 @@ #else import Yesod as Y hiding (Html) #endif+import Assistant.WebApp.Bootstrap3 as Y hiding (bfs) #ifndef __NO_TH__ import Yesod.Default.Util import Language.Haskell.TH.Syntax (Q, Exp)
Utility/libdiskfree.c view
@@ -2,7 +2,7 @@ * * Copyright 2012, 2014 Joey Hess <joey@kitenet.net> *- * Licensed under the GNU GPL version 3 or higher.+ * License: BSD-2-clause */ /* Include appropriate headers for the OS, and define what will be used to
Utility/libkqueue.c view
@@ -2,7 +2,7 @@ * * Copyright 2012 Joey Hess <joey@kitenet.net> *- * Licensed under the GNU GPL version 3 or higher.+ * License: BSD-2-clause */ #include <stdio.h>
debian/changelog view
@@ -1,3 +1,27 @@+git-annex (5.20140517) unstable; urgency=medium++ * webapp: Switched to bootstrap 3.+ Thanks, Sören Brunk.+ * Standalone builds now check gpg signatures before upgrading.+ * Simplified repository description line format. The remote name,+ if any, is always in square brackets after the description.+ * assistant: Clean up stale tmp files on startup.+ * webapp: Better ssh password prompting.+ * Depend on git-remote-gcrypt 0.20130908-6. Older versions+ fail when the assistant is run with no controlling tty.+ * Added ddar special remote.+ Thanks, Robie Basak.+ * webapp: Fixed drag and drop to reorder the list of remotes.+ * group: When no groups are specified to set, lists the current groups+ of a repository.+ * Add remote.$name.annex-shell configuration.+ Thanks, Fraser Tweedale + * Support symlinking git-annex and git-annex-shell+ from the Linux standalone bundle into PATH.+ Thanks, jlebar.++ -- Joey Hess <joeyh@debian.org> Sat, 17 May 2014 13:30:39 -0400+ git-annex (5.20140421) unstable; urgency=medium * assistant: Now detects immediately when other repositories push
debian/control view
@@ -72,6 +72,7 @@ wget, curl, openssh-client,+ git-remote-gcrypt (>= 0.20130908-6), Maintainer: Joey Hess <joeyh@debian.org> Standards-Version: 3.9.5 Vcs-Git: git://git.kitenet.net/git-annex@@ -91,9 +92,8 @@ lsof, gnupg, bind9-host,- ssh-askpass, quvi,- git-remote-gcrypt (>= 0.20130908-4),+ git-remote-gcrypt (>= 0.20130908-6), nocache, Suggests: graphviz,
debian/copyright view
@@ -7,11 +7,25 @@ Files: Assistant/WebApp.hs Assistant/WebApp/* templates/* static/* Copyright: © 2012-2014 Joey Hess <joey@kitenet.net>+ © 2014 Sören Brunk License: AGPL-3+ +Files: Remote/Ddar.hs+Copyright: © 2011 Joey Hess <joey@kitenet.net>+ © 2014 Robie Basak <robie@justgohome.co.uk>+License: GPL-3++ Files: Utility/ThreadScheduler.hs Copyright: 2011 Bas van Dijk & Roel van Dijk- 2012 Joey Hess <joey@kitenet.net>+ 2012, 2013 Joey Hess <joey@kitenet.net>+License: BSD-2-clause++Files: Utility/*+Copyright: 2012-2014 Joey Hess <joey@kitenet.net>+License: BSD-2-clause++Files: Utility/Gpg.hs Utility/DirWatcher*+Copyright: © 2010-2014 Joey Hess <joey@kitenet.net> License: GPL-3+ Files: doc/logo* */favicon.ico standalone/osx/git-annex.app/Contents/Resources/git-annex.icns standalone/android/icons/*@@ -88,23 +102,28 @@ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -Files: static/bootstrap* static/glyphicons-halflings*-Copyright: 2012 Twitter, Inc.-License: Apache-2.0- 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.- .- The complete text of the Apache License is distributed in- /usr/share/common-licenses/Apache-2.0 on Debian systems.+Files: static/*/bootstrap* static/*/glyphicons-halflings*+Copyright: 2012-2014 Twitter, Inc.+License: MIT+ Copyright (c) 2011-2014 Twitter, Inc+ .+ Permission is hereby granted, free of charge, to any person obtaining a copy+ of this software and associated documentation files (the "Software"), to deal+ in the Software without restriction, including without limitation the rights+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell+ copies of the Software, and to permit persons to whom the Software is+ furnished to do so, subject to the following conditions:+ .+ The above copyright notice and this permission notice shall be included in+ all copies or substantial portions of the Software.+ .+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN+ THE SOFTWARE. License: GPL-3+ The full text of version 3 of the GPL is distributed as doc/license/GPL in@@ -115,6 +134,28 @@ The full text of version 2.1 of the LGPL is distributed as doc/license/LGPL in this package's source, or in /usr/share/common-licenses/LGPL-2.1 on Debian systems.++License: BSD-2-clause+ Redistribution and use in source and binary forms, with or without+ modification, are permitted provided that the following conditions+ are met:+ 1. Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.+ 2. 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.+ .+ THIS SOFTWARE IS PROVIDED BY AUTHORS 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 AUTHORS OR 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. License: AGPL-3+ GNU AFFERO GENERAL PUBLIC LICENSE
− doc/Android/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://yarikoptic.myopenid.com/"- nickname="site-myopenid"- subject="asking for ssh password in the terminal (not in web ui)"- date="2013-05-24T23:49:40Z"- content="""-not sure if that is a known issue: whenever \"remote server\" is added, password needs to be typed back in the original terminal... is a bit challenging to do on android and not straightforward user-wise -"""]]
doc/Android/comment_20_81940ea56ace3dcd5fa84dfccd88ad96._comment view
@@ -4,7 +4,7 @@ subject="comment 20" date="2013-07-17T19:06:31Z" content="""-@frioux the webapp has a \"ssh server\" option that will set up a ssh key and use it for passwordless data transfer to a ssh server. You have to enter your password twice in the git-annex terminal app, and then it's set up.+@frioux the webapp has a \"ssh server\" option that will set up a ssh key and use it for passwordless data transfer to a ssh server. The openssh included in the git-annex app fully supports everything you can usually do with ssh keys, so you can also set this up by hand. """]]
+ doc/Android/oldcomments/comment_15_77bafc01b47d4cf8f96bde2b6704ed71._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://yarikoptic.myopenid.com/"+ nickname="site-myopenid"+ subject="asking for ssh password in the terminal (not in web ui)"+ date="2013-05-24T23:49:40Z"+ content="""+not sure if that is a known issue: whenever \"remote server\" is added, password needs to be typed back in the original terminal... is a bit challenging to do on android and not straightforward user-wise +"""]]
+ doc/assistant/comment_3_9bd3b532a5c026a1d664c898f8e335e6._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawnov5q9_Cl4Ps5NoYE08yE01NLSvBANnY8"+ nickname="Eric"+ subject="Does it not work in Direct Mode?"+ date="2014-04-26T09:41:20Z"+ content="""+Looks great, but I got the impression that Assistant would mirror the files from my computer to my external hard drive, and I can't seem to get it to do that.+"""]]
+ doc/assistant/comment_4_c546a24459ca29025f00e424353c40d2._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawlr2Bj0Mzqwzl28cbrotcQUbOFoaPB3B_Y"+ nickname="Tomasz"+ subject="how to disable assistant"+ date="2014-04-28T10:21:59Z"+ content="""+assistant daemon now starts at boot and pushes all annexed files to other repos... I'd like to do it on my own. I can stop daemon from webapp, but it starts again on boot - how Do I disable it from autostarting ?+"""]]
+ doc/assistant/comment_5_d17de359cdd46659170d373cd09c0979._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="108.236.230.124"+ subject="comment 5"+ date="2014-05-16T18:55:22Z"+ content="""+If you have a question about using the assistant, please ask it in the [[forum]], not here.+"""]]
doc/assistant/release_notes.mdwn view
@@ -1,3 +1,10 @@+## version 5.20140421++This release begins to deprecate XMPP support. In particular, if you use+the assistant with a ssh remote that has this version of git-annex+installed, you don't need XMPP any longer to get immediate syncing of+changes.+ ## version 5.20140411 This release fixes a bug that could cause the assistant to use a *lot* of@@ -5,9 +12,7 @@ Automatic upgrading was broken on OSX for previous versions. This has been fixed, but you'll need to manually upgrade to this version to get it going-again. (Note that the fix is currently only available in the daily builds,-not a released version.) Workaround: Remove the wget bundled inside the-git-annex dmg.+again. Workaround: Remove the wget bundled inside the git-annex dmg. ## version 5.20140221
+ doc/bugs/Commiting_Files_Containing_Non_Ascii_Char_on_OS_X_.mdwn view
@@ -0,0 +1,44 @@+### Please describe the problem.++Any file containing non ascii chars either won't get commited by the webapp or when clone of that repo is made they are shown as deleted in git status but the files are there. ++you can not commit them neither,++ git commit -m 'foo'++or+ + git annex sync++will get them to commit trying to reset the state using, + + git checkout master ++or ++ git clean -f ++won't fix the issue. till the issue is fixed sync does not work from the command line since there are changes. Temporarily running assistant in the directory does fix the problem but every now and then it pops again.++Also moving any symlinks around containing non ascii chars also causes the same issue. git annex won't add the moved symlinks git annex fix or git annex add won't add them git annex sync also skips them again the only solution is to either run the assistant or restart it if it is running.++### What steps will reproduce the problem?++Adding any file with a non ascii char on OS X (10.9).+++### What version of git-annex are you using? On what operating system?++git-annex version: 5.20140421-gc34a665++### Please provide any additional information below.++Also another thing I noticed is that same file names same repo will clone fine on Linux no errors this only happens on OS X.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]
doc/bugs/Error_creating_remote_repository_using_ssh_on_OSX.mdwn view
@@ -34,3 +34,6 @@ [[!tag /design/assistant/OSX]] [[!meta title="ssh-askpass not available on OSX"]]++> [[fixed|done]]; the webapp now handles ssh password prompting on its own,+> ssh-askpass is not needed. --[[Joey]]
+ doc/bugs/Revert_to_old_file_version_in_direct_mode___40__VFAT__41__.mdwn view
@@ -0,0 +1,27 @@+### Please describe the problem.++Somewhere on the forums you advised that in order to revert to an old+version of a file in a direct-mode annex, one should briefly switch to+indirect mode and check out an earlier revision.++This won’t work though if the direct-mode repo is on a VFAT+file-system, which does not support indirect mode.++If I didn’t overlook an alternative way, would it make sense to expose+this functionality in «git annex get $file»? Like «git annex get $file+--from $repo/$revision»?++Specifying revisions to get from might also be convenient for+alternative use-cases, I suppose.++Best regards,+T.++### What version of git-annex are you using? On what operating system?++git-annex 5.20140421+Linux 3.14.3++> VFAT is a crippled file system. I am not going to reimplenent all of git+> to support it. The suggested method won't work; git-annex would need+> to add a git-annex revert, etc, etc, etc ad infinitum. [[wontfix|done]] --[[Joey]]
+ doc/bugs/Upgrade_Does_not_Complete_on_OS_X.mdwn view
@@ -0,0 +1,31 @@+### Please describe the problem.++Every time git-annex launches (after a reboot). It prompts me to finish upgrade, even though the binary is not updated. (All my repos are set to not auto update and this happens on all my repos).+++### What steps will reproduce the problem?++Relaunching git-annex.+++### What version of git-annex are you using? On what operating system?++OS X 10.9++git-annex version: 5.20140419-g477c0c0+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL +remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> This seems to be a duplicate of this bug: [[Upgrade_impossible_om_Mac_OSX]]. Please follow up there with any details you can provide. --[[Joey]]
+ doc/bugs/Upgrade_impossible_om_Mac_OSX.mdwn view
@@ -0,0 +1,20 @@+### Please describe the problem.+When starting git-annex Version: 5.20140420-ga25b8bb Build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash on My MBP running OSX 10.9.2 I get a notification about: An upgrade of git-annex is available. (version 5.20140421) ++I then click UPGRADE and then get this message: Internal Server Error Cannot find old distribution bundle; not upgrading.++### What steps will reproduce the problem?+See problem description above, not sure what else to say.++### What version of git-annex are you using? On what operating system?+See problem description above, not sure what else to say.++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]
+ doc/bugs/android_autobuild_broken.mdwn view
@@ -0,0 +1,4 @@+The android build is broken. Annoying evilsplicer failure in the new+bootstrap3 code. --[[Joey]]++[[fixed|done]]
+ doc/bugs/bug_system_updates_when___34__done__34__.mdwn view
@@ -0,0 +1,24 @@+### Please describe the problem.++In lieu of a better place to ask/report this. Is it possible to have an email sent when bugs are moved into another category? I get emails on comments but not much when the bugs are moved elsewhere - they just seem to disappear.++### What steps will reproduce the problem?+++### What version of git-annex are you using? On what operating system?+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> That's because I add a [[done]] to close bugs, not a comment and you are+> only subscribed to comments. It's possible to subscribe to changes to+> pages, but ikiwiki does not make this easy. You should file a bug on+> ikiwiki. --[[Joey]]
+ doc/bugs/fails_to_get_content_from_bare_repo_on_windows.mdwn view
@@ -0,0 +1,140 @@+### Please describe the problem.++I have a annex repo in external drive (a bare repo), usually synced with a macbook. When I'm trying to sync the drive over to a Windows machine, all contents fail to sync over. I managed to reproduce the problem with a set of instructions locally:++ C:\Temp\test>dir + Volume in drive C is Windows + Volume Serial Number is 6839-6E71 + + Directory of C:\Temp\test + + 2014/05/08 23:08 <DIR> . + 2014/05/08 23:08 <DIR> .. + 2014/05/08 23:08 14 file.txt + 1 File(s) 14 bytes + 2 Dir(s) 164,943,056,896 bytes free + + C:\Temp\test>git init + Initialized empty Git repository in C:/Temp/test/.git/ + + C:\Temp\test>git annex init + init + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + Detected a crippled filesystem. + + Enabling direct mode. + ok + (Recording state in git...) + + C:\Temp\test>git annex add . + add file.txt ok + (Recording state in git...) + + C:\Temp\test>cd .. + + C:\Temp>mkdir bare + + C:\Temp>cd bare + + C:\Temp\bare>git init --bare + Initialized empty Git repository in C:/Temp/bare/ + C:\Temp\bare>git annex init+ init+ Detected a filesystem without fifo support.+ + Disabling ssh connection caching.+ + Detected a crippled filesystem.+ ok+ (Recording state in git...)+ + C:\Temp\bare>cd ../test+ + C:\Temp\test>git remote add mybare C:\Temp\bare+ + C:\Temp\test>git annex sync --content mybare+ commit ok+ pull mybare+ warning: no common commits+ remote: Counting objects: 5, done.+ remote: Compressing objects: 100% (3/3), done.+ remote: Total 5 (delta 0), reused 0 (delta 0)+ Unpacking objects: 100% (5/5), done.+ From C:\Temp\bare+ * [new branch] git-annex -> mybare/git-annex+ ok+ (merging mybare/git-annex into git-annex...)+ (Recording state in git...)+ copy file.txt copy file.txt (to mybare...)+ file.txt+ 14 100% 0.00kB/s 0:00:00 (xfer#1, to-check=0/1)+ + sent 86 bytes received 31 bytes 234.00 bytes/sec+ total size is 14 speedup is 0.12+ ok+ pull mybare+ ok+ (Recording state in git...)+ push mybare+ Counting objects: 23, done.+ Delta compression using up to 4 threads.+ Compressing objects: 100% (16/16), done.+ Writing objects: 100% (21/21), 1.94 KiB | 0 bytes/s, done.+ Total 21 (delta 1), reused 0 (delta 0)+ To C:\Temp\bare+ * [new branch] git-annex -> synced/git-annex+ * [new branch] annex/direct/master -> synced/master+ ok+ + C:\Temp\test>cd ..+ + C:\Temp>git clone C:\Temp\bare test2+ Cloning into 'test2'...+ done.+ + C:\Temp>cd test2+ + C:\Temp\test2>ls -l+ total 1+ ----------+ 1 Ruo None 188 May 8 23:10 file.txt+ + C:\Temp\test2>git annex init+ init+ Detected a filesystem without fifo support.+ + Disabling ssh connection caching.+ + Detected a crippled filesystem.+ + Enabling direct mode.+ ok+ (Recording state in git...)+ + C:\Temp\test2>git annex get file.txt+ get file.txt (merging origin/git-annex origin/synced/git-annex into git-annex...)+ (Recording state in git...)+ + Unable to access these remotes: origin+ + Try making some of these repositories available:+ f2af6f52-18d5-4a54-ae5c-c4bef5fab00c -- origin (MY-PC:C:\Temp\bare)+ fc00306a-157c-439b-a5c3-37aabf9d61fb -- MY-PC:C:\Temp\test+ failed+ git-annex: get: 1 failed+ + + C:\Temp\test2>git version+ git version 1.9.2.msysgit.0+ + C:\Temp\test2>git annex version+ git-annex version: 5.20140421-g78d6aa1+ build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash+ key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL+ remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external+ local repository version: 5+ supported repository version: 5+ upgrade supported from repository versions: 2 3 4+
+ doc/bugs/forget_corrupts_non-ascii_chars.mdwn view
@@ -0,0 +1,74 @@+### Please describe the problem.++it seems that `git annex forget --drop-dead --force` will double-encode UTF-8 characters.++### What steps will reproduce the problem?++Have a remote with an accent in the description.++### What version of git-annex are you using? On what operating system?++5.20140412 on debian jessie amd64.++### Please provide any additional information below.++[[!format sh """+anarcat@marcos:video$ git annex info+repository mode: indirect+trusted repositories: 1+ 5adbab10-0f7a-467b-b0d8-5d7af2223103 -- here (backup (anarcat@marcos:/srv/video))+semitrusted repositories: 5+ 00000000-0000-0000-0000-000000000001 -- web+ 2d594c02-9164-4ebd-ac47-f8cdc9c16e2f -- rachel@topcrapn:~/Vidéos/anarcat+ 2f90b958-95e4-44e3-8d3b-e780b63936d1 -- portable (300GB drive labeled VHS)+ 96365189-a0b9-4c33-865f-b573d98572dc -- trouneslo@ifuckinglovecumputers:~/video-anarcat+ ae3d62e6-49be-4340-ba25-c8736a1637c4 -- anarcat@angela:~/video+untrusted repositories: 1+ f6a70cfe-0ee4-4762-9f1d-b7b545fbd856 -- External hard drive labeled VHS+transfers in progress: none+available local disk space: 14.29 gigabytes (+10 gigabytes reserved)+local annex keys: 4110+local annex size: 991.85 gigabytes (+ 2 unknown size)+annexed files in working tree: 4108+size of annexed files in working tree: 1.01 terabytes (+ 2 unknown size)+bloom filter size: 16 mebibytes (0.8% full)+backend usage:+ SHA256E: 8214+ URL: 4+anarcat@marcos:video$ git annex dead f6a70cfe-0ee4-4762-9f1d-b7b545fbd856+dead f6a70cfe-0ee4-4762-9f1d-b7b545fbd856 ok+(Recording state in git...)+anarcat@marcos:video$ git annex unused+unused . (checking for unused data...) (checking HEAD...) (checking synced/master...) (checking backup/master...) (checking portable/annex/direct/master...) (checking portable/master...) (checking portable/synced/master...) (checking steph/master...) (checking steph/synced/master...) (checking video/synced/master...) ok+anarcat@marcos:video$ git annex forget --drop-dead --force+forget git-annex (Recording state in git...)+ok+(Recording state in git...)+anarcat@marcos:video$ git annex info+repository mode: indirect+trusted repositories: (merging synced/git-annex backup/git-annex backup/synced/git-annex portable/git-annex portable/synced/git-annex steph/git-annex video/synced/git-annex into git-annex...)+(Recording state in git...)+(Recording state in git...)+1+ 5adbab10-0f7a-467b-b0d8-5d7af2223103 -- here (backup (anarcat@marcos:/srv/video))+semitrusted repositories: 5+ 00000000-0000-0000-0000-000000000001 -- web+ 2d594c02-9164-4ebd-ac47-f8cdc9c16e2f -- rachel@topcrapn:~/Vidéos/anarcat+ 2f90b958-95e4-44e3-8d3b-e780b63936d1 -- portable (300GB drive labeled VHS)+ 96365189-a0b9-4c33-865f-b573d98572dc -- trouneslo@ifuckinglovecumputers:~/video-anarcat+ ae3d62e6-49be-4340-ba25-c8736a1637c4 -- anarcat@angela:~/video+untrusted repositories: 0+transfers in progress: none+available local disk space: 14.25 gigabytes (+10 gigabytes reserved)+local annex keys: 4110+local annex size: 991.85 gigabytes (+ 2 unknown size)+annexed files in working tree: 4108+size of annexed files in working tree: 1.01 terabytes (+ 2 unknown size)+bloom filter size: 16 mebibytes (0.8% full)+backend usage:+ SHA256E: 8214+ URL: 4+# End of transcript or log.+"""]]++well that's interesting - the above paste is broken by ikiwiki as well... in the text area where i paste it, "rachel@topcrapn:~/Vidéos/anarcat" shows up as "rachel@topcrapn:~/Vidéos/anarcat" but when i preview, the character gets corrupted. and obviously, the second instance then gets *double* corrupted - wheepee. the original paste has "rachel@topcrapn:~/Vidéos/anarcat". --[[anarcat]]
+ doc/bugs/git-annex_annex_repo_not_found.mdwn view
@@ -0,0 +1,23 @@+### Please describe the problem.++The git-annex annex repo at <https://downloads.kitenet.net/.git/> is not available. This is the address mentioned at <http://git-annex.branchable.com/publicrepos/>.++### What steps will reproduce the problem?++ $ git clone https://downloads.kitenet.net/.git/+ Cloning into 'downloads.kitenet.net'...+ fatal: repository 'https://downloads.kitenet.net/.git/' not found++### Please provide any additional information below.++Have tried various combinations of the URL, but nothing works. It was like this a week ago too, but I didn't report it because I thought it was a temporary error due to some server reconfiguration or something.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> [[fixed|done]] --[[Joey]]
+ doc/bugs/git-annex_auto_upgrade_is_redundant.mdwn view
@@ -0,0 +1,28 @@+### Please describe the problem.++Hi,++On OSX the web-app keeps notifying me of an upgrade, I choose to run it but nothing seems to happen.++The debug logs show that the upgrade is skipped as it's redundant.++### What steps will reproduce the problem?++Have upgrades set to notify.++### What version of git-annex are you using? On what operating system?++Current.++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+[2014-04-25 08:26:30 BST] Upgrader: An upgrade of git-annex is available. (version 5.20140421)+[2014-04-25 08:27:02 BST] main: Skipping redundant upgrade++# End of transcript or log.+"""]]++[[!meta title="upgrade loop when info file contains newer version than distributed version of git-annex"]]
doc/bugs/git-annex_fails_to_initialize_under_Windows.mdwn view
@@ -210,3 +210,6 @@ ### Please provide any additional information below. ^^^ See above++> [[done]]; I have made the windows documentation document the need for+> msysgit 1.9. --[[Joey]]
+ doc/bugs/git-annex_fails_to_initialize_under_Windows_with_cygwin.mdwn view
@@ -0,0 +1,38 @@+### Please describe the problem.+++### What steps will reproduce the problem?++$ git init +Initialized empty Git repository in /cygdrive/c/Temp/.git/ + +$ git-annex init +init + Detected a filesystem without fifo support. + + Disabling ssh connection caching. + + Detected a crippled filesystem. + + Disabling core.symlinks. + + Enabling direct mode. +fatal: You are on a branch yet to be born +git-annex.exe: git [Param "checkout",Param "-q",Param "-B",Param "annex/direct/master"] failed + +$ git checkout -B annex/direct/master +fatal: You are on a branch yet to be born ++### What version of git-annex are you using? On what operating system?++Running under cygwin bash++$ git --version+git version 1.7.9++$ git-annex version+git-annex version: 5.20140421-g78d6aa1+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL+remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external+
+ doc/bugs/git-annex_ignores_GIT__95__SSH.mdwn view
@@ -0,0 +1,39 @@+### Please describe the problem.++git uses environment variable GIT_SSH to determine SSH client.++I set it to plink.exe because I extensively use pageant infrastructure and do NOT want to have 2 systems lying around.++Unfortunately git-annex seems to ignore that.++Even worse, it results in unpredicted behavior because the git part works (e.g. clone) whereas annex/rsync does not resulting in half-ok repositories without meaningful error messages.++It only becomes evident when ssh.exe in the git repository is deleted.++### What steps will reproduce the problem?++Set %GIT_SSH% and remove ssh.exe++You will get++ git-annex: ssh: createProcess: does not exist (No such file or directory)+ failed+ git-annex: drop: 1 failed++### What version of git-annex are you using? On what operating system?++Windows 8,++ $ git annex version+ git-annex version: 5.20140411-gda795e0+ build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash+ key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL+ remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external+ local repository version: 5+ supported repository version: 5+ upgrade supported from repository versions: 2 3 4+++### Please provide any additional information below.++
+ doc/bugs/git-annex_remotedeamon.mdwn view
@@ -0,0 +1,27 @@+### Please describe the problem.++git-annex is back on the radar now that the jabber requirement has been dropped! :-)++But, it seems as though when I create a remote repo via the webapp it always makes it a bare git repo. Even when I specify the "client usage grouping".++If I manually create two repos on ssh enabled servers, manually link them, and fire up the assistant they are awesomely kept in sync (with no bare repo in sight).++### What steps will reproduce the problem?++Use the webapp to try to create a client usage remote repo.++### What version of git-annex are you using? On what operating system?++Latest as of post.++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> [[notabug|done]] --[[Joey]]
+ doc/bugs/git_annex_costs_not_working_as_expected_in_the_assistant.mdwn view
@@ -0,0 +1,136 @@+### Please describe the problem.++Hi,++I have a number of repos that I created both by hand and via the web-app. Some manual, some client and one backup groupings.++When creating by hand I manually set the annex-cost to 100 (but I notice the webapp sets local costs to 175 - not 100 as per the man page).++(I'm assuming the creation by hand is still just to `git add remote` on both sides).++When I run `git-annex sync --content` I do seem to get the local remote (the cheapest cost) that I want.++When I use the assistant I get every odd behaviour. It will quite happily choose from any of the available repos with no descernible pattern.++Even more strangely sometimes it queues all the transfers to use the local connection but then at the actual transfer it switches to use the public connection (I have two remotes for one repo: when on the local network and when on the internet). This is reflected in the webapps UI.++For the snippet of logs below I see the files queued as the remote "Dancingfrog" (on the internnal network) then for the transfer the web page switches to "Home" (the public network). I think the data is actually transferred over the public network as it's much slower than compared to explicit repo transfers from the cli.++<pre>+[2014-04-27 05:11:47 BST] TransferWatcher: transfer starting: Download UUID "c3cec307-367b-4373-8cb9-a3da67cee745" Dizzee Rascal/Tounge N' Cheek/03 Dance Wiv Me [Ft. Calvin Harris & Chrome].mp3 Nothing+[2014-04-27 05:11:47 BST] TransferWatcher: transfer starting: Download UUID "c3cec307-367b-4373-8cb9-a3da67cee745" Dizzee Rascal/Tounge N' Cheek/03 Dance Wiv Me [Ft. Calvin Harris & Chrome].mp3 Nothing++SHA256E-s6759929--a822e83c3448716e793fb9d1d1b1523c2492c84ba07f5c093899810fbdfe5621.mp3++ 0 0% 0.00kB/s 0:00:00 + 163,840 2% 159.20kB/s 0:00:41 + 360,448 5% 159.56kB/s 0:00:40 + 524,288 7% 155.01kB/s 0:00:40 + 688,128 10% 154.59kB/s 0:00:39 + 851,968 12% 153.18kB/s 0:00:38 [2014-04-27 05:11:54 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","ls-tree","--full-tree","-z","--","refs/heads/git-annex","uuid.log","remote.log","trust.log","group.log","numcopies.log","schedule.log","preferred-content.log","required-content.log","group-preferred-content.log"]++ 1,015,808 15% 149.92kB/s 0:00:38 To gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mus+ 617edaf..f016a03 git-annex -> synced/git-annex+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","isilon","master"]+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..f016a03fc92aebba14b239cc3647478b1fb9f78f","--oneline","-n1"]+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]+[2014-04-27 05:11:56 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]++ 1,146,880 16% 98.64kB/s 0:00:56 + 1,507,328 22% 129.55kB/s 0:00:40 + 1,671,168 24% 126.84kB/s 0:00:40 [2014-04-27 05:12:00 BST] Pusher: Syncing with dancingfrog, rss, isilon +[2014-04-27 05:12:00 BST] chat: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","hash-object","-w","--stdin-paths","--no-filters"]+[2014-04-27 05:12:00 BST] feed: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","update-index","-z","--index-info"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]+(Recording state in git...)+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","write-tree"]+[2014-04-27 05:12:00 BST] chat: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","commit-tree","86e5513adfc0d1f64cabd3ca3902738d45d809ad","-p","refs/heads/git-annex"]+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","update-ref","refs/heads/git-annex","8808dc8effc3572ae1421461ff44574e900917bf"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","symbolic-ref","HEAD"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","refs/heads/master"]+[2014-04-27 05:12:00 BST] Pusher: pushing to [Remote { name ="dancingfrog" },Remote { name ="rss" },Remote { name ="isilon" }]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","branch","-f","synced/master"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","dancingfrog","+git-annex:synced/git-annex","master:synced/master"]+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","rss","+git-annex:synced/git-annex","master:synced/master"]+[2014-04-27 05:12:00 BST] call: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","isilon","+git-annex:synced/git-annex","master:synced/master"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..8808dc8effc3572ae1421461ff44574e900917bf","--oneline","-n1"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110gcrypt: Development version -- Repository format MAY CHANGE+ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..f016a03fc92aebba14b239cc3647478b1fb9f78f","--oneline","-n1"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]+To ssh://10.23.33.19/Volumes/Media/iTunes Media/Music+ f016a03..8808dc8 git-annex -> synced/git-annex+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","dancingfrog","master"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..8808dc8effc3572ae1421461ff44574e900917bf","--oneline","-n1"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..f016a03fc92aebba14b239cc3647478b1fb9f78f","--oneline","-n1"]+[2014-04-27 05:12:00 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]++ 1,835,008 27% 125.00kB/s 0:00:39 To rss:Music+ f016a03..8808dc8 git-annex -> synced/git-annex+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","rss","master"]+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..8808dc8effc3572ae1421461ff44574e900917bf","--oneline","-n1"]+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..f016a03fc92aebba14b239cc3647478b1fb9f78f","--oneline","-n1"]+[2014-04-27 05:12:01 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]+gcrypt: Decrypting manifest+gpg: Signature made Sun 27 Apr 2014 05:11:41 BST using DSA key ID 29C42E01+gpg: Good signature from "Matt Ford (Work) <matt.ford@manchester.ac.uk>"+gpg: aka "Matt Ford <matt@dancingfrog.co.uk>"+gcrypt: Encrypting to: -R 68D8501429C42E01+gcrypt: Requesting manifest signature+gpg: 68D8501429C42E01: skipped: public key already present++ 1,998,848 29% 180.87kB/s 0:00:26 + 2,162,688 31% 135.56kB/s 0:00:33 To gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mus+ f016a03..8808dc8 git-annex -> synced/git-annex+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","git-annex"]+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","show-ref","--hash","refs/heads/git-annex"]+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","push","isilon","master"]+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..8808dc8effc3572ae1421461ff44574e900917bf","--oneline","-n1"]+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..7339a1fdd007d7a528b7e2eb82c2aeedca511920","--oneline","-n1"]+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..00f5e110ca77b9b5103e1b568ea6aa9d9d9dbb81","--oneline","-n1"]+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..ab90c337053a61111060540d2f60ce20b44cc2d9","--oneline","-n1"]+[2014-04-27 05:12:03 BST] read: git ["--git-dir=/home/matt/Music/.git","--work-tree=/home/matt/Music","log","refs/heads/git-annex..88d99a7ef2d37d1a6180e5dd66a4559927a58eaf","--oneline","-n1"]++ 2,326,528 34% 139.74kB/s 0:00:31 + 3,637,248 53% 397.83kB/s 0:00:07 + 4,423,680 65% 556.91kB/s 0:00:04 + 5,079,040 75% 692.27kB/s 0:00:02 + 5,636,096 83% 781.05kB/s 0:00:01 ++× Synced with dancingfrog, rss, isilon+× Downloaded 11 Bad Be..viour.mp3 10 Holida..rome].mp3 09 Leisure.mp3 08 Money Money.mp3 07 Dirtee Cash.mp3 06 Chilli..n Dem.mp3 05 Can't .. More.mp3 04 Freaky..reaky.mp3 03 Dance ..rome].mp3 02 Road Rage.mp3 and 8 other files+× Synced with rss+× Performed startup scan+× Synced with dancingfrog, isilon+</pre>++### What version of git-annex are you using? On what operating system?+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]
+ doc/bugs/git_annex_enableremote_gcrypt_failure_leaves_a_remote.mdwn view
@@ -0,0 +1,31 @@+### Please describe the problem.++Running `git-annex enableremote remote` without a suitable key available leaves a partially unconfigured git remote.++Subsequently making the key available and running `git-annex enableremote remote` a second time fails as the remote now partially exists.++Removing the remote with `git remote remove remote` and then re-running `git-annex enable remote` seems to do the trick.++However, I notice that even after syncing my special remotes are missing some details in the git config file - namely the `annex-gcrypt` and `annex-uuid` (there may have been more). I fixed by adding the details from a working repo.++Finally, when I initially created the gcrypt repo (by hand) I specified the remote as a local directory on the machine in question i.e. `gcrypt::/matt/mnt/isilon/rss/zzalsmf3/git-annex/mus` I then decided to make it available and changed it (via `git remote rename` to `gcrypt::ssh://rss/home/matt/mnt/isilon/rss/zzalsmf3/git-annex/mus`. Unfortunately on other machines when I `git enableremote` it recovers the original remote which obviously doesn't work - how can I update this setting?++Phew!++++### What steps will reproduce the problem?+++### What version of git-annex are you using? On what operating system?+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]
+ doc/bugs/git_annex_info_listings_can_be_confusing.mdwn view
@@ -0,0 +1,33 @@+### Please describe the problem.++The output of git-annex info can be confusing as the format rules change based on positioning++ repository mode: indirect+ trusted repositories: 0+ semitrusted repositories: 5+ 00000000-0000-0000-0000-000000000001 -- web+ 105776ba-bd78-4884-9126-aeb7c1e6da21 -- UoM Laptop+ 79ff3c20-fab3-44dd-88f7-cc1a41eb73d6 -- here (UoM Desktop Client)+ 949a8fc3-6334-5f5e-887d-b1e5725ea443 -- isilon (UoM Isilon Encrypted Git Backup)+ c3cec307-367b-4373-8cb9-a3da67cee745 -- home (Mac Mini Home Client)++Here we see the description surrounded in brackets and also not in brackets. The second annex listed does not have a name (as there is no git remote configured). Always including the brackets or an additional setting I think would make things much clearer esp. when setting things up.++ +### What steps will reproduce the problem?+++### What version of git-annex are you using? On what operating system?+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++[[done]] --[[Joey]]
+ doc/bugs/git_annex_list__47__whereis_and_uncommited_local_changes.mdwn view
@@ -0,0 +1,28 @@+### Please describe the problem.++I’m not sure whether this is a bug or a technical limitation, but here+you go: In direct mode, if a file is locally changed but unsynced,+«git annex whereis» and «git annex list» behave as if the file were+still unchanged. Any changes would only show after «git annex sync» or+«git annex add» (altough I’m not sure what the latter does if a file+is already annexed).++Syncing prior to «whereis» is not viable since I might not want to+proliferate the changes to other remotes. Would it be reasonable making+sure that «whereis» considers uncommitted local changes?++If doing so is too expensive to do implicitly, it would be useful+having an explicit means of seeing local changes in direct mode+repositories. Is «git annex add» the intended way of doing so?++### What steps will reproduce the problem?++1. Clone A to B.+2. Get file $f from A to B.+3. Switch B to direct mode.+4. Edit file $f.+5. «git annex list» reports that $f is on both A and B.++### What version of git-annex are you using? On what operating system?+git-annex 5.20140421+Linux 3.14.3
+ doc/bugs/git_annex_sync___40__sync_content_without_--content_flag__41__.mdwn view
@@ -0,0 +1,32 @@+### Please describe the problem.++Not sure if it's a bug, but pls explain why it sync files and how to stop it by cfg.++Repos. created with Assistant - git annex sync i an indirect mode not only fetch metadata but also a files. What is the correct way to disable file sync (so only broken links are created in working tree)++Desired:+to boostrap annex infrastructure with assistant, but then some repos switch to indirect mode (while still synced by assistant/webapp) but only metadata (not files). Files to be fetched on request (like git annex get xyz/*) when needed.++### What steps will reproduce the problem?++1. with git annex webapp create two repos on two nodes (Alice and Bob).+2. pair them using discovery on local lan+3. on Bob stop assistant and fire "git annex indirect"+4. add files to Alice repo+5. run git annex sync on Bob repo from CLI++Bob's repo not only sync metadata but also retrive files.+The documentation says "sync" only sync metadata.++### What version of git-annex are you using? On what operating system?++git-annex version: 5.20140420-ga25b8bb++> `git annex sync`, when used without --content, does not sync the content+> of files. However, in your example, Alice is still runing the assistant.+> The assistant will notice when Bob's git annex sync sends it a change,+> and see there are new files, and go get them. If you don't want that to+> happen, you'll need to disable the assistant on Alice too, or configure+> it to not sync with bob, etc.+> +> Not a bug, so [[done]] --[[Joey]]
+ doc/bugs/how_to_get_git-annex_shell_on_MAC__63__.mdwn view
@@ -0,0 +1,27 @@+### Please describe the problem.+shiny-2:MacOS ovi$ git annex sync+git: 'annex' is not a git command. See 'git --help'.+shiny-2:MacOS ovi$++### What steps will reproduce the problem?+INstall git-annex for MAC like this: http://git-annex.branchable.com/install/OSX/ via .dmg file then try above commands from your terminal++### What version of git-annex are you using? On what operating system?+Version: 5.20140420-ga25b8bb Build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV FsEvents XMPP DNS Feeds Quvi TDFA CryptoHash +Mac OSX 10.9.2++### Please provide any additional information below.+I tried adding the path to my .bash_profile manually like this but it didn't help (actually, this was already in there, I just added the path to git-annex to the string):+export PATH=/opt/local/bin:/opt/local/sbin/Applications/git-annex.app/Contents/MacOS:$PATH++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]++> To the extent this is a bug report, it's a duplicate of+> [[standalone_tarball_symlink_to_PATH_broken]].+> [[closing dup|done]]. --[[Joey]]
+ doc/bugs/mac_os_x_10.7_DMG_out_of_date.mdwn view
@@ -0,0 +1,16 @@+### Please describe the problem.++This URL:+http://downloads.kitenet.net/git-annex/OSX/current/10.7.5_Lion/git-annex.dmg+currently points to a DMG with an .app that has ctime/mtime of Dec 29.++After launching the app, the About screen says this:++Version: 5.20131230-g684f2e6 ++> Nobody is autobuilding git-annex for old versions of OSX, which +> is why the download page says, "**warning: not being updated any longer**"+> +> So, not a bug, and nothing ca be done, unless someone steps up to run an+> autobuilder. You can of course build it from source yourself. [[done]]+> --[[Joey]]
+ doc/bugs/no_git-annex_shell_on_Windows.mdwn view
@@ -0,0 +1,28 @@+### Please describe the problem.++git annex installer on Windows only installs git-annex-licenses.txt git-annex-uninstall.exe git-annex.exe++This makes git-annex unusable over ssh (Windows box runs cygwin sshd).++### What steps will reproduce the problem?+++### What version of git-annex are you using? On what operating system?++Windows 7 64bit++git annex version+git-annex version: 5.20140421-g78d6aa1+build flags: Assistant Webapp Webapp-secure Pairing Testsuite S3 WebDAV DNS Feeds Quvi TDFA CryptoHash+key/value backends: SHA256E SHA1E SHA512E SHA224E SHA384E SKEIN256E SKEIN512E SHA256 SHA1 SHA512 SHA224 SHA384 SKEIN256 SKEIN512 WORM URL+remote types: git gcrypt S3 bup directory rsync web webdav tahoe glacier hook external++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]
+ doc/bugs/remote_gcrypt_based_repos_and_conflicting_uuids.mdwn view
@@ -0,0 +1,23 @@+### Please describe the problem.++I've setup a gcrypt based git backup repository as per the examples here:++http://git-annex.branchable.com/tips/fully_encrypted_git_repositories_with_gcrypt/++It all seems to work well until I try to do any kind git annex operation from the console on the gcrypted repo on the remote server. If I run a `git annex fsck` (this seems a reasonable thing to do) then it initialises the encrypted remote with a different uuid to the one in the creation step. The initial repository that created the repo seems to work okay but it's no longer possible to add further repositories without getting conflicting uuid errors.++### What steps will reproduce the problem?+++### What version of git-annex are you using? On what operating system?+++### Please provide any additional information below.++[[!format sh """+# If you can, paste a complete transcript of the problem occurring here.+# If the problem is with the git-annex assistant, paste in .git/annex/daemon.log+++# End of transcript or log.+"""]]
+ doc/bugs/ssh-askpass_locks_me_out_of_x_console.mdwn view
@@ -0,0 +1,27 @@+### Please describe the problem.++Can't access X console after returning to work overnight.++### What steps will reproduce the problem?++1. Create git-annex remote repository, with git annex assistance, connected via ssh, using ssh-agent key for authentication.+2. "ssh-add -D" to delete the ssh key when not attending computer. Forget to kill git-annex assistant.+3. Lock screen with xscreeensaver.+4. Return to work. Unlock screen. Find keyboard and mouse not responding. However there are no dialog boxes on screen.+5. Open up text console, kill the numerous ssh-askpass processes. Find more ssh-askpass processes. Kill the git-annex processes, then kill the ssh-askpass processes. Find I can access the x console again.++### What version of git-annex are you using? On what operating system?++Version 5.20140320~bpo70+1 in Debian backports.++### Please provide any additional information below.++This isn't git-annex's fault, but it is a serious problem with using git-annex assistant.++Suspect ssh-askpass isn't displaying dialog properly as it conflicts with xscreensaver, which is running at the time.++Not really sure what the solution is.++Unfortunately, Out of time for today, will double check this report makes sense tomorrow.++> [[done]] per my comment. --[[Joey]]
+ doc/bugs/standalone_tarball_symlink_to_PATH_broken.mdwn view
@@ -0,0 +1,7 @@+Using the standalone build, on Linux, ln -s git-annex.linux/git-annex+/usr/local/bin doesn't work, it looks at $0 and sees /usr/local/bin and+does not find git-annex there. ++I think that there is documentation or at least past advice of symlinking+this way to install it into PATH. So need to do something about this.+Perhaps have an installation script? --[[Joey]]
+ doc/bugs/wget_tarball_over_https_complains.mdwn view
@@ -0,0 +1,15 @@+### Please describe the problem.+Can't download new tarball via wget on remote machine without passing '--no-check-certificate'.++### What steps will reproduce the problem?++[[!format sh """+greg@rose:~/bin$ wget https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz+--2014-05-14 15:55:59-- https://downloads.kitenet.net/git-annex/linux/current/git-annex-standalone-amd64.tar.gz+Resolving downloads.kitenet.net... 107.170.31.195+Connecting to downloads.kitenet.net|107.170.31.195|:443... connected.+ERROR: certificate common name "kitenet.net" doesn\'t match requested host name "downloads.kitenet.net".+To connect to downloads.kitenet.net insecurely, use '--no-check-certificate'.+"""]]++> [[done]]: Per joey's comment, I'll investigate my broken wget
doc/contribute.mdwn view
@@ -1,15 +1,37 @@ Help make git-annex better! -* This website is a wiki, so you can edit and improve any page.-* Write a [[new_tip|tips]] explaining how to accomplish something with- git-annex.-* [[download]] the source code and send patches!-* If you know Haskell, git-annex has lots of Haskell code that- could be improved. See the [[coding_style]] and have at it.-* If you don't know Haskell, git-annex has many other coding opportunities.- You could work to improve the Android port (Java etc) or improve the- Javascript and CSS of the git-annex webapp, or work on porting libraries- needed by the Windows port.+## wiki gardening++This website is a wiki, so you can edit and improve any page.++Or, write a [[new_tip|tips]] explaining how to accomplish something with+git-annex.++## bug triage++People often file [[bugs]] on git-annex that are easily resolved by helping+them with a problem, and perhaps writing some documentation.++Many bugs are also filed without enough information+to reproduce the problem, and need to be tagged moreinfo and a comment+posted asking the submitter for details.++Joey spends a lot of time dealing with this kind of bug triage. If you can+take the time to pick a bug, try to reproduce it and follow up either+confirming that the problem exists, or asking the submitter for more info,+you'll make Joey more productive!++## code contributions++[[download]] the source code and send patches!++If you know Haskell, git-annex has lots of Haskell code that+could be improved. See the [[coding_style]] and have at it.++If you don't know Haskell, git-annex has many other coding opportunities.+You could work to improve the Android port (Java etc) or improve the+Javascript and CSS of the git-annex webapp, or work on porting libraries+needed by the Windows port. To send patches, either include the patch in a bug report (small patch) or put up a branch in a git repository containing your changes.
doc/design/assistant/polls/Android_default_directory.mdwn view
@@ -4,4 +4,4 @@ want the first time they run it, but to save typing on android, anything that gets enough votes will be included in a list of choices as well. -[[!poll open=yes expandable=yes 66 "/sdcard/annex" 6 "Whole /sdcard" 7 "DCIM directory (photos and videos only)" 1 "Same as for regular git-annex. ~/annex/"]]+[[!poll open=yes expandable=yes 67 "/sdcard/annex" 6 "Whole /sdcard" 7 "DCIM directory (photos and videos only)" 1 "Same as for regular git-annex. ~/annex/"]]
doc/design/assistant/polls/prioritizing_special_remotes.mdwn view
@@ -6,7 +6,7 @@ Help me prioritize my work: What special remote would you most like to use with the git-annex assistant? -[[!poll open=yes 16 "Amazon S3 (done)" 12 "Amazon Glacier (done)" 9 "Box.com (done)" 72 "My phone (or MP3 player)" 25 "Tahoe-LAFS" 10 "OpenStack SWIFT" 33 "Google Drive"]]+[[!poll open=yes 16 "Amazon S3 (done)" 12 "Amazon Glacier (done)" 9 "Box.com (done)" 72 "My phone (or MP3 player)" 25 "Tahoe-LAFS" 11 "OpenStack SWIFT" 34 "Google Drive"]] This poll is ordered with the options I consider easiest to build listed first. Mostly because git-annex already supports them and they
doc/design/assistant/sshpassword.mdwn view
@@ -10,3 +10,56 @@ This might come down to a simple change to the webapp to prompt for the password, and then rather a lot of pain to make the webapp use HTTPS so we can be pretty sure noone is sniffing the (localhost) connection.++## ssh-askpass approach++* If ssh-askpass is in PATH, or `SSH_ASKPASS` is set, do nothing.+ (Unless webapp is run remotely.) + XXX not currently done; the UI would need to omit the password entry+ fields in this case.+* Otherwise, have the assistant set `SSH_ASKPASS` to a command that will+ cause the webapp to read the password and forward it on. Also, set+ DISPLAY to ensure that ssh runs the program. **done**++Looking at ssh.exe, I think this will even work on Windows; it contains the+code to run ssh-askpass. (It does work on Windows!)++### securely handling the password++* Maybe force upgrade webapp to https? Locally, the risk would be that+ root could tcpdump and read password, so not large risk. If webapp+ is being accessed remotely, absolutely: require https.+* Use hs-securemem to store password.+* Avoid storing password for long. Erase it after webapp setup of remote+ is complete. Time out after 10 minutes and erase it. **done**+* If the user is slow, the cached ssh key can exire before they finish.+ This results in ssh being given no password, and failing. The UI+ now detects this and suggests the user retry. **done**+* Prompt using a html field name that does not trigger web browser password+ saving if possible.++### ssh-askpass shim, and password forwarding++`SSH_ASKPASS` needs to be set to a program (probably git-annex)+which gets the password from the webapp, and outputs it to stdout. **done**++Seems to call for the webapp and program to communicate over a local+socket (locked down so only user can access) or environment.+Environment is not as secure (easily snooped by root).+Local socket probably won't work on Windows. Could just use a temp file.++(Currently uses a temp file with locked down perms that it's careful+to clean up after use.)++Note that the webapp can probe to see if ssh needs a password, and can+prompt the user for it before running ssh and the ssh-askpass shim.+This avoids some complexity, and perhaps some attack vectors,+if the shim cannot requst an arbitrary password prompt.+(This complexity not needed with the temp file approach..)++### TODO++* test on OSX+* test on Android+* remove the vestigial terminal on Windows and Android, since this was the+ last thing actually using it (not easy!)
doc/design/assistant/syncing/efficiency.mdwn view
@@ -71,3 +71,7 @@ for example, be used by laptopB to tell laptopA that it's trying to send a file directly to laptopC. laptopA could then defer the upload to the cloud for a while.++## syncing only requested content++See [[adhoc_routing]]
+ doc/design/metadata/comment_6_fa51ae544b193122334dbae7960ab3d9._comment view
@@ -0,0 +1,15 @@+[[!comment format=mdwn+ username="tdussa"+ ip="217.84.74.69"+ subject="Why not automatically add the whole date?"+ date="2014-04-30T20:41:20Z"+ content="""+Hi,++apologies if I am missing something, but from what I understand, git-annex will automatically add the year and the month from a file's mtime to its metadata if instructed to do so.++So... What about the day (or the time, for that matter?)? What is the reasoning behind the decision not to add those bits automatically? And, is there a way to get git-annex to add those bits of information automatically as well (besides the obvious way of creating a pre-commit-hook script to that effect)?++THX & Cheers,+Toby.+"""]]
+ doc/design/requests_routing.mdwn view
@@ -0,0 +1,100 @@+## requesting content+ +In some situations, nodes only want particular files, and not everything.+(Or don't have the bandwidth to get everything.) A way to handle this,+that should work in a fully ad-hoc, offline distributed network,+suggested by Vincenzo Tozzi:++* Nodes generate a request for a specific file they want, committed+ to git somewhere.+* This request has a TTL (of eg 3 or 4).+* When syncing, copy the requests that a node has, and decrease their TTL+ by 1. Requests with a TTL of 0 have timed out and are not copied.+ (So, requests are stored in git, but on eg, per-node branches.)+* Only copy content to nodes that have a request for it (either one+ originating with them, or one they copied from another node).+* Each request indicates the requesting node, so once no nodes have an+ active request for a particular file, it's ok to drop it from the+ transfer nodes (honoring numcopies etc of course).++## simulation++A simulation of a network using this method is in [[simroutes.hs]].++Question: How efficient is this method? Does the network fill with many+copies that are not needed, before the request is fulfilled?++## storing requests++Requests could be stored in the location tracking file.++Currently:++ time 0|1 uuid1+ time 0|1 uuid2++* Use negative numbers for the TTL of a request:++ time -3! uuid1+ time -2 uuid2++ The `!` indicates that the request originated on+ that node.+* To propigate a request, set -1 * (TTL+1) in the line+ for the uuid of the repository that is propigating it. + This should be done as part of the git-annex branch merge,+ so if a location tracking file is merged, any open requests+ get propigated to the current repository automatically.+* When a requested file reaches a node that requested it,+ the location is set to 1; this automatically clears the+ request.+* When a file has no more originating requests, clear all+ the copied requests:++ time 1 uuid1+ time -2 uuid2++ Becomes:++ time 1 uuid1+ time' 0 uuid2++## generating requests++ git annex request [file...]++Indicates that the file is wanted in the current repository.++(git annex get could also do this on failure, or suggest doing this)++## acting on requests++Add a preferred content expression that looks at request data:++ requestedby=N++Matches files that have been requested by at least N nodes.++ requested++Matches files that the current node has requested.++### Example preferred content expressions++For an immobile node that accumulates files it requests, and also+temporarily stores files requested by other such nodes:++ present or requestedby=1++For a node that only transfers files between the immobile nodes:++ requestedby=1++For an immobile node that only accumulates files it requests, but never+stores files requested by other nodes:++ present or requested++TODO: Would be nice to be able to prioritize files that more nodes are+requesting, or that have some urgent flag set. But currently there is no+way to do that; content is either preferred or not preferred.
+ doc/design/requests_routing/simroutes.hs view
@@ -0,0 +1,402 @@+-- Simulation of non-flood syncing of content, across a network of nodes.++module Main where++import System.Random+import Control.Monad.Random+import Control.Monad+import Control.Applicative+import Data.Ratio+import Data.Ord+import Data.List+import Data.Maybe+import qualified Data.Set as S+import qualified Data.Map.Strict as M++{-+ - Tunable values+ -}++totalFiles :: Int+totalFiles = 100++-- How likely is a given file to be wanted by any particular node?+probabilityFilesWanted :: Probability+probabilityFilesWanted = 0.10++-- How many different locations can each transfer node move between?+-- (Min, Max)+transferDestinationsRange :: (Int, Int)+transferDestinationsRange = (2, 3)++-- Controls how likely transfer nodes are to move around in a given step+-- of the simulation.+-- (They actually move slightly less because they may start to move and+-- pick the same location they are at.)+-- (Min, Max)+transferMoveFrequencyRange :: (Probability, Probability)+transferMoveFrequencyRange = (0.10, 1.00)++-- counts both immobile and transfer nodes as hops, so double Vince's+-- theoretical TTL of 3.+-- (30% loss on mocambos network w/o ttl of 4!)+maxTTL :: TTL+maxTTL = TTL (4 * 2)++numImmobileNodes :: Int+numImmobileNodes = 10++numTransferNodes :: Int+numTransferNodes = 20++numSteps :: Int+numSteps = 100++-- IO code+main :: IO ()+main = do+-- initialnetwork <- evalRandIO (seedFiles totalFiles =<< genNetwork)+ initialnetwork <- evalRandIO (seedFiles totalFiles =<< mocambosNetwork)+ networks <- evalRandIO (simulate numSteps initialnetwork)+ let finalnetwork = last networks+ putStrLn $ summarize initialnetwork finalnetwork+ putStrLn "location history of file 1:"+ print $ trace (traceHaveFile (File 1)) networks+ putStrLn "request history of file 1:"+ print $ trace (traceWantFile (File 1)) networks+-- Only pure code below :)++data Network = Network (M.Map NodeName ImmobileNode) [TransferNode]+ deriving (Show, Eq)++data ImmobileNode = ImmobileNode NodeRepo+ deriving (Show, Eq)++type NodeName = String++type Route = [NodeName]++data TransferNode = TransferNode+ { currentlocation :: NodeName+ , possiblelocations :: [NodeName]+ , movefrequency :: Probability+ , transferrepo :: NodeRepo+ }+ deriving (Show, Eq)++data NodeRepo = NodeRepo+ { wantFiles :: [Request]+ , haveFiles :: S.Set File+ , satisfiedRequests :: S.Set Request+ }+ deriving (Show, Eq)++data File = File Int+ deriving (Show, Eq, Ord)++randomFile :: (RandomGen g) => Rand g File+randomFile = File <$> getRandomR (0, totalFiles)++data Request = Request File TTL+ deriving (Show, Ord)++-- compare ignoring TTL+instance Eq Request where+ (Request f1 _) == (Request f2 _) = f1 == f2++requestedFile :: Request -> File+requestedFile (Request f _) = f++requestTTL :: Request -> TTL+requestTTL (Request _ ttl) = ttl++data TTL = TTL Int+ deriving (Show, Eq, Ord)++incTTL :: TTL -> TTL+incTTL (TTL t) = TTL (t + 1)++decTTL :: TTL -> TTL+decTTL (TTL t) = TTL (t - 1)++staleTTL :: TTL -> Bool+staleTTL (TTL t) = t < 1++-- Origin of a request starts one higher than max, since the TTL+-- will decrement the first time the Request is transferred to another node.+originTTL :: TTL+originTTL = incTTL maxTTL++randomRequest :: (RandomGen g) => Rand g Request+randomRequest = Request+ <$> randomFile+ <*> pure originTTL++type Probability = Float++randomProbability :: (RandomGen g) => Rand g Probability+randomProbability = getRandomR (0, 1)++-- Returns the state of the network at each step of the simulation.+simulate :: (RandomGen g) => Int -> Network -> Rand g [Network]+simulate n net = go n [net]+ where+ go 0 nets = return (reverse nets)+ go c (prev:nets) = do+ new <- step prev+ go (c - 1) (new:prev:nets)++-- Each step of the simulation, check if each TransferNode wants to move,+-- and if so:+-- 1. It and its current location exchange their Requests.+-- 2. And they exchange any requested files.+-- 3. Move it to a new random location.+--+-- Note: This implementation does not exchange requests between two+-- TransferNodes that both arrive at the same location at the same step,+-- and then move away in the next step.+step :: (RandomGen g) => Network -> Rand g Network+step (Network immobiles transfers) = go immobiles [] transfers+ where+ go is c [] = return (Network is c)+ go is c (t:ts) = do+ r <- randomProbability+ if movefrequency t <= r+ then case M.lookup (currentlocation t) is of+ Nothing -> go is (c ++ [t]) ts+ Just currentloc -> do+ let (currentloc', t') = merge currentloc t+ t'' <- move t'+ go (M.insert (currentlocation t) currentloc' is) (c ++ [t'']) ts+ else go is (c ++ [t]) ts++merge :: ImmobileNode -> TransferNode -> (ImmobileNode, TransferNode)+merge (ImmobileNode ir) t@(TransferNode { transferrepo = tr }) =+ ( ImmobileNode (go ir tr)+ , t { transferrepo = go tr ir }+ )+ where+ go r1 r2 = r1+ { wantFiles = wantFiles'+ , haveFiles = haveFiles'+ , satisfiedRequests = satisfiedRequests' `S.union` checkSatisfied wantFiles' haveFiles'+ }+ where+ wantFiles' = foldr addRequest (wantFiles r1) (wantFiles r2)+ haveFiles' = S.foldr (addFile wantFiles' satisfiedRequests') (haveFiles r1) (haveFiles r2)+ satisfiedRequests' = satisfiedRequests r1 `S.union` satisfiedRequests r2++-- Adds a file to the set, when there's a request for it, and the request+-- has not already been satisfied.+addFile :: [Request] -> S.Set Request -> File -> S.Set File -> S.Set File+addFile rs srs f fs+ | any (\sr -> f == requestedFile sr) (S.toList srs) = fs+ | any (\r -> f == requestedFile r) rs = S.insert f fs+ | otherwise = fs++-- Checks if any requests have been satisfied, and returns them,+-- to be added to satisfidRequests+checkSatisfied :: [Request] -> S.Set File -> S.Set Request+checkSatisfied want have = S.fromList (filter satisfied want)+ where+ satisfied r = requestTTL r == originTTL && S.member (requestedFile r) have++-- Decrements TTL, and avoids adding request with a stale TTL, or a+-- request for an already added file with the same or a lower TTL.+addRequest :: Request -> [Request] -> [Request]+addRequest (Request f ttl) rs+ | staleTTL ttl' = rs+ | any (\r -> requestTTL r >= ttl) similar = rs+ | otherwise = r' : other+ where+ ttl' = decTTL ttl+ r' = Request f ttl'+ (other, similar) = partition (/= r') rs++move :: (RandomGen g) => TransferNode -> Rand g TransferNode+move t = do+ newloc <- randomfrom (possiblelocations t)+ return $ t { currentlocation = newloc }++genNetwork :: (RandomGen g) => Rand g Network+genNetwork = do+ let immobiles = M.fromList (zip (map show [1..]) (replicate numImmobileNodes emptyImmobile))+ transfers <- sequence (replicate numTransferNodes (mkTransfer $ M.keys immobiles))+ return $ Network immobiles transfers++emptyImmobile :: ImmobileNode+emptyImmobile = ImmobileNode (NodeRepo [] S.empty S.empty)++mkTransfer :: (RandomGen g) => [NodeName] -> Rand g TransferNode+mkTransfer immobiles = do+ -- Transfer nodes are given random routes. May be simplistic.+ -- Also, some immobile nodes will not be serviced by any transfer nodes.+ numpossiblelocs <- getRandomR transferDestinationsRange+ possiblelocs <- sequence (replicate numpossiblelocs (randomfrom immobiles))+ mkTransferBetween possiblelocs++mkTransferBetween :: (RandomGen g) => [NodeName] -> Rand g TransferNode+mkTransferBetween possiblelocs = do+ currentloc <- randomfrom possiblelocs+ movefreq <- getRandomR transferMoveFrequencyRange+ -- transfer nodes start out with no files or requests in their repo+ let repo = (NodeRepo [] S.empty S.empty)+ return $ TransferNode currentloc possiblelocs movefreq repo++randomfrom :: (RandomGen g) => [a] -> Rand g a+randomfrom l = do+ i <- getRandomR (1, length l)+ return $ l !! (i - 1)++-- Seeds the network with the given number of files. Each file is added to+-- one of the immobile nodes of the network at random. And, one other node,+-- at random, is selected which wants to get the file.+seedFiles :: (RandomGen g) => Int -> Network -> Rand g Network+seedFiles 0 network = return network+seedFiles n network@(Network m t) = do+ (origink, ImmobileNode originr) <- randnode+ (destinationk, ImmobileNode destinationr) <- randnode+ let file = File n+ let origin = ImmobileNode $ originr+ { haveFiles = S.insert file (haveFiles originr) }+ let destination = ImmobileNode $ destinationr+ { wantFiles = Request file originTTL : wantFiles destinationr }+ let m' = M.insert origink origin $+ M.insert destinationk destination m+ seedFiles (n - 1) (Network m' t)+ where+ randnode = do+ k <- randomfrom (M.keys m)+ return (k, fromJust $ M.lookup k m)++summarize :: Network -> Network -> String+summarize _initial@(Network origis _) _final@(Network is _ts) = format+ [ ("Total wanted files",+ show (sum (overis (length . findoriginreqs . wantFiles . repo))))+ , ("Wanted files that were not transferred to requesting node",+ show (sum (overis (S.size . findunsatisfied . repo))))+ , ("Nodes that failed to get files",+ show (map withinitiallocs $ filter (not . S.null . snd)+ (M.toList $ M.map (findunsatisfied . repo) is)))+ , ("Total number of files on immobile nodes at end",+ show (overis (S.size . haveFiles . repo)))+ --, ("Immobile nodes at end", show is)+ ]+ where+ findoriginreqs = filter (\r -> requestTTL r == originTTL)+ findunsatisfied r = + let wantedfs = S.fromList $ map requestedFile (findoriginreqs (wantFiles r))+ in S.difference wantedfs (haveFiles r)+ repo (ImmobileNode r) = r+ overis f = map f $ M.elems is+ format = unlines . map (\(d, s) -> d ++ ": " ++ s)++ withinitiallocs (name, missingfiles) = (name, S.map addinitialloc missingfiles)+ addinitialloc f = (f, M.lookup f initiallocs)++ initiallocs = M.fromList $ + concatMap (\(k, v) -> map (\f -> (f, k)) (S.toList $ haveFiles $ repo v)) $+ M.toList origis++trace :: (Network -> S.Set NodeName) -> [Network] -> String+trace tracer networks = show $ go [] S.empty $ map tracer networks+ where+ go c old [] = reverse c+ go c old (new:l) = go ((S.toList $ new `S.difference` old):c) new l++traceHaveFile :: File -> Network -> S.Set NodeName+traceHaveFile f (Network m _) = S.fromList $ M.keys $+ M.filter (\(ImmobileNode r) -> f `S.member` haveFiles r) m ++traceWantFile :: File -> Network -> S.Set NodeName+traceWantFile f (Network m _) = S.fromList $ M.keys $+ M.filter (\(ImmobileNode r) -> any wantf (wantFiles r)) m + where+ wantf (Request rf _ttl) = rf == f++mocambosNetwork :: (RandomGen g) => Rand g Network+mocambosNetwork = do+ let major = map (immobilenamed . fst) communities+ let minor = map immobilenamed (concatMap snd communities)+ majortransfer <- mapM mkTransferBetween majorroutes+ minortransfer <- mapM mkTransferBetween (concatMap minorroutes (concat (replicate 5 communities)))+ return $ Network+ (M.fromList (major++minor))+ (majortransfer ++ minortransfer)+ where+ immobilenamed name = (name, emptyImmobile)++ -- As a simplification, this only makes 2 hop routes, between minor+ -- and major communities; no 3-legged routes.+ minorroutes :: (NodeName, [NodeName]) -> [Route]+ minorroutes (major, minors) = map (\n -> [major, n]) minors++communities :: [(NodeName, [NodeName])]+communities =+ [ ("Tainá/SP",+ [ "badtas"+ , "vauedo ribera"+ , "cofundo"+ , "jao"+ , "fazenda"+ ]+ )+ , ("Odomode/RS",+ [ "moradadapaz"+ , "pelotas" + ]+ )+ , ("MercadoSul/DF",+ [ "mesquito"+ , "kalungos"+ ]+ )+ , ("Coco/PE",+ [ "xambá"+ , "alafin"+ , "terreiaos"+ ]+ )+ , ("Linharinho/ES",+ [ "monte alegne"+ ]+ )+ , ("Boneco/BA",+ [ "barroso"+ , "lagoa santa"+ , "terravista"+ ]+ )+ , ("Zumbidospalmanes/NA",+ [ "allantana"+ ]+ )+ , ("Casa Pneta/PA",+ [ "marajó"+ ]+ )+ , ("Purarue/PA",+ [ "oriaminá"+ ]+ )+ , ("Madiba/NET", [])+ ]++majorroutes :: [Route]+majorroutes =+ -- person's routes+ [ ["Tainá/SP", "Odomode/RS"]+ , ["Tainá/SP", "MercadoSul/DF"]+ , ["MercadoSul/DF", "Boneco/BA"]+ , ["MercadoSul/DF", "Zumbidospalmanes/NA"]+ , ["Zumbidospalmanes/NA", "Casa Pneta/PA"]+ , ["Casa Pneta/PA", "Purarue/PA"]+ , ["Casa Pneta/PA", "Linharinho/ES"]+ , ["Boneco/BA", "Coco/PE"]+ -- internet connections+ , ["Tainá/SP", "MercadoSul/DF", "Coco/PE", "Purarue/PA", "Odomode/RS", "Madiba/NET"]+ , ["Tainá/SP", "MercadoSul/DF", "Coco/PE", "Purarue/PA", "Odomode/RS", "Madiba/NET"]+ , ["Tainá/SP", "MercadoSul/DF", "Coco/PE", "Purarue/PA", "Odomode/RS", "Madiba/NET"]+ , ["Tainá/SP", "MercadoSul/DF", "Coco/PE", "Purarue/PA", "Odomode/RS", "Madiba/NET"]+ , ["Tainá/SP", "MercadoSul/DF", "Coco/PE", "Purarue/PA", "Odomode/RS", "Madiba/NET"]+ ]
doc/design/roadmap.mdwn view
@@ -6,13 +6,13 @@ * Month 1 [[!traillink assistant/encrypted_git_remotes]] * Month 2 [[!traillink assistant/disaster_recovery]]-* Month 3 user-driven features and polishing [[!traillink todo/direct_mode_guard]] [[!traillink assistant/upgrading]]+* Month 3 [[!traillink todo/direct_mode_guard]] [[!traillink assistant/upgrading]] * Month 4 [[!traillink assistant/windows text="Windows webapp"]], Linux arm, [[!traillink todo/support_for_writing_external_special_remotes]] * Month 5 user-driven features and polishing * Month 6 get Windows out of beta, [[!traillink design/metadata text="metadata and views"]] * Month 7 user-driven features and polishing-* **Month 8 [[!traillink git-remote-daemon]] [[!traillink assistant/telehash]]**-* Month 9 [[!traillink assistant/gpgkeys]] [[!traillink assistant/sshpassword]]+* **Month 8 [[!traillink git-remote-daemon]]**+* Month 9 Brazil!, [[!traillink assistant/sshpassword]] * Month 10 get [[assistant/Android]] out of beta-* Month 11 [[!traillink assistant/chunks]] [[!traillink assistant/deltas]]-* Month 12 user-driven features and polishing+* Month 11 [[!traillink assistant/chunks]], [[!traillink assistant/deltas]], [[!traillink assistant/gpgkeys]] (pick 2?)+* Month 12 [[!traillink assistant/telehash]]
+ doc/devblog/day_156__release_day.mdwn view
@@ -0,0 +1,14 @@+I hope this will be a really good release. Didn't get all the way to+[[design/assistant/telehash]] this month, but the remotedaemon is pretty sweet. Updated [[design/roadmap]]+pushes telehash back again.++The files in this release are now gpg signed, after recently moving the+downloads site to a dedicated server, which has a dedicated gpg key.+You can verify the detached signatures as an additional security check+over trusting SSL. The automatic upgrade code doesn't check the gpg+signatures yet.++Sören Brunk has ported the webapp to Bootstrap 3.+<https://github.com/brunksn/git-annex/tree/bootstrap3> +The branch is not ready for merging yet (it would break the Debian stable+backports), but that was a nice surprise.
+ doc/devblog/day_157__upgrade_checking.mdwn view
@@ -0,0 +1,22 @@+Now git-annex's self-upgrade code will check the gpg signature of a+new version before using it.++To do this I had to include the gpg public keys into the+git-annex distribution, and that raised the question of which public keys+to include. Currently I have both the dedicated git-annex distribution+signing key, and my own gpg key as a backup in case I somehow misplace the+former.++Also spent a while looking at the recent logs on the web server. There+seem to be around 600 users of the assistant with+upgrade checking enabled. That breaks down to 68% Linux amd64, 20% Linux+i386, 11% OSX Mavericks, and 0.5% OSX Lion.++Most are upgrading successfully, but there are a few that seem to+repeatedly fail for some reason. (Not counting the OSX Lion, which will+probably never find an upgrade available.) I hope that someone who is+experiencing an upgrade failure gets in touch with some debug logs.++In the same time period, around 450 unique hosts manually downloaded a+git-anex distribution. Also compare with Debian popcon, which has 1200+reporting git-annex users.
+ doc/devblog/day_158__enroute_to_Brazil.mdwn view
@@ -0,0 +1,10 @@+Next month the roadmap has me working on [[design/assistant/sshpassword]].+That will be a nice UI improvement and I'd be very surprised if it takes+more than a week, which is great.++Getting a jump on it today, investigating using `SSH_ASKPASS`. It seems this+will even work on Windows! Preliminary design in [[design/assistant/sshpassword]].++Time to get on a plane to a plane to a plane to Brasilia!++[[!meta date="Fri, 25 Apr 2014 16:32:36 -0400"]]
+ doc/devblog/day_159__tmp_file_cleanup.mdwn view
@@ -0,0 +1,12 @@+Today was mostly spent driving across Brazil, but I had energy this evening+for a little work on git-annex.++Made the assistant delete old temporary files on startup. I've had+scattered reports of a few users whose `.git/annex/tmp` contained many+files, apparently put there by the assistant when it locks down a file+prior to annexing it. That seems it could possibly be a bug -- or it could+just be unclean shutdowns interrupting the assistant. Anyway, this will+deal with any source of tmp cruft, and I made sure to preserve+tmp files for partially downloaded content.++[[!meta date="Sun, 27 Apr 2014 22:12:55 -0300"]]
+ doc/devblog/day_160__.mdwn view
@@ -0,0 +1,20 @@+Reviewed Sören's updated bootstrap3 patch, which appeared while I was+[traveling](http://joeyh.name/blog/entry/the_real_Brazil/). Sören+kindly fixed it to work with Debian stable's old version of Yesod,+which was quite a lot of work. The new new bootstrap3 UI looks nice,+found a few minor issues, but expect to be able to merge it soon.++Started on [[design/assistant/sshpassword]] groundwork. Added a simple+password cache to the assistant, with automatic expiration, and made+git-annex be able to be run by ssh as the `SSH_ASKPASS` program.++The main difficulty will be changing the webapp's UI to prompt for the ssh+password when one is needed. There are several code paths in ssh remote+setup where a password might be needed. Since the cached password expires,+it may need to be prompted for at any of those points. Since a new page is+loading, it can't pop up a prompt on the current page; it needs to redirect+to a password prompt page and then redirect back to the action that needed+the password. ...At least, that's one way to do it.+I'm going to sleep on it and hope I dream up a better way.++[[!meta date="Tue, 29 Apr 2014 18:33:53 -0400"]]
+ doc/devblog/day_161__routing_design.mdwn view
@@ -0,0 +1,13 @@+I've moved out of implementation mode (unable to concentrate enough), and+into high-level design mode.++[[Syncing efficiency|design/assistant/syncing/efficiency]] has been an open TODO for years,+to find a way to avoid flood filling the network, and find more efficient+ways to ensure data only gets to the nodes that want it. Relatedly,+Android devices often need a way to mark individual files they want to have.+Had a [very productive discussion with Vince and Fernao](http://joeyh.name/blog/entry/who_needs_whiteboards_when_you_have_strange_seed_pods_from_the_jungle/)+and I think we're heading toward a design that will address both these+needs, as well as some more Brazil-specific use cases, about which more+later.++Today's work was sponsored by Casa do Boneco.
+ doc/devblog/day_162__routing_sim_and_massive_contribution_landed.mdwn view
@@ -0,0 +1,17 @@+Sören Brunk's massive bootstrap 3 patch has landed! This is a 43 thousand+line diff, with 2 thousand lines after the javascript and CSS libraries are+filtered out. Either way, the biggest patch contributed by anyone to+git-annex so far, and excellent work.++Meanwhile, I built a [[haskell program|design/assistant/syncing/simroutes.hs]] to simulate+a network of highly distributed git-annex nodes with ad-hoc connections and+the selective file syncing algorythm now documented at the bottom of+[[design/assistant/syncing/efficiency]].++Currently around 33% of requested files never get to their destination+in this simulation, but this is probably because its network is randomly+generated, and so contains disconnected islands. So next, some data entry,+from a map that involves an Amazon not in .com, dotted with names of people+I have recently met... :)++<a href="https://downloads.kitenet.net/git-annex/mapa/mapa.jpg"><img src="https://downloads.kitenet.net/git-annex/mapa/mapa.jpg" width=1024 height=768></a>
+ doc/devblog/day_163__request_and_routing_design.mdwn view
@@ -0,0 +1,3 @@+I have a preliminary design for [[design/requests_routing]]. Won't be+working on it immediately, but simulations show it can work well in a large+ad-hoc network.
+ doc/devblog/day_164__back.mdwn view
@@ -0,0 +1,17 @@+My backlog is massive -- 181 items to answer. Will probably take the rest+of the month to get caught back up. Rather than digging into that yet,+spent today working on the webapp's ssh password prompting. ++I simplified it so the password is entered on the same form as the rest+of the server's information. That made the UI easy to build, but+means that when a user already has a ssh key they want to use, they need+to select "existing ssh key"; the webapp no longer probes to automatically+detect that case.++Got the ssh password prompting in the webapp basically working, and it's a+*really* nice improvement! I even got it to work on Windows (eventually...).+It's still only in the `sshpassword` branch, since I need to test it more+and probably fix some bugs. In particular, when enabling a remote that+already exists, I think it never prompts for the password yet.++Today's work was sponsored by Nicola Chiapolini.
+ doc/devblog/day_165__sshpassword_merged.mdwn view
@@ -0,0 +1,18 @@+Spent the day testing the sshpasswd branch. A few interesting things:++* I was able to get rid of 10 lines of Windows specific code for+ rsync.net, which had been necessary for console ssh password prompting to+ work. Yay!+* git-remote-gcrypt turned out to be broken when there is no controlling+ tty. --no-tty has to be passed to gpg to avoid it falling over in this+ case, even when a gpg agent is available to be used. I fixed this with+ a new release of git-remote-gcrypt.++Mostly the new branch just worked! And is merged...++Merged a patch from Robie Basak that adds a new special remote that's sort+of like bup but supports deletion: [[special_remotes/ddar]]++Backlog: 172++Today's work was sponsored by Andrew Cant.
+ doc/devblog/day_166__catching_up.mdwn view
@@ -0,0 +1,40 @@+Powered through the backlog today, and got it down to 67! Probably most of+the rest is the hard ones though.++A theme today was: It's stupid hard to get git-annex-shell installed into+PATH. While that should be the simplest thing in the world, I'm pinned+between two problems:++1. There's no single portable package format, so all the decades of+ development nice ways to get things into PATH don't work for everybody.+2. bash provides not a single dotfile that will work in all circumstances+ to configure PATH. In particular, "ssh $host git-annex-shell" causes bash+ to helpfully avoid looking at any dotfiles at all.++Today's flailing to work around that inluded:++* Merged a patch from Fraser Tweedale to allow `git config remote.origin.annex-shell /not/in/path/git-annex-shell`+* Merged a patch from Justin Lebar to allow symlinking the git-annex-shell+ etc from the standalone tarball to a directory that is in PATH. (Only+ on Linux, not OSX yet.)+* Improved the warning message git-annex prints when a remote server does+ not have git-annex-shell in PATH, suggesting some things the user could+ do to try to fix it.++I've found out why OSX machines were retrying upgrades repeatedly. The+version in the .info file did not match the actual git-annex version for+OSX. I've fixed the info file version, but will need to come up with a+system to avoid such mismatches.++Made a few other fixes. A notable one is that dragging and dropping+repositories in the webapp to reorder the list (and configure costs)+had been broken since November.++git-annex 5.20140421 finally got into Debian testing today, so I updated+the backport. I recommend upgrading, especially if you're using the+assistant with a ssh remote, since you'll get all of last month's nice+features that make XMPP unnecessary in that configuration.++----++Today's work was sponsored by Geoffrey Irving.
+ doc/forum/Basic_set_up_with_one_remote.mdwn view
@@ -0,0 +1,14 @@+Hi, I'm new to git annex and so far it's looking really useful. I'm convinced what I'm trying to achieve is possible, but I can't seem to hit upon the right combination. Here's what I'd like to set up.++One server with git annex / rsync / ssh access, but configured such that it contains a history of all the files as a full backup.+Two clients WITHOUT ssh access (these are portable machines and I'd rather not open any ports I don't absolutely have to).++I've used the assistant to set up syncing between all three, using a jabber account to send signals and the server to pass on the files between the machines. This all works beautifully. But what I can't seem to get right is the server / backup aspect. If I set up the server using the assistant as a remote, and set it to "full backup" from the drop down list, it doesn't seem to have any files in the repository except in the .git/annex/objects folder. Which are all cryptic file names and not really accessible. If I run commands such as ++> git annex find++(which should list all files as far as I can tell) in the server repository, it doesn't list any files at all. As the clients are all set up as direct repositories I can't access any history of the files there, so this doesn't seem to be quite what I'm after. The sync is working, but I really want the backup / history aspect as well.++Does anyone know if what I want is possible? If so hopefully I'm close and someone can point out where I've gone wrong. I'm not afraid of the command line, but the assistant is a very convenient way to get started. ++Thanks for your help.
+ doc/forum/Checkout_only_some_files_with_the_assistant.mdwn view
@@ -0,0 +1,14 @@+Hi,++I really like git-annex for sharing contents with all my devices. But i have a problem with the assistant on my phone, i don't know how to git annex get some file but not all.+For example i have this on a remote:++repository:+ - big file1+ - big file2+ - big file3++I have this repository on my phone. I would like to be able to checkout out only "big file2" directly within the assistant.+How can i achieve that?++Thank you.
+ doc/forum/Distributing_data_to_a_set_of_drives.mdwn view
@@ -0,0 +1,1 @@+Here is my situation, Say I have a repo that is 3 TBs (lets call this repo A has full copy of everything.) and I have 3 other drives all 1 TB each lets call them B C D, then I have partial checkouts on my laptops D E. What I would like to do is, have two copies of all files in A and BCD I would like to threat BCD as a group acting like a single repo so A distributes files evenly to drives in group BCD. I also want copies in D and E to not count towards num of files. As for the latter even though I set D and E as untrusted annex still counts copies on those repos If a get a file in D assistant drops a copy from one of the trusted repos A or BCD I have to move it back instead of just dropping it. Also How can I or is it possible to set BCD to act as a group so A distributes files among drives currently I can do this using find/get but it turns it into a math problem every time a add a file to A I have to manually check which disk has most space navigate to it check files with less copies then 2 and get them.
+ doc/forum/Encrypted_Content_Remote_Daemon_.mdwn view
@@ -0,0 +1,1 @@+I am currently using rsync.net to keep my notes in sync, both git repo and the content (gpg encrypted) is stored there. Instead of creating two other repos on a server that I have which has git-annex installed where I can actually use remote daemon. Is it possible to create a repo containing both the git repo and the content encrypted from the command line?
+ doc/forum/Git-Annex_with_Asustor_NAS.mdwn view
@@ -0,0 +1,4 @@+I'd like to use git-annex with my Asustor 302t NAS. It should be treated like a "simple" removable drive. I don't really know how to do this however, when scanning for "removable drives", it can't be found, when I try connecting via SSH, I receive an Error: Permission denied (publickey,password). As there is no way to insert my password before connecting.++How do I setup a repository on my NAS to be synced with my laptop?+I am using MAC OS X and the git-annex web interface currently.
+ doc/forum/GitBlit_as_a_centralized_repository.mdwn view
@@ -0,0 +1,2 @@+Is it possible to use Gitblit as a centralized repository using git-annex? +thanks Gary
+ doc/forum/How_to_change_the_name_of_a_repo_on_S3__63__.mdwn view
@@ -0,0 +1,2 @@+git-annex created a gitannexxxxxxxxxxxxxxxxxxxxx folder on S3 and I guess I'm a bit OCD but I'd like to rename it to git-annex. +Of course I can rename it in my S3 console but where does git-annex store that name so I can also change it on my local install of git-annex.
+ doc/forum/Problems_when_cloning_a_repository.mdwn view
@@ -0,0 +1,22 @@+Hi,++On a linux server I created a (direct) git annex repository:++ $ ls -a+ . .. apps attic devel games .git portable tools++On a Windows client, I want to check it out:++ me@client /cygdrive/c/tmp+ $ git clone ssh://me@server/srv/data/bin bin+ Cloning into 'bin'...++But git annex checks only half of it out :-(++ me@client /cygdrive/c/tmp+ $ ls -a bin+ . .. .git attic games++Any ideas? Sorry, I am very new to git-annex (and git).++Thanks!
+ doc/forum/Special_remote_public_key_encryption_issue.mdwn view
@@ -0,0 +1,18 @@+I'm unable to set up a standard architecture: 2 computers sharing some files, talking via a jabber account and transferring files via e.g. box.com.+Steps:++Computer 1: +a) Install git-annex, open up the assistant, create a new repository, add a jabber account+b) Add a box.com account using+WEBDAV_USERNAME=[username] WEBDAV_PASSWORD=[password] git annex initremote box.com type=webdav url=https://dav.box.com/dav/git-annex chunksize=75mb encryption=pubkey keyid=[key id].+All seemed fine.++Computer 2:+a) same+b) at this point I saw the option of adding box.com as a cloud storage. I clicked enable and got the message++user error (gpg ["--quiet","--trust-model","always","--decrypt"] exited 2)++In the meantime, on Computer 1 I saw the same option. I clicked enable and got the same message.++It all works fine if I use shared encryption.
+ doc/forum/Storing_git_repos_in_git-annex.mdwn view
@@ -0,0 +1,27 @@+I tried to use the [old thread](http://git-annex.branchable.com/forum/Git_repos_in_git_annex__63__/?updated#comment-9fca5cf31ccfd3d78c78cb65f7672340) for this, but threads don't get bumped when they are updated, so I guess I'll have to start a new one...++Here is the relevant [bug report](http://git-annex.branchable.com/bugs/Can__39__t_add_a_git_repo_to_git_annex:___34__Invalid_path_repo__47__.git__47__X__34___for_many_X).++Here's my scenario: I have been using Dropbox for several years. I want to move to git-annex.++For some time I used Bazaar repos inside Dropbox. A couple of times I accidentally modified files on one computer before another finished syncing, and the repo became mildly corrupted, but I recovered it okay.++Recently I switched from bzr to git, and so far, so good. I'm careful not to make any changes to my files before Dropbox is finished syncing, so everything works fine.++Now I'm testing git-annex as a replacement for Dropbox again. But when I add a directory containing a git repo to an annex, git-annex ignores the .git directory, so the repo isn't synced.++I read this forum thread, and I read the bug report, but there don't appear to be any real solutions.++This seems like what should be a fairly common use case: a user has a directory of simple text files, like shell scripts or org-mode files. He uses git to version-control them, and he uses Dropbox to sync the files and the git repo automatically between computers. Now the user wants to use git-annex instead, but if he does this, it will mean having to choose between:++* No longer using git to version-control the files+* Only using git on a single system, which means that he can't make commits or do any other git operations when using other systems+* Keeping separate git repos on each system, and making the same commits manually on each one...which would be a mess+* Keeping separate git repos on each system, and using a script to make commits automatically--which would mean commits wouldn't be any more useful than a simple timed backup script++I guess I could just use git instead of Dropbox or git-annex, but then I must choose between either:++* Only being able to sync repos when both systems are online+* Having to store repos in plaintext on remote servers++This is one of my primary use cases for Dropbox/git-annex. I'd really appreciate any help in figuring this out. Thanks.
+ doc/forum/Workflow_for_adding_files.mdwn view
@@ -0,0 +1,32 @@+What is the correct way to add/modify files such that the changes are synchronized?++Suppose I have a server "server" and a windows client "client" (more after some time); everything direct mode.++I created the repos on the server:++ cd bin+ git init+ git annex init server+ git annex direct+ git annex add .+ git annex sync++On the (Windows) client using cygwin:++ git annex clone ssh://me@server:/srv/bin+ cd bin+ git annex init client++Then I want to add files on the client:++ git annex add tools+ git annex sync++At this point I wonder that the data is not copied to the server but only metadata!+I then used++ git annex sync --content++but then everything from the server is leeched as well (as if I could have called "git annex get .")++What is the intented workflow such that added/modified files on the client always go to the server, modified/new files from the server are always pulled but ONLY if I previously got the file/directory via "get annex get"?
+ doc/forum/differenc_in_webapp_icons__63__.mdwn view
@@ -0,0 +1,4 @@+Hi,++I'm wondering what the difference between the network signal and network sync icons are in the web-app? Nothing stands out to me why some repos have one some the other?+
+ doc/forum/folder_size_question.mdwn view
@@ -0,0 +1,3 @@+For test purposes I copied a folder into my local repository to do some tests. +I now had a look at the original folder size and the size of the repository and compared it to the original folder and the repo is about 2x bigger. How come?+=> http://screencast.com/t/Tvqe5P22Ux
+ doc/forum/git-annes_assistant_+_MAC_OSX_questions.mdwn view
@@ -0,0 +1,16 @@+After spending the whole last night playing with it, I think I have it figured out:++it runs on my Macbook and I have added a free 50GB box.com account as archive and an S3 bucket as full-backup and set the min. number of file occurrences to keep to 2 so IF I delete anything on my Macbook, this should make sure I definitely have 2 more occurrences of each file on two separate storages.++BUT here come the problems/questions++- say I add a folder called: Documents, it has now apparently successfully synced to box.com and S3. I say apparently because there is no tool in the assistant to check+- I can't seem to figure out how to delete the log of the assistant, its getting quite longish+- I can't seem to figure out how to upgrade from 5.20140420 to 5.20140421+- I move a file from a local repo to the archive folder but nothing happens except git-annex recording the move: (Recording state in git...) /Users/ovi/Sharing/git-annex/Finance/1-564 Erkl. z. Gebiets- u. Steuereigenschaft 08_04.pdf still has writers, not adding [2014-05-09 17:22:43 SAST] Committer: Committing changes to git+- the assistant doesn'T have any kind of gui for retrieving/deleting/finding stuff - I'm no stranger to the command line but I can't figure out how to add the /Applications/gitannex.app.5.20140421/Contents/MacOS to my path and if I go there and run runshell, most git-annex commands tell me: not in a git repository so all I can do right now, is look at things :-/+- reading the description on the kickstarter page I must say I expected more. This is in no way comparable to Dropbox. ++Don't get me wrong, this is the most promising project of its kind I came across if I can be pointed in the right direction :-)++P.S. How does it work on the "inside"? i.e. I edit a file and git-annex picks it up and "syncs" - what is synced? The whole file? A diff? How can one restore older versions or even look to see what versions are available?
+ doc/forum/misctmp_filling_up.mdwn view
@@ -0,0 +1,11 @@+My directory .git/annex/misctmp is quite filled up with files like P39923, P33083, and also with 7 characters P310000 up to P331998. The beginning of these filenames may come from the annexed files, which all start with 'P3'.++There is a total of 12198 of them (4.0TB... yes this repo is quite big ;)).++Each of those has the content of individual annexed files (about 300-400MB targzipped files). Sometimes they are hard liked to each other, up to 8 copies.++Since I have copied+dropped the whole repo content to other repos, there should be nothing left locally. I have verified several of those files (the annexed files which are identical to the misctmp/* files), are they indeed are located elsewhere, and not "here".++So I was wondering if it is safe to remove them, and why are they not listed by git annex unused?++Thanks for your help!!
+ doc/forum/remembering_state.mdwn view
@@ -0,0 +1,5 @@+so i am wondering how better to remember the state of a repository.++the use case is this: i have this part of my music collection which i consider to be my "favorites". i would like to have only those on an external hard drive, but also on my portable music player. so i cloned my main music collection to the external hard drive and did `git annex get` on the files i wanted there. now i want to replicate that to the music player - how would i go around doing that? if i clone that repo again, it will all have empty symlinks and i would have to reproduce the same process all over again, which i can script, but it seems a little quirky...++ideas? --[[anarcat]]
+ doc/forum/ssh_key_setup_woes_in_Android.mdwn view
@@ -0,0 +1,15 @@+I'm trying to set up a ssh remote on Android using the latest 5.20140421. For some+reason the assistant fails to set up passwordless login on the remote server. It+adds the required line in `.ssh/authorized_keys` on the server side, but it still+keeps asking for the password for every connection. Nothing suspicious appears in+the assistant's log. Also, if I set up a ssh remote on a different directory on the+same server, a new key is generated and added to `authorized_keys`, but the passwordless+login still doesn't work.++I didn't file a bug since this would make for a very lousy bug report. How could I+look more into what's causing this? Where should the generated keys reside on the+Android filesystem?++I think it would be useful for the assistant to check that the generated ssh keys are+working properly, and inform the user and/or try to set them up again if there is a+problem, instead of silently falling back to asking for the login password on the console.
doc/git-annex.mdwn view
@@ -456,6 +456,8 @@ Adds a repository to a group, such as "archival", "enduser", or "transfer". The groupname must be a single word. + Omit the groupname to show the current groups that a repository is in.+ * `ungroup repository groupname` Removes a repository from a group.@@ -1491,6 +1493,14 @@ The command will only be run once *all* running git-annex processes are finished using the remote. +* `remote.<name>.annex-shell`++ Specify an alternative git-annex-shell executable on the remote+ instead of looking for "git-annex-shell" on the PATH.++ This is useful if the git-annex-shell program is outside the PATH+ or has a non-standard name.+ * `remote.<name>.annex-ignore` If set to `true`, prevents git-annex@@ -1645,6 +1655,12 @@ Used by bup special remotes, this configures the location of the bup repository to use. Normally this is automatically+ set up by `git annex initremote`, but you can change it if needed.++* `remote.<name>.ddarrepo`++ Used by ddar special remotes, this configures+ the location of the ddar repository to use. Normally this is automatically set up by `git annex initremote`, but you can change it if needed. * `remote.<name>.directory`
+ doc/install/Android/comment_10_4b565e73f02f0e84bdf7e686b0d7bf5f._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://lj.rossia.org/users/imz/"+ ip="79.165.57.121"+ subject="re F-Droid"+ date="2014-05-03T14:58:02Z"+ content="""+See also <http://git-annex.branchable.com/todo/custom_f-droid_repo/>.+"""]]
doc/install/ArchLinux.mdwn view
@@ -1,20 +1,19 @@-There is a non-official source package for git-annex in-[AUR](https://aur.archlinux.org/packages.php?ID=44272).+There are three non non-official packages for git-annex in the Archlinux User Repository. Any of these may be installed manually per [AUR guidelines](https://wiki.archlinux.org/index.php/AUR_User_Guidelines#Installing_packages) or using a wrapper such as [`yaourt`](https://wiki.archlinux.org/index.php/yaourt) shown below. -You can then build it yourself or use a wrapper for AUR-such as yaourt:+1. The simplest method is to use the [git-annex-bin](https://aur.archlinux.org/packages/git-annex-bin/) package based on the [prebuilt Linux tarballs](http://downloads.kitenet.net/git-annex/linux/current/). This package includes many of the binary shims from the pre-built package. Although common Linux system utilities have been stripped in favor of normal dependencies, the pre-configured Haskell libraries included out of the box make this an easy install. The disadvantage is the resulting installation is a bit on the heavy side at nearly 100M. -<pre>-$ yaourt -Sy git-annex-</pre>+ $ yaourt -Sy git-annex-bin -----+2. A more traditional source package is available at [git-annex](https://aur.archlinux.org/packages/git-annex/). This depends on a large number of Haskell packages available from a third party repository or through Cabal. This has been historically a bit problematic and the package frequently sits flagged out of date. The state of dependencies also varies, so some intervention may be required to get this option to work. -I'm told the AUR has some dependency problems currently.-If it doesn't work, you can just use cabal:+ $ yaourt -Sy git-annex -<pre>-pacman -S git rsync curl wget gnupg openssh cabal-install-cabal update-cabal install git-annex --bindir=$HOME/bin-</pre>+3. A development package is available at [git-annex-git](https://aur.archlinux.org/packages/git-annex-git/) that functions similarly to the source package but builds directly from the HEAD of the git repository rather that the last official release.++ $ yaourt -Sy git-annex-git++Finally you may choose to forgo the Archlinux package system and install git-annex directly through cabal.++ $ pacman -S git rsync curl wget gnupg openssh cabal-install+ $ cabal update+ $ cabal install git-annex --bindir=$HOME/bin
− doc/install/Debian/comment_10_d5da996e106d2e4d8a822aa9bcc78596._comment
@@ -1,12 +0,0 @@-[[!comment format=mdwn- username="http://joeyh.name/"- nickname="joey"- subject="comment 10"- date="2013-05-30T19:42:05Z"- content="""-As of today, I have backported everything except for haskell-lens, haskell-dav, and haskell-network-protocol-xmpp. The last is the only real blocker (I can build a backport without webdav support..). --The haskell-network-protocol-xmpp in stable is actually ok, except it needs to be rebuilt against the haskell-gnutls I uploaded today. This fixes a bad segfault bug. I don't know how to handle this situation in backports TBH, and so am stuck waiting for a newer version of haskell-network-protocol-xmpp to reach testing, to get around backport's requirements that the backport version be in testing.--In other words, it'll happen in 2 to 5 weeks, probably..-"""]]
− doc/install/Debian/comment_11_84283676da247c401bc9b4bb12c2b453._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://hands.com/~phil/"- nickname="hands"- subject="comment 11"- date="2013-05-30T19:56:07Z"- content="""-Fair enough -- that's more positive than I was expecting TBH -- Thanks Joey :-)-"""]]
− doc/install/Debian/comment_12_0aca83b055d0a9dd8589c50250a8bbea._comment
@@ -1,13 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawmF3Klaj8Q0Czfh1F3jaLF6issqeAhmru4"- nickname="Keith"- subject="Wheezy Support"- date="2013-07-05T21:21:39Z"- content="""-Joey,--What's the status on the wheezy backport. I'm itching to try the assistant.--thanks,-Keith-"""]]
− doc/install/Debian/comment_13_167a091764e5e99ec0f35a65e95a22de._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://joeyh.name/"- ip="4.153.254.222"- subject="comment 13"- date="2013-07-07T17:21:10Z"- content="""-I remain stuck where I was stuck previously on the backport. In the meantime, use [[Linux_standalone]] :(-"""]]
+ doc/install/Debian/comment_16_89f67da4a4a6a626a7db9c6674b244b6._comment view
@@ -0,0 +1,11 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawm9ocq1Kb0WL-cz-LPpvd2Xm-q8tIQvqXA"+ nickname="Dominik"+ subject="debian squeeze"+ date="2014-05-16T22:58:52Z"+ content="""+I'm tring to set up a bare repo on a debian squeeze server and sync it to windows client. Unfortunately the direct mode does not seem to be available for the git-annex version (3.20120629~bpo60+2+) in the squeeze-backports ++Would you be able to update the version in that repository? Thank you for your hard work! Git-annex is awesome+"""]]
+ doc/install/Debian/comment_17_ef7f3e88d61833e51f0302e938343818._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="216.145.95.162"+ subject="comment 17"+ date="2014-05-17T17:03:31Z"+ content="""+Debian squeeze has an extremely ancient ghc compiler, and it would be a mammoth undertaking to build current git-annex using that. ++Use the linux standalone build instead.+"""]]
− doc/install/Debian/comment_5_38e6399083e10a6a274f35bddc15d4ac._comment
@@ -1,18 +0,0 @@-[[!comment format=mdwn- username="https://www.google.com/accounts/o8/id?id=AItOawk3eiQwrpDGJ3MJb9NWB84m4tzQ6XjVZnY"- nickname="Allard"- subject="wheezy support"- date="2012-11-23T20:47:58Z"- content="""-Hey Joey,--As a backer, I'd like to see a backport of git annex assistant to wheezy.--It is currently impossible to get this assistant in wheezy without compiling it with cabal.--It would be nice to see it in backports or something :)--Best,--Allard-"""]]
− doc/install/Debian/comment_6_2e7bbdbaabbfb9d89de22e913066e822._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://svend.ciffer.net/"- ip="2001:4978:f:52e::2"- subject="comment 6"- date="2012-11-23T21:38:29Z"- content="""-The git-annex packages in unstable install on testing (wheezy).-"""]]
− doc/install/Debian/comment_9_97eaed998ffd1ed79585075ed5cff06e._comment
@@ -1,8 +0,0 @@-[[!comment format=mdwn- username="http://hands.com/~phil/"- nickname="hands"- subject="any chance of a wheezy-backports upload?"- date="2013-05-30T18:43:52Z"- content="""-I note that the instructions at the top of the page suggest that one can install the unstable version into wheezy, but as mentioned by [mey.vn](#comment-f9811cbd46471d4159d09d814ac9cf15) this is not the case with 4.20130521 (on amd64 at least) because of the libc6 version dependency. That being the case, it would be really nice to see this in wheezy-backports as well, or would that require backporting a huge pile of haskell as well? (in which case I can see why you're not keen).-"""]]
doc/install/Windows.mdwn view
@@ -1,6 +1,6 @@ git-annex now does Windows! -* First, [install git](http://git-scm.com/downloads)+* First, [install git](http://git-scm.com/downloads) (msysgit 1.9 or newer is needed) * Then, [install git-annex](https://downloads.kitenet.net/git-annex/windows/current/) This port is now in reasonably good shape for command-line use of
− doc/news/version_5.20140402.mdwn
@@ -1,34 +0,0 @@-git-annex 5.20140402 released with [[!toggle text="these changes"]]-[[!toggleable text="""- * unannex, uninit: Avoid committing after every file is unannexed,- for massive speedup.- * --notify-finish switch will cause desktop notifications after each- file upload/download/drop completes- (using the dbus Desktop Notifications Specification)- * --notify-start switch will show desktop notifications when each- file upload/download starts.- * webapp: Automatically install Nautilus integration scripts- to get and drop files.- * tahoe: Pass -d parameter before subcommand; putting it after- the subcommand no longer works with tahoe-lafs version 1.10.- (Thanks, Alberto Berti)- * forget --drop-dead: Avoid removing the dead remote from the trust.log,- so that if git remotes for it still exist anywhere, git annex info- will still know it's dead and not show it.- * git-annex-shell: Make configlist automatically initialize- a remote git repository, as long as a git-annex branch has- been pushed to it, to simplify setup of remote git repositories,- including via gitolite.- * add --include-dotfiles: New option, perhaps useful for backups.- * Version 5.20140227 broke creation of glacier repositories,- not including the datacenter and vault in their configuration.- This bug is fixed, but glacier repositories set up with the broken- version of git-annex need to have the datacenter and vault set- in order to be usable. This can be done using git annex enableremote- to add the missing settings. For details, see- http://git-annex.branchable.com/bugs/problems\_with\_glacier/- * Added required content configuration.- * assistant: Improve ssh authorized keys line generated in local pairing- or for a remote ssh server to set environment variables in an- alternative way that works with the non-POSIX fish shell, as well- as POSIX shells."""]]
+ doc/news/version_5.20140517.mdwn view
@@ -0,0 +1,21 @@+git-annex 5.20140517 released with [[!toggle text="these changes"]]+[[!toggleable text="""+ * webapp: Switched to bootstrap 3.+ Thanks, Sören Brunk.+ * Standalone builds now check gpg signatures before upgrading.+ * Simplified repository description line format. The remote name,+ if any, is always in square brackets after the description.+ * assistant: Clean up stale tmp files on startup.+ * webapp: Better ssh password prompting.+ * Depend on git-remote-gcrypt 0.20130908-6. Older versions+ fail when the assistant is run with no controlling tty.+ * Added ddar special remote.+ Thanks, Robie Basak.+ * webapp: Fixed drag and drop to reorder the list of remotes.+ * group: When no groups are specified to set, lists the current groups+ of a repository.+ * Add remote.$name.annex-shell configuration.+ Thanks, Fraser Tweedale+ * Support symlinking git-annex and git-annex-shell+ from the Linux standalone bundle into PATH.+ Thanks, jlebar."""]]
+ doc/not/comment_14_837e3699014b73e8f2bd2a668eea9eef._comment view
@@ -0,0 +1,23 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmhufs6QGCQXnUEc6qrCcQIZTomUDKNeAQ"+ nickname="Jeff"+ subject="Git annex in a strange direct with .git/annex/objects mode"+ date="2014-04-21T21:03:24Z"+ content="""+I'm doing something perhaps unreasonable and weird, and I'm wondering if there's a better way.++I'm running a wget -mbc of a particular web site. It replicates down to a tree.+Then I'm ingesting the content into git annex via the normal 'git annex add' sequence.++Later, when I'm going to update my replica of the website, I am running a 'git annex unlock' on the whole tree (90 gig in this case), and then running the 'wget -mbc ; git annex add' command sequence again.++Is there any mechanism to convince git-annex to scan the file, and ingest (copy) it into objects if it is new content, while leaving the original files unlocked? This would give me the ability to avoid the 'git annex unlock' copy operation, which is lengthy.++I'm aware this is inherently space inefficient.++I'm sure there's some other problem with this idea that I'm missing.++Thanks.+++"""]]
+ doc/not/comment_15_ac7396ca125abb80a42f9aaaf61a6ab4._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="108.236.230.124"+ subject="comment 15"+ date="2014-05-16T18:59:47Z"+ content="""+@Jeff, why did you post that comment here? Please use the [[forum]] for questions.++(You may find it useful to use direct mode, or `git annex import --skip-duplicates` or something.)+"""]]
doc/preferred_content/standard_groups.mdwn view
@@ -1,7 +1,8 @@ git-annex comes with some built-in [[preferred_content]] settings, that can be used with repositories that are in special groups. To make a repository use one of these, just set its preferred content expression-to "standard", and put it in one of these groups.+to "standard", and put it in one of these groups. Or in the webapp, just+edit the repository and select the group. (Note that most of these standard expressions also make the repository want to get any content that is only currently available on untrusted and
doc/publicrepos.mdwn view
@@ -5,7 +5,7 @@ `git clone https://downloads.kitenet.net/.git/` Various downloads of things produced by Joey Hess, including git-annex builds.-* [debconf-share](https://downloads.kitenet.net/.git/) +* debconf-share `git clone http://annex.debconf.org/debconf-share/.git/` [DebConf](http://debconf.org/) Media, photos, videos, etc. * [conference-proceedings](https://github.com/RichiH/conference_proceedings)
doc/special_remotes.mdwn view
@@ -10,6 +10,7 @@ * [[S3]] (Amazon S3, and other compatible services) * [[Amazon_Glacier|glacier]] * [[bup]]+* [[ddar]] * [[gcrypt]] (encrypted git repositories!) * [[directory]] * [[rsync]]
+ doc/special_remotes/comment_22_308afc586b86c66bbb3437d63864d9cb._comment view
@@ -0,0 +1,16 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawmp1ThsNNAbSn46ju-gwFELfStlhl8usJo"+ nickname="donkeyicydragon"+ subject="Enhancing special remotes as backup spaces"+ date="2014-04-22T21:08:49Z"+ content="""+Hi Joey,++I am thinking about using google drive as an encrypted backup for my important files. However, I fear that if all my git annex repositories are unrecoverable that the encrypted data on the special remote will not help me much. Assuming I have backed up my gpg key I still get a bunch of decrypted files but the folder structure is lost. Would it be possible to implement something like a safety feature that also uploads an (encrypted) tar of all symlinks (pointing to the respective encrypted files) of the (current/or master-branch) git working tree? ++I am almost sure this is already implementable using hooks however I could not find information on which types of hooks are available. I am looking for one that is triggered once after all copy/move operations to a special remote are finished. Can you point me in the right direction?++Marek+++"""]]
+ doc/special_remotes/comment_23_0f5440e0e54cf7ac2a68b1ba115b0930._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="108.236.230.124"+ subject="comment 23"+ date="2014-05-16T19:11:00Z"+ content="""+@donkeyicydragon one way to accomplish that would be to just tar up `.git` -- excluding `.git/annex/objects` and add that to git-annex like any other file. You could make a git post-commit hook that does that, but that seems overboard.++Or, you could just make a git clone of your repo to a local removable drive, and use that as a local backup.+"""]]
+ doc/special_remotes/ddar.mdwn view
@@ -0,0 +1,40 @@+This special remote type stores file contents in a+[ddar](https://github.com/basak/ddar) repository. This provides easy+de-duplication when you use git-annex to manage many files that are similar.++Unlike bup, ddar uses its own storage format, which allows for both creation+and deletion of de-deduplicated files. In addition to using local storage, ddar+archives can be remote, providing that ddar is installed on the remote machine+and ssh is available to it.++See [[walkthrough/using_ddar]] for usage examples.++## encryption++Encryption is nominally supported, but is not useful. Since effective+encryption necessarily obfuscates file contents, similar areas across different+files are no longer visible to ddar and cannot be de-duplicated.++## compression++The same caveat with encryption also generally applies to compression, since+file compression changes file contents such that similar regions across files+no longer appear similar. An exception is `gzip --rsyncable`, which is+specifically designed to work around this issue. This is the only compression+mechanism with which de-duplication remains effective.++## configuration++These parameters can be passed to `git annex initremote` to configure ddar:++* `encryption` - One of "none", "hybrid", "shared", or "pubkey".+ See [[encryption]]. However, note that encryption renders all de-duplication+ineffective.++* `keyid` - Specifies the gpg key to use for [[encryption]].++* `ddarrepo` - Required. This is passed to `ddar` as the path to the ddar+ archive to use. If it doesn't exist, the ddar repository will be created+ automatically when a file is first copied to it. To use a remote ddar+ repository, use a colon (`:`) to separate the hostname from the remote path.+ Example: "ddarrepo=example.com:/big/myddar" or "ddarrepo=/big/myddar"
+ doc/sync/comment_11_7683879f6982c0eb0aa39b66ff5a5ea9._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawn3p4i4lk_zMilvjnJ9sS6g2nerpgz0Fjc"+ nickname="Matthias"+ subject="sync slow with content switch"+ date="2014-04-22T20:37:05Z"+ content="""+I noticed that in a test with 2 local repositories and around 2'000 files \"git annex sync\" is still very fast, but \"git annex sync --content\" takes multiple seconds. Is this avoidable?++I have a central repo and client repos. I want to copy all content to the central repo after a commit. Right now, I use \"git annex group central backup\", \"git annex wanted central standard\", and a hook that triggers \"git annex sync --content\" after each commit. Maybe there is a more efficient way to do this? Thanks for sharing thoughts.+"""]]
+ doc/sync/comment_12_2fea14fa314ddb7ab645a5cca5a95fd9._comment view
@@ -0,0 +1,14 @@+[[!comment format=mdwn+ username="http://mshri.livejournal.com/"+ ip="129.170.212.202"+ subject="Sync specific branch or ignore a branch during sync"+ date="2014-04-25T15:37:53Z"+ content="""++I too feel that syncing all remotes by default is the right thing to do, but I think it should be limited to the 'master' and 'git-annex' branch. I often create branches that I want to keep local and do not want them to be synced. But I want 'master' and 'git-annex' branches to be synced with all remotes.++So it would be nice to able to set an option to sync all branches or just the 'master' and 'git-annex' or to able to ignore some branches during git annex sync++Shri++"""]]
+ doc/sync/comment_13_690f66be9cefe28844d8df653b7a0331._comment view
@@ -0,0 +1,10 @@+[[!comment format=mdwn+ username="zardoz"+ ip="134.147.14.84"+ subject="comment 13"+ date="2014-05-15T08:28:09Z"+ content="""+I agree with mshri. It’s confusing to have every local branch wind up on every remote (and it hinders «git annex unused»).++I tried working around this by just including relevant branches in the «fetch» refspec, but this will only work until another remote pushes the branches again.+"""]]
+ doc/sync/comment_14_db342785a4dade30b5b75cb95031bed1._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="zardoz"+ ip="134.147.14.84"+ subject="comment 14"+ date="2014-05-15T08:58:26Z"+ content="""+Added a wishlist item <http://git-annex.branchable.com/todo/Allow_syncing_only_selected_branches/>+"""]]
+ doc/sync/comment_15_168e0ab10b4084e13df1a3058fa7e8a9._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="108.236.230.124"+ subject="comment 15"+ date="2014-05-15T19:53:16Z"+ content="""+We seem to have some rumor going around that `git annex sync` pushes all branches. It does not. It pushes only the git-annex branch and the currently checked out branch.+"""]]
+ doc/sync/comment_16_96096f994fc55f921f2b24b274f998f7._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="108.236.230.124"+ subject="comment 16"+ date="2014-05-15T19:54:54Z"+ content="""+@Matthias, `git annex sync --content` has to check each file to see if any other repository wants it. This is necessarily going to get slow when there are a lot of files. The assistant does a similar syncing but uses some tricks to avoid scanning all the files too often, while still managing to keep them all in sync -- it can do this since it's a long-running daemon and is aware when files have changed.+"""]]
doc/thanks.mdwn view
@@ -124,9 +124,10 @@ Mica Semrick, Paul Staab, Rémi Vanicat, Martin Holtschneider, Jan Ivar Beddari, Peter Simons, Thomas Koch, Justin Geibel, Guillaume DELVIT, Shanti Bouchez, Oliver Brandt, François Deppierraz, Chad Walstrom, Tim Mattison,-Jakub Antoni Tyszko, and 30 anonymous bitcoin users+Jakub Antoni Tyszko, Casa do Boneco, and 30 anonymous bitcoin users -With an especial thanks to the WikiMedia foundation.+With an especial thanks to the WikiMedia foundation,+and Rede Mocambos. ## 2012-2013
doc/tips/file_manager_integration.mdwn view
@@ -82,6 +82,25 @@ The complete instructions on how to setup actions is [in the XFCE documentation](http://docs.xfce.org/xfce/thunar/custom-actions). +## OS X (Finder)++For OS X, it is possible to get context menus in Finder. Due to how OS X deals with sym links, one needs to operate on folders if using indirect mode. Direct mode operation has not been tested.++1. Open Automator and create a new Service.+2. Using the Drop down menus in the top create the sentence "Service receives selected folders in Finder.app" to have it work on folders. For direct mode operation it is probably reasonable to select "files or folders".+3. Add a "Run shell script" element and fill in line with the following script:++ #!/usr/bin/bash+ source ~/.bash_profile+ for f in "$@"+ do+ cd "$(dirname "$f")" && git-annex get "$f"+ done++The purpose of the first line is there to get git-annex on to the path. The reason for the for loop is in case multiple files or folders are marked when running the context menu command.++Finally save the the workflow under the name for which it should be listed in the context menu.+ ## your file manager here Edit this page and add instructions!
doc/tips/metadata_driven_views.mdwn view
@@ -106,9 +106,9 @@ # tree -d 2014 |-- work- |-- todo+ |-- todo |-- urgent- `-- done+ `-- done 2013 |-- work `-- done
+ doc/tips/skydriveannex/comment_1_bf383481b2bbb962fbfe783b9f2f213a._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4"+ nickname="Ovidiu"+ subject="working for git-annex assistant?"+ date="2014-05-13T18:40:31Z"+ content="""+Will following these steps lead to the Skydrive repo being visible and recognized by the assistant too?+"""]]
+ doc/tips/skydriveannex/comment_2_1f747018b35ab8accd2bf0905e6ad926._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="108.236.230.124"+ subject="comment 2"+ date="2014-05-16T16:26:50Z"+ content="""+The assistant will use any repositories you set up, no matter how you set them up.+"""]]
+ doc/tips/skydriveannex/comment_3_8b9444006734262693f71e50a40eae1d._comment view
@@ -0,0 +1,19 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4"+ nickname="Ovidiu"+ subject="Hitting trouble"+ date="2014-05-16T17:49:59Z"+ content="""+ shiny-2:skydriveannex ovi$ git annex initremote skydrive type=external externaltype=skydrive encryption=shared folder=git-annex+ git-annex: First run: git-annex init+ shiny-2:skydriveannex ovi$++Above wasn't mentioned in the tutorial so I tried it:++ shiny-2:skydriveannex ovi$ git-annex init+ init ok+ (Recording state in git...)+ shiny-2:skydriveannex ovi$++What now? Never got asked about any OAUTH...+"""]]
+ doc/tips/skydriveannex/comment_4_8b01dc6ca1082a8c24ff65fec9d759d8._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4"+ nickname="Ovidiu"+ subject="comment 4"+ date="2014-05-16T17:51:29Z"+ content="""+And no link was opened automatically+"""]]
+ doc/tips/skydriveannex/comment_5_1d220d96945d497f3a93b5d848eb3995._comment view
@@ -0,0 +1,8 @@+[[!comment format=mdwn+ username="http://joeyh.name/"+ ip="108.236.230.124"+ subject="comment 5"+ date="2014-05-16T19:03:34Z"+ content="""+You have to run git-annex init before you can use other git-annex commands. I think if you run git annex initremote now, it will work.+"""]]
+ doc/tips/skydriveannex/comment_6_a7a3afdc7eed9a0eda48dcb57f1e87c6._comment view
@@ -0,0 +1,12 @@+[[!comment format=mdwn+ username="https://www.google.com/accounts/o8/id?id=AItOawkAUMhKOSkh9JaBA6xst3XxQIIsDEq5Zd4"+ nickname="Ovidiu"+ subject="comment 6"+ date="2014-05-16T19:25:03Z"+ content="""+tried it but no luck:++ git annex initremote skydrive type=external externaltype=skydrive encryption=shared folder=git-annex+ initremote skydrive (encryption setup) (shared cipher) env: python2: No such file or directory+ git-annex: external special remote protocol error, unexpectedly received \"\" (unable to parse command)+"""]]
doc/tips/what_to_do_when_a_repository_is_corrupted.mdwn view
@@ -19,4 +19,9 @@ * Check for any problems with the annexed data: `cd $good; git annex fsck` * Now you can remove the corrupted repository, the new one is ready to use. +Alternatively, recent versions of git-annex have a `git annex repair`+command that uses <http://git-repair.branchable.com/> to repair a+repository in-place. The git-annex assistant will detect most corruptions+and offer to run the repair for you automatically.+ --[[Joey]]
+ doc/todo/Allow_syncing_only_selected_branches.mdwn view
@@ -0,0 +1,8 @@+It seems that currently, syncing will result in every branch winding+up everywhere within the network of git annex nodes. It would be great+if one could keep some branches purely local.++The «fetch» part of «sync» seems to respect the fetch refspec in the+git config, but the push part seems to always push everything.++> [[done]]
+ doc/todo/Expose_auto-merge_for_manual__44___local_merges.mdwn view
@@ -0,0 +1,7 @@+The automatic conflict resolution currently seems to only work within+the context of sync, when merging «synced/foo» into «foo». It would be+convenient if this functionality were exposed for manual merges+between local branches.++E.g., one might invoke «git annex merge» or «git annex autoresolve»+after «git merge» when conflicts are found.
doc/todo/custom_f-droid_repo.mdwn view
@@ -1,3 +1,3 @@ It would be great to have a custom f-droid repo "alla guardianproject.info" (before getting git-annex into the main f-droid repo). -See https://github.com/guardianproject/fdroid-repo (https://guardianproject.info/repo/).+See <https://github.com/guardianproject/fdroid-repo> (<https://guardianproject.info/repo/>).
doc/todo/do_not_bug_me_about_intermediate_files.mdwn view
@@ -2,6 +2,6 @@ so this is another UX pickyness, but it seems important to me. -i like the new desktop notifications, but they are little too verbose. when i choose "git annex get" on the folder, if there's a lot of files, it will flood me with all the files being transfered in a mostly incomprehensible list of files being transfered.+i like the new [[desktop notifications|tips/file_manager_integration]], but they are little too verbose. when i choose "git annex get" on the folder, if there's a lot of files, it will flood me with all the files being transfered in a mostly incomprehensible list of files being transfered. what i would expect is more: "starting transfer of folder X", "transfer of folder X finished!", only two message per item i chose. this is especially a problem with DVD backups, which have a bunch of small files (screenshots, .nfos and so on) and large video files - so it seems the thing has finished transfering, while it's only partly done. --[[anarcat]]
+ doc/todo/read-only_removable_drives.mdwn view
@@ -0,0 +1,7 @@+Here's yet another weird use case. I have a ext3 external drive for storing media that i brought to the office. Naturally, all files on the drive are owned by my desktop user (uid = 1000). In the office, my userid is different (say 1001), so git-annex doesn't see the removable drive at all (which is a little confusing). But even if i try to add the repo on the drive as an external repo, it says it can't write to it (which is true).++I would expect it to at least be able to leech the files off of it.++Otherwise, I would welcome advice on how to fix this problem without doing a `sudo chown -R` every time i plug this drive somewhere ... --[[anarcat]]++> Workaround: `sudo setfacl -R -m u:anarcat:rwx /media/foo/annex`
doc/videos.mdwn view
@@ -1,7 +1,7 @@ Talks and screencasts about git-annex. These videos are also available in a public git-annex repository-`git clone http://downloads.kitenet.net/.git/`+`git clone https://downloads.kitenet.net/.git/` [[!inline pages="./videos/* and !./videos/*/* and !*/Discussion" show="2"]]
doc/walkthrough/automatically_managing_content.mdwn view
@@ -13,7 +13,7 @@ 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop whereis other_file (3 copies) 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop- 62b39bbe-4149-11e0-af01-bb89245a1e61 -- here (usb drive)+ 62b39bbe-4149-11e0-af01-bb89245a1e61 -- usb drive [here] 7570b02e-15e9-11e0-adf0-9f3f94cb2eaa -- backup drive What would be handy is some automated versions of get and drop, that only@@ -31,7 +31,7 @@ # git annex whereis whereis my_cool_big_file (2 copies) 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop- 62b39bbe-4149-11e0-af01-bb89245a1e61 -- here (usb drive)+ 62b39bbe-4149-11e0-af01-bb89245a1e61 -- usb drive [here] whereis other_file (2 copies) 0c443de8-e644-11df-acbf-f7cd7ca6210d -- laptop 7570b02e-15e9-11e0-adf0-9f3f94cb2eaa -- backup drive
+ doc/walkthrough/using_ddar.mdwn view
@@ -0,0 +1,32 @@+Another [[special_remote|special_remotes]] that git-annex can use is+a [[special_remotes/ddar]] repository. ddar stores large file contents+in a directory structure of its own, with deduplication. For remote+repositories, ddar requires that ssh is available on the remote, with ddar also+installed remotely. When copying files to the remote, ddar only needs to send+over the network the parts of the files that are not already present remotely.++Unlike bup, ddar uses its own storage format, which allows for both creation+and deletion of de-deduplicated files.++Here's how to create a ddar remote, and describe it.++[[!template id=note text="""+Instead of specifying a remote system, you could choose to make a ddar+remote that is only accessible on the current system, by passing+"ddarrepo=/big/myddar".+"""]]++ # git annex initremote myddar type=ddar encryption=none ddarrepo=example.com:/big/myddar+ initremote ddar (ddar init)+ Initialized empty Git repository in /big/myddar/+ ok+ # git annex describe myddar "my ddar repository at example.com"+ describe myddar ok++Now the remote can be used like any other remote.++ # git annex move my_cool_big_file --to myddar+ move my_cool_big_file (to myddar...)+ ok++See [[special_remotes/ddar]] for details.
git-annex.1 view
@@ -423,6 +423,8 @@ Adds a repository to a group, such as "archival", "enduser", or "transfer". The groupname must be a single word. .IP+Omit the groupname to show the current groups that a repository is in.+.IP .IP "\fBungroup repository groupname\fP" Removes a repository from a group. .IP@@ -1341,6 +1343,13 @@ The command will only be run once *all* running git\-annex processes are finished using the remote. .IP+.IP "\fBremote.<name>.annex\-shell\fP"+Specify an alternative git\-annex\-shell executable on the remote+instead of looking for "git\-annex\-shell" on the PATH.+.IP+This is useful if the git\-annex\-shell program is outside the PATH+or has a non\-standard name.+.IP .IP "\fBremote.<name>.annex\-ignore\fP" If set to \fBtrue\fP, prevents git\-annex from storing file contents on this remote by default.@@ -1472,6 +1481,11 @@ .IP "\fBremote.<name>.buprepo\fP" Used by bup special remotes, this configures the location of the bup repository to use. Normally this is automatically+set up by \fBgit annex initremote\fP, but you can change it if needed.+.IP+.IP "\fBremote.<name>.ddarrepo\fP"+Used by ddar special remotes, this configures+the location of the ddar repository to use. Normally this is automatically set up by \fBgit annex initremote\fP, but you can change it if needed. .IP .IP "\fBremote.<name>.directory\fP"
git-annex.cabal view
@@ -1,5 +1,5 @@ Name: git-annex-Version: 5.20140421+Version: 5.20140517 Cabal-Version: >= 1.8 License: GPL-3 Maintainer: Joey Hess <joey@kitenet.net>
standalone/android/Makefile view
@@ -76,6 +76,7 @@ cp $(GIT_ANNEX_ANDROID_SOURCETREE)/git/git.tar.gz $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.git.tar.gz.so git rev-parse HEAD > $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.version.so+ cp ../trustedkeys.gpg $(GIT_ANNEX_ANDROID_SOURCETREE)/term/libs/armeabi/lib.trustedkeys.so mkdir -p ../../tmp/4.0 ../../tmp/4.3
standalone/android/runshell view
@@ -53,6 +53,7 @@ $cmd echo "exec $base/lib/lib.start.so" >> "$base/runshell" $cmd chmod 755 runshell + $cmd cat "$base/lib/lib.trustedkeys.so" > "$base/bin/trustedkeys.gpg" $cmd cat "$base/lib/lib.version.so" > "$base/installed-version" $cmd echo "Installation complete" }
standalone/licences.gz view
binary file changed (60519 → 60598 bytes)
standalone/linux/skel/git view
@@ -1,5 +1,5 @@ #!/bin/sh-link="$(readlink "$0")" || true+link="$(readlink -f "$0" 2>/dev/null || readlink "$0")" || true if [ -n "$link" ]; then base="$(dirname "$link")" else
standalone/linux/skel/git-annex view
@@ -1,5 +1,5 @@ #!/bin/sh-link="$(readlink "$0")" || true+link="$(readlink -f "$0" 2>/dev/null || readlink "$0")" || true if [ -n "$link" ]; then base="$(dirname "$link")" else
standalone/linux/skel/git-annex-shell view
@@ -1,5 +1,5 @@ #!/bin/sh-link="$(readlink "$0")" || true+link="$(readlink -f "$0" 2>/dev/null || readlink "$0")" || true if [ -n "$link" ]; then base="$(dirname "$link")" else
standalone/linux/skel/git-annex-webapp view
@@ -1,5 +1,5 @@ #!/bin/sh-link="$(readlink "$0")" || true+link="$(readlink -f "$0" 2>/dev/null || readlink "$0")" || true if [ -n "$link" ]; then base="$(dirname "$link")" else
standalone/linux/skel/git-receive-pack view
@@ -1,5 +1,5 @@ #!/bin/sh-link="$(readlink "$0")" || true+link="$(readlink -f "$0" 2>/dev/null || readlink "$0")" || true if [ -n "$link" ]; then base="$(dirname "$link")" else
standalone/linux/skel/git-shell view
@@ -1,5 +1,5 @@ #!/bin/sh-link="$(readlink "$0")" || true+link="$(readlink -f "$0" 2>/dev/null || readlink "$0")" || true if [ -n "$link" ]; then base="$(dirname "$link")" else
standalone/linux/skel/git-upload-pack view
@@ -1,5 +1,5 @@ #!/bin/sh-link="$(readlink "$0")" || true+link="$(readlink -f "$0" 2>/dev/null || readlink "$0")" || true if [ -n "$link" ]; then base="$(dirname "$link")" else
+ standalone/trustedkeys.gpg view
binary file changed (absent → 4979 bytes)
− static/bootstrap-collapse.js
@@ -1,138 +0,0 @@-/* =============================================================- * bootstrap-collapse.js v2.0.2- * http://twitter.github.com/bootstrap/javascript.html#collapse- * =============================================================- * Copyright 2012 Twitter, Inc.- *- * 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.- * ============================================================ */--!function( $ ){-- "use strict"-- var Collapse = function ( element, options ) {- this.$element = $(element)- this.options = $.extend({}, $.fn.collapse.defaults, options)-- if (this.options["parent"]) {- this.$parent = $(this.options["parent"])- }-- this.options.toggle && this.toggle()- }-- Collapse.prototype = {-- constructor: Collapse-- , dimension: function () {- var hasWidth = this.$element.hasClass('width')- return hasWidth ? 'width' : 'height'- }-- , show: function () {- var dimension = this.dimension()- , scroll = $.camelCase(['scroll', dimension].join('-'))- , actives = this.$parent && this.$parent.find('.in')- , hasData-- if (actives && actives.length) {- hasData = actives.data('collapse')- actives.collapse('hide')- hasData || actives.data('collapse', null)- }-- this.$element[dimension](0)- this.transition('addClass', 'show', 'shown')- this.$element[dimension](this.$element[0][scroll])-- }-- , hide: function () {- var dimension = this.dimension()- this.reset(this.$element[dimension]())- this.transition('removeClass', 'hide', 'hidden')- this.$element[dimension](0)- }-- , reset: function ( size ) {- var dimension = this.dimension()-- this.$element- .removeClass('collapse')- [dimension](size || 'auto')- [0].offsetWidth-- this.$element[size ? 'addClass' : 'removeClass']('collapse')-- return this- }-- , transition: function ( method, startEvent, completeEvent ) {- var that = this- , complete = function () {- if (startEvent == 'show') that.reset()- that.$element.trigger(completeEvent)- }-- this.$element- .trigger(startEvent)- [method]('in')-- $.support.transition && this.$element.hasClass('collapse') ?- this.$element.one($.support.transition.end, complete) :- complete()- }-- , toggle: function () {- this[this.$element.hasClass('in') ? 'hide' : 'show']()- }-- }-- /* COLLAPSIBLE PLUGIN DEFINITION- * ============================== */-- $.fn.collapse = function ( option ) {- return this.each(function () {- var $this = $(this)- , data = $this.data('collapse')- , options = typeof option == 'object' && option- if (!data) $this.data('collapse', (data = new Collapse(this, options)))- if (typeof option == 'string') data[option]()- })- }-- $.fn.collapse.defaults = {- toggle: true- }-- $.fn.collapse.Constructor = Collapse--- /* COLLAPSIBLE DATA-API- * ==================== */-- $(function () {- $('body').on('click.collapse.data-api', '[data-toggle=collapse]', function ( e ) {- var $this = $(this), href- , target = $this.attr('data-target')- || e.preventDefault()- || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7- , option = $(target).data('collapse') ? 'toggle' : $this.data()- $(target).collapse(option)- })- })--}( window.jQuery );
− static/bootstrap-dropdown.js
@@ -1,92 +0,0 @@-/* ============================================================- * bootstrap-dropdown.js v2.0.2- * http://twitter.github.com/bootstrap/javascript.html#dropdowns- * ============================================================- * Copyright 2012 Twitter, Inc.- *- * 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.- * ============================================================ */---!function( $ ){-- "use strict"-- /* DROPDOWN CLASS DEFINITION- * ========================= */-- var toggle = '[data-toggle="dropdown"]'- , Dropdown = function ( element ) {- var $el = $(element).on('click.dropdown.data-api', this.toggle)- $('html').on('click.dropdown.data-api', function () {- $el.parent().removeClass('open')- })- }-- Dropdown.prototype = {-- constructor: Dropdown-- , toggle: function ( e ) {- var $this = $(this)- , selector = $this.attr('data-target')- , $parent- , isActive-- if (!selector) {- selector = $this.attr('href')- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7- }-- $parent = $(selector)- $parent.length || ($parent = $this.parent())-- isActive = $parent.hasClass('open')-- clearMenus()- !isActive && $parent.toggleClass('open')-- return false- }-- }-- function clearMenus() {- $(toggle).parent().removeClass('open')- }--- /* DROPDOWN PLUGIN DEFINITION- * ========================== */-- $.fn.dropdown = function ( option ) {- return this.each(function () {- var $this = $(this)- , data = $this.data('dropdown')- if (!data) $this.data('dropdown', (data = new Dropdown(this)))- if (typeof option == 'string') data[option].call($this)- })- }-- $.fn.dropdown.Constructor = Dropdown--- /* APPLY TO STANDARD DROPDOWN ELEMENTS- * =================================== */-- $(function () {- $('html').on('click.dropdown.data-api', clearMenus)- $('body').on('click.dropdown.data-api', toggle, Dropdown.prototype.toggle)- })--}( window.jQuery );
− static/bootstrap-modal.js
@@ -1,210 +0,0 @@-/* =========================================================- * bootstrap-modal.js v2.0.2- * http://twitter.github.com/bootstrap/javascript.html#modals- * =========================================================- * Copyright 2012 Twitter, Inc.- *- * 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.- * ========================================================= */---!function( $ ){-- "use strict"-- /* MODAL CLASS DEFINITION- * ====================== */-- var Modal = function ( content, options ) {- this.options = options- this.$element = $(content)- .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this))- }-- Modal.prototype = {-- constructor: Modal-- , toggle: function () {- return this[!this.isShown ? 'show' : 'hide']()- }-- , show: function () {- var that = this-- if (this.isShown) return-- $('body').addClass('modal-open')-- this.isShown = true- this.$element.trigger('show')-- escape.call(this)- backdrop.call(this, function () {- var transition = $.support.transition && that.$element.hasClass('fade')-- !that.$element.parent().length && that.$element.appendTo(document.body) //don't move modals dom position-- that.$element- .show()-- if (transition) {- that.$element[0].offsetWidth // force reflow- }-- that.$element.addClass('in')-- transition ?- that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) :- that.$element.trigger('shown')-- })- }-- , hide: function ( e ) {- e && e.preventDefault()-- if (!this.isShown) return-- var that = this- this.isShown = false-- $('body').removeClass('modal-open')-- escape.call(this)-- this.$element- .trigger('hide')- .removeClass('in')-- $.support.transition && this.$element.hasClass('fade') ?- hideWithTransition.call(this) :- hideModal.call(this)- }-- }--- /* MODAL PRIVATE METHODS- * ===================== */-- function hideWithTransition() {- var that = this- , timeout = setTimeout(function () {- that.$element.off($.support.transition.end)- hideModal.call(that)- }, 500)-- this.$element.one($.support.transition.end, function () {- clearTimeout(timeout)- hideModal.call(that)- })- }-- function hideModal( that ) {- this.$element- .hide()- .trigger('hidden')-- backdrop.call(this)- }-- function backdrop( callback ) {- var that = this- , animate = this.$element.hasClass('fade') ? 'fade' : ''-- if (this.isShown && this.options.backdrop) {- var doAnimate = $.support.transition && animate-- this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')- .appendTo(document.body)-- if (this.options.backdrop != 'static') {- this.$backdrop.click($.proxy(this.hide, this))- }-- if (doAnimate) this.$backdrop[0].offsetWidth // force reflow-- this.$backdrop.addClass('in')-- doAnimate ?- this.$backdrop.one($.support.transition.end, callback) :- callback()-- } else if (!this.isShown && this.$backdrop) {- this.$backdrop.removeClass('in')-- $.support.transition && this.$element.hasClass('fade')?- this.$backdrop.one($.support.transition.end, $.proxy(removeBackdrop, this)) :- removeBackdrop.call(this)-- } else if (callback) {- callback()- }- }-- function removeBackdrop() {- this.$backdrop.remove()- this.$backdrop = null- }-- function escape() {- var that = this- if (this.isShown && this.options.keyboard) {- $(document).on('keyup.dismiss.modal', function ( e ) {- e.which == 27 && that.hide()- })- } else if (!this.isShown) {- $(document).off('keyup.dismiss.modal')- }- }--- /* MODAL PLUGIN DEFINITION- * ======================= */-- $.fn.modal = function ( option ) {- return this.each(function () {- var $this = $(this)- , data = $this.data('modal')- , options = $.extend({}, $.fn.modal.defaults, $this.data(), typeof option == 'object' && option)- if (!data) $this.data('modal', (data = new Modal(this, options)))- if (typeof option == 'string') data[option]()- else if (options.show) data.show()- })- }-- $.fn.modal.defaults = {- backdrop: true- , keyboard: true- , show: true- }-- $.fn.modal.Constructor = Modal--- /* MODAL DATA-API- * ============== */-- $(function () {- $('body').on('click.modal.data-api', '[data-toggle="modal"]', function ( e ) {- var $this = $(this), href- , $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7- , option = $target.data('modal') ? 'toggle' : $.extend({}, $target.data(), $this.data())-- e.preventDefault()- $target.modal(option)- })- })--}( window.jQuery );
− static/bootstrap-responsive.css
@@ -1,815 +0,0 @@-/*!- * Bootstrap Responsive v2.0.4- *- * Copyright 2012 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 @twitter by @mdo and @fat.- */--.clearfix {- *zoom: 1;-}--.clearfix:before,-.clearfix:after {- display: table;- content: "";-}--.clearfix:after {- clear: both;-}--.hide-text {- font: 0/0 a;- color: transparent;- text-shadow: none;- background-color: transparent;- border: 0;-}--.input-block-level {- display: block;- width: 100%;- min-height: 28px;- -webkit-box-sizing: border-box;- -moz-box-sizing: border-box;- -ms-box-sizing: border-box;- box-sizing: border-box;-}--.hidden {- display: none;- visibility: hidden;-}--.visible-phone {- display: none !important;-}--.visible-tablet {- display: none !important;-}--.hidden-desktop {- display: none !important;-}--@media (max-width: 767px) {- .visible-phone {- display: inherit !important;- }- .hidden-phone {- display: none !important;- }- .hidden-desktop {- display: inherit !important;- }- .visible-desktop {- display: none !important;- }-}--@media (min-width: 768px) and (max-width: 979px) {- .visible-tablet {- display: inherit !important;- }- .hidden-tablet {- display: none !important;- }- .hidden-desktop {- display: inherit !important;- }- .visible-desktop {- display: none !important ;- }-}--@media (max-width: 480px) {- .nav-collapse {- -webkit-transform: translate3d(0, 0, 0);- }- .page-header h1 small {- display: block;- line-height: 18px;- }- input[type="checkbox"],- input[type="radio"] {- border: 1px solid #ccc;- }- .form-horizontal .control-group > label {- float: none;- width: auto;- padding-top: 0;- text-align: left;- }- .form-horizontal .controls {- margin-left: 0;- }- .form-horizontal .control-list {- padding-top: 0;- }- .form-horizontal .form-actions {- padding-right: 10px;- padding-left: 10px;- }- .modal {- position: absolute;- top: 10px;- right: 10px;- left: 10px;- width: auto;- margin: 0;- }- .modal.fade.in {- top: auto;- }- .modal-header .close {- padding: 10px;- margin: -10px;- }- .carousel-caption {- position: static;- }-}--@media (max-width: 767px) {- body {- padding-right: 20px;- padding-left: 20px;- }- .navbar-fixed-top,- .navbar-fixed-bottom {- margin-right: -20px;- margin-left: -20px;- }- .container-fluid {- padding: 0;- }- .dl-horizontal dt {- float: none;- width: auto;- clear: none;- text-align: left;- }- .dl-horizontal dd {- margin-left: 0;- }- .container {- width: auto;- }- .row-fluid {- width: 100%;- }- .row,- .thumbnails {- margin-left: 0;- }- [class*="span"],- .row-fluid [class*="span"] {- display: block;- float: none;- width: auto;- margin-left: 0;- }- .input-large,- .input-xlarge,- .input-xxlarge,- input[class*="span"],- select[class*="span"],- textarea[class*="span"],- .uneditable-input {- display: block;- width: 100%;- min-height: 28px;- -webkit-box-sizing: border-box;- -moz-box-sizing: border-box;- -ms-box-sizing: border-box;- box-sizing: border-box;- }- .input-prepend input,- .input-append input,- .input-prepend input[class*="span"],- .input-append input[class*="span"] {- display: inline-block;- width: auto;- }-}--@media (min-width: 768px) and (max-width: 979px) {- .row {- margin-left: -20px;- *zoom: 1;- }- .row:before,- .row:after {- display: table;- content: "";- }- .row:after {- clear: both;- }- [class*="span"] {- float: left;- margin-left: 20px;- }- .container,- .navbar-fixed-top .container,- .navbar-fixed-bottom .container {- width: 724px;- }- .span12 {- width: 724px;- }- .span11 {- width: 662px;- }- .span10 {- width: 600px;- }- .span9 {- width: 538px;- }- .span8 {- width: 476px;- }- .span7 {- width: 414px;- }- .span6 {- width: 352px;- }- .span5 {- width: 290px;- }- .span4 {- width: 228px;- }- .span3 {- width: 166px;- }- .span2 {- width: 104px;- }- .span1 {- width: 42px;- }- .offset12 {- margin-left: 764px;- }- .offset11 {- margin-left: 702px;- }- .offset10 {- margin-left: 640px;- }- .offset9 {- margin-left: 578px;- }- .offset8 {- margin-left: 516px;- }- .offset7 {- margin-left: 454px;- }- .offset6 {- margin-left: 392px;- }- .offset5 {- margin-left: 330px;- }- .offset4 {- margin-left: 268px;- }- .offset3 {- margin-left: 206px;- }- .offset2 {- margin-left: 144px;- }- .offset1 {- margin-left: 82px;- }- .row-fluid {- width: 100%;- *zoom: 1;- }- .row-fluid:before,- .row-fluid:after {- display: table;- content: "";- }- .row-fluid:after {- clear: both;- }- .row-fluid [class*="span"] {- display: block;- float: left;- width: 100%;- min-height: 28px;- margin-left: 2.762430939%;- *margin-left: 2.709239449638298%;- -webkit-box-sizing: border-box;- -moz-box-sizing: border-box;- -ms-box-sizing: border-box;- box-sizing: border-box;- }- .row-fluid [class*="span"]:first-child {- margin-left: 0;- }- .row-fluid .span12 {- width: 99.999999993%;- *width: 99.9468085036383%;- }- .row-fluid .span11 {- width: 91.436464082%;- *width: 91.38327259263829%;- }- .row-fluid .span10 {- width: 82.87292817100001%;- *width: 82.8197366816383%;- }- .row-fluid .span9 {- width: 74.30939226%;- *width: 74.25620077063829%;- }- .row-fluid .span8 {- width: 65.74585634900001%;- *width: 65.6926648596383%;- }- .row-fluid .span7 {- width: 57.182320438000005%;- *width: 57.129128948638304%;- }- .row-fluid .span6 {- width: 48.618784527%;- *width: 48.5655930376383%;- }- .row-fluid .span5 {- width: 40.055248616%;- *width: 40.0020571266383%;- }- .row-fluid .span4 {- width: 31.491712705%;- *width: 31.4385212156383%;- }- .row-fluid .span3 {- width: 22.928176794%;- *width: 22.874985304638297%;- }- .row-fluid .span2 {- width: 14.364640883%;- *width: 14.311449393638298%;- }- .row-fluid .span1 {- width: 5.801104972%;- *width: 5.747913482638298%;- }- input,- textarea,- .uneditable-input {- margin-left: 0;- }- input.span12,- textarea.span12,- .uneditable-input.span12 {- width: 714px;- }- input.span11,- textarea.span11,- .uneditable-input.span11 {- width: 652px;- }- input.span10,- textarea.span10,- .uneditable-input.span10 {- width: 590px;- }- input.span9,- textarea.span9,- .uneditable-input.span9 {- width: 528px;- }- input.span8,- textarea.span8,- .uneditable-input.span8 {- width: 466px;- }- input.span7,- textarea.span7,- .uneditable-input.span7 {- width: 404px;- }- input.span6,- textarea.span6,- .uneditable-input.span6 {- width: 342px;- }- input.span5,- textarea.span5,- .uneditable-input.span5 {- width: 280px;- }- input.span4,- textarea.span4,- .uneditable-input.span4 {- width: 218px;- }- input.span3,- textarea.span3,- .uneditable-input.span3 {- width: 156px;- }- input.span2,- textarea.span2,- .uneditable-input.span2 {- width: 94px;- }- input.span1,- textarea.span1,- .uneditable-input.span1 {- width: 32px;- }-}--@media (min-width: 1200px) {- .row {- margin-left: -30px;- *zoom: 1;- }- .row:before,- .row:after {- display: table;- content: "";- }- .row:after {- clear: both;- }- [class*="span"] {- float: left;- margin-left: 30px;- }- .container,- .navbar-fixed-top .container,- .navbar-fixed-bottom .container {- width: 1170px;- }- .span12 {- width: 1170px;- }- .span11 {- width: 1070px;- }- .span10 {- width: 970px;- }- .span9 {- width: 870px;- }- .span8 {- width: 770px;- }- .span7 {- width: 670px;- }- .span6 {- width: 570px;- }- .span5 {- width: 470px;- }- .span4 {- width: 370px;- }- .span3 {- width: 270px;- }- .span2 {- width: 170px;- }- .span1 {- width: 70px;- }- .offset12 {- margin-left: 1230px;- }- .offset11 {- margin-left: 1130px;- }- .offset10 {- margin-left: 1030px;- }- .offset9 {- margin-left: 930px;- }- .offset8 {- margin-left: 830px;- }- .offset7 {- margin-left: 730px;- }- .offset6 {- margin-left: 630px;- }- .offset5 {- margin-left: 530px;- }- .offset4 {- margin-left: 430px;- }- .offset3 {- margin-left: 330px;- }- .offset2 {- margin-left: 230px;- }- .offset1 {- margin-left: 130px;- }- .row-fluid {- width: 100%;- *zoom: 1;- }- .row-fluid:before,- .row-fluid:after {- display: table;- content: "";- }- .row-fluid:after {- clear: both;- }- .row-fluid [class*="span"] {- display: block;- float: left;- width: 100%;- min-height: 28px;- margin-left: 2.564102564%;- *margin-left: 2.510911074638298%;- -webkit-box-sizing: border-box;- -moz-box-sizing: border-box;- -ms-box-sizing: border-box;- box-sizing: border-box;- }- .row-fluid [class*="span"]:first-child {- margin-left: 0;- }- .row-fluid .span12 {- width: 100%;- *width: 99.94680851063829%;- }- .row-fluid .span11 {- width: 91.45299145300001%;- *width: 91.3997999636383%;- }- .row-fluid .span10 {- width: 82.905982906%;- *width: 82.8527914166383%;- }- .row-fluid .span9 {- width: 74.358974359%;- *width: 74.30578286963829%;- }- .row-fluid .span8 {- width: 65.81196581200001%;- *width: 65.7587743226383%;- }- .row-fluid .span7 {- width: 57.264957265%;- *width: 57.2117657756383%;- }- .row-fluid .span6 {- width: 48.717948718%;- *width: 48.6647572286383%;- }- .row-fluid .span5 {- width: 40.170940171000005%;- *width: 40.117748681638304%;- }- .row-fluid .span4 {- width: 31.623931624%;- *width: 31.5707401346383%;- }- .row-fluid .span3 {- width: 23.076923077%;- *width: 23.0237315876383%;- }- .row-fluid .span2 {- width: 14.529914530000001%;- *width: 14.4767230406383%;- }- .row-fluid .span1 {- width: 5.982905983%;- *width: 5.929714493638298%;- }- input,- textarea,- .uneditable-input {- margin-left: 0;- }- input.span12,- textarea.span12,- .uneditable-input.span12 {- width: 1160px;- }- input.span11,- textarea.span11,- .uneditable-input.span11 {- width: 1060px;- }- input.span10,- textarea.span10,- .uneditable-input.span10 {- width: 960px;- }- input.span9,- textarea.span9,- .uneditable-input.span9 {- width: 860px;- }- input.span8,- textarea.span8,- .uneditable-input.span8 {- width: 760px;- }- input.span7,- textarea.span7,- .uneditable-input.span7 {- width: 660px;- }- input.span6,- textarea.span6,- .uneditable-input.span6 {- width: 560px;- }- input.span5,- textarea.span5,- .uneditable-input.span5 {- width: 460px;- }- input.span4,- textarea.span4,- .uneditable-input.span4 {- width: 360px;- }- input.span3,- textarea.span3,- .uneditable-input.span3 {- width: 260px;- }- input.span2,- textarea.span2,- .uneditable-input.span2 {- width: 160px;- }- input.span1,- textarea.span1,- .uneditable-input.span1 {- width: 60px;- }- .thumbnails {- margin-left: -30px;- }- .thumbnails > li {- margin-left: 30px;- }- .row-fluid .thumbnails {- margin-left: 0;- }-}--@media (max-width: 979px) {- body {- padding-top: 0;- }- .navbar-fixed-top,- .navbar-fixed-bottom {- position: static;- }- .navbar-fixed-top {- margin-bottom: 18px;- }- .navbar-fixed-bottom {- margin-top: 18px;- }- .navbar-fixed-top .navbar-inner,- .navbar-fixed-bottom .navbar-inner {- padding: 5px;- }- .navbar .container {- width: auto;- padding: 0;- }- .navbar .brand {- padding-right: 10px;- padding-left: 10px;- margin: 0 0 0 -5px;- }- .nav-collapse {- clear: both;- }- .nav-collapse .nav {- float: none;- margin: 0 0 9px;- }- .nav-collapse .nav > li {- float: none;- }- .nav-collapse .nav > li > a {- margin-bottom: 2px;- }- .nav-collapse .nav > .divider-vertical {- display: none;- }- .nav-collapse .nav .nav-header {- color: #999999;- text-shadow: none;- }- .nav-collapse .nav > li > a,- .nav-collapse .dropdown-menu a {- padding: 6px 15px;- font-weight: bold;- color: #999999;- -webkit-border-radius: 3px;- -moz-border-radius: 3px;- border-radius: 3px;- }- .nav-collapse .btn {- padding: 4px 10px 4px;- font-weight: normal;- -webkit-border-radius: 4px;- -moz-border-radius: 4px;- border-radius: 4px;- }- .nav-collapse .dropdown-menu li + li a {- margin-bottom: 2px;- }- .nav-collapse .nav > li > a:hover,- .nav-collapse .dropdown-menu a:hover {- background-color: #222222;- }- .nav-collapse.in .btn-group {- padding: 0;- margin-top: 5px;- }- .nav-collapse .dropdown-menu {- position: static;- top: auto;- left: auto;- display: block;- float: none;- max-width: none;- padding: 0;- margin: 0 15px;- background-color: transparent;- border: none;- -webkit-border-radius: 0;- -moz-border-radius: 0;- border-radius: 0;- -webkit-box-shadow: none;- -moz-box-shadow: none;- box-shadow: none;- }- .nav-collapse .dropdown-menu:before,- .nav-collapse .dropdown-menu:after {- display: none;- }- .nav-collapse .dropdown-menu .divider {- display: none;- }- .nav-collapse .navbar-form,- .nav-collapse .navbar-search {- float: none;- padding: 9px 15px;- margin: 9px 0;- border-top: 1px solid #222222;- border-bottom: 1px solid #222222;- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1);- -moz-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);- }- .navbar .nav-collapse .nav.pull-right {- float: none;- margin-left: 0;- }- .nav-collapse,- .nav-collapse.collapse {- height: 0;- overflow: hidden;- }- .navbar .btn-navbar {- display: block;- }- .navbar-static .navbar-inner {- padding-right: 10px;- padding-left: 10px;- }-}--@media (min-width: 980px) {- .nav-collapse.collapse {- height: auto !important;- overflow: visible !important;- }-}
− static/bootstrap.css
@@ -1,4983 +0,0 @@-/*!- * Bootstrap v2.0.4- *- * Copyright 2012 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 @twitter by @mdo and @fat.- */--article,-aside,-details,-figcaption,-figure,-footer,-header,-hgroup,-nav,-section {- display: block;-}--audio,-canvas,-video {- display: inline-block;- *display: inline;- *zoom: 1;-}--audio:not([controls]) {- display: none;-}--html {- font-size: 100%;- -webkit-text-size-adjust: 100%;- -ms-text-size-adjust: 100%;-}--a:focus {- outline: thin dotted #333;- outline: 5px auto -webkit-focus-ring-color;- outline-offset: -2px;-}--a:hover,-a:active {- outline: 0;-}--sub,-sup {- position: relative;- font-size: 75%;- line-height: 0;- vertical-align: baseline;-}--sup {- top: -0.5em;-}--sub {- bottom: -0.25em;-}--img {- max-width: 100%;- vertical-align: middle;- border: 0;- -ms-interpolation-mode: bicubic;-}--#map_canvas img {- max-width: none;-}--button,-input,-select,-textarea {- margin: 0;- font-size: 100%;- vertical-align: middle;-}--button,-input {- *overflow: visible;- line-height: normal;-}--button::-moz-focus-inner,-input::-moz-focus-inner {- padding: 0;- border: 0;-}--button,-input[type="button"],-input[type="reset"],-input[type="submit"] {- cursor: pointer;- -webkit-appearance: button;-}--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-decoration,-input[type="search"]::-webkit-search-cancel-button {- -webkit-appearance: none;-}--textarea {- overflow: auto;- vertical-align: top;-}--.clearfix {- *zoom: 1;-}--.clearfix:before,-.clearfix:after {- display: table;- content: "";-}--.clearfix:after {- clear: both;-}--.hide-text {- font: 0/0 a;- color: transparent;- text-shadow: none;- background-color: transparent;- border: 0;-}--.input-block-level {- display: block;- width: 100%;- min-height: 28px;- -webkit-box-sizing: border-box;- -moz-box-sizing: border-box;- -ms-box-sizing: border-box;- box-sizing: border-box;-}--body {- margin: 0;- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;- font-size: 13px;- line-height: 18px;- color: #333333;- background-color: #ffffff;-}--a {- color: #0088cc;- text-decoration: none;-}--a:hover {- color: #005580;- text-decoration: underline;-}--.row {- margin-left: -20px;- *zoom: 1;-}--.row:before,-.row:after {- display: table;- content: "";-}--.row:after {- clear: both;-}--[class*="span"] {- float: left;- margin-left: 20px;-}--.container,-.navbar-fixed-top .container,-.navbar-fixed-bottom .container {- width: 940px;-}--.span12 {- width: 940px;-}--.span11 {- width: 860px;-}--.span10 {- width: 780px;-}--.span9 {- width: 700px;-}--.span8 {- width: 620px;-}--.span7 {- width: 540px;-}--.span6 {- width: 460px;-}--.span5 {- width: 380px;-}--.span4 {- width: 300px;-}--.span3 {- width: 220px;-}--.span2 {- width: 140px;-}--.span1 {- width: 60px;-}--.offset12 {- margin-left: 980px;-}--.offset11 {- margin-left: 900px;-}--.offset10 {- margin-left: 820px;-}--.offset9 {- margin-left: 740px;-}--.offset8 {- margin-left: 660px;-}--.offset7 {- margin-left: 580px;-}--.offset6 {- margin-left: 500px;-}--.offset5 {- margin-left: 420px;-}--.offset4 {- margin-left: 340px;-}--.offset3 {- margin-left: 260px;-}--.offset2 {- margin-left: 180px;-}--.offset1 {- margin-left: 100px;-}--.row-fluid {- width: 100%;- *zoom: 1;-}--.row-fluid:before,-.row-fluid:after {- display: table;- content: "";-}--.row-fluid:after {- clear: both;-}--.row-fluid [class*="span"] {- display: block;- float: left;- width: 100%;- min-height: 28px;- margin-left: 2.127659574%;- *margin-left: 2.0744680846382977%;- -webkit-box-sizing: border-box;- -moz-box-sizing: border-box;- -ms-box-sizing: border-box;- box-sizing: border-box;-}--.row-fluid [class*="span"]:first-child {- margin-left: 0;-}--.row-fluid .span12 {- width: 99.99999998999999%;- *width: 99.94680850063828%;-}--.row-fluid .span11 {- width: 91.489361693%;- *width: 91.4361702036383%;-}--.row-fluid .span10 {- width: 82.97872339599999%;- *width: 82.92553190663828%;-}--.row-fluid .span9 {- width: 74.468085099%;- *width: 74.4148936096383%;-}--.row-fluid .span8 {- width: 65.95744680199999%;- *width: 65.90425531263828%;-}--.row-fluid .span7 {- width: 57.446808505%;- *width: 57.3936170156383%;-}--.row-fluid .span6 {- width: 48.93617020799999%;- *width: 48.88297871863829%;-}--.row-fluid .span5 {- width: 40.425531911%;- *width: 40.3723404216383%;-}--.row-fluid .span4 {- width: 31.914893614%;- *width: 31.8617021246383%;-}--.row-fluid .span3 {- width: 23.404255317%;- *width: 23.3510638276383%;-}--.row-fluid .span2 {- width: 14.89361702%;- *width: 14.8404255306383%;-}--.row-fluid .span1 {- width: 6.382978723%;- *width: 6.329787233638298%;-}--.container {- margin-right: auto;- margin-left: auto;- *zoom: 1;-}--.container:before,-.container:after {- display: table;- content: "";-}--.container:after {- clear: both;-}--.container-fluid {- padding-right: 20px;- padding-left: 20px;- *zoom: 1;-}--.container-fluid:before,-.container-fluid:after {- display: table;- content: "";-}--.container-fluid:after {- clear: both;-}--p {- margin: 0 0 9px;-}--p small {- font-size: 11px;- color: #999999;-}--.lead {- margin-bottom: 18px;- font-size: 20px;- font-weight: 200;- line-height: 27px;-}--h1,-h2,-h3,-h4,-h5,-h6 {- margin: 0;- font-family: inherit;- font-weight: bold;- color: inherit;- text-rendering: optimizelegibility;-}--h1 small,-h2 small,-h3 small,-h4 small,-h5 small,-h6 small {- font-weight: normal;- color: #999999;-}--h1 {- font-size: 30px;- line-height: 36px;-}--h1 small {- font-size: 18px;-}--h2 {- font-size: 24px;- line-height: 36px;-}--h2 small {- font-size: 18px;-}--h3 {- font-size: 18px;- line-height: 27px;-}--h3 small {- font-size: 14px;-}--h4,-h5,-h6 {- line-height: 18px;-}--h4 {- font-size: 14px;-}--h4 small {- font-size: 12px;-}--h5 {- font-size: 12px;-}--h6 {- font-size: 11px;- color: #999999;- text-transform: uppercase;-}--.page-header {- padding-bottom: 17px;- margin: 18px 0;- border-bottom: 1px solid #eeeeee;-}--.page-header h1 {- line-height: 1;-}--ul,-ol {- padding: 0;- margin: 0 0 9px 25px;-}--ul ul,-ul ol,-ol ol,-ol ul {- margin-bottom: 0;-}--ul {- list-style: disc;-}--ol {- list-style: decimal;-}--li {- line-height: 18px;-}--ul.unstyled,-ol.unstyled {- margin-left: 0;- list-style: none;-}--dl {- margin-bottom: 18px;-}--dt,-dd {- line-height: 18px;-}--dt {- font-weight: bold;- line-height: 17px;-}--dd {- margin-left: 9px;-}--.dl-horizontal dt {- float: left;- width: 120px;- overflow: hidden;- clear: left;- text-align: right;- text-overflow: ellipsis;- white-space: nowrap;-}--.dl-horizontal dd {- margin-left: 130px;-}--hr {- margin: 18px 0;- border: 0;- border-top: 1px solid #eeeeee;- border-bottom: 1px solid #ffffff;-}--strong {- font-weight: bold;-}--em {- font-style: italic;-}--.muted {- color: #999999;-}--abbr[title] {- cursor: help;- border-bottom: 1px dotted #999999;-}--abbr.initialism {- font-size: 90%;- text-transform: uppercase;-}--blockquote {- padding: 0 0 0 15px;- margin: 0 0 18px;- border-left: 5px solid #eeeeee;-}--blockquote p {- margin-bottom: 0;- font-size: 16px;- font-weight: 300;- line-height: 22.5px;-}--blockquote small {- display: block;- line-height: 18px;- color: #999999;-}--blockquote small:before {- content: '\2014 \00A0';-}--blockquote.pull-right {- float: right;- padding-right: 15px;- padding-left: 0;- border-right: 5px solid #eeeeee;- border-left: 0;-}--blockquote.pull-right p,-blockquote.pull-right small {- text-align: right;-}--q:before,-q:after,-blockquote:before,-blockquote:after {- content: "";-}--address {- display: block;- margin-bottom: 18px;- font-style: normal;- line-height: 18px;-}--small {- font-size: 100%;-}--cite {- font-style: normal;-}--code,-pre {- padding: 0 3px 2px;- font-family: Menlo, Monaco, Consolas, "Courier New", monospace;- font-size: 12px;- color: #333333;- -webkit-border-radius: 3px;- -moz-border-radius: 3px;- border-radius: 3px;-}--code {- padding: 2px 4px;- color: #d14;- background-color: #f7f7f9;- border: 1px solid #e1e1e8;-}--pre {- display: block;- padding: 8.5px;- margin: 0 0 9px;- font-size: 12.025px;- line-height: 18px;- word-break: break-all;- word-wrap: break-word;- white-space: pre;- white-space: pre-wrap;- background-color: #f5f5f5;- border: 1px solid #ccc;- border: 1px solid rgba(0, 0, 0, 0.15);- -webkit-border-radius: 4px;- -moz-border-radius: 4px;- border-radius: 4px;-}--pre.prettyprint {- margin-bottom: 18px;-}--pre code {- padding: 0;- color: inherit;- background-color: transparent;- border: 0;-}--.pre-scrollable {- max-height: 340px;- overflow-y: scroll;-}--form {- margin: 0 0 18px;-}--fieldset {- padding: 0;- margin: 0;- border: 0;-}--legend {- display: block;- width: 100%;- padding: 0;- margin-bottom: 27px;- font-size: 19.5px;- line-height: 36px;- color: #333333;- border: 0;- border-bottom: 1px solid #e5e5e5;-}--legend small {- font-size: 13.5px;- color: #999999;-}--label,-input,-button,-select,-textarea {- font-size: 13px;- font-weight: normal;- line-height: 18px;-}--input,-button,-select,-textarea {- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;-}--label {- display: block;- margin-bottom: 5px;-}--select,-textarea,-input[type="text"],-input[type="password"],-input[type="datetime"],-input[type="datetime-local"],-input[type="date"],-input[type="month"],-input[type="time"],-input[type="week"],-input[type="number"],-input[type="email"],-input[type="url"],-input[type="search"],-input[type="tel"],-input[type="color"],-.uneditable-input {- display: inline-block;- height: 18px;- padding: 4px;- margin-bottom: 9px;- font-size: 13px;- line-height: 18px;- color: #555555;-}--input,-textarea {- width: 210px;-}--textarea {- height: auto;-}--textarea,-input[type="text"],-input[type="password"],-input[type="datetime"],-input[type="datetime-local"],-input[type="date"],-input[type="month"],-input[type="time"],-input[type="week"],-input[type="number"],-input[type="email"],-input[type="url"],-input[type="search"],-input[type="tel"],-input[type="color"],-.uneditable-input {- background-color: #ffffff;- border: 1px solid #cccccc;- -webkit-border-radius: 3px;- -moz-border-radius: 3px;- border-radius: 3px;- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075);- -moz-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 linear 0.2s, box-shadow linear 0.2s;- -moz-transition: border linear 0.2s, box-shadow linear 0.2s;- -ms-transition: border linear 0.2s, box-shadow linear 0.2s;- -o-transition: border linear 0.2s, box-shadow linear 0.2s;- transition: border linear 0.2s, box-shadow linear 0.2s;-}--textarea:focus,-input[type="text"]:focus,-input[type="password"]:focus,-input[type="datetime"]:focus,-input[type="datetime-local"]:focus,-input[type="date"]:focus,-input[type="month"]:focus,-input[type="time"]:focus,-input[type="week"]:focus,-input[type="number"]:focus,-input[type="email"]:focus,-input[type="url"]:focus,-input[type="search"]:focus,-input[type="tel"]:focus,-input[type="color"]:focus,-.uneditable-input:focus {- border-color: rgba(82, 168, 236, 0.8);- outline: 0;- outline: thin dotted \9;- /* IE6-9 */-- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);- -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 8px rgba(82, 168, 236, 0.6);-}--input[type="radio"],-input[type="checkbox"] {- margin: 3px 0;- *margin-top: 0;- /* IE7 */-- line-height: normal;- cursor: pointer;-}--input[type="submit"],-input[type="reset"],-input[type="button"],-input[type="radio"],-input[type="checkbox"] {- width: auto;-}--.uneditable-textarea {- width: auto;- height: auto;-}--select,-input[type="file"] {- height: 28px;- /* In IE7, the height of the select element cannot be changed by height, only font-size */-- *margin-top: 4px;- /* For IE7, add top margin to align select with labels */-- line-height: 28px;-}--select {- width: 220px;- border: 1px solid #bbb;-}--select[multiple],-select[size] {- height: auto;-}--select:focus,-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;-}--.radio,-.checkbox {- min-height: 18px;- padding-left: 18px;-}--.radio input[type="radio"],-.checkbox input[type="checkbox"] {- float: left;- margin-left: -18px;-}--.controls > .radio:first-child,-.controls > .checkbox:first-child {- padding-top: 5px;-}--.radio.inline,-.checkbox.inline {- display: inline-block;- padding-top: 5px;- margin-bottom: 0;- vertical-align: middle;-}--.radio.inline + .radio.inline,-.checkbox.inline + .checkbox.inline {- margin-left: 10px;-}--.input-mini {- width: 60px;-}--.input-small {- width: 90px;-}--.input-medium {- width: 150px;-}--.input-large {- width: 210px;-}--.input-xlarge {- width: 270px;-}--.input-xxlarge {- width: 530px;-}--input[class*="span"],-select[class*="span"],-textarea[class*="span"],-.uneditable-input[class*="span"],-.row-fluid input[class*="span"],-.row-fluid select[class*="span"],-.row-fluid textarea[class*="span"],-.row-fluid .uneditable-input[class*="span"] {- float: none;- margin-left: 0;-}--.input-append input[class*="span"],-.input-append .uneditable-input[class*="span"],-.input-prepend input[class*="span"],-.input-prepend .uneditable-input[class*="span"],-.row-fluid .input-prepend [class*="span"],-.row-fluid .input-append [class*="span"] {- display: inline-block;-}--input,-textarea,-.uneditable-input {- margin-left: 0;-}--input.span12,-textarea.span12,-.uneditable-input.span12 {- width: 930px;-}--input.span11,-textarea.span11,-.uneditable-input.span11 {- width: 850px;-}--input.span10,-textarea.span10,-.uneditable-input.span10 {- width: 770px;-}--input.span9,-textarea.span9,-.uneditable-input.span9 {- width: 690px;-}--input.span8,-textarea.span8,-.uneditable-input.span8 {- width: 610px;-}--input.span7,-textarea.span7,-.uneditable-input.span7 {- width: 530px;-}--input.span6,-textarea.span6,-.uneditable-input.span6 {- width: 450px;-}--input.span5,-textarea.span5,-.uneditable-input.span5 {- width: 370px;-}--input.span4,-textarea.span4,-.uneditable-input.span4 {- width: 290px;-}--input.span3,-textarea.span3,-.uneditable-input.span3 {- width: 210px;-}--input.span2,-textarea.span2,-.uneditable-input.span2 {- width: 130px;-}--input.span1,-textarea.span1,-.uneditable-input.span1 {- width: 50px;-}--input[disabled],-select[disabled],-textarea[disabled],-input[readonly],-select[readonly],-textarea[readonly] {- cursor: not-allowed;- background-color: #eeeeee;- border-color: #ddd;-}--input[type="radio"][disabled],-input[type="checkbox"][disabled],-input[type="radio"][readonly],-input[type="checkbox"][readonly] {- background-color: transparent;-}--.control-group.warning > label,-.control-group.warning .help-block,-.control-group.warning .help-inline {- color: #c09853;-}--.control-group.warning .checkbox,-.control-group.warning .radio,-.control-group.warning input,-.control-group.warning select,-.control-group.warning textarea {- color: #c09853;- border-color: #c09853;-}--.control-group.warning .checkbox:focus,-.control-group.warning .radio:focus,-.control-group.warning input:focus,-.control-group.warning select:focus,-.control-group.warning textarea:focus {- border-color: #a47e3c;- -webkit-box-shadow: 0 0 6px #dbc59e;- -moz-box-shadow: 0 0 6px #dbc59e;- box-shadow: 0 0 6px #dbc59e;-}--.control-group.warning .input-prepend .add-on,-.control-group.warning .input-append .add-on {- color: #c09853;- background-color: #fcf8e3;- border-color: #c09853;-}--.control-group.error > label,-.control-group.error .help-block,-.control-group.error .help-inline {- color: #b94a48;-}--.control-group.error .checkbox,-.control-group.error .radio,-.control-group.error input,-.control-group.error select,-.control-group.error textarea {- color: #b94a48;- border-color: #b94a48;-}--.control-group.error .checkbox:focus,-.control-group.error .radio:focus,-.control-group.error input:focus,-.control-group.error select:focus,-.control-group.error textarea:focus {- border-color: #953b39;- -webkit-box-shadow: 0 0 6px #d59392;- -moz-box-shadow: 0 0 6px #d59392;- box-shadow: 0 0 6px #d59392;-}--.control-group.error .input-prepend .add-on,-.control-group.error .input-append .add-on {- color: #b94a48;- background-color: #f2dede;- border-color: #b94a48;-}--.control-group.success > label,-.control-group.success .help-block,-.control-group.success .help-inline {- color: #468847;-}--.control-group.success .checkbox,-.control-group.success .radio,-.control-group.success input,-.control-group.success select,-.control-group.success textarea {- color: #468847;- border-color: #468847;-}--.control-group.success .checkbox:focus,-.control-group.success .radio:focus,-.control-group.success input:focus,-.control-group.success select:focus,-.control-group.success textarea:focus {- border-color: #356635;- -webkit-box-shadow: 0 0 6px #7aba7b;- -moz-box-shadow: 0 0 6px #7aba7b;- box-shadow: 0 0 6px #7aba7b;-}--.control-group.success .input-prepend .add-on,-.control-group.success .input-append .add-on {- color: #468847;- background-color: #dff0d8;- border-color: #468847;-}--input:focus:required:invalid,-textarea:focus:required:invalid,-select:focus:required:invalid {- color: #b94a48;- border-color: #ee5f5b;-}--input:focus:required:invalid:focus,-textarea:focus:required:invalid:focus,-select:focus:required:invalid:focus {- border-color: #e9322d;- -webkit-box-shadow: 0 0 6px #f8b9b7;- -moz-box-shadow: 0 0 6px #f8b9b7;- box-shadow: 0 0 6px #f8b9b7;-}--.form-actions {- padding: 17px 20px 18px;- margin-top: 18px;- margin-bottom: 18px;- background-color: #f5f5f5;- border-top: 1px solid #e5e5e5;- *zoom: 1;-}--.form-actions:before,-.form-actions:after {- display: table;- content: "";-}--.form-actions:after {- clear: both;-}--.uneditable-input {- overflow: hidden;- white-space: nowrap;- cursor: not-allowed;- background-color: #ffffff;- border-color: #eee;- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025);-}--:-moz-placeholder {- color: #999999;-}--:-ms-input-placeholder {- color: #999999;-}--::-webkit-input-placeholder {- color: #999999;-}--.help-block,-.help-inline {- color: #555555;-}--.help-block {- display: block;- margin-bottom: 9px;-}--.help-inline {- display: inline-block;- *display: inline;- padding-left: 5px;- vertical-align: middle;- *zoom: 1;-}--.input-prepend,-.input-append {- margin-bottom: 5px;-}--.input-prepend input,-.input-append input,-.input-prepend select,-.input-append select,-.input-prepend .uneditable-input,-.input-append .uneditable-input {- position: relative;- margin-bottom: 0;- *margin-left: 0;- vertical-align: middle;- -webkit-border-radius: 0 3px 3px 0;- -moz-border-radius: 0 3px 3px 0;- border-radius: 0 3px 3px 0;-}--.input-prepend input:focus,-.input-append input:focus,-.input-prepend select:focus,-.input-append select:focus,-.input-prepend .uneditable-input:focus,-.input-append .uneditable-input:focus {- z-index: 2;-}--.input-prepend .uneditable-input,-.input-append .uneditable-input {- border-left-color: #ccc;-}--.input-prepend .add-on,-.input-append .add-on {- display: inline-block;- width: auto;- height: 18px;- min-width: 16px;- padding: 4px 5px;- font-weight: normal;- line-height: 18px;- text-align: center;- text-shadow: 0 1px 0 #ffffff;- vertical-align: middle;- background-color: #eeeeee;- border: 1px solid #ccc;-}--.input-prepend .add-on,-.input-append .add-on,-.input-prepend .btn,-.input-append .btn {- margin-left: -1px;- -webkit-border-radius: 0;- -moz-border-radius: 0;- border-radius: 0;-}--.input-prepend .active,-.input-append .active {- background-color: #a9dba9;- border-color: #46a546;-}--.input-prepend .add-on,-.input-prepend .btn {- margin-right: -1px;-}--.input-prepend .add-on:first-child,-.input-prepend .btn:first-child {- -webkit-border-radius: 3px 0 0 3px;- -moz-border-radius: 3px 0 0 3px;- border-radius: 3px 0 0 3px;-}--.input-append input,-.input-append select,-.input-append .uneditable-input {- -webkit-border-radius: 3px 0 0 3px;- -moz-border-radius: 3px 0 0 3px;- border-radius: 3px 0 0 3px;-}--.input-append .uneditable-input {- border-right-color: #ccc;- border-left-color: #eee;-}--.input-append .add-on:last-child,-.input-append .btn:last-child {- -webkit-border-radius: 0 3px 3px 0;- -moz-border-radius: 0 3px 3px 0;- border-radius: 0 3px 3px 0;-}--.input-prepend.input-append input,-.input-prepend.input-append select,-.input-prepend.input-append .uneditable-input {- -webkit-border-radius: 0;- -moz-border-radius: 0;- border-radius: 0;-}--.input-prepend.input-append .add-on:first-child,-.input-prepend.input-append .btn:first-child {- margin-right: -1px;- -webkit-border-radius: 3px 0 0 3px;- -moz-border-radius: 3px 0 0 3px;- border-radius: 3px 0 0 3px;-}--.input-prepend.input-append .add-on:last-child,-.input-prepend.input-append .btn:last-child {- margin-left: -1px;- -webkit-border-radius: 0 3px 3px 0;- -moz-border-radius: 0 3px 3px 0;- border-radius: 0 3px 3px 0;-}--.search-query {- padding-right: 14px;- padding-right: 4px \9;- padding-left: 14px;- padding-left: 4px \9;- /* IE7-8 doesn't have border-radius, so don't indent the padding */-- margin-bottom: 0;- -webkit-border-radius: 14px;- -moz-border-radius: 14px;- border-radius: 14px;-}--.form-search input,-.form-inline input,-.form-horizontal input,-.form-search textarea,-.form-inline textarea,-.form-horizontal textarea,-.form-search select,-.form-inline select,-.form-horizontal select,-.form-search .help-inline,-.form-inline .help-inline,-.form-horizontal .help-inline,-.form-search .uneditable-input,-.form-inline .uneditable-input,-.form-horizontal .uneditable-input,-.form-search .input-prepend,-.form-inline .input-prepend,-.form-horizontal .input-prepend,-.form-search .input-append,-.form-inline .input-append,-.form-horizontal .input-append {- display: inline-block;- *display: inline;- margin-bottom: 0;- *zoom: 1;-}--.form-search .hide,-.form-inline .hide,-.form-horizontal .hide {- display: none;-}--.form-search label,-.form-inline label {- display: inline-block;-}--.form-search .input-append,-.form-inline .input-append,-.form-search .input-prepend,-.form-inline .input-prepend {- margin-bottom: 0;-}--.form-search .radio,-.form-search .checkbox,-.form-inline .radio,-.form-inline .checkbox {- padding-left: 0;- margin-bottom: 0;- vertical-align: middle;-}--.form-search .radio input[type="radio"],-.form-search .checkbox input[type="checkbox"],-.form-inline .radio input[type="radio"],-.form-inline .checkbox input[type="checkbox"] {- float: left;- margin-right: 3px;- margin-left: 0;-}--.control-group {- margin-bottom: 9px;-}--legend + .control-group {- margin-top: 18px;- -webkit-margin-top-collapse: separate;-}--.form-horizontal .control-group {- margin-bottom: 18px;- *zoom: 1;-}--.form-horizontal .control-group:before,-.form-horizontal .control-group:after {- display: table;- content: "";-}--.form-horizontal .control-group:after {- clear: both;-}--.form-horizontal .control-label {- float: left;- width: 140px;- padding-top: 5px;- text-align: right;-}--.form-horizontal .controls {- *display: inline-block;- *padding-left: 20px;- margin-left: 160px;- *margin-left: 0;-}--.form-horizontal .controls:first-child {- *padding-left: 160px;-}--.form-horizontal .help-block {- margin-top: 9px;- margin-bottom: 0;-}--.form-horizontal .form-actions {- padding-left: 160px;-}--table {- max-width: 100%;- background-color: transparent;- border-collapse: collapse;- border-spacing: 0;-}--.table {- width: 100%;- margin-bottom: 18px;-}--.table th,-.table td {- padding: 8px;- line-height: 18px;- text-align: left;- vertical-align: top;- border-top: 1px solid #dddddd;-}--.table th {- font-weight: bold;-}--.table thead th {- vertical-align: bottom;-}--.table caption + thead tr:first-child th,-.table caption + thead tr:first-child td,-.table colgroup + thead tr:first-child th,-.table colgroup + thead tr:first-child td,-.table thead:first-child tr:first-child th,-.table thead:first-child tr:first-child td {- border-top: 0;-}--.table tbody + tbody {- border-top: 2px solid #dddddd;-}--.table-condensed th,-.table-condensed td {- padding: 4px 5px;-}--.table-bordered {- border: 1px solid #dddddd;- border-collapse: separate;- *border-collapse: collapsed;- border-left: 0;- -webkit-border-radius: 4px;- -moz-border-radius: 4px;- border-radius: 4px;-}--.table-bordered th,-.table-bordered td {- border-left: 1px solid #dddddd;-}--.table-bordered caption + thead tr:first-child th,-.table-bordered caption + tbody tr:first-child th,-.table-bordered caption + tbody tr:first-child td,-.table-bordered colgroup + thead tr:first-child th,-.table-bordered colgroup + tbody tr:first-child th,-.table-bordered colgroup + tbody tr:first-child td,-.table-bordered thead:first-child tr:first-child th,-.table-bordered tbody:first-child tr:first-child th,-.table-bordered tbody:first-child tr:first-child td {- border-top: 0;-}--.table-bordered thead:first-child tr:first-child th:first-child,-.table-bordered tbody:first-child tr:first-child td:first-child {- -webkit-border-top-left-radius: 4px;- border-top-left-radius: 4px;- -moz-border-radius-topleft: 4px;-}--.table-bordered thead:first-child tr:first-child th:last-child,-.table-bordered tbody:first-child tr:first-child td:last-child {- -webkit-border-top-right-radius: 4px;- border-top-right-radius: 4px;- -moz-border-radius-topright: 4px;-}--.table-bordered thead:last-child tr:last-child th:first-child,-.table-bordered tbody:last-child tr:last-child td:first-child {- -webkit-border-radius: 0 0 0 4px;- -moz-border-radius: 0 0 0 4px;- border-radius: 0 0 0 4px;- -webkit-border-bottom-left-radius: 4px;- border-bottom-left-radius: 4px;- -moz-border-radius-bottomleft: 4px;-}--.table-bordered thead:last-child tr:last-child th:last-child,-.table-bordered tbody:last-child tr:last-child td:last-child {- -webkit-border-bottom-right-radius: 4px;- border-bottom-right-radius: 4px;- -moz-border-radius-bottomright: 4px;-}--.table-striped tbody tr:nth-child(odd) td,-.table-striped tbody tr:nth-child(odd) th {- background-color: #f9f9f9;-}--.table tbody tr:hover td,-.table tbody tr:hover th {- background-color: #f5f5f5;-}--table .span1 {- float: none;- width: 44px;- margin-left: 0;-}--table .span2 {- float: none;- width: 124px;- margin-left: 0;-}--table .span3 {- float: none;- width: 204px;- margin-left: 0;-}--table .span4 {- float: none;- width: 284px;- margin-left: 0;-}--table .span5 {- float: none;- width: 364px;- margin-left: 0;-}--table .span6 {- float: none;- width: 444px;- margin-left: 0;-}--table .span7 {- float: none;- width: 524px;- margin-left: 0;-}--table .span8 {- float: none;- width: 604px;- margin-left: 0;-}--table .span9 {- float: none;- width: 684px;- margin-left: 0;-}--table .span10 {- float: none;- width: 764px;- margin-left: 0;-}--table .span11 {- float: none;- width: 844px;- margin-left: 0;-}--table .span12 {- float: none;- width: 924px;- margin-left: 0;-}--table .span13 {- float: none;- width: 1004px;- margin-left: 0;-}--table .span14 {- float: none;- width: 1084px;- margin-left: 0;-}--table .span15 {- float: none;- width: 1164px;- margin-left: 0;-}--table .span16 {- float: none;- width: 1244px;- margin-left: 0;-}--table .span17 {- float: none;- width: 1324px;- margin-left: 0;-}--table .span18 {- float: none;- width: 1404px;- margin-left: 0;-}--table .span19 {- float: none;- width: 1484px;- margin-left: 0;-}--table .span20 {- float: none;- width: 1564px;- margin-left: 0;-}--table .span21 {- float: none;- width: 1644px;- margin-left: 0;-}--table .span22 {- float: none;- width: 1724px;- margin-left: 0;-}--table .span23 {- float: none;- width: 1804px;- margin-left: 0;-}--table .span24 {- float: none;- width: 1884px;- margin-left: 0;-}--[class^="icon-"],-[class*=" icon-"] {- display: inline-block;- width: 14px;- height: 14px;- *margin-right: .3em;- line-height: 14px;- vertical-align: text-top;- background-image: url("glyphicons-halflings.png");- background-position: 14px 14px;- background-repeat: no-repeat;-}--[class^="icon-"]:last-child,-[class*=" icon-"]:last-child {- *margin-left: 0;-}--.icon-white {- background-image: url("glyphicons-halflings-white.png");-}--.icon-glass {- background-position: 0 0;-}--.icon-music {- background-position: -24px 0;-}--.icon-search {- background-position: -48px 0;-}--.icon-envelope {- background-position: -72px 0;-}--.icon-heart {- background-position: -96px 0;-}--.icon-star {- background-position: -120px 0;-}--.icon-star-empty {- background-position: -144px 0;-}--.icon-user {- background-position: -168px 0;-}--.icon-film {- background-position: -192px 0;-}--.icon-th-large {- background-position: -216px 0;-}--.icon-th {- background-position: -240px 0;-}--.icon-th-list {- background-position: -264px 0;-}--.icon-ok {- background-position: -288px 0;-}--.icon-remove {- background-position: -312px 0;-}--.icon-zoom-in {- background-position: -336px 0;-}--.icon-zoom-out {- background-position: -360px 0;-}--.icon-off {- background-position: -384px 0;-}--.icon-signal {- background-position: -408px 0;-}--.icon-cog {- background-position: -432px 0;-}--.icon-trash {- background-position: -456px 0;-}--.icon-home {- background-position: 0 -24px;-}--.icon-file {- background-position: -24px -24px;-}--.icon-time {- background-position: -48px -24px;-}--.icon-road {- background-position: -72px -24px;-}--.icon-download-alt {- background-position: -96px -24px;-}--.icon-download {- background-position: -120px -24px;-}--.icon-upload {- background-position: -144px -24px;-}--.icon-inbox {- background-position: -168px -24px;-}--.icon-play-circle {- background-position: -192px -24px;-}--.icon-repeat {- background-position: -216px -24px;-}--.icon-refresh {- background-position: -240px -24px;-}--.icon-list-alt {- background-position: -264px -24px;-}--.icon-lock {- background-position: -287px -24px;-}--.icon-flag {- background-position: -312px -24px;-}--.icon-headphones {- background-position: -336px -24px;-}--.icon-volume-off {- background-position: -360px -24px;-}--.icon-volume-down {- background-position: -384px -24px;-}--.icon-volume-up {- background-position: -408px -24px;-}--.icon-qrcode {- background-position: -432px -24px;-}--.icon-barcode {- background-position: -456px -24px;-}--.icon-tag {- background-position: 0 -48px;-}--.icon-tags {- background-position: -25px -48px;-}--.icon-book {- background-position: -48px -48px;-}--.icon-bookmark {- background-position: -72px -48px;-}--.icon-print {- background-position: -96px -48px;-}--.icon-camera {- background-position: -120px -48px;-}--.icon-font {- background-position: -144px -48px;-}--.icon-bold {- background-position: -167px -48px;-}--.icon-italic {- background-position: -192px -48px;-}--.icon-text-height {- background-position: -216px -48px;-}--.icon-text-width {- background-position: -240px -48px;-}--.icon-align-left {- background-position: -264px -48px;-}--.icon-align-center {- background-position: -288px -48px;-}--.icon-align-right {- background-position: -312px -48px;-}--.icon-align-justify {- background-position: -336px -48px;-}--.icon-list {- background-position: -360px -48px;-}--.icon-indent-left {- background-position: -384px -48px;-}--.icon-indent-right {- background-position: -408px -48px;-}--.icon-facetime-video {- background-position: -432px -48px;-}--.icon-picture {- background-position: -456px -48px;-}--.icon-pencil {- background-position: 0 -72px;-}--.icon-map-marker {- background-position: -24px -72px;-}--.icon-adjust {- background-position: -48px -72px;-}--.icon-tint {- background-position: -72px -72px;-}--.icon-edit {- background-position: -96px -72px;-}--.icon-share {- background-position: -120px -72px;-}--.icon-check {- background-position: -144px -72px;-}--.icon-move {- background-position: -168px -72px;-}--.icon-step-backward {- background-position: -192px -72px;-}--.icon-fast-backward {- background-position: -216px -72px;-}--.icon-backward {- background-position: -240px -72px;-}--.icon-play {- background-position: -264px -72px;-}--.icon-pause {- background-position: -288px -72px;-}--.icon-stop {- background-position: -312px -72px;-}--.icon-forward {- background-position: -336px -72px;-}--.icon-fast-forward {- background-position: -360px -72px;-}--.icon-step-forward {- background-position: -384px -72px;-}--.icon-eject {- background-position: -408px -72px;-}--.icon-chevron-left {- background-position: -432px -72px;-}--.icon-chevron-right {- background-position: -456px -72px;-}--.icon-plus-sign {- background-position: 0 -96px;-}--.icon-minus-sign {- background-position: -24px -96px;-}--.icon-remove-sign {- background-position: -48px -96px;-}--.icon-ok-sign {- background-position: -72px -96px;-}--.icon-question-sign {- background-position: -96px -96px;-}--.icon-info-sign {- background-position: -120px -96px;-}--.icon-screenshot {- background-position: -144px -96px;-}--.icon-remove-circle {- background-position: -168px -96px;-}--.icon-ok-circle {- background-position: -192px -96px;-}--.icon-ban-circle {- background-position: -216px -96px;-}--.icon-arrow-left {- background-position: -240px -96px;-}--.icon-arrow-right {- background-position: -264px -96px;-}--.icon-arrow-up {- background-position: -289px -96px;-}--.icon-arrow-down {- background-position: -312px -96px;-}--.icon-share-alt {- background-position: -336px -96px;-}--.icon-resize-full {- background-position: -360px -96px;-}--.icon-resize-small {- background-position: -384px -96px;-}--.icon-plus {- background-position: -408px -96px;-}--.icon-minus {- background-position: -433px -96px;-}--.icon-asterisk {- background-position: -456px -96px;-}--.icon-exclamation-sign {- background-position: 0 -120px;-}--.icon-gift {- background-position: -24px -120px;-}--.icon-leaf {- background-position: -48px -120px;-}--.icon-fire {- background-position: -72px -120px;-}--.icon-eye-open {- background-position: -96px -120px;-}--.icon-eye-close {- background-position: -120px -120px;-}--.icon-warning-sign {- background-position: -144px -120px;-}--.icon-plane {- background-position: -168px -120px;-}--.icon-calendar {- background-position: -192px -120px;-}--.icon-random {- background-position: -216px -120px;-}--.icon-comment {- background-position: -240px -120px;-}--.icon-magnet {- background-position: -264px -120px;-}--.icon-chevron-up {- background-position: -288px -120px;-}--.icon-chevron-down {- background-position: -313px -119px;-}--.icon-retweet {- background-position: -336px -120px;-}--.icon-shopping-cart {- background-position: -360px -120px;-}--.icon-folder-close {- background-position: -384px -120px;-}--.icon-folder-open {- background-position: -408px -120px;-}--.icon-resize-vertical {- background-position: -432px -119px;-}--.icon-resize-horizontal {- background-position: -456px -118px;-}--.icon-hdd {- background-position: 0 -144px;-}--.icon-bullhorn {- background-position: -24px -144px;-}--.icon-bell {- background-position: -48px -144px;-}--.icon-certificate {- background-position: -72px -144px;-}--.icon-thumbs-up {- background-position: -96px -144px;-}--.icon-thumbs-down {- background-position: -120px -144px;-}--.icon-hand-right {- background-position: -144px -144px;-}--.icon-hand-left {- background-position: -168px -144px;-}--.icon-hand-up {- background-position: -192px -144px;-}--.icon-hand-down {- background-position: -216px -144px;-}--.icon-circle-arrow-right {- background-position: -240px -144px;-}--.icon-circle-arrow-left {- background-position: -264px -144px;-}--.icon-circle-arrow-up {- background-position: -288px -144px;-}--.icon-circle-arrow-down {- background-position: -312px -144px;-}--.icon-globe {- background-position: -336px -144px;-}--.icon-wrench {- background-position: -360px -144px;-}--.icon-tasks {- background-position: -384px -144px;-}--.icon-filter {- background-position: -408px -144px;-}--.icon-briefcase {- background-position: -432px -144px;-}--.icon-fullscreen {- background-position: -456px -144px;-}--.dropup,-.dropdown {- position: relative;-}--.dropdown-toggle {- *margin-bottom: -3px;-}--.dropdown-toggle:active,-.open .dropdown-toggle {- outline: 0;-}--.caret {- display: inline-block;- width: 0;- height: 0;- vertical-align: top;- border-top: 4px solid #000000;- border-right: 4px solid transparent;- border-left: 4px solid transparent;- content: "";- opacity: 0.3;- filter: alpha(opacity=30);-}--.dropdown .caret {- margin-top: 8px;- margin-left: 2px;-}--.dropdown:hover .caret,-.open .caret {- opacity: 1;- filter: alpha(opacity=100);-}--.dropdown-menu {- position: absolute;- top: 100%;- left: 0;- z-index: 1000;- display: none;- float: left;- min-width: 160px;- padding: 4px 0;- margin: 1px 0 0;- list-style: none;- background-color: #ffffff;- border: 1px solid #ccc;- border: 1px solid rgba(0, 0, 0, 0.2);- *border-right-width: 2px;- *border-bottom-width: 2px;- -webkit-border-radius: 5px;- -moz-border-radius: 5px;- border-radius: 5px;- -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);- -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);- box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2);- -webkit-background-clip: padding-box;- -moz-background-clip: padding;- background-clip: padding-box;-}--.dropdown-menu.pull-right {- right: 0;- left: auto;-}--.dropdown-menu .divider {- *width: 100%;- height: 1px;- margin: 8px 1px;- *margin: -5px 0 5px;- overflow: hidden;- background-color: #e5e5e5;- border-bottom: 1px solid #ffffff;-}--.dropdown-menu a {- display: block;- padding: 3px 15px;- clear: both;- font-weight: normal;- line-height: 18px;- color: #333333;- white-space: nowrap;-}--.dropdown-menu li > a:hover,-.dropdown-menu .active > a,-.dropdown-menu .active > a:hover {- color: #ffffff;- text-decoration: none;- background-color: #0088cc;-}--.open {- *z-index: 1000;-}--.open > .dropdown-menu {- display: block;-}--.pull-right > .dropdown-menu {- right: 0;- left: auto;-}--.dropup .caret,-.navbar-fixed-bottom .dropdown .caret {- border-top: 0;- border-bottom: 4px solid #000000;- content: "\2191";-}--.dropup .dropdown-menu,-.navbar-fixed-bottom .dropdown .dropdown-menu {- top: auto;- bottom: 100%;- margin-bottom: 1px;-}--.typeahead {- margin-top: 2px;- -webkit-border-radius: 4px;- -moz-border-radius: 4px;- border-radius: 4px;-}--.well {- min-height: 20px;- padding: 19px;- margin-bottom: 20px;- background-color: #f5f5f5;- border: 1px solid #eee;- border: 1px solid rgba(0, 0, 0, 0.05);- -webkit-border-radius: 4px;- -moz-border-radius: 4px;- border-radius: 4px;- -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05);- -moz-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-large {- padding: 24px;- -webkit-border-radius: 6px;- -moz-border-radius: 6px;- border-radius: 6px;-}--.well-small {- padding: 9px;- -webkit-border-radius: 3px;- -moz-border-radius: 3px;- border-radius: 3px;-}--.fade {- opacity: 0;- -webkit-transition: opacity 0.15s linear;- -moz-transition: opacity 0.15s linear;- -ms-transition: opacity 0.15s linear;- -o-transition: opacity 0.15s linear;- transition: opacity 0.15s linear;-}--.fade.in {- opacity: 1;-}--.collapse {- position: relative;- height: 0;- overflow: hidden;- -webkit-transition: height 0.35s ease;- -moz-transition: height 0.35s ease;- -ms-transition: height 0.35s ease;- -o-transition: height 0.35s ease;- transition: height 0.35s ease;-}--.collapse.in {- height: auto;-}--.close {- float: right;- font-size: 20px;- font-weight: bold;- line-height: 18px;- color: #000000;- text-shadow: 0 1px 0 #ffffff;- opacity: 0.2;- filter: alpha(opacity=20);-}--.close:hover {- color: #000000;- text-decoration: none;- cursor: pointer;- opacity: 0.4;- filter: alpha(opacity=40);-}--button.close {- padding: 0;- cursor: pointer;- background: transparent;- border: 0;- -webkit-appearance: none;-}--.btn {- display: inline-block;- *display: inline;- padding: 4px 10px 4px;- margin-bottom: 0;- *margin-left: .3em;- font-size: 13px;- line-height: 18px;- *line-height: 20px;- color: #333333;- text-align: center;- text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75);- vertical-align: middle;- cursor: pointer;- background-color: #f5f5f5;- *background-color: #e6e6e6;- background-image: -ms-linear-gradient(top, #ffffff, #e6e6e6);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));- background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6);- background-image: -o-linear-gradient(top, #ffffff, #e6e6e6);- background-image: linear-gradient(top, #ffffff, #e6e6e6);- background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6);- background-repeat: repeat-x;- border: 1px solid #cccccc;- *border: 0;- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);- border-color: #e6e6e6 #e6e6e6 #bfbfbf;- border-bottom-color: #b3b3b3;- -webkit-border-radius: 4px;- -moz-border-radius: 4px;- border-radius: 4px;- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#e6e6e6', GradientType=0);- filter: progid:dximagetransform.microsoft.gradient(enabled=false);- *zoom: 1;- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);-}--.btn:hover,-.btn:active,-.btn.active,-.btn.disabled,-.btn[disabled] {- background-color: #e6e6e6;- *background-color: #d9d9d9;-}--.btn:active,-.btn.active {- background-color: #cccccc \9;-}--.btn:first-child {- *margin-left: 0;-}--.btn:hover {- color: #333333;- text-decoration: none;- background-color: #e6e6e6;- *background-color: #d9d9d9;- /* Buttons in IE7 don't get borders, so darken on hover */-- background-position: 0 -15px;- -webkit-transition: background-position 0.1s linear;- -moz-transition: background-position 0.1s linear;- -ms-transition: background-position 0.1s linear;- -o-transition: background-position 0.1s linear;- transition: background-position 0.1s linear;-}--.btn:focus {- outline: thin dotted #333;- outline: 5px auto -webkit-focus-ring-color;- outline-offset: -2px;-}--.btn.active,-.btn:active {- background-color: #e6e6e6;- background-color: #d9d9d9 \9;- background-image: none;- outline: 0;- -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);- -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);- box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);-}--.btn.disabled,-.btn[disabled] {- cursor: default;- background-color: #e6e6e6;- background-image: none;- opacity: 0.65;- filter: alpha(opacity=65);- -webkit-box-shadow: none;- -moz-box-shadow: none;- box-shadow: none;-}--.btn-large {- padding: 9px 14px;- font-size: 15px;- line-height: normal;- -webkit-border-radius: 5px;- -moz-border-radius: 5px;- border-radius: 5px;-}--.btn-large [class^="icon-"] {- margin-top: 1px;-}--.btn-small {- padding: 5px 9px;- font-size: 11px;- line-height: 16px;-}--.btn-small [class^="icon-"] {- margin-top: -1px;-}--.btn-mini {- padding: 2px 6px;- font-size: 11px;- line-height: 14px;-}--.btn-primary,-.btn-primary:hover,-.btn-warning,-.btn-warning:hover,-.btn-danger,-.btn-danger:hover,-.btn-success,-.btn-success:hover,-.btn-info,-.btn-info:hover,-.btn-inverse,-.btn-inverse:hover {- color: #ffffff;- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);-}--.btn-primary.active,-.btn-warning.active,-.btn-danger.active,-.btn-success.active,-.btn-info.active,-.btn-inverse.active {- color: rgba(255, 255, 255, 0.75);-}--.btn {- border-color: #ccc;- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);-}--.btn-primary {- background-color: #0074cc;- *background-color: #0055cc;- background-image: -ms-linear-gradient(top, #0088cc, #0055cc);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0055cc));- background-image: -webkit-linear-gradient(top, #0088cc, #0055cc);- background-image: -o-linear-gradient(top, #0088cc, #0055cc);- background-image: -moz-linear-gradient(top, #0088cc, #0055cc);- background-image: linear-gradient(top, #0088cc, #0055cc);- background-repeat: repeat-x;- border-color: #0055cc #0055cc #003580;- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#0088cc', endColorstr='#0055cc', GradientType=0);- filter: progid:dximagetransform.microsoft.gradient(enabled=false);-}--.btn-primary:hover,-.btn-primary:active,-.btn-primary.active,-.btn-primary.disabled,-.btn-primary[disabled] {- background-color: #0055cc;- *background-color: #004ab3;-}--.btn-primary:active,-.btn-primary.active {- background-color: #004099 \9;-}--.btn-warning {- background-color: #faa732;- *background-color: #f89406;- background-image: -ms-linear-gradient(top, #fbb450, #f89406);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));- background-image: -webkit-linear-gradient(top, #fbb450, #f89406);- background-image: -o-linear-gradient(top, #fbb450, #f89406);- background-image: -moz-linear-gradient(top, #fbb450, #f89406);- background-image: linear-gradient(top, #fbb450, #f89406);- background-repeat: repeat-x;- border-color: #f89406 #f89406 #ad6704;- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);- filter: progid:dximagetransform.microsoft.gradient(enabled=false);-}--.btn-warning:hover,-.btn-warning:active,-.btn-warning.active,-.btn-warning.disabled,-.btn-warning[disabled] {- background-color: #f89406;- *background-color: #df8505;-}--.btn-warning:active,-.btn-warning.active {- background-color: #c67605 \9;-}--.btn-danger {- background-color: #da4f49;- *background-color: #bd362f;- background-image: -ms-linear-gradient(top, #ee5f5b, #bd362f);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));- background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f);- background-image: -o-linear-gradient(top, #ee5f5b, #bd362f);- background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f);- background-image: linear-gradient(top, #ee5f5b, #bd362f);- background-repeat: repeat-x;- border-color: #bd362f #bd362f #802420;- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#bd362f', GradientType=0);- filter: progid:dximagetransform.microsoft.gradient(enabled=false);-}--.btn-danger:hover,-.btn-danger:active,-.btn-danger.active,-.btn-danger.disabled,-.btn-danger[disabled] {- background-color: #bd362f;- *background-color: #a9302a;-}--.btn-danger:active,-.btn-danger.active {- background-color: #942a25 \9;-}--.btn-success {- background-color: #5bb75b;- *background-color: #51a351;- background-image: -ms-linear-gradient(top, #62c462, #51a351);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));- background-image: -webkit-linear-gradient(top, #62c462, #51a351);- background-image: -o-linear-gradient(top, #62c462, #51a351);- background-image: -moz-linear-gradient(top, #62c462, #51a351);- background-image: linear-gradient(top, #62c462, #51a351);- background-repeat: repeat-x;- border-color: #51a351 #51a351 #387038;- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#51a351', GradientType=0);- filter: progid:dximagetransform.microsoft.gradient(enabled=false);-}--.btn-success:hover,-.btn-success:active,-.btn-success.active,-.btn-success.disabled,-.btn-success[disabled] {- background-color: #51a351;- *background-color: #499249;-}--.btn-success:active,-.btn-success.active {- background-color: #408140 \9;-}--.btn-info {- background-color: #49afcd;- *background-color: #2f96b4;- background-image: -ms-linear-gradient(top, #5bc0de, #2f96b4);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));- background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4);- background-image: -o-linear-gradient(top, #5bc0de, #2f96b4);- background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4);- background-image: linear-gradient(top, #5bc0de, #2f96b4);- background-repeat: repeat-x;- border-color: #2f96b4 #2f96b4 #1f6377;- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#2f96b4', GradientType=0);- filter: progid:dximagetransform.microsoft.gradient(enabled=false);-}--.btn-info:hover,-.btn-info:active,-.btn-info.active,-.btn-info.disabled,-.btn-info[disabled] {- background-color: #2f96b4;- *background-color: #2a85a0;-}--.btn-info:active,-.btn-info.active {- background-color: #24748c \9;-}--.btn-inverse {- background-color: #414141;- *background-color: #222222;- background-image: -ms-linear-gradient(top, #555555, #222222);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#555555), to(#222222));- background-image: -webkit-linear-gradient(top, #555555, #222222);- background-image: -o-linear-gradient(top, #555555, #222222);- background-image: -moz-linear-gradient(top, #555555, #222222);- background-image: linear-gradient(top, #555555, #222222);- background-repeat: repeat-x;- border-color: #222222 #222222 #000000;- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#555555', endColorstr='#222222', GradientType=0);- filter: progid:dximagetransform.microsoft.gradient(enabled=false);-}--.btn-inverse:hover,-.btn-inverse:active,-.btn-inverse.active,-.btn-inverse.disabled,-.btn-inverse[disabled] {- background-color: #222222;- *background-color: #151515;-}--.btn-inverse:active,-.btn-inverse.active {- background-color: #080808 \9;-}--button.btn,-input[type="submit"].btn {- *padding-top: 2px;- *padding-bottom: 2px;-}--button.btn::-moz-focus-inner,-input[type="submit"].btn::-moz-focus-inner {- padding: 0;- border: 0;-}--button.btn.btn-large,-input[type="submit"].btn.btn-large {- *padding-top: 7px;- *padding-bottom: 7px;-}--button.btn.btn-small,-input[type="submit"].btn.btn-small {- *padding-top: 3px;- *padding-bottom: 3px;-}--button.btn.btn-mini,-input[type="submit"].btn.btn-mini {- *padding-top: 1px;- *padding-bottom: 1px;-}--.btn-group {- position: relative;- *margin-left: .3em;- *zoom: 1;-}--.btn-group:before,-.btn-group:after {- display: table;- content: "";-}--.btn-group:after {- clear: both;-}--.btn-group:first-child {- *margin-left: 0;-}--.btn-group + .btn-group {- margin-left: 5px;-}--.btn-toolbar {- margin-top: 9px;- margin-bottom: 9px;-}--.btn-toolbar .btn-group {- display: inline-block;- *display: inline;- /* IE7 inline-block hack */-- *zoom: 1;-}--.btn-group > .btn {- position: relative;- float: left;- margin-left: -1px;- -webkit-border-radius: 0;- -moz-border-radius: 0;- border-radius: 0;-}--.btn-group > .btn:first-child {- margin-left: 0;- -webkit-border-bottom-left-radius: 4px;- border-bottom-left-radius: 4px;- -webkit-border-top-left-radius: 4px;- border-top-left-radius: 4px;- -moz-border-radius-bottomleft: 4px;- -moz-border-radius-topleft: 4px;-}--.btn-group > .btn:last-child,-.btn-group > .dropdown-toggle {- -webkit-border-top-right-radius: 4px;- border-top-right-radius: 4px;- -webkit-border-bottom-right-radius: 4px;- border-bottom-right-radius: 4px;- -moz-border-radius-topright: 4px;- -moz-border-radius-bottomright: 4px;-}--.btn-group > .btn.large:first-child {- margin-left: 0;- -webkit-border-bottom-left-radius: 6px;- border-bottom-left-radius: 6px;- -webkit-border-top-left-radius: 6px;- border-top-left-radius: 6px;- -moz-border-radius-bottomleft: 6px;- -moz-border-radius-topleft: 6px;-}--.btn-group > .btn.large:last-child,-.btn-group > .large.dropdown-toggle {- -webkit-border-top-right-radius: 6px;- border-top-right-radius: 6px;- -webkit-border-bottom-right-radius: 6px;- border-bottom-right-radius: 6px;- -moz-border-radius-topright: 6px;- -moz-border-radius-bottomright: 6px;-}--.btn-group > .btn:hover,-.btn-group > .btn:focus,-.btn-group > .btn:active,-.btn-group > .btn.active {- z-index: 2;-}--.btn-group .dropdown-toggle:active,-.btn-group.open .dropdown-toggle {- outline: 0;-}--.btn-group > .dropdown-toggle {- *padding-top: 4px;- padding-right: 8px;- *padding-bottom: 4px;- padding-left: 8px;- -webkit-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);- -moz-box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);- box-shadow: inset 1px 0 0 rgba(255, 255, 255, 0.125), inset 0 1px 0 rgba(255, 255, 255, 0.2), 0 1px 2px rgba(0, 0, 0, 0.05);-}--.btn-group > .btn-mini.dropdown-toggle {- padding-right: 5px;- padding-left: 5px;-}--.btn-group > .btn-small.dropdown-toggle {- *padding-top: 4px;- *padding-bottom: 4px;-}--.btn-group > .btn-large.dropdown-toggle {- padding-right: 12px;- padding-left: 12px;-}--.btn-group.open .dropdown-toggle {- background-image: none;- -webkit-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);- -moz-box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);- box-shadow: inset 0 2px 4px rgba(0, 0, 0, 0.15), 0 1px 2px rgba(0, 0, 0, 0.05);-}--.btn-group.open .btn.dropdown-toggle {- background-color: #e6e6e6;-}--.btn-group.open .btn-primary.dropdown-toggle {- background-color: #0055cc;-}--.btn-group.open .btn-warning.dropdown-toggle {- background-color: #f89406;-}--.btn-group.open .btn-danger.dropdown-toggle {- background-color: #bd362f;-}--.btn-group.open .btn-success.dropdown-toggle {- background-color: #51a351;-}--.btn-group.open .btn-info.dropdown-toggle {- background-color: #2f96b4;-}--.btn-group.open .btn-inverse.dropdown-toggle {- background-color: #222222;-}--.btn .caret {- margin-top: 7px;- margin-left: 0;-}--.btn:hover .caret,-.open.btn-group .caret {- opacity: 1;- filter: alpha(opacity=100);-}--.btn-mini .caret {- margin-top: 5px;-}--.btn-small .caret {- margin-top: 6px;-}--.btn-large .caret {- margin-top: 6px;- border-top-width: 5px;- border-right-width: 5px;- border-left-width: 5px;-}--.dropup .btn-large .caret {- border-top: 0;- border-bottom: 5px solid #000000;-}--.btn-primary .caret,-.btn-warning .caret,-.btn-danger .caret,-.btn-info .caret,-.btn-success .caret,-.btn-inverse .caret {- border-top-color: #ffffff;- border-bottom-color: #ffffff;- opacity: 0.75;- filter: alpha(opacity=75);-}--.alert {- padding: 8px 35px 8px 14px;- margin-bottom: 18px;- color: #c09853;- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);- background-color: #fcf8e3;- border: 1px solid #fbeed5;- -webkit-border-radius: 4px;- -moz-border-radius: 4px;- border-radius: 4px;-}--.alert-heading {- color: inherit;-}--.alert .close {- position: relative;- top: -2px;- right: -21px;- line-height: 18px;-}--.alert-success {- color: #468847;- background-color: #dff0d8;- border-color: #d6e9c6;-}--.alert-danger,-.alert-error {- color: #b94a48;- background-color: #f2dede;- border-color: #eed3d7;-}--.alert-info {- color: #3a87ad;- background-color: #d9edf7;- border-color: #bce8f1;-}--.alert-block {- padding-top: 14px;- padding-bottom: 14px;-}--.alert-block > p,-.alert-block > ul {- margin-bottom: 0;-}--.alert-block p + p {- margin-top: 5px;-}--.nav {- margin-bottom: 18px;- margin-left: 0;- list-style: none;-}--.nav > li > a {- display: block;-}--.nav > li > a:hover {- text-decoration: none;- background-color: #eeeeee;-}--.nav > .pull-right {- float: right;-}--.nav .nav-header {- display: block;- padding: 3px 15px;- font-size: 11px;- font-weight: bold;- line-height: 18px;- color: #999999;- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);- text-transform: uppercase;-}--.nav li + .nav-header {- margin-top: 9px;-}--.nav-list {- padding-right: 15px;- padding-left: 15px;- margin-bottom: 0;-}--.nav-list > li > a,-.nav-list .nav-header {- margin-right: -15px;- margin-left: -15px;- text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5);-}--.nav-list > li > a {- padding: 3px 15px;-}--.nav-list > .active > a,-.nav-list > .active > a:hover {- color: #ffffff;- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2);- background-color: #0088cc;-}--.nav-list [class^="icon-"] {- margin-right: 2px;-}--.nav-list .divider {- *width: 100%;- height: 1px;- margin: 8px 1px;- *margin: -5px 0 5px;- overflow: hidden;- background-color: #e5e5e5;- border-bottom: 1px solid #ffffff;-}--.nav-tabs,-.nav-pills {- *zoom: 1;-}--.nav-tabs:before,-.nav-pills:before,-.nav-tabs:after,-.nav-pills:after {- display: table;- content: "";-}--.nav-tabs:after,-.nav-pills:after {- clear: both;-}--.nav-tabs > li,-.nav-pills > li {- float: left;-}--.nav-tabs > li > a,-.nav-pills > li > a {- padding-right: 12px;- padding-left: 12px;- margin-right: 2px;- line-height: 14px;-}--.nav-tabs {- border-bottom: 1px solid #ddd;-}--.nav-tabs > li {- margin-bottom: -1px;-}--.nav-tabs > li > a {- padding-top: 8px;- padding-bottom: 8px;- line-height: 18px;- border: 1px solid transparent;- -webkit-border-radius: 4px 4px 0 0;- -moz-border-radius: 4px 4px 0 0;- border-radius: 4px 4px 0 0;-}--.nav-tabs > li > a:hover {- border-color: #eeeeee #eeeeee #dddddd;-}--.nav-tabs > .active > a,-.nav-tabs > .active > a:hover {- color: #555555;- cursor: default;- background-color: #ffffff;- border: 1px solid #ddd;- border-bottom-color: transparent;-}--.nav-pills > li > a {- padding-top: 8px;- padding-bottom: 8px;- margin-top: 2px;- margin-bottom: 2px;- -webkit-border-radius: 5px;- -moz-border-radius: 5px;- border-radius: 5px;-}--.nav-pills > .active > a,-.nav-pills > .active > a:hover {- color: #ffffff;- background-color: #0088cc;-}--.nav-stacked > li {- float: none;-}--.nav-stacked > li > a {- margin-right: 0;-}--.nav-tabs.nav-stacked {- border-bottom: 0;-}--.nav-tabs.nav-stacked > li > a {- border: 1px solid #ddd;- -webkit-border-radius: 0;- -moz-border-radius: 0;- border-radius: 0;-}--.nav-tabs.nav-stacked > li:first-child > a {- -webkit-border-radius: 4px 4px 0 0;- -moz-border-radius: 4px 4px 0 0;- border-radius: 4px 4px 0 0;-}--.nav-tabs.nav-stacked > li:last-child > a {- -webkit-border-radius: 0 0 4px 4px;- -moz-border-radius: 0 0 4px 4px;- border-radius: 0 0 4px 4px;-}--.nav-tabs.nav-stacked > li > a:hover {- z-index: 2;- border-color: #ddd;-}--.nav-pills.nav-stacked > li > a {- margin-bottom: 3px;-}--.nav-pills.nav-stacked > li:last-child > a {- margin-bottom: 1px;-}--.nav-tabs .dropdown-menu {- -webkit-border-radius: 0 0 5px 5px;- -moz-border-radius: 0 0 5px 5px;- border-radius: 0 0 5px 5px;-}--.nav-pills .dropdown-menu {- -webkit-border-radius: 4px;- -moz-border-radius: 4px;- border-radius: 4px;-}--.nav-tabs .dropdown-toggle .caret,-.nav-pills .dropdown-toggle .caret {- margin-top: 6px;- border-top-color: #0088cc;- border-bottom-color: #0088cc;-}--.nav-tabs .dropdown-toggle:hover .caret,-.nav-pills .dropdown-toggle:hover .caret {- border-top-color: #005580;- border-bottom-color: #005580;-}--.nav-tabs .active .dropdown-toggle .caret,-.nav-pills .active .dropdown-toggle .caret {- border-top-color: #333333;- border-bottom-color: #333333;-}--.nav > .dropdown.active > a:hover {- color: #000000;- cursor: pointer;-}--.nav-tabs .open .dropdown-toggle,-.nav-pills .open .dropdown-toggle,-.nav > li.dropdown.open.active > a:hover {- color: #ffffff;- background-color: #999999;- border-color: #999999;-}--.nav li.dropdown.open .caret,-.nav li.dropdown.open.active .caret,-.nav li.dropdown.open a:hover .caret {- border-top-color: #ffffff;- border-bottom-color: #ffffff;- opacity: 1;- filter: alpha(opacity=100);-}--.tabs-stacked .open > a:hover {- border-color: #999999;-}--.tabbable {- *zoom: 1;-}--.tabbable:before,-.tabbable:after {- display: table;- content: "";-}--.tabbable:after {- clear: both;-}--.tab-content {- overflow: auto;-}--.tabs-below > .nav-tabs,-.tabs-right > .nav-tabs,-.tabs-left > .nav-tabs {- border-bottom: 0;-}--.tab-content > .tab-pane,-.pill-content > .pill-pane {- display: none;-}--.tab-content > .active,-.pill-content > .active {- display: block;-}--.tabs-below > .nav-tabs {- border-top: 1px solid #ddd;-}--.tabs-below > .nav-tabs > li {- margin-top: -1px;- margin-bottom: 0;-}--.tabs-below > .nav-tabs > li > a {- -webkit-border-radius: 0 0 4px 4px;- -moz-border-radius: 0 0 4px 4px;- border-radius: 0 0 4px 4px;-}--.tabs-below > .nav-tabs > li > a:hover {- border-top-color: #ddd;- border-bottom-color: transparent;-}--.tabs-below > .nav-tabs > .active > a,-.tabs-below > .nav-tabs > .active > a:hover {- border-color: transparent #ddd #ddd #ddd;-}--.tabs-left > .nav-tabs > li,-.tabs-right > .nav-tabs > li {- float: none;-}--.tabs-left > .nav-tabs > li > a,-.tabs-right > .nav-tabs > li > a {- min-width: 74px;- margin-right: 0;- margin-bottom: 3px;-}--.tabs-left > .nav-tabs {- float: left;- margin-right: 19px;- border-right: 1px solid #ddd;-}--.tabs-left > .nav-tabs > li > a {- margin-right: -1px;- -webkit-border-radius: 4px 0 0 4px;- -moz-border-radius: 4px 0 0 4px;- border-radius: 4px 0 0 4px;-}--.tabs-left > .nav-tabs > li > a:hover {- border-color: #eeeeee #dddddd #eeeeee #eeeeee;-}--.tabs-left > .nav-tabs .active > a,-.tabs-left > .nav-tabs .active > a:hover {- border-color: #ddd transparent #ddd #ddd;- *border-right-color: #ffffff;-}--.tabs-right > .nav-tabs {- float: right;- margin-left: 19px;- border-left: 1px solid #ddd;-}--.tabs-right > .nav-tabs > li > a {- margin-left: -1px;- -webkit-border-radius: 0 4px 4px 0;- -moz-border-radius: 0 4px 4px 0;- border-radius: 0 4px 4px 0;-}--.tabs-right > .nav-tabs > li > a:hover {- border-color: #eeeeee #eeeeee #eeeeee #dddddd;-}--.tabs-right > .nav-tabs .active > a,-.tabs-right > .nav-tabs .active > a:hover {- border-color: #ddd #ddd #ddd transparent;- *border-left-color: #ffffff;-}--.navbar {- *position: relative;- *z-index: 2;- margin-bottom: 18px;- overflow: visible;-}--.navbar-inner {- min-height: 40px;- padding-right: 20px;- padding-left: 20px;- background-color: #2c2c2c;- background-image: -moz-linear-gradient(top, #333333, #222222);- background-image: -ms-linear-gradient(top, #333333, #222222);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));- background-image: -webkit-linear-gradient(top, #333333, #222222);- background-image: -o-linear-gradient(top, #333333, #222222);- background-image: linear-gradient(top, #333333, #222222);- background-repeat: repeat-x;- -webkit-border-radius: 4px;- -moz-border-radius: 4px;- border-radius: 4px;- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);- -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);- -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);- box-shadow: 0 1px 3px rgba(0, 0, 0, 0.25), inset 0 -1px 0 rgba(0, 0, 0, 0.1);-}--.navbar .container {- width: auto;-}--.nav-collapse.collapse {- height: auto;-}--.navbar {- color: #999999;-}--.navbar .brand:hover {- text-decoration: none;-}--.navbar .brand {- display: block;- float: left;- padding: 8px 20px 12px;- margin-left: -20px;- font-size: 20px;- font-weight: 200;- line-height: 1;- color: #999999;-}--.navbar .navbar-text {- margin-bottom: 0;- line-height: 40px;-}--.navbar .navbar-link {- color: #999999;-}--.navbar .navbar-link:hover {- color: #ffffff;-}--.navbar .btn,-.navbar .btn-group {- margin-top: 5px;-}--.navbar .btn-group .btn {- margin: 0;-}--.navbar-form {- margin-bottom: 0;- *zoom: 1;-}--.navbar-form:before,-.navbar-form:after {- display: table;- content: "";-}--.navbar-form:after {- clear: both;-}--.navbar-form input,-.navbar-form select,-.navbar-form .radio,-.navbar-form .checkbox {- margin-top: 5px;-}--.navbar-form input,-.navbar-form select {- display: inline-block;- margin-bottom: 0;-}--.navbar-form input[type="image"],-.navbar-form input[type="checkbox"],-.navbar-form input[type="radio"] {- margin-top: 3px;-}--.navbar-form .input-append,-.navbar-form .input-prepend {- margin-top: 6px;- white-space: nowrap;-}--.navbar-form .input-append input,-.navbar-form .input-prepend input {- margin-top: 0;-}--.navbar-search {- position: relative;- float: left;- margin-top: 6px;- margin-bottom: 0;-}--.navbar-search .search-query {- padding: 4px 9px;- font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;- font-size: 13px;- font-weight: normal;- line-height: 1;- color: #ffffff;- background-color: #626262;- border: 1px solid #151515;- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);- -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);- box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1), 0 1px 0 rgba(255, 255, 255, 0.15);- -webkit-transition: none;- -moz-transition: none;- -ms-transition: none;- -o-transition: none;- transition: none;-}--.navbar-search .search-query:-moz-placeholder {- color: #cccccc;-}--.navbar-search .search-query:-ms-input-placeholder {- color: #cccccc;-}--.navbar-search .search-query::-webkit-input-placeholder {- color: #cccccc;-}--.navbar-search .search-query:focus,-.navbar-search .search-query.focused {- padding: 5px 10px;- color: #333333;- text-shadow: 0 1px 0 #ffffff;- background-color: #ffffff;- border: 0;- outline: 0;- -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);- -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);- box-shadow: 0 0 3px rgba(0, 0, 0, 0.15);-}--.navbar-fixed-top,-.navbar-fixed-bottom {- position: fixed;- right: 0;- left: 0;- z-index: 1030;- margin-bottom: 0;-}--.navbar-fixed-top .navbar-inner,-.navbar-fixed-bottom .navbar-inner {- padding-right: 0;- padding-left: 0;- -webkit-border-radius: 0;- -moz-border-radius: 0;- border-radius: 0;-}--.navbar-fixed-top .container,-.navbar-fixed-bottom .container {- width: 940px;-}--.navbar-fixed-top {- top: 0;-}--.navbar-fixed-bottom {- bottom: 0;-}--.navbar .nav {- position: relative;- left: 0;- display: block;- float: left;- margin: 0 10px 0 0;-}--.navbar .nav.pull-right {- float: right;-}--.navbar .nav > li {- display: block;- float: left;-}--.navbar .nav > li > a {- float: none;- padding: 9px 10px 11px;- line-height: 19px;- color: #999999;- text-decoration: none;- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);-}--.navbar .btn {- display: inline-block;- padding: 4px 10px 4px;- margin: 5px 5px 6px;- line-height: 18px;-}--.navbar .btn-group {- padding: 5px 5px 6px;- margin: 0;-}--.navbar .nav > li > a:hover {- color: #ffffff;- text-decoration: none;- background-color: transparent;-}--.navbar .nav .active > a,-.navbar .nav .active > a:hover {- color: #ffffff;- text-decoration: none;- background-color: #222222;-}--.navbar .divider-vertical {- width: 1px;- height: 40px;- margin: 0 9px;- overflow: hidden;- background-color: #222222;- border-right: 1px solid #333333;-}--.navbar .nav.pull-right {- margin-right: 0;- margin-left: 10px;-}--.navbar .btn-navbar {- display: none;- float: right;- padding: 7px 10px;- margin-right: 5px;- margin-left: 5px;- background-color: #2c2c2c;- *background-color: #222222;- background-image: -ms-linear-gradient(top, #333333, #222222);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#333333), to(#222222));- background-image: -webkit-linear-gradient(top, #333333, #222222);- background-image: -o-linear-gradient(top, #333333, #222222);- background-image: linear-gradient(top, #333333, #222222);- background-image: -moz-linear-gradient(top, #333333, #222222);- background-repeat: repeat-x;- border-color: #222222 #222222 #000000;- border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#333333', endColorstr='#222222', GradientType=0);- filter: progid:dximagetransform.microsoft.gradient(enabled=false);- -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);- -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);- box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.075);-}--.navbar .btn-navbar:hover,-.navbar .btn-navbar:active,-.navbar .btn-navbar.active,-.navbar .btn-navbar.disabled,-.navbar .btn-navbar[disabled] {- background-color: #222222;- *background-color: #151515;-}--.navbar .btn-navbar:active,-.navbar .btn-navbar.active {- background-color: #080808 \9;-}--.navbar .btn-navbar .icon-bar {- display: block;- width: 18px;- height: 2px;- background-color: #f5f5f5;- -webkit-border-radius: 1px;- -moz-border-radius: 1px;- border-radius: 1px;- -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);- -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);- box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25);-}--.btn-navbar .icon-bar + .icon-bar {- margin-top: 3px;-}--.navbar .dropdown-menu:before {- position: absolute;- top: -7px;- left: 9px;- display: inline-block;- border-right: 7px solid transparent;- border-bottom: 7px solid #ccc;- border-left: 7px solid transparent;- border-bottom-color: rgba(0, 0, 0, 0.2);- content: '';-}--.navbar .dropdown-menu:after {- position: absolute;- top: -6px;- left: 10px;- display: inline-block;- border-right: 6px solid transparent;- border-bottom: 6px solid #ffffff;- border-left: 6px solid transparent;- content: '';-}--.navbar-fixed-bottom .dropdown-menu:before {- top: auto;- bottom: -7px;- border-top: 7px solid #ccc;- border-bottom: 0;- border-top-color: rgba(0, 0, 0, 0.2);-}--.navbar-fixed-bottom .dropdown-menu:after {- top: auto;- bottom: -6px;- border-top: 6px solid #ffffff;- border-bottom: 0;-}--.navbar .nav li.dropdown .dropdown-toggle .caret,-.navbar .nav li.dropdown.open .caret {- border-top-color: #ffffff;- border-bottom-color: #ffffff;-}--.navbar .nav li.dropdown.active .caret {- opacity: 1;- filter: alpha(opacity=100);-}--.navbar .nav li.dropdown.open > .dropdown-toggle,-.navbar .nav li.dropdown.active > .dropdown-toggle,-.navbar .nav li.dropdown.open.active > .dropdown-toggle {- background-color: transparent;-}--.navbar .nav li.dropdown.active > .dropdown-toggle:hover {- color: #ffffff;-}--.navbar .pull-right .dropdown-menu,-.navbar .dropdown-menu.pull-right {- right: 0;- left: auto;-}--.navbar .pull-right .dropdown-menu:before,-.navbar .dropdown-menu.pull-right:before {- right: 12px;- left: auto;-}--.navbar .pull-right .dropdown-menu:after,-.navbar .dropdown-menu.pull-right:after {- right: 13px;- left: auto;-}--.breadcrumb {- padding: 7px 14px;- margin: 0 0 18px;- list-style: none;- background-color: #fbfbfb;- background-image: -moz-linear-gradient(top, #ffffff, #f5f5f5);- background-image: -ms-linear-gradient(top, #ffffff, #f5f5f5);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f5f5f5));- background-image: -webkit-linear-gradient(top, #ffffff, #f5f5f5);- background-image: -o-linear-gradient(top, #ffffff, #f5f5f5);- background-image: linear-gradient(top, #ffffff, #f5f5f5);- background-repeat: repeat-x;- border: 1px solid #ddd;- -webkit-border-radius: 3px;- -moz-border-radius: 3px;- border-radius: 3px;- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ffffff', endColorstr='#f5f5f5', GradientType=0);- -webkit-box-shadow: inset 0 1px 0 #ffffff;- -moz-box-shadow: inset 0 1px 0 #ffffff;- box-shadow: inset 0 1px 0 #ffffff;-}--.breadcrumb li {- display: inline-block;- *display: inline;- text-shadow: 0 1px 0 #ffffff;- *zoom: 1;-}--.breadcrumb .divider {- padding: 0 5px;- color: #999999;-}--.breadcrumb .active a {- color: #333333;-}--.pagination {- height: 36px;- margin: 18px 0;-}--.pagination ul {- display: inline-block;- *display: inline;- margin-bottom: 0;- margin-left: 0;- -webkit-border-radius: 3px;- -moz-border-radius: 3px;- border-radius: 3px;- *zoom: 1;- -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);- -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05);-}--.pagination li {- display: inline;-}--.pagination a {- float: left;- padding: 0 14px;- line-height: 34px;- text-decoration: none;- border: 1px solid #ddd;- border-left-width: 0;-}--.pagination a:hover,-.pagination .active a {- background-color: #f5f5f5;-}--.pagination .active a {- color: #999999;- cursor: default;-}--.pagination .disabled span,-.pagination .disabled a,-.pagination .disabled a:hover {- color: #999999;- cursor: default;- background-color: transparent;-}--.pagination li:first-child a {- border-left-width: 1px;- -webkit-border-radius: 3px 0 0 3px;- -moz-border-radius: 3px 0 0 3px;- border-radius: 3px 0 0 3px;-}--.pagination li:last-child a {- -webkit-border-radius: 0 3px 3px 0;- -moz-border-radius: 0 3px 3px 0;- border-radius: 0 3px 3px 0;-}--.pagination-centered {- text-align: center;-}--.pagination-right {- text-align: right;-}--.pager {- margin-bottom: 18px;- margin-left: 0;- text-align: center;- list-style: none;- *zoom: 1;-}--.pager:before,-.pager:after {- display: table;- content: "";-}--.pager:after {- clear: both;-}--.pager li {- display: inline;-}--.pager a {- display: inline-block;- padding: 5px 14px;- background-color: #fff;- border: 1px solid #ddd;- -webkit-border-radius: 15px;- -moz-border-radius: 15px;- border-radius: 15px;-}--.pager a:hover {- text-decoration: none;- background-color: #f5f5f5;-}--.pager .next a {- float: right;-}--.pager .previous a {- float: left;-}--.pager .disabled a,-.pager .disabled a:hover {- color: #999999;- cursor: default;- background-color: #fff;-}--.modal-open .dropdown-menu {- z-index: 2050;-}--.modal-open .dropdown.open {- *z-index: 2050;-}--.modal-open .popover {- z-index: 2060;-}--.modal-open .tooltip {- z-index: 2070;-}--.modal-backdrop {- position: fixed;- top: 0;- right: 0;- bottom: 0;- left: 0;- z-index: 1040;- background-color: #000000;-}--.modal-backdrop.fade {- opacity: 0;-}--.modal-backdrop,-.modal-backdrop.fade.in {- opacity: 0.8;- filter: alpha(opacity=80);-}--.modal {- position: fixed;- top: 50%;- left: 50%;- z-index: 1050;- width: 560px;- margin: -250px 0 0 -280px;- overflow: auto;- background-color: #ffffff;- border: 1px solid #999;- border: 1px solid rgba(0, 0, 0, 0.3);- *border: 1px solid #999;- -webkit-border-radius: 6px;- -moz-border-radius: 6px;- border-radius: 6px;- -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);- -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);- box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);- -webkit-background-clip: padding-box;- -moz-background-clip: padding-box;- background-clip: padding-box;-}--.modal.fade {- top: -25%;- -webkit-transition: opacity 0.3s linear, top 0.3s ease-out;- -moz-transition: opacity 0.3s linear, top 0.3s ease-out;- -ms-transition: opacity 0.3s linear, top 0.3s ease-out;- -o-transition: opacity 0.3s linear, top 0.3s ease-out;- transition: opacity 0.3s linear, top 0.3s ease-out;-}--.modal.fade.in {- top: 50%;-}--.modal-header {- padding: 9px 15px;- border-bottom: 1px solid #eee;-}--.modal-header .close {- margin-top: 2px;-}--.modal-body {- max-height: 400px;- padding: 15px;- overflow-y: auto;-}--.modal-form {- margin-bottom: 0;-}--.modal-footer {- padding: 14px 15px 15px;- margin-bottom: 0;- text-align: right;- background-color: #f5f5f5;- border-top: 1px solid #ddd;- -webkit-border-radius: 0 0 6px 6px;- -moz-border-radius: 0 0 6px 6px;- border-radius: 0 0 6px 6px;- *zoom: 1;- -webkit-box-shadow: inset 0 1px 0 #ffffff;- -moz-box-shadow: inset 0 1px 0 #ffffff;- box-shadow: inset 0 1px 0 #ffffff;-}--.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;-}--.tooltip {- position: absolute;- z-index: 1020;- display: block;- padding: 5px;- font-size: 11px;- opacity: 0;- filter: alpha(opacity=0);- visibility: visible;-}--.tooltip.in {- opacity: 0.8;- filter: alpha(opacity=80);-}--.tooltip.top {- margin-top: -2px;-}--.tooltip.right {- margin-left: 2px;-}--.tooltip.bottom {- margin-top: 2px;-}--.tooltip.left {- margin-left: -2px;-}--.tooltip.top .tooltip-arrow {- bottom: 0;- left: 50%;- margin-left: -5px;- border-top: 5px solid #000000;- border-right: 5px solid transparent;- border-left: 5px solid transparent;-}--.tooltip.left .tooltip-arrow {- top: 50%;- right: 0;- margin-top: -5px;- border-top: 5px solid transparent;- border-bottom: 5px solid transparent;- border-left: 5px solid #000000;-}--.tooltip.bottom .tooltip-arrow {- top: 0;- left: 50%;- margin-left: -5px;- border-right: 5px solid transparent;- border-bottom: 5px solid #000000;- border-left: 5px solid transparent;-}--.tooltip.right .tooltip-arrow {- top: 50%;- left: 0;- margin-top: -5px;- border-top: 5px solid transparent;- border-right: 5px solid #000000;- border-bottom: 5px solid transparent;-}--.tooltip-inner {- max-width: 200px;- padding: 3px 8px;- color: #ffffff;- text-align: center;- text-decoration: none;- background-color: #000000;- -webkit-border-radius: 4px;- -moz-border-radius: 4px;- border-radius: 4px;-}--.tooltip-arrow {- position: absolute;- width: 0;- height: 0;-}--.popover {- position: absolute;- top: 0;- left: 0;- z-index: 1010;- display: none;- padding: 5px;-}--.popover.top {- margin-top: -5px;-}--.popover.right {- margin-left: 5px;-}--.popover.bottom {- margin-top: 5px;-}--.popover.left {- margin-left: -5px;-}--.popover.top .arrow {- bottom: 0;- left: 50%;- margin-left: -5px;- border-top: 5px solid #000000;- border-right: 5px solid transparent;- border-left: 5px solid transparent;-}--.popover.right .arrow {- top: 50%;- left: 0;- margin-top: -5px;- border-top: 5px solid transparent;- border-right: 5px solid #000000;- border-bottom: 5px solid transparent;-}--.popover.bottom .arrow {- top: 0;- left: 50%;- margin-left: -5px;- border-right: 5px solid transparent;- border-bottom: 5px solid #000000;- border-left: 5px solid transparent;-}--.popover.left .arrow {- top: 50%;- right: 0;- margin-top: -5px;- border-top: 5px solid transparent;- border-bottom: 5px solid transparent;- border-left: 5px solid #000000;-}--.popover .arrow {- position: absolute;- width: 0;- height: 0;-}--.popover-inner {- width: 280px;- padding: 3px;- overflow: hidden;- background: #000000;- background: rgba(0, 0, 0, 0.8);- -webkit-border-radius: 6px;- -moz-border-radius: 6px;- border-radius: 6px;- -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);- -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);- box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3);-}--.popover-title {- padding: 9px 15px;- line-height: 1;- background-color: #f5f5f5;- border-bottom: 1px solid #eee;- -webkit-border-radius: 3px 3px 0 0;- -moz-border-radius: 3px 3px 0 0;- border-radius: 3px 3px 0 0;-}--.popover-content {- padding: 14px;- background-color: #ffffff;- -webkit-border-radius: 0 0 3px 3px;- -moz-border-radius: 0 0 3px 3px;- border-radius: 0 0 3px 3px;- -webkit-background-clip: padding-box;- -moz-background-clip: padding-box;- background-clip: padding-box;-}--.popover-content p,-.popover-content ul,-.popover-content ol {- margin-bottom: 0;-}--.thumbnails {- margin-left: -20px;- list-style: none;- *zoom: 1;-}--.thumbnails:before,-.thumbnails:after {- display: table;- content: "";-}--.thumbnails:after {- clear: both;-}--.row-fluid .thumbnails {- margin-left: 0;-}--.thumbnails > li {- float: left;- margin-bottom: 18px;- margin-left: 20px;-}--.thumbnail {- display: block;- padding: 4px;- line-height: 1;- border: 1px solid #ddd;- -webkit-border-radius: 4px;- -moz-border-radius: 4px;- border-radius: 4px;- -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);- -moz-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.075);-}--a.thumbnail:hover {- border-color: #0088cc;- -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);- -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);- box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25);-}--.thumbnail > img {- display: block;- max-width: 100%;- margin-right: auto;- margin-left: auto;-}--.thumbnail .caption {- padding: 9px;-}--.label,-.badge {- font-size: 10.998px;- font-weight: bold;- line-height: 14px;- color: #ffffff;- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);- white-space: nowrap;- vertical-align: baseline;- background-color: #999999;-}--.label {- padding: 1px 4px 2px;- -webkit-border-radius: 3px;- -moz-border-radius: 3px;- border-radius: 3px;-}--.badge {- padding: 1px 9px 2px;- -webkit-border-radius: 9px;- -moz-border-radius: 9px;- border-radius: 9px;-}--a.label:hover,-a.badge:hover {- color: #ffffff;- text-decoration: none;- cursor: pointer;-}--.label-important,-.badge-important {- background-color: #b94a48;-}--.label-important[href],-.badge-important[href] {- background-color: #953b39;-}--.label-warning,-.badge-warning {- background-color: #f89406;-}--.label-warning[href],-.badge-warning[href] {- background-color: #c67605;-}--.label-success,-.badge-success {- background-color: #468847;-}--.label-success[href],-.badge-success[href] {- background-color: #356635;-}--.label-info,-.badge-info {- background-color: #3a87ad;-}--.label-info[href],-.badge-info[href] {- background-color: #2d6987;-}--.label-inverse,-.badge-inverse {- background-color: #333333;-}--.label-inverse[href],-.badge-inverse[href] {- background-color: #1a1a1a;-}--@-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;- }-}--@-ms-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: 18px;- margin-bottom: 18px;- overflow: hidden;- background-color: #f7f7f7;- background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9);- background-image: -ms-linear-gradient(top, #f5f5f5, #f9f9f9);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));- background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9);- background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9);- background-image: linear-gradient(top, #f5f5f5, #f9f9f9);- background-repeat: repeat-x;- -webkit-border-radius: 4px;- -moz-border-radius: 4px;- border-radius: 4px;- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#f5f5f5', endColorstr='#f9f9f9', GradientType=0);- -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1);- -moz-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 {- width: 0;- height: 18px;- font-size: 12px;- color: #ffffff;- text-align: center;- text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);- background-color: #0e90d2;- background-image: -moz-linear-gradient(top, #149bdf, #0480be);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));- background-image: -webkit-linear-gradient(top, #149bdf, #0480be);- background-image: -o-linear-gradient(top, #149bdf, #0480be);- background-image: linear-gradient(top, #149bdf, #0480be);- background-image: -ms-linear-gradient(top, #149bdf, #0480be);- background-repeat: repeat-x;- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#149bdf', endColorstr='#0480be', GradientType=0);- -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15);- -moz-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-box-sizing: border-box;- -moz-box-sizing: border-box;- -ms-box-sizing: border-box;- box-sizing: border-box;- -webkit-transition: width 0.6s ease;- -moz-transition: width 0.6s ease;- -ms-transition: width 0.6s ease;- -o-transition: width 0.6s ease;- transition: width 0.6s ease;-}--.progress-striped .bar {- background-color: #149bdf;- background-image: -o-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: -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: -ms-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: -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: 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);- -webkit-background-size: 40px 40px;- -moz-background-size: 40px 40px;- -o-background-size: 40px 40px;- background-size: 40px 40px;-}--.progress.active .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-danger .bar {- background-color: #dd514c;- background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35);- background-image: -ms-linear-gradient(top, #ee5f5b, #c43c35);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));- background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35);- background-image: -o-linear-gradient(top, #ee5f5b, #c43c35);- background-image: linear-gradient(top, #ee5f5b, #c43c35);- background-repeat: repeat-x;- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#ee5f5b', endColorstr='#c43c35', GradientType=0);-}--.progress-danger.progress-striped .bar {- background-color: #ee5f5b;- 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: -ms-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: -o-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-success .bar {- background-color: #5eb95e;- background-image: -moz-linear-gradient(top, #62c462, #57a957);- background-image: -ms-linear-gradient(top, #62c462, #57a957);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));- background-image: -webkit-linear-gradient(top, #62c462, #57a957);- background-image: -o-linear-gradient(top, #62c462, #57a957);- background-image: linear-gradient(top, #62c462, #57a957);- background-repeat: repeat-x;- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#62c462', endColorstr='#57a957', GradientType=0);-}--.progress-success.progress-striped .bar {- background-color: #62c462;- 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: -ms-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: -o-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-info .bar {- background-color: #4bb1cf;- background-image: -moz-linear-gradient(top, #5bc0de, #339bb9);- background-image: -ms-linear-gradient(top, #5bc0de, #339bb9);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));- background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9);- background-image: -o-linear-gradient(top, #5bc0de, #339bb9);- background-image: linear-gradient(top, #5bc0de, #339bb9);- background-repeat: repeat-x;- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#5bc0de', endColorstr='#339bb9', GradientType=0);-}--.progress-info.progress-striped .bar {- background-color: #5bc0de;- 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: -ms-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: -o-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-warning .bar {- background-color: #faa732;- background-image: -moz-linear-gradient(top, #fbb450, #f89406);- background-image: -ms-linear-gradient(top, #fbb450, #f89406);- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));- background-image: -webkit-linear-gradient(top, #fbb450, #f89406);- background-image: -o-linear-gradient(top, #fbb450, #f89406);- background-image: linear-gradient(top, #fbb450, #f89406);- background-repeat: repeat-x;- filter: progid:dximagetransform.microsoft.gradient(startColorstr='#fbb450', endColorstr='#f89406', GradientType=0);-}--.progress-warning.progress-striped .bar {- background-color: #fbb450;- 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: -ms-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: -o-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);-}--.accordion {- margin-bottom: 18px;-}--.accordion-group {- margin-bottom: 2px;- border: 1px solid #e5e5e5;- -webkit-border-radius: 4px;- -moz-border-radius: 4px;- border-radius: 4px;-}--.accordion-heading {- border-bottom: 0;-}--.accordion-heading .accordion-toggle {- display: block;- padding: 8px 15px;-}--.accordion-toggle {- cursor: pointer;-}--.accordion-inner {- padding: 9px 15px;- border-top: 1px solid #e5e5e5;-}--.carousel {- position: relative;- margin-bottom: 18px;- line-height: 1;-}--.carousel-inner {- position: relative;- width: 100%;- overflow: hidden;-}--.carousel .item {- position: relative;- display: none;- -webkit-transition: 0.6s ease-in-out left;- -moz-transition: 0.6s ease-in-out left;- -ms-transition: 0.6s ease-in-out left;- -o-transition: 0.6s ease-in-out left;- transition: 0.6s ease-in-out left;-}--.carousel .item > img {- display: block;- line-height: 1;-}--.carousel .active,-.carousel .next,-.carousel .prev {- display: block;-}--.carousel .active {- left: 0;-}--.carousel .next,-.carousel .prev {- position: absolute;- top: 0;- width: 100%;-}--.carousel .next {- left: 100%;-}--.carousel .prev {- left: -100%;-}--.carousel .next.left,-.carousel .prev.right {- left: 0;-}--.carousel .active.left {- left: -100%;-}--.carousel .active.right {- left: 100%;-}--.carousel-control {- position: absolute;- top: 40%;- left: 15px;- width: 40px;- height: 40px;- margin-top: -20px;- font-size: 60px;- font-weight: 100;- line-height: 30px;- color: #ffffff;- text-align: center;- background: #222222;- border: 3px solid #ffffff;- -webkit-border-radius: 23px;- -moz-border-radius: 23px;- border-radius: 23px;- opacity: 0.5;- filter: alpha(opacity=50);-}--.carousel-control.right {- right: 15px;- left: auto;-}--.carousel-control:hover {- color: #ffffff;- text-decoration: none;- opacity: 0.9;- filter: alpha(opacity=90);-}--.carousel-caption {- position: absolute;- right: 0;- bottom: 0;- left: 0;- padding: 10px 15px 5px;- background: #333333;- background: rgba(0, 0, 0, 0.75);-}--.carousel-caption h4,-.carousel-caption p {- color: #ffffff;-}--.hero-unit {- padding: 60px;- margin-bottom: 30px;- background-color: #eeeeee;- -webkit-border-radius: 6px;- -moz-border-radius: 6px;- border-radius: 6px;-}--.hero-unit h1 {- margin-bottom: 0;- font-size: 60px;- line-height: 1;- letter-spacing: -1px;- color: inherit;-}--.hero-unit p {- font-size: 18px;- font-weight: 200;- line-height: 27px;- color: inherit;-}--.pull-right {- float: right;-}--.pull-left {- float: left;-}--.hide {- display: none;-}--.show {- display: block;-}--.invisible {- visibility: hidden;-}
+ static/css/bootstrap-theme.css view
@@ -0,0 +1,347 @@+/*!+ * Bootstrap v3.1.1 (http://getbootstrap.com)+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ */++.btn-default,+.btn-primary,+.btn-success,+.btn-info,+.btn-warning,+.btn-danger {+ text-shadow: 0 -1px 0 rgba(0, 0, 0, .2);+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 1px rgba(0, 0, 0, .075);+}+.btn-default:active,+.btn-primary:active,+.btn-success:active,+.btn-info:active,+.btn-warning:active,+.btn-danger:active,+.btn-default.active,+.btn-primary.active,+.btn-success.active,+.btn-info.active,+.btn-warning.active,+.btn-danger.active {+ -webkit-box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);+ box-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);+}+.btn:active,+.btn.active {+ background-image: none;+}+.btn-default {+ text-shadow: 0 1px 0 #fff;+ background-image: -webkit-linear-gradient(top, #fff 0%, #e0e0e0 100%);+ background-image: linear-gradient(to bottom, #fff 0%, #e0e0e0 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe0e0e0', GradientType=0);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+ background-repeat: repeat-x;+ border-color: #dbdbdb;+ border-color: #ccc;+}+.btn-default:hover,+.btn-default:focus {+ background-color: #e0e0e0;+ background-position: 0 -15px;+}+.btn-default:active,+.btn-default.active {+ background-color: #e0e0e0;+ border-color: #dbdbdb;+}+.btn-primary {+ background-image: -webkit-linear-gradient(top, #428bca 0%, #2d6ca2 100%);+ background-image: linear-gradient(to bottom, #428bca 0%, #2d6ca2 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff2d6ca2', GradientType=0);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+ background-repeat: repeat-x;+ border-color: #2b669a;+}+.btn-primary:hover,+.btn-primary:focus {+ background-color: #2d6ca2;+ background-position: 0 -15px;+}+.btn-primary:active,+.btn-primary.active {+ background-color: #2d6ca2;+ border-color: #2b669a;+}+.btn-success {+ background-image: -webkit-linear-gradient(top, #5cb85c 0%, #419641 100%);+ background-image: linear-gradient(to bottom, #5cb85c 0%, #419641 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff419641', GradientType=0);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+ background-repeat: repeat-x;+ border-color: #3e8f3e;+}+.btn-success:hover,+.btn-success:focus {+ background-color: #419641;+ background-position: 0 -15px;+}+.btn-success:active,+.btn-success.active {+ background-color: #419641;+ border-color: #3e8f3e;+}+.btn-info {+ background-image: -webkit-linear-gradient(top, #5bc0de 0%, #2aabd2 100%);+ background-image: linear-gradient(to bottom, #5bc0de 0%, #2aabd2 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2aabd2', GradientType=0);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+ background-repeat: repeat-x;+ border-color: #28a4c9;+}+.btn-info:hover,+.btn-info:focus {+ background-color: #2aabd2;+ background-position: 0 -15px;+}+.btn-info:active,+.btn-info.active {+ background-color: #2aabd2;+ border-color: #28a4c9;+}+.btn-warning {+ background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #eb9316 100%);+ background-image: linear-gradient(to bottom, #f0ad4e 0%, #eb9316 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffeb9316', GradientType=0);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+ background-repeat: repeat-x;+ border-color: #e38d13;+}+.btn-warning:hover,+.btn-warning:focus {+ background-color: #eb9316;+ background-position: 0 -15px;+}+.btn-warning:active,+.btn-warning.active {+ background-color: #eb9316;+ border-color: #e38d13;+}+.btn-danger {+ background-image: -webkit-linear-gradient(top, #d9534f 0%, #c12e2a 100%);+ background-image: linear-gradient(to bottom, #d9534f 0%, #c12e2a 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc12e2a', GradientType=0);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+ background-repeat: repeat-x;+ border-color: #b92c28;+}+.btn-danger:hover,+.btn-danger:focus {+ background-color: #c12e2a;+ background-position: 0 -15px;+}+.btn-danger:active,+.btn-danger.active {+ background-color: #c12e2a;+ border-color: #b92c28;+}+.thumbnail,+.img-thumbnail {+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);+ box-shadow: 0 1px 2px rgba(0, 0, 0, .075);+}+.dropdown-menu > li > a:hover,+.dropdown-menu > li > a:focus {+ background-color: #e8e8e8;+ background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);+ background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);+ background-repeat: repeat-x;+}+.dropdown-menu > .active > a,+.dropdown-menu > .active > a:hover,+.dropdown-menu > .active > a:focus {+ background-color: #357ebd;+ background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);+ background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);+ background-repeat: repeat-x;+}+.navbar-default {+ background-image: -webkit-linear-gradient(top, #fff 0%, #f8f8f8 100%);+ background-image: linear-gradient(to bottom, #fff 0%, #f8f8f8 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff8f8f8', GradientType=0);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+ background-repeat: repeat-x;+ border-radius: 4px;+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .15), 0 1px 5px rgba(0, 0, 0, .075);+}+.navbar-default .navbar-nav > .active > a {+ background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f3f3f3 100%);+ background-image: linear-gradient(to bottom, #ebebeb 0%, #f3f3f3 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff3f3f3', GradientType=0);+ background-repeat: repeat-x;+ -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);+ box-shadow: inset 0 3px 9px rgba(0, 0, 0, .075);+}+.navbar-brand,+.navbar-nav > li > a {+ text-shadow: 0 1px 0 rgba(255, 255, 255, .25);+}+.navbar-inverse {+ background-image: -webkit-linear-gradient(top, #3c3c3c 0%, #222 100%);+ background-image: linear-gradient(to bottom, #3c3c3c 0%, #222 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff3c3c3c', endColorstr='#ff222222', GradientType=0);+ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false);+ background-repeat: repeat-x;+}+.navbar-inverse .navbar-nav > .active > a {+ background-image: -webkit-linear-gradient(top, #222 0%, #282828 100%);+ background-image: linear-gradient(to bottom, #222 0%, #282828 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff282828', GradientType=0);+ background-repeat: repeat-x;+ -webkit-box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);+ box-shadow: inset 0 3px 9px rgba(0, 0, 0, .25);+}+.navbar-inverse .navbar-brand,+.navbar-inverse .navbar-nav > li > a {+ text-shadow: 0 -1px 0 rgba(0, 0, 0, .25);+}+.navbar-static-top,+.navbar-fixed-top,+.navbar-fixed-bottom {+ border-radius: 0;+}+.alert {+ text-shadow: 0 1px 0 rgba(255, 255, 255, .2);+ -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .25), 0 1px 2px rgba(0, 0, 0, .05);+}+.alert-success {+ background-image: -webkit-linear-gradient(top, #dff0d8 0%, #c8e5bc 100%);+ background-image: linear-gradient(to bottom, #dff0d8 0%, #c8e5bc 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffc8e5bc', GradientType=0);+ background-repeat: repeat-x;+ border-color: #b2dba1;+}+.alert-info {+ background-image: -webkit-linear-gradient(top, #d9edf7 0%, #b9def0 100%);+ background-image: linear-gradient(to bottom, #d9edf7 0%, #b9def0 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffb9def0', GradientType=0);+ background-repeat: repeat-x;+ border-color: #9acfea;+}+.alert-warning {+ background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #f8efc0 100%);+ background-image: linear-gradient(to bottom, #fcf8e3 0%, #f8efc0 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fff8efc0', GradientType=0);+ background-repeat: repeat-x;+ border-color: #f5e79e;+}+.alert-danger {+ background-image: -webkit-linear-gradient(top, #f2dede 0%, #e7c3c3 100%);+ background-image: linear-gradient(to bottom, #f2dede 0%, #e7c3c3 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffe7c3c3', GradientType=0);+ background-repeat: repeat-x;+ border-color: #dca7a7;+}+.progress {+ background-image: -webkit-linear-gradient(top, #ebebeb 0%, #f5f5f5 100%);+ background-image: linear-gradient(to bottom, #ebebeb 0%, #f5f5f5 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffebebeb', endColorstr='#fff5f5f5', GradientType=0);+ background-repeat: repeat-x;+}+.progress-bar {+ background-image: -webkit-linear-gradient(top, #428bca 0%, #3071a9 100%);+ background-image: linear-gradient(to bottom, #428bca 0%, #3071a9 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3071a9', GradientType=0);+ background-repeat: repeat-x;+}+.progress-bar-success {+ background-image: -webkit-linear-gradient(top, #5cb85c 0%, #449d44 100%);+ background-image: linear-gradient(to bottom, #5cb85c 0%, #449d44 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5cb85c', endColorstr='#ff449d44', GradientType=0);+ background-repeat: repeat-x;+}+.progress-bar-info {+ background-image: -webkit-linear-gradient(top, #5bc0de 0%, #31b0d5 100%);+ background-image: linear-gradient(to bottom, #5bc0de 0%, #31b0d5 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff31b0d5', GradientType=0);+ background-repeat: repeat-x;+}+.progress-bar-warning {+ background-image: -webkit-linear-gradient(top, #f0ad4e 0%, #ec971f 100%);+ background-image: linear-gradient(to bottom, #f0ad4e 0%, #ec971f 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff0ad4e', endColorstr='#ffec971f', GradientType=0);+ background-repeat: repeat-x;+}+.progress-bar-danger {+ background-image: -webkit-linear-gradient(top, #d9534f 0%, #c9302c 100%);+ background-image: linear-gradient(to bottom, #d9534f 0%, #c9302c 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9534f', endColorstr='#ffc9302c', GradientType=0);+ background-repeat: repeat-x;+}+.list-group {+ border-radius: 4px;+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .075);+ box-shadow: 0 1px 2px rgba(0, 0, 0, .075);+}+.list-group-item.active,+.list-group-item.active:hover,+.list-group-item.active:focus {+ text-shadow: 0 -1px 0 #3071a9;+ background-image: -webkit-linear-gradient(top, #428bca 0%, #3278b3 100%);+ background-image: linear-gradient(to bottom, #428bca 0%, #3278b3 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff3278b3', GradientType=0);+ background-repeat: repeat-x;+ border-color: #3278b3;+}+.panel {+ -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, .05);+ box-shadow: 0 1px 2px rgba(0, 0, 0, .05);+}+.panel-default > .panel-heading {+ background-image: -webkit-linear-gradient(top, #f5f5f5 0%, #e8e8e8 100%);+ background-image: linear-gradient(to bottom, #f5f5f5 0%, #e8e8e8 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#ffe8e8e8', GradientType=0);+ background-repeat: repeat-x;+}+.panel-primary > .panel-heading {+ background-image: -webkit-linear-gradient(top, #428bca 0%, #357ebd 100%);+ background-image: linear-gradient(to bottom, #428bca 0%, #357ebd 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff428bca', endColorstr='#ff357ebd', GradientType=0);+ background-repeat: repeat-x;+}+.panel-success > .panel-heading {+ background-image: -webkit-linear-gradient(top, #dff0d8 0%, #d0e9c6 100%);+ background-image: linear-gradient(to bottom, #dff0d8 0%, #d0e9c6 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffdff0d8', endColorstr='#ffd0e9c6', GradientType=0);+ background-repeat: repeat-x;+}+.panel-info > .panel-heading {+ background-image: -webkit-linear-gradient(top, #d9edf7 0%, #c4e3f3 100%);+ background-image: linear-gradient(to bottom, #d9edf7 0%, #c4e3f3 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffd9edf7', endColorstr='#ffc4e3f3', GradientType=0);+ background-repeat: repeat-x;+}+.panel-warning > .panel-heading {+ background-image: -webkit-linear-gradient(top, #fcf8e3 0%, #faf2cc 100%);+ background-image: linear-gradient(to bottom, #fcf8e3 0%, #faf2cc 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffcf8e3', endColorstr='#fffaf2cc', GradientType=0);+ background-repeat: repeat-x;+}+.panel-danger > .panel-heading {+ background-image: -webkit-linear-gradient(top, #f2dede 0%, #ebcccc 100%);+ background-image: linear-gradient(to bottom, #f2dede 0%, #ebcccc 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2dede', endColorstr='#ffebcccc', GradientType=0);+ background-repeat: repeat-x;+}+.well {+ background-image: -webkit-linear-gradient(top, #e8e8e8 0%, #f5f5f5 100%);+ background-image: linear-gradient(to bottom, #e8e8e8 0%, #f5f5f5 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffe8e8e8', endColorstr='#fff5f5f5', GradientType=0);+ background-repeat: repeat-x;+ border-color: #dcdcdc;+ -webkit-box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, .05), 0 1px 0 rgba(255, 255, 255, .1);+}+/*# sourceMappingURL=bootstrap-theme.css.map */
+ static/css/bootstrap.css view
@@ -0,0 +1,5785 @@+/*!+ * Bootstrap v3.1.1 (http://getbootstrap.com)+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ */++/*! normalize.css v3.0.0 | MIT License | git.io/normalize */+html {+ font-family: sans-serif;+ -webkit-text-size-adjust: 100%;+ -ms-text-size-adjust: 100%;+}+body {+ margin: 0;+}+article,+aside,+details,+figcaption,+figure,+footer,+header,+hgroup,+main,+nav,+section,+summary {+ display: block;+}+audio,+canvas,+progress,+video {+ display: inline-block;+ vertical-align: baseline;+}+audio:not([controls]) {+ display: none;+ height: 0;+}+[hidden],+template {+ display: none;+}+a {+ background: transparent;+}+a:active,+a:hover {+ outline: 0;+}+abbr[title] {+ border-bottom: 1px dotted;+}+b,+strong {+ font-weight: bold;+}+dfn {+ font-style: italic;+}+h1 {+ margin: .67em 0;+ font-size: 2em;+}+mark {+ color: #000;+ background: #ff0;+}+small {+ font-size: 80%;+}+sub,+sup {+ position: relative;+ font-size: 75%;+ line-height: 0;+ vertical-align: baseline;+}+sup {+ top: -.5em;+}+sub {+ bottom: -.25em;+}+img {+ border: 0;+}+svg:not(:root) {+ overflow: hidden;+}+figure {+ margin: 1em 40px;+}+hr {+ height: 0;+ -moz-box-sizing: content-box;+ box-sizing: content-box;+}+pre {+ overflow: auto;+}+code,+kbd,+pre,+samp {+ font-family: monospace, monospace;+ font-size: 1em;+}+button,+input,+optgroup,+select,+textarea {+ margin: 0;+ font: inherit;+ color: inherit;+}+button {+ overflow: visible;+}+button,+select {+ text-transform: none;+}+button,+html input[type="button"],+input[type="reset"],+input[type="submit"] {+ -webkit-appearance: button;+ cursor: pointer;+}+button[disabled],+html input[disabled] {+ cursor: default;+}+button::-moz-focus-inner,+input::-moz-focus-inner {+ padding: 0;+ border: 0;+}+input {+ line-height: normal;+}+input[type="checkbox"],+input[type="radio"] {+ box-sizing: border-box;+ padding: 0;+}+input[type="number"]::-webkit-inner-spin-button,+input[type="number"]::-webkit-outer-spin-button {+ height: auto;+}+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;+}+fieldset {+ padding: .35em .625em .75em;+ margin: 0 2px;+ border: 1px solid #c0c0c0;+}+legend {+ padding: 0;+ border: 0;+}+textarea {+ overflow: auto;+}+optgroup {+ font-weight: bold;+}+table {+ border-spacing: 0;+ border-collapse: collapse;+}+td,+th {+ padding: 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) ")";+ }+ 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;+ }+ p,+ h2,+ h3 {+ orphans: 3;+ widows: 3;+ }+ h2,+ h3 {+ page-break-after: avoid;+ }+ select {+ background: #fff !important;+ }+ .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;+ }+}+* {+ -webkit-box-sizing: border-box;+ -moz-box-sizing: border-box;+ box-sizing: border-box;+}+*: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.42857143;+ color: #333;+ background-color: #fff;+}+input,+button,+select,+textarea {+ font-family: inherit;+ font-size: inherit;+ line-height: inherit;+}+a {+ color: #428bca;+ text-decoration: none;+}+a:hover,+a:focus {+ color: #2a6496;+ text-decoration: underline;+}+a:focus {+ outline: thin dotted;+ outline: 5px auto -webkit-focus-ring-color;+ outline-offset: -2px;+}+figure {+ margin: 0;+}+img {+ vertical-align: middle;+}+.img-responsive,+.thumbnail > img,+.thumbnail a > img,+.carousel-inner > .item > img,+.carousel-inner > .item > a > img {+ display: block;+ max-width: 100%;+ height: auto;+}+.img-rounded {+ border-radius: 6px;+}+.img-thumbnail {+ display: inline-block;+ max-width: 100%;+ height: auto;+ 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;+}+.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;+}+h1,+h2,+h3,+h4,+h5,+h6,+.h1,+.h2,+.h3,+.h4,+.h5,+.h6 {+ font-family: inherit;+ font-weight: 500;+ line-height: 1.1;+ color: inherit;+}+h1 small,+h2 small,+h3 small,+h4 small,+h5 small,+h6 small,+.h1 small,+.h2 small,+.h3 small,+.h4 small,+.h5 small,+.h6 small,+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,+.h1,+h2,+.h2,+h3,+.h3 {+ margin-top: 20px;+ margin-bottom: 10px;+}+h1 small,+.h1 small,+h2 small,+.h2 small,+h3 small,+.h3 small,+h1 .small,+.h1 .small,+h2 .small,+.h2 .small,+h3 .small,+.h3 .small {+ font-size: 65%;+}+h4,+.h4,+h5,+.h5,+h6,+.h6 {+ margin-top: 10px;+ margin-bottom: 10px;+}+h4 small,+.h4 small,+h5 small,+.h5 small,+h6 small,+.h6 small,+h4 .small,+.h4 .small,+h5 .small,+.h5 .small,+h6 .small,+.h6 .small {+ font-size: 75%;+}+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;+}+p {+ margin: 0 0 10px;+}+.lead {+ margin-bottom: 20px;+ font-size: 16px;+ font-weight: 200;+ line-height: 1.4;+}+@media (min-width: 768px) {+ .lead {+ font-size: 21px;+ }+}+small,+.small {+ font-size: 85%;+}+cite {+ font-style: normal;+}+.text-left {+ text-align: left;+}+.text-right {+ text-align: right;+}+.text-center {+ text-align: center;+}+.text-justify {+ text-align: justify;+}+.text-muted {+ color: #999;+}+.text-primary {+ color: #428bca;+}+a.text-primary:hover {+ color: #3071a9;+}+.text-success {+ color: #3c763d;+}+a.text-success:hover {+ color: #2b542c;+}+.text-info {+ color: #31708f;+}+a.text-info:hover {+ color: #245269;+}+.text-warning {+ color: #8a6d3b;+}+a.text-warning:hover {+ color: #66512c;+}+.text-danger {+ color: #a94442;+}+a.text-danger:hover {+ color: #843534;+}+.bg-primary {+ color: #fff;+ background-color: #428bca;+}+a.bg-primary:hover {+ background-color: #3071a9;+}+.bg-success {+ background-color: #dff0d8;+}+a.bg-success:hover {+ background-color: #c1e2b3;+}+.bg-info {+ background-color: #d9edf7;+}+a.bg-info:hover {+ background-color: #afd9ee;+}+.bg-warning {+ background-color: #fcf8e3;+}+a.bg-warning:hover {+ background-color: #f7ecb5;+}+.bg-danger {+ background-color: #f2dede;+}+a.bg-danger:hover {+ background-color: #e4b9b9;+}+.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;+ margin-left: -5px;+ list-style: none;+}+.list-inline > li {+ display: inline-block;+ padding-right: 5px;+ padding-left: 5px;+}+dl {+ margin-top: 0;+ margin-bottom: 20px;+}+dt,+dd {+ line-height: 1.42857143;+}+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;+ }+}+abbr[title],+abbr[data-original-title] {+ cursor: help;+ border-bottom: 1px dotted #999;+}+.initialism {+ font-size: 90%;+ text-transform: uppercase;+}+blockquote {+ padding: 10px 20px;+ margin: 0 0 20px;+ font-size: 17.5px;+ border-left: 5px solid #eee;+}+blockquote p:last-child,+blockquote ul:last-child,+blockquote ol:last-child {+ margin-bottom: 0;+}+blockquote footer,+blockquote small,+blockquote .small {+ display: block;+ font-size: 80%;+ line-height: 1.42857143;+ color: #999;+}+blockquote footer:before,+blockquote small:before,+blockquote .small:before {+ content: '\2014 \00A0';+}+.blockquote-reverse,+blockquote.pull-right {+ padding-right: 15px;+ padding-left: 0;+ text-align: right;+ border-right: 5px solid #eee;+ border-left: 0;+}+.blockquote-reverse footer:before,+blockquote.pull-right footer:before,+.blockquote-reverse small:before,+blockquote.pull-right small:before,+.blockquote-reverse .small:before,+blockquote.pull-right .small:before {+ content: '';+}+.blockquote-reverse footer:after,+blockquote.pull-right footer:after,+.blockquote-reverse small:after,+blockquote.pull-right small:after,+.blockquote-reverse .small:after,+blockquote.pull-right .small:after {+ content: '\00A0 \2014';+}+blockquote:before,+blockquote:after {+ content: "";+}+address {+ margin-bottom: 20px;+ font-style: normal;+ line-height: 1.42857143;+}+code,+kbd,+pre,+samp {+ font-family: Menlo, Monaco, Consolas, "Courier New", monospace;+}+code {+ padding: 2px 4px;+ font-size: 90%;+ color: #c7254e;+ white-space: nowrap;+ background-color: #f9f2f4;+ border-radius: 4px;+}+kbd {+ padding: 2px 4px;+ font-size: 90%;+ color: #fff;+ background-color: #333;+ border-radius: 3px;+ box-shadow: inset 0 -1px 0 rgba(0, 0, 0, .25);+}+pre {+ display: block;+ padding: 9.5px;+ margin: 0 0 10px;+ font-size: 13px;+ line-height: 1.42857143;+ color: #333;+ word-break: break-all;+ word-wrap: break-word;+ background-color: #f5f5f5;+ border: 1px solid #ccc;+ border-radius: 4px;+}+pre code {+ padding: 0;+ font-size: inherit;+ color: inherit;+ white-space: pre-wrap;+ background-color: transparent;+ border-radius: 0;+}+.pre-scrollable {+ max-height: 340px;+ overflow-y: scroll;+}+.container {+ padding-right: 15px;+ padding-left: 15px;+ margin-right: auto;+ margin-left: auto;+}+@media (min-width: 768px) {+ .container {+ width: 750px;+ }+}+@media (min-width: 992px) {+ .container {+ width: 970px;+ }+}+@media (min-width: 1200px) {+ .container {+ width: 1170px;+ }+}+.container-fluid {+ padding-right: 15px;+ padding-left: 15px;+ margin-right: auto;+ margin-left: auto;+}+.row {+ margin-right: -15px;+ margin-left: -15px;+}+.col-xs-1, .col-sm-1, .col-md-1, .col-lg-1, .col-xs-2, .col-sm-2, .col-md-2, .col-lg-2, .col-xs-3, .col-sm-3, .col-md-3, .col-lg-3, .col-xs-4, .col-sm-4, .col-md-4, .col-lg-4, .col-xs-5, .col-sm-5, .col-md-5, .col-lg-5, .col-xs-6, .col-sm-6, .col-md-6, .col-lg-6, .col-xs-7, .col-sm-7, .col-md-7, .col-lg-7, .col-xs-8, .col-sm-8, .col-md-8, .col-lg-8, .col-xs-9, .col-sm-9, .col-md-9, .col-lg-9, .col-xs-10, .col-sm-10, .col-md-10, .col-lg-10, .col-xs-11, .col-sm-11, .col-md-11, .col-lg-11, .col-xs-12, .col-sm-12, .col-md-12, .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, .col-xs-12 {+ float: left;+}+.col-xs-12 {+ width: 100%;+}+.col-xs-11 {+ width: 91.66666667%;+}+.col-xs-10 {+ width: 83.33333333%;+}+.col-xs-9 {+ width: 75%;+}+.col-xs-8 {+ width: 66.66666667%;+}+.col-xs-7 {+ width: 58.33333333%;+}+.col-xs-6 {+ width: 50%;+}+.col-xs-5 {+ width: 41.66666667%;+}+.col-xs-4 {+ width: 33.33333333%;+}+.col-xs-3 {+ width: 25%;+}+.col-xs-2 {+ width: 16.66666667%;+}+.col-xs-1 {+ width: 8.33333333%;+}+.col-xs-pull-12 {+ right: 100%;+}+.col-xs-pull-11 {+ right: 91.66666667%;+}+.col-xs-pull-10 {+ right: 83.33333333%;+}+.col-xs-pull-9 {+ right: 75%;+}+.col-xs-pull-8 {+ right: 66.66666667%;+}+.col-xs-pull-7 {+ right: 58.33333333%;+}+.col-xs-pull-6 {+ right: 50%;+}+.col-xs-pull-5 {+ right: 41.66666667%;+}+.col-xs-pull-4 {+ right: 33.33333333%;+}+.col-xs-pull-3 {+ right: 25%;+}+.col-xs-pull-2 {+ right: 16.66666667%;+}+.col-xs-pull-1 {+ right: 8.33333333%;+}+.col-xs-pull-0 {+ right: 0;+}+.col-xs-push-12 {+ left: 100%;+}+.col-xs-push-11 {+ left: 91.66666667%;+}+.col-xs-push-10 {+ left: 83.33333333%;+}+.col-xs-push-9 {+ left: 75%;+}+.col-xs-push-8 {+ left: 66.66666667%;+}+.col-xs-push-7 {+ left: 58.33333333%;+}+.col-xs-push-6 {+ left: 50%;+}+.col-xs-push-5 {+ left: 41.66666667%;+}+.col-xs-push-4 {+ left: 33.33333333%;+}+.col-xs-push-3 {+ left: 25%;+}+.col-xs-push-2 {+ left: 16.66666667%;+}+.col-xs-push-1 {+ left: 8.33333333%;+}+.col-xs-push-0 {+ left: 0;+}+.col-xs-offset-12 {+ margin-left: 100%;+}+.col-xs-offset-11 {+ margin-left: 91.66666667%;+}+.col-xs-offset-10 {+ margin-left: 83.33333333%;+}+.col-xs-offset-9 {+ margin-left: 75%;+}+.col-xs-offset-8 {+ margin-left: 66.66666667%;+}+.col-xs-offset-7 {+ margin-left: 58.33333333%;+}+.col-xs-offset-6 {+ margin-left: 50%;+}+.col-xs-offset-5 {+ margin-left: 41.66666667%;+}+.col-xs-offset-4 {+ margin-left: 33.33333333%;+}+.col-xs-offset-3 {+ margin-left: 25%;+}+.col-xs-offset-2 {+ margin-left: 16.66666667%;+}+.col-xs-offset-1 {+ margin-left: 8.33333333%;+}+.col-xs-offset-0 {+ margin-left: 0;+}+@media (min-width: 768px) {+ .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 {+ float: left;+ }+ .col-sm-12 {+ width: 100%;+ }+ .col-sm-11 {+ width: 91.66666667%;+ }+ .col-sm-10 {+ width: 83.33333333%;+ }+ .col-sm-9 {+ width: 75%;+ }+ .col-sm-8 {+ width: 66.66666667%;+ }+ .col-sm-7 {+ width: 58.33333333%;+ }+ .col-sm-6 {+ width: 50%;+ }+ .col-sm-5 {+ width: 41.66666667%;+ }+ .col-sm-4 {+ width: 33.33333333%;+ }+ .col-sm-3 {+ width: 25%;+ }+ .col-sm-2 {+ width: 16.66666667%;+ }+ .col-sm-1 {+ width: 8.33333333%;+ }+ .col-sm-pull-12 {+ right: 100%;+ }+ .col-sm-pull-11 {+ right: 91.66666667%;+ }+ .col-sm-pull-10 {+ right: 83.33333333%;+ }+ .col-sm-pull-9 {+ right: 75%;+ }+ .col-sm-pull-8 {+ right: 66.66666667%;+ }+ .col-sm-pull-7 {+ right: 58.33333333%;+ }+ .col-sm-pull-6 {+ right: 50%;+ }+ .col-sm-pull-5 {+ right: 41.66666667%;+ }+ .col-sm-pull-4 {+ right: 33.33333333%;+ }+ .col-sm-pull-3 {+ right: 25%;+ }+ .col-sm-pull-2 {+ right: 16.66666667%;+ }+ .col-sm-pull-1 {+ right: 8.33333333%;+ }+ .col-sm-pull-0 {+ right: 0;+ }+ .col-sm-push-12 {+ left: 100%;+ }+ .col-sm-push-11 {+ left: 91.66666667%;+ }+ .col-sm-push-10 {+ left: 83.33333333%;+ }+ .col-sm-push-9 {+ left: 75%;+ }+ .col-sm-push-8 {+ left: 66.66666667%;+ }+ .col-sm-push-7 {+ left: 58.33333333%;+ }+ .col-sm-push-6 {+ left: 50%;+ }+ .col-sm-push-5 {+ left: 41.66666667%;+ }+ .col-sm-push-4 {+ left: 33.33333333%;+ }+ .col-sm-push-3 {+ left: 25%;+ }+ .col-sm-push-2 {+ left: 16.66666667%;+ }+ .col-sm-push-1 {+ left: 8.33333333%;+ }+ .col-sm-push-0 {+ left: 0;+ }+ .col-sm-offset-12 {+ margin-left: 100%;+ }+ .col-sm-offset-11 {+ margin-left: 91.66666667%;+ }+ .col-sm-offset-10 {+ margin-left: 83.33333333%;+ }+ .col-sm-offset-9 {+ margin-left: 75%;+ }+ .col-sm-offset-8 {+ margin-left: 66.66666667%;+ }+ .col-sm-offset-7 {+ margin-left: 58.33333333%;+ }+ .col-sm-offset-6 {+ margin-left: 50%;+ }+ .col-sm-offset-5 {+ margin-left: 41.66666667%;+ }+ .col-sm-offset-4 {+ margin-left: 33.33333333%;+ }+ .col-sm-offset-3 {+ margin-left: 25%;+ }+ .col-sm-offset-2 {+ margin-left: 16.66666667%;+ }+ .col-sm-offset-1 {+ margin-left: 8.33333333%;+ }+ .col-sm-offset-0 {+ margin-left: 0;+ }+}+@media (min-width: 992px) {+ .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 {+ float: left;+ }+ .col-md-12 {+ width: 100%;+ }+ .col-md-11 {+ width: 91.66666667%;+ }+ .col-md-10 {+ width: 83.33333333%;+ }+ .col-md-9 {+ width: 75%;+ }+ .col-md-8 {+ width: 66.66666667%;+ }+ .col-md-7 {+ width: 58.33333333%;+ }+ .col-md-6 {+ width: 50%;+ }+ .col-md-5 {+ width: 41.66666667%;+ }+ .col-md-4 {+ width: 33.33333333%;+ }+ .col-md-3 {+ width: 25%;+ }+ .col-md-2 {+ width: 16.66666667%;+ }+ .col-md-1 {+ width: 8.33333333%;+ }+ .col-md-pull-12 {+ right: 100%;+ }+ .col-md-pull-11 {+ right: 91.66666667%;+ }+ .col-md-pull-10 {+ right: 83.33333333%;+ }+ .col-md-pull-9 {+ right: 75%;+ }+ .col-md-pull-8 {+ right: 66.66666667%;+ }+ .col-md-pull-7 {+ right: 58.33333333%;+ }+ .col-md-pull-6 {+ right: 50%;+ }+ .col-md-pull-5 {+ right: 41.66666667%;+ }+ .col-md-pull-4 {+ right: 33.33333333%;+ }+ .col-md-pull-3 {+ right: 25%;+ }+ .col-md-pull-2 {+ right: 16.66666667%;+ }+ .col-md-pull-1 {+ right: 8.33333333%;+ }+ .col-md-pull-0 {+ right: 0;+ }+ .col-md-push-12 {+ left: 100%;+ }+ .col-md-push-11 {+ left: 91.66666667%;+ }+ .col-md-push-10 {+ left: 83.33333333%;+ }+ .col-md-push-9 {+ left: 75%;+ }+ .col-md-push-8 {+ left: 66.66666667%;+ }+ .col-md-push-7 {+ left: 58.33333333%;+ }+ .col-md-push-6 {+ left: 50%;+ }+ .col-md-push-5 {+ left: 41.66666667%;+ }+ .col-md-push-4 {+ left: 33.33333333%;+ }+ .col-md-push-3 {+ left: 25%;+ }+ .col-md-push-2 {+ left: 16.66666667%;+ }+ .col-md-push-1 {+ left: 8.33333333%;+ }+ .col-md-push-0 {+ left: 0;+ }+ .col-md-offset-12 {+ margin-left: 100%;+ }+ .col-md-offset-11 {+ margin-left: 91.66666667%;+ }+ .col-md-offset-10 {+ margin-left: 83.33333333%;+ }+ .col-md-offset-9 {+ margin-left: 75%;+ }+ .col-md-offset-8 {+ margin-left: 66.66666667%;+ }+ .col-md-offset-7 {+ margin-left: 58.33333333%;+ }+ .col-md-offset-6 {+ margin-left: 50%;+ }+ .col-md-offset-5 {+ margin-left: 41.66666667%;+ }+ .col-md-offset-4 {+ margin-left: 33.33333333%;+ }+ .col-md-offset-3 {+ margin-left: 25%;+ }+ .col-md-offset-2 {+ margin-left: 16.66666667%;+ }+ .col-md-offset-1 {+ margin-left: 8.33333333%;+ }+ .col-md-offset-0 {+ margin-left: 0;+ }+}+@media (min-width: 1200px) {+ .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 {+ float: left;+ }+ .col-lg-12 {+ width: 100%;+ }+ .col-lg-11 {+ width: 91.66666667%;+ }+ .col-lg-10 {+ width: 83.33333333%;+ }+ .col-lg-9 {+ width: 75%;+ }+ .col-lg-8 {+ width: 66.66666667%;+ }+ .col-lg-7 {+ width: 58.33333333%;+ }+ .col-lg-6 {+ width: 50%;+ }+ .col-lg-5 {+ width: 41.66666667%;+ }+ .col-lg-4 {+ width: 33.33333333%;+ }+ .col-lg-3 {+ width: 25%;+ }+ .col-lg-2 {+ width: 16.66666667%;+ }+ .col-lg-1 {+ width: 8.33333333%;+ }+ .col-lg-pull-12 {+ right: 100%;+ }+ .col-lg-pull-11 {+ right: 91.66666667%;+ }+ .col-lg-pull-10 {+ right: 83.33333333%;+ }+ .col-lg-pull-9 {+ right: 75%;+ }+ .col-lg-pull-8 {+ right: 66.66666667%;+ }+ .col-lg-pull-7 {+ right: 58.33333333%;+ }+ .col-lg-pull-6 {+ right: 50%;+ }+ .col-lg-pull-5 {+ right: 41.66666667%;+ }+ .col-lg-pull-4 {+ right: 33.33333333%;+ }+ .col-lg-pull-3 {+ right: 25%;+ }+ .col-lg-pull-2 {+ right: 16.66666667%;+ }+ .col-lg-pull-1 {+ right: 8.33333333%;+ }+ .col-lg-pull-0 {+ right: 0;+ }+ .col-lg-push-12 {+ left: 100%;+ }+ .col-lg-push-11 {+ left: 91.66666667%;+ }+ .col-lg-push-10 {+ left: 83.33333333%;+ }+ .col-lg-push-9 {+ left: 75%;+ }+ .col-lg-push-8 {+ left: 66.66666667%;+ }+ .col-lg-push-7 {+ left: 58.33333333%;+ }+ .col-lg-push-6 {+ left: 50%;+ }+ .col-lg-push-5 {+ left: 41.66666667%;+ }+ .col-lg-push-4 {+ left: 33.33333333%;+ }+ .col-lg-push-3 {+ left: 25%;+ }+ .col-lg-push-2 {+ left: 16.66666667%;+ }+ .col-lg-push-1 {+ left: 8.33333333%;+ }+ .col-lg-push-0 {+ left: 0;+ }+ .col-lg-offset-12 {+ margin-left: 100%;+ }+ .col-lg-offset-11 {+ margin-left: 91.66666667%;+ }+ .col-lg-offset-10 {+ margin-left: 83.33333333%;+ }+ .col-lg-offset-9 {+ margin-left: 75%;+ }+ .col-lg-offset-8 {+ margin-left: 66.66666667%;+ }+ .col-lg-offset-7 {+ margin-left: 58.33333333%;+ }+ .col-lg-offset-6 {+ margin-left: 50%;+ }+ .col-lg-offset-5 {+ margin-left: 41.66666667%;+ }+ .col-lg-offset-4 {+ margin-left: 33.33333333%;+ }+ .col-lg-offset-3 {+ margin-left: 25%;+ }+ .col-lg-offset-2 {+ margin-left: 16.66666667%;+ }+ .col-lg-offset-1 {+ margin-left: 8.33333333%;+ }+ .col-lg-offset-0 {+ margin-left: 0;+ }+}+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.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 > 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-"] {+ position: static;+ display: table-column;+ float: none;+}+table td[class*="col-"],+table th[class*="col-"] {+ position: static;+ 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-hover > tbody > tr > td.active:hover,+.table-hover > tbody > tr > th.active:hover,+.table-hover > tbody > tr.active:hover > td,+.table-hover > tbody > tr.active:hover > th {+ background-color: #e8e8e8;+}+.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;+}+.table-hover > tbody > tr > td.success:hover,+.table-hover > tbody > tr > th.success:hover,+.table-hover > tbody > tr.success:hover > td,+.table-hover > tbody > tr.success:hover > th {+ background-color: #d0e9c6;+}+.table > thead > tr > td.info,+.table > tbody > tr > td.info,+.table > tfoot > tr > td.info,+.table > thead > tr > th.info,+.table > tbody > tr > th.info,+.table > tfoot > tr > th.info,+.table > thead > tr.info > td,+.table > tbody > tr.info > td,+.table > tfoot > tr.info > td,+.table > thead > tr.info > th,+.table > tbody > tr.info > th,+.table > tfoot > tr.info > th {+ background-color: #d9edf7;+}+.table-hover > tbody > tr > td.info:hover,+.table-hover > tbody > tr > th.info:hover,+.table-hover > tbody > tr.info:hover > td,+.table-hover > tbody > tr.info:hover > th {+ background-color: #c4e3f3;+}+.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;+}+.table-hover > tbody > tr > td.warning:hover,+.table-hover > tbody > tr > th.warning:hover,+.table-hover > tbody > tr.warning:hover > td,+.table-hover > tbody > tr.warning:hover > th {+ background-color: #faf2cc;+}+.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;+}+.table-hover > tbody > tr > td.danger:hover,+.table-hover > tbody > tr > th.danger:hover,+.table-hover > tbody > tr.danger:hover > td,+.table-hover > tbody > tr.danger:hover > th {+ background-color: #ebcccc;+}+@media (max-width: 767px) {+ .table-responsive {+ width: 100%;+ margin-bottom: 15px;+ overflow-x: scroll;+ overflow-y: hidden;+ -webkit-overflow-scrolling: touch;+ -ms-overflow-style: -ms-autohiding-scrollbar;+ border: 1px solid #ddd;+ }+ .table-responsive > .table {+ margin-bottom: 0;+ }+ .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 > tbody > tr:last-child > th,+ .table-responsive > .table-bordered > tfoot > tr:last-child > th,+ .table-responsive > .table-bordered > tbody > tr:last-child > td,+ .table-responsive > .table-bordered > tfoot > tr:last-child > td {+ border-bottom: 0;+ }+}+fieldset {+ min-width: 0;+ 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;+ /* IE8-9 */+ line-height: normal;+}+input[type="file"] {+ display: block;+}+input[type="range"] {+ display: block;+ width: 100%;+}+select[multiple],+select[size] {+ height: auto;+}+input[type="file"]:focus,+input[type="radio"]:focus,+input[type="checkbox"]:focus {+ outline: thin dotted;+ outline: 5px auto -webkit-focus-ring-color;+ outline-offset: -2px;+}+output {+ display: block;+ padding-top: 7px;+ font-size: 14px;+ line-height: 1.42857143;+ color: #555;+}+.form-control {+ display: block;+ width: 100%;+ height: 34px;+ padding: 6px 12px;+ font-size: 14px;+ line-height: 1.42857143;+ color: #555;+ background-color: #fff;+ background-image: none;+ 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::-moz-placeholder {+ color: #999;+ opacity: 1;+}+.form-control:-ms-input-placeholder {+ color: #999;+}+.form-control::-webkit-input-placeholder {+ color: #999;+}+.form-control[disabled],+.form-control[readonly],+fieldset[disabled] .form-control {+ cursor: not-allowed;+ background-color: #eee;+ opacity: 1;+}+textarea.form-control {+ height: auto;+}+input[type="search"] {+ -webkit-appearance: none;+}+input[type="date"] {+ line-height: 34px;+}+.form-group {+ margin-bottom: 15px;+}+.radio,+.checkbox {+ display: block;+ min-height: 20px;+ padding-left: 20px;+ margin-top: 10px;+ margin-bottom: 10px;+}+.radio label,+.checkbox label {+ display: inline;+ 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,+select[multiple].input-sm {+ height: auto;+}+.input-lg {+ height: 46px;+ padding: 10px 16px;+ font-size: 18px;+ line-height: 1.33;+ border-radius: 6px;+}+select.input-lg {+ height: 46px;+ line-height: 46px;+}+textarea.input-lg,+select[multiple].input-lg {+ height: auto;+}+.has-feedback {+ position: relative;+}+.has-feedback .form-control {+ padding-right: 42.5px;+}+.has-feedback .form-control-feedback {+ position: absolute;+ top: 25px;+ right: 0;+ display: block;+ width: 34px;+ height: 34px;+ line-height: 34px;+ text-align: center;+}+.has-success .help-block,+.has-success .control-label,+.has-success .radio,+.has-success .checkbox,+.has-success .radio-inline,+.has-success .checkbox-inline {+ color: #3c763d;+}+.has-success .form-control {+ border-color: #3c763d;+ -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: #2b542c;+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #67b168;+}+.has-success .input-group-addon {+ color: #3c763d;+ background-color: #dff0d8;+ border-color: #3c763d;+}+.has-success .form-control-feedback {+ color: #3c763d;+}+.has-warning .help-block,+.has-warning .control-label,+.has-warning .radio,+.has-warning .checkbox,+.has-warning .radio-inline,+.has-warning .checkbox-inline {+ color: #8a6d3b;+}+.has-warning .form-control {+ border-color: #8a6d3b;+ -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: #66512c;+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #c0a16b;+}+.has-warning .input-group-addon {+ color: #8a6d3b;+ background-color: #fcf8e3;+ border-color: #8a6d3b;+}+.has-warning .form-control-feedback {+ color: #8a6d3b;+}+.has-error .help-block,+.has-error .control-label,+.has-error .radio,+.has-error .checkbox,+.has-error .radio-inline,+.has-error .checkbox-inline {+ color: #a94442;+}+.has-error .form-control {+ border-color: #a94442;+ -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: #843534;+ -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075), 0 0 6px #ce8483;+}+.has-error .input-group-addon {+ color: #a94442;+ background-color: #f2dede;+ border-color: #a94442;+}+.has-error .form-control-feedback {+ color: #a94442;+}+.form-control-static {+ 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;+ width: auto;+ vertical-align: middle;+ }+ .form-inline .input-group > .form-control {+ width: 100%;+ }+ .form-inline .control-label {+ margin-bottom: 0;+ vertical-align: middle;+ }+ .form-inline .radio,+ .form-inline .checkbox {+ display: inline-block;+ padding-left: 0;+ margin-top: 0;+ margin-bottom: 0;+ vertical-align: middle;+ }+ .form-inline .radio input[type="radio"],+ .form-inline .checkbox input[type="checkbox"] {+ float: none;+ margin-left: 0;+ }+ .form-inline .has-feedback .form-control-feedback {+ top: 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 .radio,+.form-horizontal .checkbox {+ min-height: 27px;+}+.form-horizontal .form-group {+ margin-right: -15px;+ margin-left: -15px;+}+.form-horizontal .form-control-static {+ padding-top: 7px;+}+@media (min-width: 768px) {+ .form-horizontal .control-label {+ text-align: right;+ }+}+.form-horizontal .has-feedback .form-control-feedback {+ top: 0;+ right: 15px;+}+.btn {+ display: inline-block;+ padding: 6px 12px;+ margin-bottom: 0;+ font-size: 14px;+ font-weight: normal;+ line-height: 1.42857143;+ text-align: center;+ white-space: nowrap;+ vertical-align: middle;+ cursor: pointer;+ -webkit-user-select: none;+ -moz-user-select: none;+ -ms-user-select: none;+ user-select: none;+ background-image: none;+ border: 1px solid transparent;+ border-radius: 4px;+}+.btn:focus,+.btn:active:focus,+.btn.active:focus {+ outline: thin dotted;+ 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, .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;+ filter: alpha(opacity=65);+ -webkit-box-shadow: none;+ box-shadow: none;+ opacity: .65;+}+.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-default .badge {+ color: #fff;+ background-color: #333;+}+.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-primary .badge {+ color: #428bca;+ background-color: #fff;+}+.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-success .badge {+ color: #5cb85c;+ background-color: #fff;+}+.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-info .badge {+ color: #5bc0de;+ background-color: #fff;+}+.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-warning .badge {+ color: #f0ad4e;+ background-color: #fff;+}+.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-danger .badge {+ color: #d9534f;+ background-color: #fff;+}+.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,+.btn-group-lg > .btn {+ padding: 10px 16px;+ font-size: 18px;+ line-height: 1.33;+ border-radius: 6px;+}+.btn-sm,+.btn-group-sm > .btn {+ padding: 5px 10px;+ font-size: 12px;+ line-height: 1.5;+ border-radius: 3px;+}+.btn-xs,+.btn-group-xs > .btn {+ padding: 1px 5px;+ font-size: 12px;+ line-height: 1.5;+ border-radius: 3px;+}+.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';+ font-style: normal;+ font-weight: normal;+ line-height: 1;++ -webkit-font-smoothing: antialiased;+ -moz-osx-font-smoothing: grayscale;+}+.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-lock:before {+ content: "\e033";+}+.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-bookmark:before {+ content: "\e044";+}+.glyphicon-print:before {+ content: "\e045";+}+.glyphicon-camera:before {+ content: "\e046";+}+.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-fire:before {+ content: "\e104";+}+.glyphicon-eye-open:before {+ content: "\e105";+}+.glyphicon-eye-close:before {+ content: "\e106";+}+.glyphicon-warning-sign:before {+ content: "\e107";+}+.glyphicon-plane:before {+ content: "\e108";+}+.glyphicon-calendar:before {+ content: "\e109";+}+.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-bell:before {+ content: "\e123";+}+.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-wrench:before {+ content: "\e136";+}+.glyphicon-tasks:before {+ content: "\e137";+}+.glyphicon-filter:before {+ content: "\e138";+}+.glyphicon-briefcase:before {+ content: "\e139";+}+.glyphicon-fullscreen:before {+ content: "\e140";+}+.glyphicon-dashboard:before {+ content: "\e141";+}+.glyphicon-paperclip:before {+ content: "\e142";+}+.glyphicon-heart-empty:before {+ content: "\e143";+}+.glyphicon-link:before {+ content: "\e144";+}+.glyphicon-phone:before {+ content: "\e145";+}+.glyphicon-pushpin:before {+ content: "\e146";+}+.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";+}+.caret {+ display: inline-block;+ width: 0;+ height: 0;+ margin-left: 2px;+ vertical-align: middle;+ border-top: 4px solid;+ border-right: 4px solid transparent;+ border-left: 4px solid transparent;+}+.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;+ background-clip: padding-box;+ 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);+}+.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.42857143;+ color: #333;+ white-space: nowrap;+}+.dropdown-menu > li > a:hover,+.dropdown-menu > li > a:focus {+ color: #262626;+ text-decoration: none;+ background-color: #f5f5f5;+}+.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-menu-right {+ right: 0;+ left: auto;+}+.dropdown-menu-left {+ right: auto;+ left: 0;+}+.dropdown-header {+ display: block;+ padding: 3px 20px;+ font-size: 12px;+ line-height: 1.42857143;+ 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 {+ content: "";+ border-top: 0;+ border-bottom: 4px solid;+}+.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;+ }+ .navbar-right .dropdown-menu-left {+ right: auto;+ left: 0;+ }+}+.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: none;+}+.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 {+ margin-left: -5px;+}+.btn-toolbar .btn-group,+.btn-toolbar .input-group {+ float: left;+}+.btn-toolbar > .btn,+.btn-toolbar > .btn-group,+.btn-toolbar > .input-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-top-left-radius: 0;+ border-bottom-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-top-left-radius: 0;+ border-bottom-left-radius: 0;+}+.btn-group .dropdown-toggle:active,+.btn-group.open .dropdown-toggle {+ outline: 0;+}+.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-group.open .dropdown-toggle.btn-link {+ -webkit-box-shadow: none;+ box-shadow: none;+}+.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,+.btn-group-vertical > .btn-group > .btn {+ display: block;+ float: none;+ width: 100%;+ max-width: 100%;+}+.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-left-radius: 0;+ border-top-right-radius: 0;+ border-bottom-left-radius: 4px;+}+.btn-group-vertical > .btn-group:not(:first-child):not(:last-child) > .btn {+ border-radius: 0;+}+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .btn:last-child,+.btn-group-vertical > .btn-group:first-child:not(:last-child) > .dropdown-toggle {+ border-bottom-right-radius: 0;+ border-bottom-left-radius: 0;+}+.btn-group-vertical > .btn-group:last-child:not(:first-child) > .btn:first-child {+ border-top-left-radius: 0;+ border-top-right-radius: 0;+}+.btn-group-justified {+ display: table;+ width: 100%;+ table-layout: fixed;+ border-collapse: separate;+}+.btn-group-justified > .btn,+.btn-group-justified > .btn-group {+ display: table-cell;+ float: none;+ width: 1%;+}+.btn-group-justified > .btn-group .btn {+ width: 100%;+}+[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[class*="col-"] {+ float: none;+ padding-right: 0;+ padding-left: 0;+}+.input-group .form-control {+ position: relative;+ z-index: 2;+ float: left;+ width: 100%;+ margin-bottom: 0;+}+.input-group-lg > .form-control,+.input-group-lg > .input-group-addon,+.input-group-lg > .input-group-btn > .btn {+ height: 46px;+ 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: 46px;+ line-height: 46px;+}+textarea.input-group-lg > .form-control,+textarea.input-group-lg > .input-group-addon,+textarea.input-group-lg > .input-group-btn > .btn,+select[multiple].input-group-lg > .form-control,+select[multiple].input-group-lg > .input-group-addon,+select[multiple].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,+select[multiple].input-group-sm > .form-control,+select[multiple].input-group-sm > .input-group-addon,+select[multiple].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;+ color: #555;+ 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 > .btn-group > .btn,+.input-group-btn:first-child > .dropdown-toggle,+.input-group-btn:last-child > .btn:not(:last-child):not(.dropdown-toggle),+.input-group-btn:last-child > .btn-group:not(:last-child) > .btn {+ 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 > .btn-group > .btn,+.input-group-btn:last-child > .dropdown-toggle,+.input-group-btn:first-child > .btn:not(:first-child),+.input-group-btn:first-child > .btn-group:not(:first-child) > .btn {+ border-top-left-radius: 0;+ border-bottom-left-radius: 0;+}+.input-group-addon:last-child {+ border-left: 0;+}+.input-group-btn {+ position: relative;+ font-size: 0;+ white-space: nowrap;+}+.input-group-btn > .btn {+ position: relative;+}+.input-group-btn > .btn + .btn {+ margin-left: -1px;+}+.input-group-btn > .btn:hover,+.input-group-btn > .btn:focus,+.input-group-btn > .btn:active {+ z-index: 2;+}+.input-group-btn:first-child > .btn,+.input-group-btn:first-child > .btn-group {+ margin-right: -1px;+}+.input-group-btn:last-child > .btn,+.input-group-btn:last-child > .btn-group {+ margin-left: -1px;+}+.nav {+ padding-left: 0;+ margin-bottom: 0;+ list-style: none;+}+.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.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: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 {+ margin-bottom: 5px;+ text-align: center;+}+.nav-tabs.nav-justified > .dropdown .dropdown-menu {+ top: auto;+ left: auto;+}+@media (min-width: 768px) {+ .nav-tabs.nav-justified > li {+ display: table-cell;+ width: 1%;+ }+ .nav-tabs.nav-justified > li > a {+ margin-bottom: 0;+ }+}+.nav-tabs.nav-justified > li > a {+ margin-right: 0;+ border-radius: 4px;+}+.nav-tabs.nav-justified > .active > a,+.nav-tabs.nav-justified > .active > a:hover,+.nav-tabs.nav-justified > .active > a:focus {+ border: 1px solid #ddd;+}+@media (min-width: 768px) {+ .nav-tabs.nav-justified > li > a {+ border-bottom: 1px solid #ddd;+ border-radius: 4px 4px 0 0;+ }+ .nav-tabs.nav-justified > .active > a,+ .nav-tabs.nav-justified > .active > a:hover,+ .nav-tabs.nav-justified > .active > a:focus {+ border-bottom-color: #fff;+ }+}+.nav-pills > li {+ float: left;+}+.nav-pills > li > a {+ border-radius: 4px;+}+.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 {+ margin-bottom: 5px;+ text-align: center;+}+.nav-justified > .dropdown .dropdown-menu {+ top: auto;+ left: auto;+}+@media (min-width: 768px) {+ .nav-justified > li {+ display: table-cell;+ width: 1%;+ }+ .nav-justified > li > a {+ margin-bottom: 0;+ }+}+.nav-tabs-justified {+ border-bottom: 0;+}+.nav-tabs-justified > li > a {+ margin-right: 0;+ border-radius: 4px;+}+.nav-tabs-justified > .active > a,+.nav-tabs-justified > .active > a:hover,+.nav-tabs-justified > .active > a:focus {+ border: 1px solid #ddd;+}+@media (min-width: 768px) {+ .nav-tabs-justified > li > a {+ border-bottom: 1px solid #ddd;+ border-radius: 4px 4px 0 0;+ }+ .nav-tabs-justified > .active > a,+ .nav-tabs-justified > .active > a:hover,+ .nav-tabs-justified > .active > a:focus {+ border-bottom-color: #fff;+ }+}+.tab-content > .tab-pane {+ display: none;+}+.tab-content > .active {+ display: block;+}+.nav-tabs .dropdown-menu {+ margin-top: -1px;+ border-top-left-radius: 0;+ border-top-right-radius: 0;+}+.navbar {+ position: relative;+ min-height: 50px;+ margin-bottom: 20px;+ border: 1px solid transparent;+}+@media (min-width: 768px) {+ .navbar {+ border-radius: 4px;+ }+}+@media (min-width: 768px) {+ .navbar-header {+ float: left;+ }+}+.navbar-collapse {+ max-height: 340px;+ padding-right: 15px;+ padding-left: 15px;+ overflow-x: visible;+ -webkit-overflow-scrolling: touch;+ border-top: 1px solid transparent;+ box-shadow: inset 0 1px 0 rgba(255, 255, 255, .1);+}+.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-fixed-top .navbar-collapse,+ .navbar-static-top .navbar-collapse,+ .navbar-fixed-bottom .navbar-collapse {+ padding-right: 0;+ padding-left: 0;+ }+}+.container > .navbar-header,+.container-fluid > .navbar-header,+.container > .navbar-collapse,+.container-fluid > .navbar-collapse {+ margin-right: -15px;+ margin-left: -15px;+}+@media (min-width: 768px) {+ .container > .navbar-header,+ .container-fluid > .navbar-header,+ .container > .navbar-collapse,+ .container-fluid > .navbar-collapse {+ margin-right: 0;+ margin-left: 0;+ }+}+.navbar-static-top {+ z-index: 1000;+ 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;+ z-index: 1030;+}+@media (min-width: 768px) {+ .navbar-fixed-top,+ .navbar-fixed-bottom {+ border-radius: 0;+ }+}+.navbar-fixed-top {+ top: 0;+ border-width: 0 0 1px;+}+.navbar-fixed-bottom {+ bottom: 0;+ margin-bottom: 0;+ border-width: 1px 0 0;+}+.navbar-brand {+ float: left;+ height: 50px;+ 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,+ .navbar > .container-fluid .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;+ background-image: none;+ border: 1px solid transparent;+ border-radius: 4px;+}+.navbar-toggle:focus {+ outline: none;+}+.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;+ }+ .navbar-nav.navbar-right:last-child {+ margin-right: -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, .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);+}+@media (min-width: 768px) {+ .navbar-form .form-group {+ display: inline-block;+ margin-bottom: 0;+ vertical-align: middle;+ }+ .navbar-form .form-control {+ display: inline-block;+ width: auto;+ vertical-align: middle;+ }+ .navbar-form .input-group > .form-control {+ width: 100%;+ }+ .navbar-form .control-label {+ margin-bottom: 0;+ vertical-align: middle;+ }+ .navbar-form .radio,+ .navbar-form .checkbox {+ display: inline-block;+ padding-left: 0;+ margin-top: 0;+ margin-bottom: 0;+ vertical-align: middle;+ }+ .navbar-form .radio input[type="radio"],+ .navbar-form .checkbox input[type="checkbox"] {+ float: none;+ margin-left: 0;+ }+ .navbar-form .has-feedback .form-control-feedback {+ top: 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-form.navbar-right:last-child {+ margin-right: -15px;+ }+}+.navbar-nav > li > .dropdown-menu {+ margin-top: 0;+ border-top-left-radius: 0;+ border-top-right-radius: 0;+}+.navbar-fixed-bottom .navbar-nav > li > .dropdown-menu {+ border-bottom-right-radius: 0;+ border-bottom-left-radius: 0;+}+.navbar-btn {+ margin-top: 8px;+ margin-bottom: 8px;+}+.navbar-btn.btn-sm {+ margin-top: 10px;+ margin-bottom: 10px;+}+.navbar-btn.btn-xs {+ margin-top: 14px;+ margin-bottom: 14px;+}+.navbar-text {+ margin-top: 15px;+ margin-bottom: 15px;+}+@media (min-width: 768px) {+ .navbar-text {+ float: left;+ margin-right: 15px;+ margin-left: 15px;+ }+ .navbar-text.navbar-right:last-child {+ margin-right: 0;+ }+}+.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: #888;+}+.navbar-default .navbar-collapse,+.navbar-default .navbar-form {+ border-color: #e7e7e7;+}+.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;+}+@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;+}+@media (max-width: 767px) {+ .navbar-inverse .navbar-nav .open .dropdown-menu > .dropdown-header {+ border-color: #080808;+ }+ .navbar-inverse .navbar-nav .open .dropdown-menu .divider {+ background-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.42857143;+ color: #428bca;+ text-decoration: none;+ background-color: #fff;+ border: 1px solid #ddd;+}+.pagination > li:first-child > a,+.pagination > li:first-child > span {+ margin-left: 0;+ border-top-left-radius: 4px;+ border-bottom-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 {+ color: #2a6496;+ background-color: #eee;+ border-color: #ddd;+}+.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 > span:hover,+.pagination > .disabled > span:focus,+.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-top-left-radius: 6px;+ border-bottom-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-top-left-radius: 3px;+ border-bottom-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 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;+}+.btn .label {+ position: relative;+ top: -1px;+}+.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;+}+.btn .badge {+ position: relative;+ top: -1px;+}+.btn-xs .badge {+ top: 0;+ padding: 1px 5px;+}+a.badge:hover,+a.badge:focus {+ color: #fff;+ text-decoration: none;+ cursor: pointer;+}+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;+ color: inherit;+ background-color: #eee;+}+.jumbotron h1,+.jumbotron .h1 {+ color: inherit;+}+.jumbotron p {+ margin-bottom: 15px;+ font-size: 21px;+ font-weight: 200;+}+.container .jumbotron {+ border-radius: 6px;+}+.jumbotron .container {+ max-width: 100%;+}+@media screen and (min-width: 768px) {+ .jumbotron {+ padding-top: 48px;+ padding-bottom: 48px;+ }+ .container .jumbotron {+ padding-right: 60px;+ padding-left: 60px;+ }+ .jumbotron h1,+ .jumbotron .h1 {+ font-size: 63px;+ }+}+.thumbnail {+ display: block;+ padding: 4px;+ margin-bottom: 20px;+ 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,+.thumbnail a > img {+ margin-right: auto;+ margin-left: auto;+}+a.thumbnail:hover,+a.thumbnail:focus,+a.thumbnail.active {+ border-color: #428bca;+}+.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: #3c763d;+ background-color: #dff0d8;+ border-color: #d6e9c6;+}+.alert-success hr {+ border-top-color: #c9e2b3;+}+.alert-success .alert-link {+ color: #2b542c;+}+.alert-info {+ color: #31708f;+ background-color: #d9edf7;+ border-color: #bce8f1;+}+.alert-info hr {+ border-top-color: #a6e1ec;+}+.alert-info .alert-link {+ color: #245269;+}+.alert-warning {+ color: #8a6d3b;+ background-color: #fcf8e3;+ border-color: #faebcc;+}+.alert-warning hr {+ border-top-color: #f7e1b5;+}+.alert-warning .alert-link {+ color: #66512c;+}+.alert-danger {+ color: #a94442;+ background-color: #f2dede;+ border-color: #ebccd1;+}+.alert-danger hr {+ border-top-color: #e4b9c0;+}+.alert-danger .alert-link {+ color: #843534;+}+@-webkit-keyframes progress-bar-stripes {+ from {+ background-position: 40px 0;+ }+ to {+ background-position: 0 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, .1);+ box-shadow: inset 0 1px 2px rgba(0, 0, 0, .1);+}+.progress-bar {+ float: left;+ width: 0;+ height: 100%;+ font-size: 12px;+ line-height: 20px;+ 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-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;+ animation: progress-bar-stripes 2s linear infinite;+}+.progress-bar-success {+ background-color: #5cb85c;+}+.progress-striped .progress-bar-success {+ 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: 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: -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: 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: -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: 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-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;+}+.list-group-item:first-child {+ border-top-left-radius: 4px;+ border-top-right-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;+}+a.list-group-item.active,+a.list-group-item.active:hover,+a.list-group-item.active:focus {+ z-index: 2;+ color: #fff;+ background-color: #428bca;+ border-color: #428bca;+}+a.list-group-item.active .list-group-item-heading,+a.list-group-item.active:hover .list-group-item-heading,+a.list-group-item.active:focus .list-group-item-heading {+ color: inherit;+}+a.list-group-item.active .list-group-item-text,+a.list-group-item.active:hover .list-group-item-text,+a.list-group-item.active:focus .list-group-item-text {+ color: #e1edf7;+}+.list-group-item-success {+ color: #3c763d;+ background-color: #dff0d8;+}+a.list-group-item-success {+ color: #3c763d;+}+a.list-group-item-success .list-group-item-heading {+ color: inherit;+}+a.list-group-item-success:hover,+a.list-group-item-success:focus {+ color: #3c763d;+ background-color: #d0e9c6;+}+a.list-group-item-success.active,+a.list-group-item-success.active:hover,+a.list-group-item-success.active:focus {+ color: #fff;+ background-color: #3c763d;+ border-color: #3c763d;+}+.list-group-item-info {+ color: #31708f;+ background-color: #d9edf7;+}+a.list-group-item-info {+ color: #31708f;+}+a.list-group-item-info .list-group-item-heading {+ color: inherit;+}+a.list-group-item-info:hover,+a.list-group-item-info:focus {+ color: #31708f;+ background-color: #c4e3f3;+}+a.list-group-item-info.active,+a.list-group-item-info.active:hover,+a.list-group-item-info.active:focus {+ color: #fff;+ background-color: #31708f;+ border-color: #31708f;+}+.list-group-item-warning {+ color: #8a6d3b;+ background-color: #fcf8e3;+}+a.list-group-item-warning {+ color: #8a6d3b;+}+a.list-group-item-warning .list-group-item-heading {+ color: inherit;+}+a.list-group-item-warning:hover,+a.list-group-item-warning:focus {+ color: #8a6d3b;+ background-color: #faf2cc;+}+a.list-group-item-warning.active,+a.list-group-item-warning.active:hover,+a.list-group-item-warning.active:focus {+ color: #fff;+ background-color: #8a6d3b;+ border-color: #8a6d3b;+}+.list-group-item-danger {+ color: #a94442;+ background-color: #f2dede;+}+a.list-group-item-danger {+ color: #a94442;+}+a.list-group-item-danger .list-group-item-heading {+ color: inherit;+}+a.list-group-item-danger:hover,+a.list-group-item-danger:focus {+ color: #a94442;+ background-color: #ebcccc;+}+a.list-group-item-danger.active,+a.list-group-item-danger.active:hover,+a.list-group-item-danger.active:focus {+ color: #fff;+ background-color: #a94442;+ border-color: #a94442;+}+.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-body {+ padding: 15px;+}+.panel-heading {+ padding: 10px 15px;+ border-bottom: 1px solid transparent;+ border-top-left-radius: 3px;+ border-top-right-radius: 3px;+}+.panel-heading > .dropdown .dropdown-toggle {+ color: inherit;+}+.panel-title {+ margin-top: 0;+ margin-bottom: 0;+ font-size: 16px;+ color: inherit;+}+.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 > .list-group {+ margin-bottom: 0;+}+.panel > .list-group .list-group-item {+ border-width: 1px 0;+ border-radius: 0;+}+.panel > .list-group:first-child .list-group-item:first-child {+ border-top: 0;+ border-top-left-radius: 3px;+ border-top-right-radius: 3px;+}+.panel > .list-group:last-child .list-group-item:last-child {+ border-bottom: 0;+ border-bottom-right-radius: 3px;+ border-bottom-left-radius: 3px;+}+.panel-heading + .list-group .list-group-item:first-child {+ border-top-width: 0;+}+.panel > .table,+.panel > .table-responsive > .table {+ margin-bottom: 0;+}+.panel > .table:first-child,+.panel > .table-responsive:first-child > .table:first-child {+ border-top-left-radius: 3px;+ border-top-right-radius: 3px;+}+.panel > .table:first-child > thead:first-child > tr:first-child td:first-child,+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:first-child,+.panel > .table:first-child > tbody:first-child > tr:first-child td:first-child,+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:first-child,+.panel > .table:first-child > thead:first-child > tr:first-child th:first-child,+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:first-child,+.panel > .table:first-child > tbody:first-child > tr:first-child th:first-child,+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:first-child {+ border-top-left-radius: 3px;+}+.panel > .table:first-child > thead:first-child > tr:first-child td:last-child,+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child td:last-child,+.panel > .table:first-child > tbody:first-child > tr:first-child td:last-child,+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child td:last-child,+.panel > .table:first-child > thead:first-child > tr:first-child th:last-child,+.panel > .table-responsive:first-child > .table:first-child > thead:first-child > tr:first-child th:last-child,+.panel > .table:first-child > tbody:first-child > tr:first-child th:last-child,+.panel > .table-responsive:first-child > .table:first-child > tbody:first-child > tr:first-child th:last-child {+ border-top-right-radius: 3px;+}+.panel > .table:last-child,+.panel > .table-responsive:last-child > .table:last-child {+ border-bottom-right-radius: 3px;+ border-bottom-left-radius: 3px;+}+.panel > .table:last-child > tbody:last-child > tr:last-child td:first-child,+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:first-child,+.panel > .table:last-child > tfoot:last-child > tr:last-child td:first-child,+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:first-child,+.panel > .table:last-child > tbody:last-child > tr:last-child th:first-child,+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:first-child,+.panel > .table:last-child > tfoot:last-child > tr:last-child th:first-child,+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:first-child {+ border-bottom-left-radius: 3px;+}+.panel > .table:last-child > tbody:last-child > tr:last-child td:last-child,+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child td:last-child,+.panel > .table:last-child > tfoot:last-child > tr:last-child td:last-child,+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child td:last-child,+.panel > .table:last-child > tbody:last-child > tr:last-child th:last-child,+.panel > .table-responsive:last-child > .table:last-child > tbody:last-child > tr:last-child th:last-child,+.panel > .table:last-child > tfoot:last-child > tr:last-child th:last-child,+.panel > .table-responsive:last-child > .table:last-child > tfoot:last-child > tr:last-child th:last-child {+ border-bottom-right-radius: 3px;+}+.panel > .panel-body + .table,+.panel > .panel-body + .table-responsive {+ border-top: 1px solid #ddd;+}+.panel > .table > tbody:first-child > tr:first-child th,+.panel > .table > tbody:first-child > tr:first-child td {+ border-top: 0;+}+.panel > .table-bordered,+.panel > .table-responsive > .table-bordered {+ border: 0;+}+.panel > .table-bordered > thead > tr > th:first-child,+.panel > .table-responsive > .table-bordered > thead > tr > th:first-child,+.panel > .table-bordered > tbody > tr > th:first-child,+.panel > .table-responsive > .table-bordered > tbody > tr > th:first-child,+.panel > .table-bordered > tfoot > tr > th:first-child,+.panel > .table-responsive > .table-bordered > tfoot > tr > th:first-child,+.panel > .table-bordered > thead > tr > td:first-child,+.panel > .table-responsive > .table-bordered > thead > tr > td:first-child,+.panel > .table-bordered > tbody > tr > td:first-child,+.panel > .table-responsive > .table-bordered > tbody > tr > td:first-child,+.panel > .table-bordered > tfoot > tr > td:first-child,+.panel > .table-responsive > .table-bordered > tfoot > tr > td:first-child {+ border-left: 0;+}+.panel > .table-bordered > thead > tr > th:last-child,+.panel > .table-responsive > .table-bordered > thead > tr > th:last-child,+.panel > .table-bordered > tbody > tr > th:last-child,+.panel > .table-responsive > .table-bordered > tbody > tr > th:last-child,+.panel > .table-bordered > tfoot > tr > th:last-child,+.panel > .table-responsive > .table-bordered > tfoot > tr > th:last-child,+.panel > .table-bordered > thead > tr > td:last-child,+.panel > .table-responsive > .table-bordered > thead > tr > td:last-child,+.panel > .table-bordered > tbody > tr > td:last-child,+.panel > .table-responsive > .table-bordered > tbody > tr > td:last-child,+.panel > .table-bordered > tfoot > tr > td:last-child,+.panel > .table-responsive > .table-bordered > tfoot > tr > td:last-child {+ border-right: 0;+}+.panel > .table-bordered > thead > tr:first-child > td,+.panel > .table-responsive > .table-bordered > thead > tr:first-child > td,+.panel > .table-bordered > tbody > tr:first-child > td,+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > td,+.panel > .table-bordered > thead > tr:first-child > th,+.panel > .table-responsive > .table-bordered > thead > tr:first-child > th,+.panel > .table-bordered > tbody > tr:first-child > th,+.panel > .table-responsive > .table-bordered > tbody > tr:first-child > th {+ border-bottom: 0;+}+.panel > .table-bordered > tbody > tr:last-child > td,+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > td,+.panel > .table-bordered > tfoot > tr:last-child > td,+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > td,+.panel > .table-bordered > tbody > tr:last-child > th,+.panel > .table-responsive > .table-bordered > tbody > tr:last-child > th,+.panel > .table-bordered > tfoot > tr:last-child > th,+.panel > .table-responsive > .table-bordered > tfoot > tr:last-child > th {+ border-bottom: 0;+}+.panel > .table-responsive {+ margin-bottom: 0;+ border: 0;+}+.panel-group {+ margin-bottom: 20px;+}+.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: #3c763d;+ 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-info {+ border-color: #bce8f1;+}+.panel-info > .panel-heading {+ color: #31708f;+ 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;+}+.panel-warning {+ border-color: #faebcc;+}+.panel-warning > .panel-heading {+ color: #8a6d3b;+ background-color: #fcf8e3;+ border-color: #faebcc;+}+.panel-warning > .panel-heading + .panel-collapse .panel-body {+ border-top-color: #faebcc;+}+.panel-warning > .panel-footer + .panel-collapse .panel-body {+ border-bottom-color: #faebcc;+}+.panel-danger {+ border-color: #ebccd1;+}+.panel-danger > .panel-heading {+ color: #a94442;+ background-color: #f2dede;+ border-color: #ebccd1;+}+.panel-danger > .panel-heading + .panel-collapse .panel-body {+ border-top-color: #ebccd1;+}+.panel-danger > .panel-footer + .panel-collapse .panel-body {+ border-bottom-color: #ebccd1;+}+.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 {+ float: right;+ font-size: 21px;+ font-weight: bold;+ line-height: 1;+ color: #000;+ text-shadow: 0 1px 0 #fff;+ filter: alpha(opacity=20);+ opacity: .2;+}+.close:hover,+.close:focus {+ color: #000;+ text-decoration: none;+ cursor: pointer;+ filter: alpha(opacity=50);+ opacity: .5;+}+button.close {+ -webkit-appearance: none;+ padding: 0;+ cursor: pointer;+ background: transparent;+ border: 0;+}+.modal-open {+ overflow: hidden;+}+.modal {+ position: fixed;+ top: 0;+ right: 0;+ bottom: 0;+ left: 0;+ z-index: 1050;+ display: none;+ overflow: auto;+ overflow-y: scroll;+ -webkit-overflow-scrolling: touch;+ outline: 0;+}+.modal.fade .modal-dialog {+ -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;+ -webkit-transform: translate(0, -25%);+ -ms-transform: translate(0, -25%);+ transform: translate(0, -25%);+}+.modal.in .modal-dialog {+ -webkit-transform: translate(0, 0);+ -ms-transform: translate(0, 0);+ transform: translate(0, 0);+}+.modal-dialog {+ position: relative;+ width: auto;+ margin: 10px;+}+.modal-content {+ position: relative;+ background-color: #fff;+ background-clip: padding-box;+ border: 1px solid #999;+ border: 1px solid rgba(0, 0, 0, .2);+ border-radius: 6px;+ outline: none;+ -webkit-box-shadow: 0 3px 9px rgba(0, 0, 0, .5);+ box-shadow: 0 3px 9px rgba(0, 0, 0, .5);+}+.modal-backdrop {+ position: fixed;+ top: 0;+ right: 0;+ bottom: 0;+ left: 0;+ z-index: 1040;+ background-color: #000;+}+.modal-backdrop.fade {+ filter: alpha(opacity=0);+ opacity: 0;+}+.modal-backdrop.in {+ filter: alpha(opacity=50);+ opacity: .5;+}+.modal-header {+ min-height: 16.42857143px;+ 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;+ text-align: right;+ border-top: 1px solid #e5e5e5;+}+.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 (min-width: 768px) {+ .modal-dialog {+ width: 600px;+ margin: 30px auto;+ }+ .modal-content {+ -webkit-box-shadow: 0 5px 15px rgba(0, 0, 0, .5);+ box-shadow: 0 5px 15px rgba(0, 0, 0, .5);+ }+ .modal-sm {+ width: 300px;+ }+}+@media (min-width: 992px) {+ .modal-lg {+ width: 900px;+ }+}+.tooltip {+ position: absolute;+ z-index: 1030;+ display: block;+ font-size: 12px;+ line-height: 1.4;+ visibility: visible;+ filter: alpha(opacity=0);+ opacity: 0;+}+.tooltip.in {+ filter: alpha(opacity=90);+ opacity: .9;+}+.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-width: 5px 5px 0;+ border-top-color: #000;+}+.tooltip.top-left .tooltip-arrow {+ bottom: 0;+ left: 5px;+ border-width: 5px 5px 0;+ border-top-color: #000;+}+.tooltip.top-right .tooltip-arrow {+ right: 5px;+ bottom: 0;+ border-width: 5px 5px 0;+ border-top-color: #000;+}+.tooltip.right .tooltip-arrow {+ top: 50%;+ left: 0;+ margin-top: -5px;+ border-width: 5px 5px 5px 0;+ border-right-color: #000;+}+.tooltip.left .tooltip-arrow {+ top: 50%;+ right: 0;+ margin-top: -5px;+ border-width: 5px 0 5px 5px;+ border-left-color: #000;+}+.tooltip.bottom .tooltip-arrow {+ top: 0;+ left: 50%;+ margin-left: -5px;+ border-width: 0 5px 5px;+ border-bottom-color: #000;+}+.tooltip.bottom-left .tooltip-arrow {+ top: 0;+ left: 5px;+ border-width: 0 5px 5px;+ border-bottom-color: #000;+}+.tooltip.bottom-right .tooltip-arrow {+ top: 0;+ right: 5px;+ border-width: 0 5px 5px;+ border-bottom-color: #000;+}+.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;+ background-clip: padding-box;+ 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: 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 {+ content: "";+ border-width: 10px;+}+.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;+ content: " ";+ border-top-color: #fff;+ border-bottom-width: 0;+}+.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 {+ bottom: -10px;+ left: 1px;+ content: " ";+ border-right-color: #fff;+ border-left-width: 0;+}+.popover.bottom > .arrow {+ top: -11px;+ left: 50%;+ margin-left: -11px;+ border-top-width: 0;+ border-bottom-color: #999;+ border-bottom-color: rgba(0, 0, 0, .25);+}+.popover.bottom > .arrow:after {+ top: 1px;+ margin-left: -10px;+ content: " ";+ border-top-width: 0;+ border-bottom-color: #fff;+}+.popover.left > .arrow {+ top: 50%;+ right: -11px;+ margin-top: -11px;+ border-right-width: 0;+ border-left-color: #999;+ border-left-color: rgba(0, 0, 0, .25);+}+.popover.left > .arrow:after {+ right: 1px;+ bottom: -10px;+ content: " ";+ border-right-width: 0;+ border-left-color: #fff;+}+.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 {+ 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);+ filter: alpha(opacity=50);+ opacity: .5;+}+.carousel-control.left {+ background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, .5) 0%), color-stop(rgba(0, 0, 0, .0001) 100%));+ background-image: linear-gradient(to right, rgba(0, 0, 0, .5) 0%, rgba(0, 0, 0, .0001) 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#80000000', endColorstr='#00000000', GradientType=1);+ background-repeat: repeat-x;+}+.carousel-control.right {+ right: 0;+ left: auto;+ background-image: -webkit-linear-gradient(left, color-stop(rgba(0, 0, 0, .0001) 0%), color-stop(rgba(0, 0, 0, .5) 100%));+ background-image: linear-gradient(to right, rgba(0, 0, 0, .0001) 0%, rgba(0, 0, 0, .5) 100%);+ filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00000000', endColorstr='#80000000', GradientType=1);+ background-repeat: repeat-x;+}+.carousel-control:hover,+.carousel-control:focus {+ color: #fff;+ text-decoration: none;+ filter: alpha(opacity=90);+ outline: none;+ opacity: .9;+}+.carousel-control .icon-prev,+.carousel-control .icon-next,+.carousel-control .glyphicon-chevron-left,+.carousel-control .glyphicon-chevron-right {+ position: absolute;+ top: 50%;+ z-index: 5;+ display: inline-block;+}+.carousel-control .icon-prev,+.carousel-control .glyphicon-chevron-left {+ left: 50%;+}+.carousel-control .icon-next,+.carousel-control .glyphicon-chevron-right {+ right: 50%;+}+.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;+ background-color: #000 \9;+ background-color: rgba(0, 0, 0, 0);+ 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-shadow: none;+}+@media screen and (min-width: 768px) {+ .carousel-control .glyphicon-chevron-left,+ .carousel-control .glyphicon-chevron-right,+ .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,+.container:before,+.container:after,+.container-fluid:before,+.container-fluid:after,+.row:before,+.row:after,+.form-horizontal .form-group:before,+.form-horizontal .form-group:after,+.btn-toolbar:before,+.btn-toolbar:after,+.btn-group-vertical > .btn-group:before,+.btn-group-vertical > .btn-group:after,+.nav:before,+.nav:after,+.navbar:before,+.navbar:after,+.navbar-header:before,+.navbar-header:after,+.navbar-collapse:before,+.navbar-collapse:after,+.pager:before,+.pager:after,+.panel-body:before,+.panel-body:after,+.modal-footer:before,+.modal-footer:after {+ display: table;+ content: " ";+}+.clearfix:after,+.container:after,+.container-fluid:after,+.row:after,+.form-horizontal .form-group:after,+.btn-toolbar:after,+.btn-group-vertical > .btn-group:after,+.nav:after,+.navbar:after,+.navbar-header:after,+.navbar-collapse:after,+.pager:after,+.panel-body:after,+.modal-footer:after {+ clear: both;+}+.center-block {+ display: block;+ margin-right: auto;+ margin-left: auto;+}+.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;+}+.hidden {+ display: none !important;+ visibility: hidden !important;+}+.affix {+ position: fixed;+}+@-ms-viewport {+ width: device-width;+}+.visible-xs,+.visible-sm,+.visible-md,+.visible-lg {+ display: none !important;+}+@media (max-width: 767px) {+ .visible-xs {+ display: block !important;+ }+ table.visible-xs {+ display: table;+ }+ 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-sm {+ display: block !important;+ }+ table.visible-sm {+ display: table;+ }+ 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-md {+ display: block !important;+ }+ table.visible-md {+ display: table;+ }+ tr.visible-md {+ display: table-row !important;+ }+ th.visible-md,+ td.visible-md {+ display: table-cell !important;+ }+}+@media (min-width: 1200px) {+ .visible-lg {+ display: block !important;+ }+ table.visible-lg {+ display: table;+ }+ tr.visible-lg {+ display: table-row !important;+ }+ th.visible-lg,+ td.visible-lg {+ display: table-cell !important;+ }+}+@media (max-width: 767px) {+ .hidden-xs {+ display: none !important;+ }+}+@media (min-width: 768px) and (max-width: 991px) {+ .hidden-sm {+ display: none !important;+ }+}+@media (min-width: 992px) and (max-width: 1199px) {+ .hidden-md {+ display: none !important;+ }+}+@media (min-width: 1200px) {+ .hidden-lg {+ display: none !important;+ }+}+.visible-print {+ display: none !important;+}+@media print {+ .visible-print {+ display: block !important;+ }+ table.visible-print {+ display: table;+ }+ tr.visible-print {+ display: table-row !important;+ }+ th.visible-print,+ td.visible-print {+ display: table-cell !important;+ }+}+@media print {+ .hidden-print {+ display: none !important;+ }+}+/*# sourceMappingURL=bootstrap.css.map */
+ static/fonts/glyphicons-halflings-regular.eot view
binary file changed (absent → 20335 bytes)
+ static/fonts/glyphicons-halflings-regular.svg view
@@ -0,0 +1,229 @@+<?xml version="1.0" standalone="no"?>+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >+<svg xmlns="http://www.w3.org/2000/svg">+<metadata></metadata>+<defs>+<font id="glyphicons_halflingsregular" horiz-adv-x="1200" >+<font-face units-per-em="1200" ascent="960" descent="-240" />+<missing-glyph horiz-adv-x="500" />+<glyph />+<glyph />+<glyph unicode="
" />+<glyph unicode=" " />+<glyph unicode="*" d="M100 500v200h259l-183 183l141 141l183 -183v259h200v-259l183 183l141 -141l-183 -183h259v-200h-259l183 -183l-141 -141l-183 183v-259h-200v259l-183 -183l-141 141l183 183h-259z" />+<glyph unicode="+" d="M0 400v300h400v400h300v-400h400v-300h-400v-400h-300v400h-400z" />+<glyph unicode=" " />+<glyph unicode=" " horiz-adv-x="652" />+<glyph unicode=" " horiz-adv-x="1304" />+<glyph unicode=" " horiz-adv-x="652" />+<glyph unicode=" " horiz-adv-x="1304" />+<glyph unicode=" " horiz-adv-x="434" />+<glyph unicode=" " horiz-adv-x="326" />+<glyph unicode=" " horiz-adv-x="217" />+<glyph unicode=" " horiz-adv-x="217" />+<glyph unicode=" " horiz-adv-x="163" />+<glyph unicode=" " horiz-adv-x="260" />+<glyph unicode=" " horiz-adv-x="72" />+<glyph unicode=" " horiz-adv-x="260" />+<glyph unicode=" " horiz-adv-x="326" />+<glyph unicode="€" d="M100 500l100 100h113q0 47 5 100h-218l100 100h135q37 167 112 257q117 141 297 141q242 0 354 -189q60 -103 66 -209h-181q0 55 -25.5 99t-63.5 68t-75 36.5t-67 12.5q-24 0 -52.5 -10t-62.5 -32t-65.5 -67t-50.5 -107h379l-100 -100h-300q-6 -46 -6 -100h406l-100 -100 h-300q9 -74 33 -132t52.5 -91t62 -54.5t59 -29t46.5 -7.5q29 0 66 13t75 37t63.5 67.5t25.5 96.5h174q-31 -172 -128 -278q-107 -117 -274 -117q-205 0 -324 158q-36 46 -69 131.5t-45 205.5h-217z" />+<glyph unicode="−" d="M200 400h900v300h-900v-300z" />+<glyph unicode="◼" horiz-adv-x="500" d="M0 0z" />+<glyph unicode="☁" d="M-14 494q0 -80 56.5 -137t135.5 -57h750q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5z" />+<glyph unicode="✉" d="M0 100l400 400l200 -200l200 200l400 -400h-1200zM0 300v600l300 -300zM0 1100l600 -603l600 603h-1200zM900 600l300 300v-600z" />+<glyph unicode="✏" d="M-13 -13l333 112l-223 223zM187 403l214 -214l614 614l-214 214zM887 1103l214 -214l99 92q13 13 13 32.5t-13 33.5l-153 153q-15 13 -33 13t-33 -13z" />+<glyph unicode="" d="M0 1200h1200l-500 -550v-550h300v-100h-800v100h300v550z" />+<glyph unicode="" d="M14 84q18 -55 86 -75.5t147 5.5q65 21 109 69t44 90v606l600 155v-521q-64 16 -138 -7q-79 -26 -122.5 -83t-25.5 -111q18 -55 86 -75.5t147 4.5q70 23 111.5 63.5t41.5 95.5v881q0 10 -7 15.5t-17 2.5l-752 -193q-10 -3 -17 -12.5t-7 -19.5v-689q-64 17 -138 -7 q-79 -25 -122.5 -82t-25.5 -112z" />+<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233z" />+<glyph unicode="" d="M100 784q0 64 28 123t73 100.5t104.5 64t119 20.5t120 -38.5t104.5 -104.5q48 69 109.5 105t121.5 38t118.5 -20.5t102.5 -64t71 -100.5t27 -123q0 -57 -33.5 -117.5t-94 -124.5t-126.5 -127.5t-150 -152.5t-146 -174q-62 85 -145.5 174t-149.5 152.5t-126.5 127.5 t-94 124.5t-33.5 117.5z" />+<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1z" />+<glyph unicode="" d="M-72 800h479l146 400h2l146 -400h472l-382 -278l145 -449l-384 275l-382 -275l146 447zM168 71l2 1zM237 700l196 -142l-73 -226l192 140l195 -141l-74 229l193 140h-235l-77 211l-78 -211h-239z" />+<glyph unicode="" d="M0 0v143l400 257v100q-37 0 -68.5 74.5t-31.5 125.5v200q0 124 88 212t212 88t212 -88t88 -212v-200q0 -51 -31.5 -125.5t-68.5 -74.5v-100l400 -257v-143h-1200z" />+<glyph unicode="" d="M0 0v1100h1200v-1100h-1200zM100 100h100v100h-100v-100zM100 300h100v100h-100v-100zM100 500h100v100h-100v-100zM100 700h100v100h-100v-100zM100 900h100v100h-100v-100zM300 100h600v400h-600v-400zM300 600h600v400h-600v-400zM1000 100h100v100h-100v-100z M1000 300h100v100h-100v-100zM1000 500h100v100h-100v-100zM1000 700h100v100h-100v-100zM1000 900h100v100h-100v-100z" />+<glyph unicode="" d="M0 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM0 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400 q-21 0 -35.5 14.5t-14.5 35.5zM600 50v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5zM600 650v400q0 21 14.5 35.5t35.5 14.5h400q21 0 35.5 -14.5t14.5 -35.5v-400 q0 -21 -14.5 -35.5t-35.5 -14.5h-400q-21 0 -35.5 14.5t-14.5 35.5z" />+<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200 q-21 0 -35.5 14.5t-14.5 35.5zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 450v200q0 21 14.5 35.5t35.5 14.5h200 q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM800 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5z" />+<glyph unicode="" d="M0 50v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM0 450q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v200q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5 t-14.5 -35.5v-200zM0 850v200q0 21 14.5 35.5t35.5 14.5h200q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5zM400 50v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5 t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 450v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5zM400 850v200q0 21 14.5 35.5t35.5 14.5h700q21 0 35.5 -14.5t14.5 -35.5 v-200q0 -21 -14.5 -35.5t-35.5 -14.5h-700q-21 0 -35.5 14.5t-14.5 35.5z" />+<glyph unicode="" d="M29 454l419 -420l818 820l-212 212l-607 -607l-206 207z" />+<glyph unicode="" d="M106 318l282 282l-282 282l212 212l282 -282l282 282l212 -212l-282 -282l282 -282l-212 -212l-282 282l-282 -282z" />+<glyph unicode="" d="M23 693q0 200 142 342t342 142t342 -142t142 -342q0 -142 -78 -261l300 -300q7 -8 7 -18t-7 -18l-109 -109q-8 -7 -18 -7t-18 7l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 693q0 -136 97 -233t234 -97t233.5 96.5t96.5 233.5t-96.5 233.5t-233.5 96.5 t-234 -97t-97 -233zM300 600v200h100v100h200v-100h100v-200h-100v-100h-200v100h-100z" />+<glyph unicode="" d="M23 694q0 200 142 342t342 142t342 -142t142 -342q0 -141 -78 -262l300 -299q7 -7 7 -18t-7 -18l-109 -109q-8 -8 -18 -8t-18 8l-300 300q-119 -78 -261 -78q-200 0 -342 142t-142 342zM176 694q0 -136 97 -233t234 -97t233.5 97t96.5 233t-96.5 233t-233.5 97t-234 -97 t-97 -233zM300 601h400v200h-400v-200z" />+<glyph unicode="" d="M23 600q0 183 105 331t272 210v-166q-103 -55 -165 -155t-62 -220q0 -177 125 -302t302 -125t302 125t125 302q0 120 -62 220t-165 155v166q167 -62 272 -210t105 -331q0 -118 -45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5 zM500 750q0 -21 14.5 -35.5t35.5 -14.5h100q21 0 35.5 14.5t14.5 35.5v400q0 21 -14.5 35.5t-35.5 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-400z" />+<glyph unicode="" d="M100 1h200v300h-200v-300zM400 1v500h200v-500h-200zM700 1v800h200v-800h-200zM1000 1v1200h200v-1200h-200z" />+<glyph unicode="" d="M26 601q0 -33 6 -74l151 -38l2 -6q14 -49 38 -93l3 -5l-80 -134q45 -59 105 -105l133 81l5 -3q45 -26 94 -39l5 -2l38 -151q40 -5 74 -5q27 0 74 5l38 151l6 2q46 13 93 39l5 3l134 -81q56 44 104 105l-80 134l3 5q24 44 39 93l1 6l152 38q5 40 5 74q0 28 -5 73l-152 38 l-1 6q-16 51 -39 93l-3 5l80 134q-44 58 -104 105l-134 -81l-5 3q-45 25 -93 39l-6 1l-38 152q-40 5 -74 5q-27 0 -74 -5l-38 -152l-5 -1q-50 -14 -94 -39l-5 -3l-133 81q-59 -47 -105 -105l80 -134l-3 -5q-25 -47 -38 -93l-2 -6l-151 -38q-6 -48 -6 -73zM385 601 q0 88 63 151t152 63t152 -63t63 -151q0 -89 -63 -152t-152 -63t-152 63t-63 152z" />+<glyph unicode="" d="M100 1025v50q0 10 7.5 17.5t17.5 7.5h275v100q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5v-100h275q10 0 17.5 -7.5t7.5 -17.5v-50q0 -11 -7 -18t-18 -7h-1050q-11 0 -18 7t-7 18zM200 100v800h900v-800q0 -41 -29.5 -71t-70.5 -30h-700q-41 0 -70.5 30 t-29.5 71zM300 100h100v700h-100v-700zM500 100h100v700h-100v-700zM500 1100h300v100h-300v-100zM700 100h100v700h-100v-700zM900 100h100v700h-100v-700z" />+<glyph unicode="" d="M1 601l656 644l644 -644h-200v-600h-300v400h-300v-400h-300v600h-200z" />+<glyph unicode="" d="M100 25v1150q0 11 7 18t18 7h475v-500h400v-675q0 -11 -7 -18t-18 -7h-850q-11 0 -18 7t-7 18zM700 800v300l300 -300h-300z" />+<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 500v400h100 v-300h200v-100h-300z" />+<glyph unicode="" d="M-100 0l431 1200h209l-21 -300h162l-20 300h208l431 -1200h-538l-41 400h-242l-40 -400h-539zM488 500h224l-27 300h-170z" />+<glyph unicode="" d="M0 0v400h490l-290 300h200v500h300v-500h200l-290 -300h490v-400h-1100zM813 200h175v100h-175v-100z" />+<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM188 600q0 -170 121 -291t291 -121t291 121t121 291t-121 291t-291 121 t-291 -121t-121 -291zM350 600h150v300h200v-300h150l-250 -300z" />+<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM350 600l250 300 l250 -300h-150v-300h-200v300h-150z" />+<glyph unicode="" d="M0 25v475l200 700h800l199 -700l1 -475q0 -11 -7 -18t-18 -7h-1150q-11 0 -18 7t-7 18zM200 500h200l50 -200h300l50 200h200l-97 500h-606z" />+<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM500 397v401 l297 -200z" />+<glyph unicode="" d="M23 600q0 -118 45.5 -224.5t123 -184t184 -123t224.5 -45.5t224.5 45.5t184 123t123 184t45.5 224.5h-150q0 -177 -125 -302t-302 -125t-302 125t-125 302t125 302t302 125q136 0 246 -81l-146 -146h400v400l-145 -145q-157 122 -355 122q-118 0 -224.5 -45.5t-184 -123 t-123 -184t-45.5 -224.5z" />+<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5q198 0 355 -122l145 145v-400h-400l147 147q-112 80 -247 80q-177 0 -302 -125t-125 -302h-150zM100 0v400h400l-147 -147q112 -80 247 -80q177 0 302 125t125 302h150q0 -118 -45.5 -224.5t-123 -184t-184 -123 t-224.5 -45.5q-198 0 -355 122z" />+<glyph unicode="" d="M100 0h1100v1200h-1100v-1200zM200 100v900h900v-900h-900zM300 200v100h100v-100h-100zM300 400v100h100v-100h-100zM300 600v100h100v-100h-100zM300 800v100h100v-100h-100zM500 200h500v100h-500v-100zM500 400v100h500v-100h-500zM500 600v100h500v-100h-500z M500 800v100h500v-100h-500z" />+<glyph unicode="" d="M0 100v600q0 41 29.5 70.5t70.5 29.5h100v200q0 82 59 141t141 59h300q82 0 141 -59t59 -141v-200h100q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-900q-41 0 -70.5 29.5t-29.5 70.5zM400 800h300v150q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-150z" />+<glyph unicode="" d="M100 0v1100h100v-1100h-100zM300 400q60 60 127.5 84t127.5 17.5t122 -23t119 -30t110 -11t103 42t91 120.5v500q-40 -81 -101.5 -115.5t-127.5 -29.5t-138 25t-139.5 40t-125.5 25t-103 -29.5t-65 -115.5v-500z" />+<glyph unicode="" d="M0 275q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 127 70.5 231.5t184.5 161.5t245 57t245 -57t184.5 -161.5t70.5 -231.5v-300q0 -11 7 -18t18 -7h50q11 0 18 7t7 18v300q0 116 -49.5 227t-131 192.5t-192.5 131t-227 49.5t-227 -49.5t-192.5 -131t-131 -192.5 t-49.5 -227v-300zM200 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14zM800 20v460q0 8 6 14t14 6h160q8 0 14 -6t6 -14v-460q0 -8 -6 -14t-14 -6h-160q-8 0 -14 6t-6 14z" />+<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM688 459l141 141l-141 141l71 71l141 -141l141 141l71 -71l-141 -141l141 -141l-71 -71l-141 141l-141 -141z" />+<glyph unicode="" d="M0 400h300l300 -200v800l-300 -200h-300v-400zM700 857l69 53q111 -135 111 -310q0 -169 -106 -302l-67 54q86 110 86 248q0 146 -93 257z" />+<glyph unicode="" d="M0 401v400h300l300 200v-800l-300 200h-300zM702 858l69 53q111 -135 111 -310q0 -170 -106 -303l-67 55q86 110 86 248q0 145 -93 257zM889 951l7 -8q123 -151 123 -344q0 -189 -119 -339l-7 -8l81 -66l6 8q142 178 142 405q0 230 -144 408l-6 8z" />+<glyph unicode="" d="M0 0h500v500h-200v100h-100v-100h-200v-500zM0 600h100v100h400v100h100v100h-100v300h-500v-600zM100 100v300h300v-300h-300zM100 800v300h300v-300h-300zM200 200v100h100v-100h-100zM200 900h100v100h-100v-100zM500 500v100h300v-300h200v-100h-100v-100h-200v100 h-100v100h100v200h-200zM600 0v100h100v-100h-100zM600 1000h100v-300h200v-300h300v200h-200v100h200v500h-600v-200zM800 800v300h300v-300h-300zM900 0v100h300v-100h-300zM900 900v100h100v-100h-100zM1100 200v100h100v-100h-100z" />+<glyph unicode="" d="M0 200h100v1000h-100v-1000zM100 0v100h300v-100h-300zM200 200v1000h100v-1000h-100zM500 0v91h100v-91h-100zM500 200v1000h200v-1000h-200zM700 0v91h100v-91h-100zM800 200v1000h100v-1000h-100zM900 0v91h200v-91h-200zM1000 200v1000h200v-1000h-200z" />+<glyph unicode="" d="M0 700l1 475q0 10 7.5 17.5t17.5 7.5h474l700 -700l-500 -500zM148 953q0 -42 29 -71q30 -30 71.5 -30t71.5 30q29 29 29 71t-29 71q-30 30 -71.5 30t-71.5 -30q-29 -29 -29 -71z" />+<glyph unicode="" d="M1 700l1 475q0 11 7 18t18 7h474l700 -700l-500 -500zM148 953q0 -42 30 -71q29 -30 71 -30t71 30q30 29 30 71t-30 71q-29 30 -71 30t-71 -30q-30 -29 -30 -71zM701 1200h100l700 -700l-500 -500l-50 50l450 450z" />+<glyph unicode="" d="M100 0v1025l175 175h925v-1000l-100 -100v1000h-750l-100 -100h750v-1000h-900z" />+<glyph unicode="" d="M200 0l450 444l450 -443v1150q0 20 -14.5 35t-35.5 15h-800q-21 0 -35.5 -15t-14.5 -35v-1151z" />+<glyph unicode="" d="M0 100v700h200l100 -200h600l100 200h200v-700h-200v200h-800v-200h-200zM253 829l40 -124h592l62 124l-94 346q-2 11 -10 18t-18 7h-450q-10 0 -18 -7t-10 -18zM281 24l38 152q2 10 11.5 17t19.5 7h500q10 0 19.5 -7t11.5 -17l38 -152q2 -10 -3.5 -17t-15.5 -7h-600 q-10 0 -15.5 7t-3.5 17z" />+<glyph unicode="" d="M0 200q0 -41 29.5 -70.5t70.5 -29.5h1000q41 0 70.5 29.5t29.5 70.5v600q0 41 -29.5 70.5t-70.5 29.5h-150q-4 8 -11.5 21.5t-33 48t-53 61t-69 48t-83.5 21.5h-200q-41 0 -82 -20.5t-70 -50t-52 -59t-34 -50.5l-12 -20h-150q-41 0 -70.5 -29.5t-29.5 -70.5v-600z M356 500q0 100 72 172t172 72t172 -72t72 -172t-72 -172t-172 -72t-172 72t-72 172zM494 500q0 -44 31 -75t75 -31t75 31t31 75t-31 75t-75 31t-75 -31t-31 -75zM900 700v100h100v-100h-100z" />+<glyph unicode="" d="M53 0h365v66q-41 0 -72 11t-49 38t1 71l92 234h391l82 -222q16 -45 -5.5 -88.5t-74.5 -43.5v-66h417v66q-34 1 -74 43q-18 19 -33 42t-21 37l-6 13l-385 998h-93l-399 -1006q-24 -48 -52 -75q-12 -12 -33 -25t-36 -20l-15 -7v-66zM416 521l178 457l46 -140l116 -317h-340 z" />+<glyph unicode="" d="M100 0v89q41 7 70.5 32.5t29.5 65.5v827q0 28 -1 39.5t-5.5 26t-15.5 21t-29 14t-49 14.5v71l471 -1q120 0 213 -88t93 -228q0 -55 -11.5 -101.5t-28 -74t-33.5 -47.5t-28 -28l-12 -7q8 -3 21.5 -9t48 -31.5t60.5 -58t47.5 -91.5t21.5 -129q0 -84 -59 -156.5t-142 -111 t-162 -38.5h-500zM400 200h161q89 0 153 48.5t64 132.5q0 90 -62.5 154.5t-156.5 64.5h-159v-400zM400 700h139q76 0 130 61.5t54 138.5q0 82 -84 130.5t-239 48.5v-379z" />+<glyph unicode="" d="M200 0v57q77 7 134.5 40.5t65.5 80.5l173 849q10 56 -10 74t-91 37q-6 1 -10.5 2.5t-9.5 2.5v57h425l2 -57q-33 -8 -62 -25.5t-46 -37t-29.5 -38t-17.5 -30.5l-5 -12l-128 -825q-10 -52 14 -82t95 -36v-57h-500z" />+<glyph unicode="" d="M-75 200h75v800h-75l125 167l125 -167h-75v-800h75l-125 -167zM300 900v300h150h700h150v-300h-50q0 29 -8 48.5t-18.5 30t-33.5 15t-39.5 5.5t-50.5 1h-200v-850l100 -50v-100h-400v100l100 50v850h-200q-34 0 -50.5 -1t-40 -5.5t-33.5 -15t-18.5 -30t-8.5 -48.5h-49z " />+<glyph unicode="" d="M33 51l167 125v-75h800v75l167 -125l-167 -125v75h-800v-75zM100 901v300h150h700h150v-300h-50q0 29 -8 48.5t-18 30t-33.5 15t-40 5.5t-50.5 1h-200v-650l100 -50v-100h-400v100l100 50v650h-200q-34 0 -50.5 -1t-39.5 -5.5t-33.5 -15t-18.5 -30t-8 -48.5h-50z" />+<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 350q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM0 650q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1000q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 950q0 -20 14.5 -35t35.5 -15h600q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-600q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />+<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM0 650q0 -20 14.5 -35t35.5 -15h1100q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5 v-100zM200 350q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM200 950q0 -20 14.5 -35t35.5 -15h700q21 0 35.5 15t14.5 35v100q0 21 -14.5 35.5t-35.5 14.5h-700q-21 0 -35.5 -14.5 t-14.5 -35.5v-100z" />+<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM100 650v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1000q-21 0 -35.5 15 t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM500 950v100q0 21 14.5 35.5t35.5 14.5h600q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-600 q-21 0 -35.5 15t-14.5 35z" />+<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h1100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-1100 q-21 0 -35.5 15t-14.5 35z" />+<glyph unicode="" d="M0 50v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 350v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM0 650v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15t-14.5 35zM0 950v100q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-100q-21 0 -35.5 15 t-14.5 35zM300 50v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 350v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800 q-21 0 -35.5 15t-14.5 35zM300 650v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15h-800q-21 0 -35.5 15t-14.5 35zM300 950v100q0 21 14.5 35.5t35.5 14.5h800q21 0 35.5 -14.5t14.5 -35.5v-100q0 -20 -14.5 -35t-35.5 -15 h-800q-21 0 -35.5 15t-14.5 35z" />+<glyph unicode="" d="M-101 500v100h201v75l166 -125l-166 -125v75h-201zM300 0h100v1100h-100v-1100zM500 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35 v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 650q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM500 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100 q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100z" />+<glyph unicode="" d="M1 50q0 -20 14.5 -35t35.5 -15h600q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-600q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 350q0 -20 14.5 -35t35.5 -15h300q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-300q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 650 q0 -20 14.5 -35t35.5 -15h500q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-500q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM1 950q0 -20 14.5 -35t35.5 -15h100q20 0 35 15t15 35v100q0 21 -15 35.5t-35 14.5h-100q-21 0 -35.5 -14.5t-14.5 -35.5v-100zM801 0v1100h100v-1100 h-100zM934 550l167 -125v75h200v100h-200v75z" />+<glyph unicode="" d="M0 275v650q0 31 22 53t53 22h750q31 0 53 -22t22 -53v-650q0 -31 -22 -53t-53 -22h-750q-31 0 -53 22t-22 53zM900 600l300 300v-600z" />+<glyph unicode="" d="M0 44v1012q0 18 13 31t31 13h1112q19 0 31.5 -13t12.5 -31v-1012q0 -18 -12.5 -31t-31.5 -13h-1112q-18 0 -31 13t-13 31zM100 263l247 182l298 -131l-74 156l293 318l236 -288v500h-1000v-737zM208 750q0 56 39 95t95 39t95 -39t39 -95t-39 -95t-95 -39t-95 39t-39 95z " />+<glyph unicode="" d="M148 745q0 124 60.5 231.5t165 172t226.5 64.5q123 0 227 -63t164.5 -169.5t60.5 -229.5t-73 -272q-73 -114 -166.5 -237t-150.5 -189l-57 -66q-10 9 -27 26t-66.5 70.5t-96 109t-104 135.5t-100.5 155q-63 139 -63 262zM342 772q0 -107 75.5 -182.5t181.5 -75.5 q107 0 182.5 75.5t75.5 182.5t-75.5 182t-182.5 75t-182 -75.5t-75 -181.5z" />+<glyph unicode="" d="M1 600q0 122 47.5 233t127.5 191t191 127.5t233 47.5t233 -47.5t191 -127.5t127.5 -191t47.5 -233t-47.5 -233t-127.5 -191t-191 -127.5t-233 -47.5t-233 47.5t-191 127.5t-127.5 191t-47.5 233zM173 600q0 -177 125.5 -302t301.5 -125v854q-176 0 -301.5 -125 t-125.5 -302z" />+<glyph unicode="" d="M117 406q0 94 34 186t88.5 172.5t112 159t115 177t87.5 194.5q21 -71 57.5 -142.5t76 -130.5t83 -118.5t82 -117t70 -116t50 -125.5t18.5 -136q0 -89 -39 -165.5t-102 -126.5t-140 -79.5t-156 -33.5q-114 6 -211.5 53t-161.5 139t-64 210zM243 414q14 -82 59.5 -136 t136.5 -80l16 98q-7 6 -18 17t-34 48t-33 77q-15 73 -14 143.5t10 122.5l9 51q-92 -110 -119.5 -185t-12.5 -156z" />+<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5q366 -6 397 -14l-186 -186h-311q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v125l200 200v-225q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM436 341l161 50l412 412l-114 113l-405 -405zM995 1015l113 -113l113 113l-21 85l-92 28z" />+<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h261l2 -80q-133 -32 -218 -120h-145q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5l200 153v-53q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5 zM423 524q30 38 81.5 64t103 35.5t99 14t77.5 3.5l29 -1v-209l360 324l-359 318v-216q-7 0 -19 -1t-48 -8t-69.5 -18.5t-76.5 -37t-76.5 -59t-62 -88t-39.5 -121.5z" />+<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q61 0 127 -23l-178 -177h-349q-41 0 -70.5 -29.5t-29.5 -70.5v-500q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v69l200 200v-169q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5 t-117.5 282.5zM342 632l283 -284l567 567l-137 137l-430 -431l-146 147z" />+<glyph unicode="" d="M0 603l300 296v-198h200v200h-200l300 300l295 -300h-195v-200h200v198l300 -296l-300 -300v198h-200v-200h195l-295 -300l-300 300h200v200h-200v-198z" />+<glyph unicode="" d="M200 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-1100l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />+<glyph unicode="" d="M0 50v1000q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-437l500 487v-487l500 487v-1100l-500 488v-488l-500 488v-438q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5z" />+<glyph unicode="" d="M136 550l564 550v-487l500 487v-1100l-500 488v-488z" />+<glyph unicode="" d="M200 0l900 550l-900 550v-1100z" />+<glyph unicode="" d="M200 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200q-21 0 -35.5 -14.5t-14.5 -35.5v-800zM600 150q0 -21 14.5 -35.5t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v800q0 21 -14.5 35.5t-35.5 14.5h-200 q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />+<glyph unicode="" d="M200 150q0 -20 14.5 -35t35.5 -15h800q21 0 35.5 15t14.5 35v800q0 21 -14.5 35.5t-35.5 14.5h-800q-21 0 -35.5 -14.5t-14.5 -35.5v-800z" />+<glyph unicode="" d="M0 0v1100l500 -487v487l564 -550l-564 -550v488z" />+<glyph unicode="" d="M0 0v1100l500 -487v487l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438l-500 -488v488z" />+<glyph unicode="" d="M300 0v1100l500 -487v437q0 21 14.5 35.5t35.5 14.5h100q21 0 35.5 -14.5t14.5 -35.5v-1000q0 -21 -14.5 -35.5t-35.5 -14.5h-100q-21 0 -35.5 14.5t-14.5 35.5v438z" />+<glyph unicode="" d="M100 250v100q0 21 14.5 35.5t35.5 14.5h1000q21 0 35.5 -14.5t14.5 -35.5v-100q0 -21 -14.5 -35.5t-35.5 -14.5h-1000q-21 0 -35.5 14.5t-14.5 35.5zM100 500h1100l-550 564z" />+<glyph unicode="" d="M185 599l592 -592l240 240l-353 353l353 353l-240 240z" />+<glyph unicode="" d="M272 194l353 353l-353 353l241 240l572 -571l21 -22l-1 -1v-1l-592 -591z" />+<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h200v-200h200v200h200v200h-200v200h-200v-200h-200v-200z" />+<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM300 500h600v200h-600v-200z" />+<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM246 459l213 -213l141 142l141 -142l213 213l-142 141l142 141l-213 212l-141 -141l-141 142l-212 -213l141 -141 z" />+<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM270 551l276 -277l411 411l-175 174l-236 -236l-102 102z" />+<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM364 700h143q4 0 11.5 -1t11 -1t6.5 3t3 9t1 11t3.5 8.5t3.5 6t5.5 4t6.5 2.5t9 1.5t9 0.5h11.5h12.5 q19 0 30 -10t11 -26q0 -22 -4 -28t-27 -22q-5 -1 -12.5 -3t-27 -13.5t-34 -27t-26.5 -46t-11 -68.5h200q5 3 14 8t31.5 25.5t39.5 45.5t31 69t14 94q0 51 -17.5 89t-42 58t-58.5 32t-58.5 15t-51.5 3q-50 0 -90.5 -12t-75 -38.5t-53.5 -74.5t-19 -114zM500 300h200v100h-200 v-100z" />+<glyph unicode="" d="M3 600q0 162 80 299.5t217.5 217.5t299.5 80t299.5 -80t217.5 -217.5t80 -299.5t-80 -299.5t-217.5 -217.5t-299.5 -80t-299.5 80t-217.5 217.5t-80 299.5zM400 300h400v100h-100v300h-300v-100h100v-200h-100v-100zM500 800h200v100h-200v-100z" />+<glyph unicode="" d="M0 500v200h195q31 125 98.5 199.5t206.5 100.5v200h200v-200q54 -20 113 -60t112.5 -105.5t71.5 -134.5h203v-200h-203q-25 -102 -116.5 -186t-180.5 -117v-197h-200v197q-140 27 -208 102.5t-98 200.5h-194zM290 500q24 -73 79.5 -127.5t130.5 -78.5v206h200v-206 q149 48 201 206h-201v200h200q-25 74 -75.5 127t-124.5 77v-204h-200v203q-75 -23 -130 -77t-79 -126h209v-200h-210z" />+<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM356 465l135 135 l-135 135l109 109l135 -135l135 135l109 -109l-135 -135l135 -135l-109 -109l-135 135l-135 -135z" />+<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM322 537l141 141 l87 -87l204 205l142 -142l-346 -345z" />+<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -115 62 -215l568 567q-100 62 -216 62q-171 0 -292.5 -121.5t-121.5 -292.5zM391 245q97 -59 209 -59q171 0 292.5 121.5t121.5 292.5 q0 112 -59 209z" />+<glyph unicode="" d="M0 547l600 453v-300h600v-300h-600v-301z" />+<glyph unicode="" d="M0 400v300h600v300l600 -453l-600 -448v301h-600z" />+<glyph unicode="" d="M204 600l450 600l444 -600h-298v-600h-300v600h-296z" />+<glyph unicode="" d="M104 600h296v600h300v-600h298l-449 -600z" />+<glyph unicode="" d="M0 200q6 132 41 238.5t103.5 193t184 138t271.5 59.5v271l600 -453l-600 -448v301q-95 -2 -183 -20t-170 -52t-147 -92.5t-100 -135.5z" />+<glyph unicode="" d="M0 0v400l129 -129l294 294l142 -142l-294 -294l129 -129h-400zM635 777l142 -142l294 294l129 -129v400h-400l129 -129z" />+<glyph unicode="" d="M34 176l295 295l-129 129h400v-400l-129 130l-295 -295zM600 600v400l129 -129l295 295l142 -141l-295 -295l129 -130h-400z" />+<glyph unicode="" d="M23 600q0 118 45.5 224.5t123 184t184 123t224.5 45.5t224.5 -45.5t184 -123t123 -184t45.5 -224.5t-45.5 -224.5t-123 -184t-184 -123t-224.5 -45.5t-224.5 45.5t-184 123t-123 184t-45.5 224.5zM456 851l58 -302q4 -20 21.5 -34.5t37.5 -14.5h54q20 0 37.5 14.5 t21.5 34.5l58 302q4 20 -8 34.5t-32 14.5h-207q-21 0 -33 -14.5t-8 -34.5zM500 300h200v100h-200v-100z" />+<glyph unicode="" d="M0 800h100v-200h400v300h200v-300h400v200h100v100h-111q1 1 1 6.5t-1.5 15t-3.5 17.5l-34 172q-11 39 -41.5 63t-69.5 24q-32 0 -61 -17l-239 -144q-22 -13 -40 -35q-19 24 -40 36l-238 144q-33 18 -62 18q-39 0 -69.5 -23t-40.5 -61l-35 -177q-2 -8 -3 -18t-1 -15v-6 h-111v-100zM100 0h400v400h-400v-400zM200 900q-3 0 14 48t36 96l18 47l213 -191h-281zM700 0v400h400v-400h-400zM731 900l202 197q5 -12 12 -32.5t23 -64t25 -72t7 -28.5h-269z" />+<glyph unicode="" d="M0 -22v143l216 193q-9 53 -13 83t-5.5 94t9 113t38.5 114t74 124q47 60 99.5 102.5t103 68t127.5 48t145.5 37.5t184.5 43.5t220 58.5q0 -189 -22 -343t-59 -258t-89 -181.5t-108.5 -120t-122 -68t-125.5 -30t-121.5 -1.5t-107.5 12.5t-87.5 17t-56.5 7.5l-99 -55z M238.5 300.5q19.5 -6.5 86.5 76.5q55 66 367 234q70 38 118.5 69.5t102 79t99 111.5t86.5 148q22 50 24 60t-6 19q-7 5 -17 5t-26.5 -14.5t-33.5 -39.5q-35 -51 -113.5 -108.5t-139.5 -89.5l-61 -32q-369 -197 -458 -401q-48 -111 -28.5 -117.5z" />+<glyph unicode="" d="M111 408q0 -33 5 -63q9 -56 44 -119.5t105 -108.5q31 -21 64 -16t62 23.5t57 49.5t48 61.5t35 60.5q32 66 39 184.5t-13 157.5q79 -80 122 -164t26 -184q-5 -33 -20.5 -69.5t-37.5 -80.5q-10 -19 -14.5 -29t-12 -26t-9 -23.5t-3 -19t2.5 -15.5t11 -9.5t19.5 -5t30.5 2.5 t42 8q57 20 91 34t87.5 44.5t87 64t65.5 88.5t47 122q38 172 -44.5 341.5t-246.5 278.5q22 -44 43 -129q39 -159 -32 -154q-15 2 -33 9q-79 33 -120.5 100t-44 175.5t48.5 257.5q-13 -8 -34 -23.5t-72.5 -66.5t-88.5 -105.5t-60 -138t-8 -166.5q2 -12 8 -41.5t8 -43t6 -39.5 t3.5 -39.5t-1 -33.5t-6 -31.5t-13.5 -24t-21 -20.5t-31 -12q-38 -10 -67 13t-40.5 61.5t-15 81.5t10.5 75q-52 -46 -83.5 -101t-39 -107t-7.5 -85z" />+<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5t145.5 -23.5t132.5 -59t116.5 -83.5t97 -90t74.5 -85.5t49 -63.5t20 -30l26 -40l-26 -40q-6 -10 -20 -30t-49 -63.5t-74.5 -85.5t-97 -90t-116.5 -83.5t-132.5 -59t-145.5 -23.5 t-145.5 23.5t-132.5 59t-116.5 83.5t-97 90t-74.5 85.5t-49 63.5t-20 30zM120 600q7 -10 40.5 -58t56 -78.5t68 -77.5t87.5 -75t103 -49.5t125 -21.5t123.5 20t100.5 45.5t85.5 71.5t66.5 75.5t58 81.5t47 66q-1 1 -28.5 37.5t-42 55t-43.5 53t-57.5 63.5t-58.5 54 q49 -74 49 -163q0 -124 -88 -212t-212 -88t-212 88t-88 212q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l105 105q-37 24 -75 72t-57 84l-20 36z" />+<glyph unicode="" d="M-61 600l26 40q6 10 20 30t49 63.5t74.5 85.5t97 90t116.5 83.5t132.5 59t145.5 23.5q61 0 121 -17l37 142h148l-314 -1200h-148l37 143q-82 21 -165 71.5t-140 102t-109.5 112t-72 88.5t-29.5 43zM120 600q210 -282 393 -336l37 141q-107 18 -178.5 101.5t-71.5 193.5 q0 85 46 158q-102 -87 -226 -258zM377 656q49 -124 154 -191l47 47l23 87q-30 28 -59 69t-44 68l-14 26zM780 161l38 145q22 15 44.5 34t46 44t40.5 44t41 50.5t33.5 43.5t33 44t24.5 34q-97 127 -140 175l39 146q67 -54 131.5 -125.5t87.5 -103.5t36 -52l26 -40l-26 -40 q-7 -12 -25.5 -38t-63.5 -79.5t-95.5 -102.5t-124 -100t-146.5 -79z" />+<glyph unicode="" d="M-97.5 34q13.5 -34 50.5 -34h1294q37 0 50.5 35.5t-7.5 67.5l-642 1056q-20 34 -48 36.5t-48 -29.5l-642 -1066q-21 -32 -7.5 -66zM155 200l445 723l445 -723h-345v100h-200v-100h-345zM500 600l100 -300l100 300v100h-200v-100z" />+<glyph unicode="" d="M100 262v41q0 20 11 44.5t26 38.5l363 325v339q0 62 44 106t106 44t106 -44t44 -106v-339l363 -325q15 -14 26 -38.5t11 -44.5v-41q0 -20 -12 -26.5t-29 5.5l-359 249v-263q100 -91 100 -113v-64q0 -20 -13 -28.5t-32 0.5l-94 78h-222l-94 -78q-19 -9 -32 -0.5t-13 28.5 v64q0 22 100 113v263l-359 -249q-17 -12 -29 -5.5t-12 26.5z" />+<glyph unicode="" d="M0 50q0 -20 14.5 -35t35.5 -15h1000q21 0 35.5 15t14.5 35v750h-1100v-750zM0 900h1100v150q0 21 -14.5 35.5t-35.5 14.5h-150v100h-100v-100h-500v100h-100v-100h-150q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 100v100h100v-100h-100zM100 300v100h100v-100h-100z M100 500v100h100v-100h-100zM300 100v100h100v-100h-100zM300 300v100h100v-100h-100zM300 500v100h100v-100h-100zM500 100v100h100v-100h-100zM500 300v100h100v-100h-100zM500 500v100h100v-100h-100zM700 100v100h100v-100h-100zM700 300v100h100v-100h-100zM700 500 v100h100v-100h-100zM900 100v100h100v-100h-100zM900 300v100h100v-100h-100zM900 500v100h100v-100h-100z" />+<glyph unicode="" d="M0 200v200h259l600 600h241v198l300 -295l-300 -300v197h-159l-600 -600h-341zM0 800h259l122 -122l141 142l-181 180h-341v-200zM678 381l141 142l122 -123h159v198l300 -295l-300 -300v197h-241z" />+<glyph unicode="" d="M0 400v600q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-600q0 -41 -29.5 -70.5t-70.5 -29.5h-596l-304 -300v300h-100q-41 0 -70.5 29.5t-29.5 70.5z" />+<glyph unicode="" d="M100 600v200h300v-250q0 -113 6 -145q17 -92 102 -117q39 -11 92 -11q37 0 66.5 5.5t50 15.5t36 24t24 31.5t14 37.5t7 42t2.5 45t0 47v25v250h300v-200q0 -42 -3 -83t-15 -104t-31.5 -116t-58 -109.5t-89 -96.5t-129 -65.5t-174.5 -25.5t-174.5 25.5t-129 65.5t-89 96.5 t-58 109.5t-31.5 116t-15 104t-3 83zM100 900v300h300v-300h-300zM800 900v300h300v-300h-300z" />+<glyph unicode="" d="M-30 411l227 -227l352 353l353 -353l226 227l-578 579z" />+<glyph unicode="" d="M70 797l580 -579l578 579l-226 227l-353 -353l-352 353z" />+<glyph unicode="" d="M-198 700l299 283l300 -283h-203v-400h385l215 -200h-800v600h-196zM402 1000l215 -200h381v-400h-198l299 -283l299 283h-200v600h-796z" />+<glyph unicode="" d="M18 939q-5 24 10 42q14 19 39 19h896l38 162q5 17 18.5 27.5t30.5 10.5h94q20 0 35 -14.5t15 -35.5t-15 -35.5t-35 -14.5h-54l-201 -961q-2 -4 -6 -10.5t-19 -17.5t-33 -11h-31v-50q0 -20 -14.5 -35t-35.5 -15t-35.5 15t-14.5 35v50h-300v-50q0 -20 -14.5 -35t-35.5 -15 t-35.5 15t-14.5 35v50h-50q-21 0 -35.5 15t-14.5 35q0 21 14.5 35.5t35.5 14.5h535l48 200h-633q-32 0 -54.5 21t-27.5 43z" />+<glyph unicode="" d="M0 0v800h1200v-800h-1200zM0 900v100h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-100h-1200z" />+<glyph unicode="" d="M1 0l300 700h1200l-300 -700h-1200zM1 400v600h200q0 41 29.5 70.5t70.5 29.5h300q41 0 70.5 -29.5t29.5 -70.5h500v-200h-1000z" />+<glyph unicode="" d="M302 300h198v600h-198l298 300l298 -300h-198v-600h198l-298 -300z" />+<glyph unicode="" d="M0 600l300 298v-198h600v198l300 -298l-300 -297v197h-600v-197z" />+<glyph unicode="" d="M0 100v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM31 400l172 739q5 22 23 41.5t38 19.5h672q19 0 37.5 -22.5t23.5 -45.5l172 -732h-1138zM800 100h100v100h-100v-100z M1000 100h100v100h-100v-100z" />+<glyph unicode="" d="M-101 600v50q0 24 25 49t50 38l25 13v-250l-11 5.5t-24 14t-30 21.5t-24 27.5t-11 31.5zM100 500v250v8v8v7t0.5 7t1.5 5.5t2 5t3 4t4.5 3.5t6 1.5t7.5 0.5h200l675 250v-850l-675 200h-38l47 -276q2 -12 -3 -17.5t-11 -6t-21 -0.5h-8h-83q-20 0 -34.5 14t-18.5 35 q-55 337 -55 351zM1100 200v850q0 21 14.5 35.5t35.5 14.5q20 0 35 -14.5t15 -35.5v-850q0 -20 -15 -35t-35 -15q-21 0 -35.5 15t-14.5 35z" />+<glyph unicode="" d="M74 350q0 21 13.5 35.5t33.5 14.5h18l117 173l63 327q15 77 76 140t144 83l-18 32q-6 19 3 32t29 13h94q20 0 29 -10.5t3 -29.5q-18 -36 -18 -37q83 -19 144 -82.5t76 -140.5l63 -327l118 -173h17q20 0 33.5 -14.5t13.5 -35.5q0 -20 -13 -40t-31 -27q-8 -3 -23 -8.5 t-65 -20t-103 -25t-132.5 -19.5t-158.5 -9q-125 0 -245.5 20.5t-178.5 40.5l-58 20q-18 7 -31 27.5t-13 40.5zM497 110q12 -49 40 -79.5t63 -30.5t63 30.5t39 79.5q-48 -6 -102 -6t-103 6z" />+<glyph unicode="" d="M21 445l233 -45l-78 -224l224 78l45 -233l155 179l155 -179l45 233l224 -78l-78 224l234 45l-180 155l180 156l-234 44l78 225l-224 -78l-45 233l-155 -180l-155 180l-45 -233l-224 78l78 -225l-233 -44l179 -156z" />+<glyph unicode="" d="M0 200h200v600h-200v-600zM300 275q0 -75 100 -75h61q124 -100 139 -100h250q46 0 83 57l238 344q29 31 29 74v100q0 44 -30.5 84.5t-69.5 40.5h-328q28 118 28 125v150q0 44 -30.5 84.5t-69.5 40.5h-50q-27 0 -51 -20t-38 -48l-96 -198l-145 -196q-20 -26 -20 -63v-400z M400 300v375l150 213l100 212h50v-175l-50 -225h450v-125l-250 -375h-214l-136 100h-100z" />+<glyph unicode="" d="M0 400v600h200v-600h-200zM300 525v400q0 75 100 75h61q124 100 139 100h250q46 0 83 -57l238 -344q29 -31 29 -74v-100q0 -44 -30.5 -84.5t-69.5 -40.5h-328q28 -118 28 -125v-150q0 -44 -30.5 -84.5t-69.5 -40.5h-50q-27 0 -51 20t-38 48l-96 198l-145 196 q-20 26 -20 63zM400 525l150 -212l100 -213h50v175l-50 225h450v125l-250 375h-214l-136 -100h-100v-375z" />+<glyph unicode="" d="M8 200v600h200v-600h-200zM308 275v525q0 17 14 35.5t28 28.5l14 9l362 230q14 6 25 6q17 0 29 -12l109 -112q14 -14 14 -34q0 -18 -11 -32l-85 -121h302q85 0 138.5 -38t53.5 -110t-54.5 -111t-138.5 -39h-107l-130 -339q-7 -22 -20.5 -41.5t-28.5 -19.5h-341 q-7 0 -90 81t-83 94zM408 289l100 -89h293l131 339q6 21 19.5 41t28.5 20h203q16 0 25 15t9 36q0 20 -9 34.5t-25 14.5h-457h-6.5h-7.5t-6.5 0.5t-6 1t-5 1.5t-5.5 2.5t-4 4t-4 5.5q-5 12 -5 20q0 14 10 27l147 183l-86 83l-339 -236v-503z" />+<glyph unicode="" d="M-101 651q0 72 54 110t139 38l302 -1l-85 121q-11 16 -11 32q0 21 14 34l109 113q13 12 29 12q11 0 25 -6l365 -230q7 -4 17 -10.5t26.5 -26t16.5 -36.5v-526q0 -13 -86 -93.5t-94 -80.5h-341q-16 0 -29.5 20t-19.5 41l-130 339h-107q-84 0 -139 39t-55 111zM-1 601h222 q15 0 28.5 -20.5t19.5 -40.5l131 -339h293l107 89v502l-343 237l-87 -83l145 -184q10 -11 10 -26q0 -11 -5 -20q-1 -3 -3.5 -5.5l-4 -4t-5 -2.5t-5.5 -1.5t-6.5 -1t-6.5 -0.5h-7.5h-6.5h-476v-100zM1000 201v600h200v-600h-200z" />+<glyph unicode="" d="M97 719l230 -363q4 -6 10.5 -15.5t26 -25t36.5 -15.5h525q13 0 94 83t81 90v342q0 15 -20 28.5t-41 19.5l-339 131v106q0 84 -39 139t-111 55t-110 -53.5t-38 -138.5v-302l-121 84q-15 12 -33.5 11.5t-32.5 -13.5l-112 -110q-22 -22 -6 -53zM172 739l83 86l183 -146 q22 -18 47 -5q3 1 5.5 3.5l4 4t2.5 5t1.5 5.5t1 6.5t0.5 6.5v7.5v6.5v456q0 22 25 31t50 -0.5t25 -30.5v-202q0 -16 20 -29.5t41 -19.5l339 -130v-294l-89 -100h-503zM400 0v200h600v-200h-600z" />+<glyph unicode="" d="M2 585q-16 -31 6 -53l112 -110q13 -13 32 -13.5t34 10.5l121 85q0 -51 -0.5 -153.5t-0.5 -148.5q0 -84 38.5 -138t110.5 -54t111 55t39 139v106l339 131q20 6 40.5 19.5t20.5 28.5v342q0 7 -81 90t-94 83h-525q-17 0 -35.5 -14t-28.5 -28l-10 -15zM77 565l236 339h503 l89 -100v-294l-340 -130q-20 -6 -40 -20t-20 -29v-202q0 -22 -25 -31t-50 0t-25 31v456v14.5t-1.5 11.5t-5 12t-9.5 7q-24 13 -46 -5l-184 -146zM305 1104v200h600v-200h-600z" />+<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM298 701l2 -201h300l-2 -194l402 294l-402 298v-197h-300z" />+<glyph unicode="" d="M0 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t231.5 47.5q122 0 232.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-218 -217.5t-300 -80t-299.5 80t-217.5 217.5t-80 299.5zM200 600l402 -294l-2 194h300l2 201h-300v197z" />+<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600h200v-300h200v300h200l-300 400z" />+<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q162 0 299.5 -80t217.5 -218t80 -300t-80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM300 600l300 -400l300 400h-200v300h-200v-300h-200z" />+<glyph unicode="" d="M5 597q0 122 47.5 232.5t127.5 190.5t190.5 127.5t232.5 47.5q121 0 231.5 -47.5t190.5 -127.5t127.5 -190.5t47.5 -232.5q0 -162 -80 -299.5t-217.5 -217.5t-299.5 -80t-300 80t-218 217.5t-80 299.5zM254 780q-8 -33 5.5 -92.5t7.5 -87.5q0 -9 17 -44t16 -60 q12 0 23 -5.5t23 -15t20 -13.5q24 -12 108 -42q22 -8 53 -31.5t59.5 -38.5t57.5 -11q8 -18 -15 -55t-20 -57q42 -71 87 -80q0 -6 -3 -15.5t-3.5 -14.5t4.5 -17q104 -3 221 112q30 29 47 47t34.5 49t20.5 62q-14 9 -37 9.5t-36 7.5q-14 7 -49 15t-52 19q-9 0 -39.5 -0.5 t-46.5 -1.5t-39 -6.5t-39 -16.5q-50 -35 -66 -12q-4 2 -3.5 25.5t0.5 25.5q-6 13 -26.5 17t-24.5 7q2 22 -2 41t-16.5 28t-38.5 -20q-23 -25 -42 4q-19 28 -8 58q6 16 22 22q6 -1 26 -1.5t33.5 -4t19.5 -13.5q12 -19 32 -37.5t34 -27.5l14 -8q0 3 9.5 39.5t5.5 57.5 q-4 23 14.5 44.5t22.5 31.5q5 14 10 35t8.5 31t15.5 22.5t34 21.5q-6 18 10 37q8 0 23.5 -1.5t24.5 -1.5t20.5 4.5t20.5 15.5q-10 23 -30.5 42.5t-38 30t-49 26.5t-43.5 23q11 39 2 44q31 -13 58 -14.5t39 3.5l11 4q7 36 -16.5 53.5t-64.5 28.5t-56 23q-19 -3 -37 0 q-15 -12 -36.5 -21t-34.5 -12t-44 -8t-39 -6q-15 -3 -45.5 0.5t-45.5 -2.5q-21 -7 -52 -26.5t-34 -34.5q-3 -11 6.5 -22.5t8.5 -18.5q-3 -34 -27.5 -90.5t-29.5 -79.5zM518 916q3 12 16 30t16 25q10 -10 18.5 -10t14 6t14.5 14.5t16 12.5q0 -24 17 -66.5t17 -43.5 q-9 2 -31 5t-36 5t-32 8t-30 14zM692 1003h1h-1z" />+<glyph unicode="" d="M0 164.5q0 21.5 15 37.5l600 599q-33 101 6 201.5t135 154.5q164 92 306 -9l-259 -138l145 -232l251 126q13 -175 -151 -267q-123 -70 -253 -23l-596 -596q-15 -16 -36.5 -16t-36.5 16l-111 110q-15 15 -15 36.5z" />+<glyph unicode="" horiz-adv-x="1220" d="M0 196v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 596v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000 q-41 0 -70.5 29.5t-29.5 70.5zM0 996v100q0 41 29.5 70.5t70.5 29.5h1000q41 0 70.5 -29.5t29.5 -70.5v-100q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM600 596h500v100h-500v-100zM800 196h300v100h-300v-100zM900 996h200v100h-200v-100z" />+<glyph unicode="" d="M100 1100v100h1000v-100h-1000zM150 1000h900l-350 -500v-300l-200 -200v500z" />+<glyph unicode="" d="M0 200v200h1200v-200q0 -41 -29.5 -70.5t-70.5 -29.5h-1000q-41 0 -70.5 29.5t-29.5 70.5zM0 500v400q0 41 29.5 70.5t70.5 29.5h300v100q0 41 29.5 70.5t70.5 29.5h200q41 0 70.5 -29.5t29.5 -70.5v-100h300q41 0 70.5 -29.5t29.5 -70.5v-400h-500v100h-200v-100h-500z M500 1000h200v100h-200v-100z" />+<glyph unicode="" d="M0 0v400l129 -129l200 200l142 -142l-200 -200l129 -129h-400zM0 800l129 129l200 -200l142 142l-200 200l129 129h-400v-400zM729 329l142 142l200 -200l129 129v-400h-400l129 129zM729 871l200 200l-129 129h400v-400l-129 129l-200 -200z" />+<glyph unicode="" d="M0 596q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 596q0 -172 121.5 -293t292.5 -121t292.5 121t121.5 293q0 171 -121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM291 655 q0 23 15.5 38.5t38.5 15.5t39 -16t16 -38q0 -23 -16 -39t-39 -16q-22 0 -38 16t-16 39zM400 850q0 22 16 38.5t39 16.5q22 0 38 -16t16 -39t-16 -39t-38 -16q-23 0 -39 16.5t-16 38.5zM514 609q0 32 20.5 56.5t51.5 29.5l122 126l1 1q-9 14 -9 28q0 22 16 38.5t39 16.5 q22 0 38 -16t16 -39t-16 -39t-38 -16q-14 0 -29 10l-55 -145q17 -22 17 -51q0 -36 -25.5 -61.5t-61.5 -25.5t-61.5 25.5t-25.5 61.5zM800 655q0 22 16 38t39 16t38.5 -15.5t15.5 -38.5t-16 -39t-38 -16q-23 0 -39 16t-16 39z" />+<glyph unicode="" d="M-40 375q-13 -95 35 -173q35 -57 94 -89t129 -32q63 0 119 28q33 16 65 40.5t52.5 45.5t59.5 64q40 44 57 61l394 394q35 35 47 84t-3 96q-27 87 -117 104q-20 2 -29 2q-46 0 -78.5 -16.5t-67.5 -51.5l-389 -396l-7 -7l69 -67l377 373q20 22 39 38q23 23 50 23 q38 0 53 -36q16 -39 -20 -75l-547 -547q-52 -52 -125 -52q-55 0 -100 33t-54 96q-5 35 2.5 66t31.5 63t42 50t56 54q24 21 44 41l348 348q52 52 82.5 79.5t84 54t107.5 26.5q25 0 48 -4q95 -17 154 -94.5t51 -175.5q-7 -101 -98 -192l-252 -249l-253 -256l7 -7l69 -60 l517 511q67 67 95 157t11 183q-16 87 -67 154t-130 103q-69 33 -152 33q-107 0 -197 -55q-40 -24 -111 -95l-512 -512q-68 -68 -81 -163z" />+<glyph unicode="" d="M80 784q0 131 98.5 229.5t230.5 98.5q143 0 241 -129q103 129 246 129q129 0 226 -98.5t97 -229.5q0 -46 -17.5 -91t-61 -99t-77 -89.5t-104.5 -105.5q-197 -191 -293 -322l-17 -23l-16 23q-43 58 -100 122.5t-92 99.5t-101 100q-71 70 -104.5 105.5t-77 89.5t-61 99 t-17.5 91zM250 784q0 -27 30.5 -70t61.5 -75.5t95 -94.5l22 -22q93 -90 190 -201q82 92 195 203l12 12q64 62 97.5 97t64.5 79t31 72q0 71 -48 119.5t-105 48.5q-74 0 -132 -83l-118 -171l-114 174q-51 80 -123 80q-60 0 -109.5 -49.5t-49.5 -118.5z" />+<glyph unicode="" d="M57 353q0 -95 66 -159l141 -142q68 -66 159 -66q93 0 159 66l283 283q66 66 66 159t-66 159l-141 141q-8 9 -19 17l-105 -105l212 -212l-389 -389l-247 248l95 95l-18 18q-46 45 -75 101l-55 -55q-66 -66 -66 -159zM269 706q0 -93 66 -159l141 -141q7 -7 19 -17l105 105 l-212 212l389 389l247 -247l-95 -96l18 -17q47 -49 77 -100l29 29q35 35 62.5 88t27.5 96q0 93 -66 159l-141 141q-66 66 -159 66q-95 0 -159 -66l-283 -283q-66 -64 -66 -159z" />+<glyph unicode="" d="M200 100v953q0 21 30 46t81 48t129 38t163 15t162 -15t127 -38t79 -48t29 -46v-953q0 -41 -29.5 -70.5t-70.5 -29.5h-600q-41 0 -70.5 29.5t-29.5 70.5zM300 300h600v700h-600v-700zM496 150q0 -43 30.5 -73.5t73.5 -30.5t73.5 30.5t30.5 73.5t-30.5 73.5t-73.5 30.5 t-73.5 -30.5t-30.5 -73.5z" />+<glyph unicode="" d="M0 0l303 380l207 208l-210 212h300l267 279l-35 36q-15 14 -15 35t15 35q14 15 35 15t35 -15l283 -282q15 -15 15 -36t-15 -35q-14 -15 -35 -15t-35 15l-36 35l-279 -267v-300l-212 210l-208 -207z" />+<glyph unicode="" d="M295 433h139q5 -77 48.5 -126.5t117.5 -64.5v335q-6 1 -15.5 4t-11.5 3q-46 14 -79 26.5t-72 36t-62.5 52t-40 72.5t-16.5 99q0 92 44 159.5t109 101t144 40.5v78h100v-79q38 -4 72.5 -13.5t75.5 -31.5t71 -53.5t51.5 -84t24.5 -118.5h-159q-8 72 -35 109.5t-101 50.5 v-307l64 -14q34 -7 64 -16.5t70 -31.5t67.5 -52t47.5 -80.5t20 -112.5q0 -139 -89 -224t-244 -96v-77h-100v78q-152 17 -237 104q-40 40 -52.5 93.5t-15.5 139.5zM466 889q0 -29 8 -51t16.5 -34t29.5 -22.5t31 -13.5t38 -10q7 -2 11 -3v274q-61 -8 -97.5 -37.5t-36.5 -102.5 zM700 237q170 18 170 151q0 64 -44 99.5t-126 60.5v-311z" />+<glyph unicode="" d="M100 600v100h166q-24 49 -44 104q-10 26 -14.5 55.5t-3 72.5t25 90t68.5 87q97 88 263 88q129 0 230 -89t101 -208h-153q0 52 -34 89.5t-74 51.5t-76 14q-37 0 -79 -14.5t-62 -35.5q-41 -44 -41 -101q0 -28 16.5 -69.5t28 -62.5t41.5 -72h241v-100h-197q8 -50 -2.5 -115 t-31.5 -94q-41 -59 -99 -113q35 11 84 18t70 7q33 1 103 -16t103 -17q76 0 136 30l50 -147q-41 -25 -80.5 -36.5t-59 -13t-61.5 -1.5q-23 0 -128 33t-155 29q-39 -4 -82 -17t-66 -25l-24 -11l-55 145l16.5 11t15.5 10t13.5 9.5t14.5 12t14.5 14t17.5 18.5q48 55 54 126.5 t-30 142.5h-221z" />+<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM602 900l298 300l298 -300h-198v-900h-200v900h-198z" />+<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v200h100v-100h200v-100h-300zM700 400v100h300v-200h-99v-100h-100v100h99v100h-200zM700 700v500h300v-500h-100v100h-100v-100h-100zM801 900h100v200h-100v-200z" />+<glyph unicode="" d="M2 300h198v900h200v-900h198l-298 -300zM700 0v500h300v-500h-100v100h-100v-100h-100zM700 700v200h100v-100h200v-100h-300zM700 1100v100h300v-200h-99v-100h-100v100h99v100h-200zM801 200h100v200h-100v-200z" />+<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 100v400h300v-500h-100v100h-200zM800 1100v100h200v-500h-100v400h-100zM901 200h100v200h-100v-200z" />+<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM800 400v100h200v-500h-100v400h-100zM800 800v400h300v-500h-100v100h-200zM901 900h100v200h-100v-200z" />+<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h500v-200h-500zM700 400v200h400v-200h-400zM700 700v200h300v-200h-300zM700 1000v200h200v-200h-200z" />+<glyph unicode="" d="M2 300l298 -300l298 300h-198v900h-200v-900h-198zM700 100v200h200v-200h-200zM700 400v200h300v-200h-300zM700 700v200h400v-200h-400zM700 1000v200h500v-200h-500z" />+<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q162 0 281 -118.5t119 -281.5v-300q0 -165 -118.5 -282.5t-281.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500z" />+<glyph unicode="" d="M0 400v300q0 163 119 281.5t281 118.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-163 0 -281.5 117.5t-118.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM400 300l333 250l-333 250v-500z" />+<glyph unicode="" d="M0 400v300q0 163 117.5 281.5t282.5 118.5h300q163 0 281.5 -119t118.5 -281v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-300q-165 0 -282.5 117.5t-117.5 282.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 700l250 -333l250 333h-500z" />+<glyph unicode="" d="M0 400v300q0 165 117.5 282.5t282.5 117.5h300q165 0 282.5 -117.5t117.5 -282.5v-300q0 -162 -118.5 -281t-281.5 -119h-300q-165 0 -282.5 118.5t-117.5 281.5zM200 300q0 -41 29.5 -70.5t70.5 -29.5h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5 h-500q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM300 400h500l-250 333z" />+<glyph unicode="" d="M0 400v300h300v200l400 -350l-400 -350v200h-300zM500 0v200h500q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-500v200h400q165 0 282.5 -117.5t117.5 -282.5v-300q0 -165 -117.5 -282.5t-282.5 -117.5h-400z" />+<glyph unicode="" d="M217 519q8 -19 31 -19h302q-155 -438 -160 -458q-5 -21 4 -32l9 -8h9q14 0 26 15q11 13 274.5 321.5t264.5 308.5q14 19 5 36q-8 17 -31 17l-301 -1q1 4 78 219.5t79 227.5q2 15 -5 27l-9 9h-9q-15 0 -25 -16q-4 -6 -98 -111.5t-228.5 -257t-209.5 -237.5q-16 -19 -6 -41 z" />+<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q47 0 100 15v185h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h500v185q-14 4 -114 7.5t-193 5.5l-93 2q-165 0 -282.5 -117.5t-117.5 -282.5v-300zM600 400v300h300v200l400 -350l-400 -350v200h-300z " />+<glyph unicode="" d="M0 400q0 -165 117.5 -282.5t282.5 -117.5h300q163 0 281.5 117.5t118.5 282.5v98l-78 73l-122 -123v-148q0 -41 -29.5 -70.5t-70.5 -29.5h-500q-41 0 -70.5 29.5t-29.5 70.5v500q0 41 29.5 70.5t70.5 29.5h156l118 122l-74 78h-100q-165 0 -282.5 -117.5t-117.5 -282.5 v-300zM496 709l353 342l-149 149h500v-500l-149 149l-342 -353z" />+<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM406 600 q0 80 57 137t137 57t137 -57t57 -137t-57 -137t-137 -57t-137 57t-57 137z" />+<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 800l445 -500l450 500h-295v400h-300v-400h-300zM900 150h100v50h-100v-50z" />+<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 700h300v-300h300v300h295l-445 500zM900 150h100v50h-100v-50z" />+<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 705l305 -305l596 596l-154 155l-442 -442l-150 151zM900 150h100v50h-100v-50z" />+<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM100 988l97 -98l212 213l-97 97zM200 400l697 1l3 699l-250 -239l-149 149l-212 -212l149 -149zM900 150h100v50h-100v-50z" />+<glyph unicode="" d="M0 0v275q0 11 7 18t18 7h1048q11 0 19 -7.5t8 -17.5v-275h-1100zM200 612l212 -212l98 97l-213 212zM300 1200l239 -250l-149 -149l212 -212l149 148l249 -237l-1 697zM900 150h100v50h-100v-50z" />+<glyph unicode="" d="M23 415l1177 784v-1079l-475 272l-310 -393v416h-392zM494 210l672 938l-672 -712v-226z" />+<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-850q0 -21 -15 -35.5t-35 -14.5h-150v400h-700v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200z" />+<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-218l-276 -275l-120 120l-126 -127h-378v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM581 306l123 123l120 -120l353 352l123 -123l-475 -476zM600 1000h100v200h-100v-200z" />+<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-269l-103 -103l-170 170l-298 -298h-329v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 1000h100v200h-100v-200zM700 133l170 170l-170 170l127 127l170 -170l170 170l127 -128l-170 -169l170 -170 l-127 -127l-170 170l-170 -170z" />+<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-300h-400v-200h-500v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300l300 -300l300 300h-200v300h-200v-300h-200zM600 1000v200h100v-200h-100z" />+<glyph unicode="" d="M0 150v1000q0 20 14.5 35t35.5 15h250v-300h500v300h100l200 -200v-402l-200 200l-298 -298h-402v-400h-150q-21 0 -35.5 14.5t-14.5 35.5zM600 300h200v-300h200v300h200l-300 300zM600 1000v200h100v-200h-100z" />+<glyph unicode="" d="M0 250q0 -21 14.5 -35.5t35.5 -14.5h1100q21 0 35.5 14.5t14.5 35.5v550h-1200v-550zM0 900h1200v150q0 21 -14.5 35.5t-35.5 14.5h-1100q-21 0 -35.5 -14.5t-14.5 -35.5v-150zM100 300v200h400v-200h-400z" />+<glyph unicode="" d="M0 400l300 298v-198h400v-200h-400v-198zM100 800v200h100v-200h-100zM300 800v200h100v-200h-100zM500 800v200h400v198l300 -298l-300 -298v198h-400zM800 300v200h100v-200h-100zM1000 300h100v200h-100v-200z" />+<glyph unicode="" d="M100 700v400l50 100l50 -100v-300h100v300l50 100l50 -100v-300h100v300l50 100l50 -100v-400l-100 -203v-447q0 -21 -14.5 -35.5t-35.5 -14.5h-200q-21 0 -35.5 14.5t-14.5 35.5v447zM800 597q0 -29 10.5 -55.5t25 -43t29 -28.5t25.5 -18l10 -5v-397q0 -21 14.5 -35.5 t35.5 -14.5h200q21 0 35.5 14.5t14.5 35.5v1106q0 31 -18 40.5t-44 -7.5l-276 -116q-25 -17 -43.5 -51.5t-18.5 -65.5v-359z" />+<glyph unicode="" d="M100 0h400v56q-75 0 -87.5 6t-12.5 44v394h500v-394q0 -38 -12.5 -44t-87.5 -6v-56h400v56q-4 0 -11 0.5t-24 3t-30 7t-24 15t-11 24.5v888q0 22 25 34.5t50 13.5l25 2v56h-400v-56q75 0 87.5 -6t12.5 -44v-394h-500v394q0 38 12.5 44t87.5 6v56h-400v-56q4 0 11 -0.5 t24 -3t30 -7t24 -15t11 -24.5v-888q0 -22 -25 -34.5t-50 -13.5l-25 -2v-56z" />+<glyph unicode="" d="M0 300q0 -41 29.5 -70.5t70.5 -29.5h300q41 0 70.5 29.5t29.5 70.5v500q0 41 -29.5 70.5t-70.5 29.5h-300q-41 0 -70.5 -29.5t-29.5 -70.5v-500zM100 100h400l200 200h105l295 98v-298h-425l-100 -100h-375zM100 300v200h300v-200h-300zM100 600v200h300v-200h-300z M100 1000h400l200 -200v-98l295 98h105v200h-425l-100 100h-375zM700 402v163l400 133v-163z" />+<glyph unicode="" d="M16.5 974.5q0.5 -21.5 16 -90t46.5 -140t104 -177.5t175 -208q103 -103 207.5 -176t180 -103.5t137 -47t92.5 -16.5l31 1l163 162q17 18 13.5 41t-22.5 37l-192 136q-19 14 -45 12t-42 -19l-118 -118q-142 101 -268 227t-227 268l118 118q17 17 20 41.5t-11 44.5 l-139 194q-14 19 -36.5 22t-40.5 -14l-162 -162q-1 -11 -0.5 -32.5z" />+<glyph unicode="" d="M0 50v212q0 20 10.5 45.5t24.5 39.5l365 303v50q0 4 1 10.5t12 22.5t30 28.5t60 23t97 10.5t97 -10t60 -23.5t30 -27.5t12 -24l1 -10v-50l365 -303q14 -14 24.5 -39.5t10.5 -45.5v-212q0 -21 -14.5 -35.5t-35.5 -14.5h-1100q-20 0 -35 14.5t-15 35.5zM0 712 q0 -21 14.5 -33.5t34.5 -8.5l202 33q20 4 34.5 21t14.5 38v146q141 24 300 24t300 -24v-146q0 -21 14.5 -38t34.5 -21l202 -33q20 -4 34.5 8.5t14.5 33.5v200q-6 8 -19 20.5t-63 45t-112 57t-171 45t-235 20.5q-92 0 -175 -10.5t-141.5 -27t-108.5 -36.5t-81.5 -40 t-53.5 -36.5t-31 -27.5l-9 -10v-200z" />+<glyph unicode="" d="M100 0v100h1100v-100h-1100zM175 200h950l-125 150v250l100 100v400h-100v-200h-100v200h-200v-200h-100v200h-200v-200h-100v200h-100v-400l100 -100v-250z" />+<glyph unicode="" d="M100 0h300v400q0 41 -29.5 70.5t-70.5 29.5h-100q-41 0 -70.5 -29.5t-29.5 -70.5v-400zM500 0v1000q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-1000h-300zM900 0v700q0 41 29.5 70.5t70.5 29.5h100q41 0 70.5 -29.5t29.5 -70.5v-700h-300z" />+<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />+<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h100v200h100v-200h100v500h-100v-200h-100v200h-100v-500zM600 300h200v100h100v300h-100v100h-200v-500 zM700 400v300h100v-300h-100z" />+<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v100h-200v300h200v100h-300v-500zM600 300h300v100h-200v300h200v100h-300v-500z" />+<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 550l300 -150v300zM600 400l300 150l-300 150v-300z" />+<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300v500h700v-500h-700zM300 400h130q41 0 68 42t27 107t-28.5 108t-66.5 43h-130v-300zM575 549 q0 -65 27 -107t68 -42h130v300h-130q-38 0 -66.5 -43t-28.5 -108z" />+<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v300h-200v100h200v100h-300v-300h200v-100h-200v-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />+<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 300h300v400h-200v100h-100v-500zM301 400v200h100v-200h-100zM601 300h100v100h-100v-100zM700 700h100 v-400h100v500h-200v-100z" />+<glyph unicode="" d="M-100 300v500q0 124 88 212t212 88h700q124 0 212 -88t88 -212v-500q0 -124 -88 -212t-212 -88h-700q-124 0 -212 88t-88 212zM100 200h900v700h-900v-700zM200 700v100h300v-300h-99v-100h-100v100h99v200h-200zM201 300v100h100v-100h-100zM601 300v100h100v-100h-100z M700 700v100h200v-500h-100v400h-100z" />+<glyph unicode="" d="M4 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM186 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 500v200 l100 100h300v-100h-300v-200h300v-100h-300z" />+<glyph unicode="" d="M0 600q0 162 80 299t217 217t299 80t299 -80t217 -217t80 -299t-80 -299t-217 -217t-299 -80t-299 80t-217 217t-80 299zM182 600q0 -171 121.5 -292.5t292.5 -121.5t292.5 121.5t121.5 292.5t-121.5 292.5t-292.5 121.5t-292.5 -121.5t-121.5 -292.5zM400 400v400h300 l100 -100v-100h-100v100h-200v-100h200v-100h-200v-100h-100zM700 400v100h100v-100h-100z" />+<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h222v300h400v-300h128q120 0 205 86.5t85 207.5t-85 207t-205 86q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200h200v300h200v-300h200 l-300 -300z" />+<glyph unicode="" d="M-14 494q0 -80 56.5 -137t135.5 -57h8l414 414l403 -403q94 26 154.5 104.5t60.5 178.5q0 120 -85 206.5t-205 86.5q-46 0 -90 -14q-44 97 -134.5 156.5t-200.5 59.5q-152 0 -260 -107.5t-108 -260.5q0 -25 2 -37q-66 -14 -108.5 -67.5t-42.5 -122.5zM300 200l300 300 l300 -300h-200v-300h-200v300h-200z" />+<glyph unicode="" d="M100 200h400v-155l-75 -45h350l-75 45v155h400l-270 300h170l-270 300h170l-300 333l-300 -333h170l-270 -300h170z" />+<glyph unicode="" d="M121 700q0 -53 28.5 -97t75.5 -65q-4 -16 -4 -38q0 -74 52.5 -126.5t126.5 -52.5q56 0 100 30v-306l-75 -45h350l-75 45v306q46 -30 100 -30q74 0 126.5 52.5t52.5 126.5q0 24 -9 55q50 32 79.5 83t29.5 112q0 90 -61.5 155.5t-150.5 71.5q-26 89 -99.5 145.5 t-167.5 56.5q-116 0 -197.5 -81.5t-81.5 -197.5q0 -4 1 -11.5t1 -11.5q-14 2 -23 2q-74 0 -126.5 -52.5t-52.5 -126.5z" />+</font>+</defs></svg>
+ static/fonts/glyphicons-halflings-regular.ttf view
binary file changed (absent → 41280 bytes)
+ static/fonts/glyphicons-halflings-regular.woff view
binary file changed (absent → 23320 bytes)
− static/glyphicons-halflings-white.png
binary file changed (4352 → absent bytes)
− static/glyphicons-halflings.png
binary file changed (4352 → absent bytes)
− static/jquery.full.js
@@ -1,9404 +0,0 @@-/*!- * jQuery JavaScript Library v1.7.2- * http://jquery.com/- *- * Copyright 2011, John Resig- * Dual licensed under the MIT or GPL Version 2 licenses.- * http://jquery.org/license- *- * Includes Sizzle.js- * http://sizzlejs.com/- * Copyright 2011, The Dojo Foundation- * Released under the MIT, BSD, and GPL Licenses.- *- * Date: Wed Mar 21 12:46:34 2012 -0700- */-(function( window, undefined ) {--// Use the correct document accordingly with window argument (sandbox)-var document = window.document,- navigator = window.navigator,- location = window.location;-var jQuery = (function() {--// Define a local copy of jQuery-var jQuery = function( selector, context ) {- // The jQuery object is actually just the init constructor 'enhanced'- return new jQuery.fn.init( selector, context, rootjQuery );- },-- // Map over jQuery in case of overwrite- _jQuery = window.jQuery,-- // Map over the $ in case of overwrite- _$ = window.$,-- // A central reference to the root jQuery(document)- rootjQuery,-- // A simple way to check for HTML strings or ID strings- // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)- quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,-- // Check if a string has a non-whitespace character in it- rnotwhite = /\S/,-- // Used for trimming whitespace- trimLeft = /^\s+/,- trimRight = /\s+$/,-- // Match a standalone tag- rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,-- // JSON RegExp- rvalidchars = /^[\],:{}\s]*$/,- rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,- rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,- rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,-- // Useragent RegExp- rwebkit = /(webkit)[ \/]([\w.]+)/,- ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,- rmsie = /(msie) ([\w.]+)/,- rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,-- // Matches dashed string for camelizing- rdashAlpha = /-([a-z]|[0-9])/ig,- rmsPrefix = /^-ms-/,-- // Used by jQuery.camelCase as callback to replace()- fcamelCase = function( all, letter ) {- return ( letter + "" ).toUpperCase();- },-- // Keep a UserAgent string for use with jQuery.browser- userAgent = navigator.userAgent,-- // For matching the engine and version of the browser- browserMatch,-- // The deferred used on DOM ready- readyList,-- // The ready event handler- DOMContentLoaded,-- // Save a reference to some core methods- toString = Object.prototype.toString,- hasOwn = Object.prototype.hasOwnProperty,- push = Array.prototype.push,- slice = Array.prototype.slice,- trim = String.prototype.trim,- indexOf = Array.prototype.indexOf,-- // [[Class]] -> type pairs- class2type = {};--jQuery.fn = jQuery.prototype = {- constructor: jQuery,- init: function( selector, context, rootjQuery ) {- var match, elem, ret, doc;-- // Handle $(""), $(null), or $(undefined)- if ( !selector ) {- return this;- }-- // Handle $(DOMElement)- if ( selector.nodeType ) {- this.context = this[0] = selector;- this.length = 1;- return this;- }-- // The body element only exists once, optimize finding it- if ( selector === "body" && !context && document.body ) {- this.context = document;- this[0] = document.body;- this.selector = selector;- this.length = 1;- return this;- }-- // Handle HTML strings- if ( typeof selector === "string" ) {- // Are we dealing with HTML string or an ID?- if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {- // Assume that strings that start and end with <> are HTML and skip the regex check- match = [ null, selector, null ];-- } else {- match = quickExpr.exec( selector );- }-- // Verify a match, and that no context was specified for #id- if ( match && (match[1] || !context) ) {-- // HANDLE: $(html) -> $(array)- if ( match[1] ) {- context = context instanceof jQuery ? context[0] : context;- doc = ( context ? context.ownerDocument || context : document );-- // If a single string is passed in and it's a single tag- // just do a createElement and skip the rest- ret = rsingleTag.exec( selector );-- if ( ret ) {- if ( jQuery.isPlainObject( context ) ) {- selector = [ document.createElement( ret[1] ) ];- jQuery.fn.attr.call( selector, context, true );-- } else {- selector = [ doc.createElement( ret[1] ) ];- }-- } else {- ret = jQuery.buildFragment( [ match[1] ], [ doc ] );- selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;- }-- return jQuery.merge( this, selector );-- // HANDLE: $("#id")- } else {- elem = document.getElementById( match[2] );-- // Check parentNode to catch when Blackberry 4.6 returns- // nodes that are no longer in the document #6963- if ( elem && elem.parentNode ) {- // Handle the case where IE and Opera return items- // by name instead of ID- if ( elem.id !== match[2] ) {- return rootjQuery.find( selector );- }-- // Otherwise, we inject the element directly into the jQuery object- this.length = 1;- this[0] = elem;- }-- this.context = document;- this.selector = selector;- return this;- }-- // HANDLE: $(expr, $(...))- } else if ( !context || context.jquery ) {- return ( context || rootjQuery ).find( selector );-- // HANDLE: $(expr, context)- // (which is just equivalent to: $(context).find(expr)- } else {- return this.constructor( context ).find( selector );- }-- // HANDLE: $(function)- // Shortcut for document ready- } else if ( jQuery.isFunction( selector ) ) {- return rootjQuery.ready( selector );- }-- if ( selector.selector !== undefined ) {- this.selector = selector.selector;- this.context = selector.context;- }-- return jQuery.makeArray( selector, this );- },-- // Start with an empty selector- selector: "",-- // The current version of jQuery being used- jquery: "1.7.2",-- // The default length of a jQuery object is 0- length: 0,-- // The number of elements contained in the matched element set- size: function() {- return this.length;- },-- toArray: function() {- return slice.call( this, 0 );- },-- // Get the Nth element in the matched element set OR- // Get the whole matched element set as a clean array- get: function( num ) {- return num == null ?-- // Return a 'clean' array- this.toArray() :-- // Return just the object- ( num < 0 ? this[ this.length + num ] : this[ num ] );- },-- // Take an array of elements and push it onto the stack- // (returning the new matched element set)- pushStack: function( elems, name, selector ) {- // Build a new jQuery matched element set- var ret = this.constructor();-- if ( jQuery.isArray( elems ) ) {- push.apply( ret, elems );-- } else {- jQuery.merge( ret, elems );- }-- // Add the old object onto the stack (as a reference)- ret.prevObject = this;-- ret.context = this.context;-- if ( name === "find" ) {- ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;- } else if ( name ) {- ret.selector = this.selector + "." + name + "(" + selector + ")";- }-- // Return the newly-formed element set- return ret;- },-- // Execute a callback for every element in the matched set.- // (You can seed the arguments with an array of args, but this is- // only used internally.)- each: function( callback, args ) {- return jQuery.each( this, callback, args );- },-- ready: function( fn ) {- // Attach the listeners- jQuery.bindReady();-- // Add the callback- readyList.add( fn );-- return this;- },-- eq: function( i ) {- i = +i;- return i === -1 ?- this.slice( i ) :- this.slice( i, i + 1 );- },-- first: function() {- return this.eq( 0 );- },-- last: function() {- return this.eq( -1 );- },-- slice: function() {- return this.pushStack( slice.apply( this, arguments ),- "slice", slice.call(arguments).join(",") );- },-- map: function( callback ) {- return this.pushStack( jQuery.map(this, function( elem, i ) {- return callback.call( elem, i, elem );- }));- },-- end: function() {- return this.prevObject || this.constructor(null);- },-- // For internal use only.- // Behaves like an Array's method, not like a jQuery method.- push: push,- sort: [].sort,- splice: [].splice-};--// Give the init function the jQuery prototype for later instantiation-jQuery.fn.init.prototype = jQuery.fn;--jQuery.extend = jQuery.fn.extend = function() {- var options, name, src, copy, copyIsArray, clone,- target = arguments[0] || {},- i = 1,- length = arguments.length,- deep = false;-- // Handle a deep copy situation- if ( typeof target === "boolean" ) {- deep = target;- target = arguments[1] || {};- // skip the boolean and the target- i = 2;- }-- // Handle case when target is a string or something (possible in deep copy)- if ( typeof target !== "object" && !jQuery.isFunction(target) ) {- target = {};- }-- // extend jQuery itself if only one argument is passed- if ( length === i ) {- target = this;- --i;- }-- for ( ; i < length; i++ ) {- // Only deal with non-null/undefined values- if ( (options = arguments[ i ]) != null ) {- // Extend the base object- for ( name in options ) {- src = target[ name ];- copy = options[ name ];-- // Prevent never-ending loop- if ( target === copy ) {- continue;- }-- // Recurse if we're merging plain objects or arrays- if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {- if ( copyIsArray ) {- copyIsArray = false;- clone = src && jQuery.isArray(src) ? src : [];-- } else {- clone = src && jQuery.isPlainObject(src) ? src : {};- }-- // Never move original objects, clone them- target[ name ] = jQuery.extend( deep, clone, copy );-- // Don't bring in undefined values- } else if ( copy !== undefined ) {- target[ name ] = copy;- }- }- }- }-- // Return the modified object- return target;-};--jQuery.extend({- noConflict: function( deep ) {- if ( window.$ === jQuery ) {- window.$ = _$;- }-- if ( deep && window.jQuery === jQuery ) {- window.jQuery = _jQuery;- }-- return jQuery;- },-- // Is the DOM ready to be used? Set to true once it occurs.- isReady: false,-- // A counter to track how many items to wait for before- // the ready event fires. See #6781- readyWait: 1,-- // Hold (or release) the ready event- holdReady: function( hold ) {- if ( hold ) {- jQuery.readyWait++;- } else {- jQuery.ready( true );- }- },-- // Handle when the DOM is ready- ready: function( wait ) {- // Either a released hold or an DOMready/load event and not yet ready- if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).- if ( !document.body ) {- return setTimeout( jQuery.ready, 1 );- }-- // Remember that the DOM is ready- jQuery.isReady = true;-- // If a normal DOM Ready event fired, decrement, and wait if need be- if ( wait !== true && --jQuery.readyWait > 0 ) {- return;- }-- // If there are functions bound, to execute- readyList.fireWith( document, [ jQuery ] );-- // Trigger any bound ready events- if ( jQuery.fn.trigger ) {- jQuery( document ).trigger( "ready" ).off( "ready" );- }- }- },-- bindReady: function() {- if ( readyList ) {- return;- }-- readyList = jQuery.Callbacks( "once memory" );-- // Catch cases where $(document).ready() is called after the- // browser event has already occurred.- if ( document.readyState === "complete" ) {- // Handle it asynchronously to allow scripts the opportunity to delay ready- return setTimeout( jQuery.ready, 1 );- }-- // Mozilla, Opera and webkit nightlies currently support this event- if ( document.addEventListener ) {- // Use the handy event callback- document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );-- // A fallback to window.onload, that will always work- window.addEventListener( "load", jQuery.ready, false );-- // If IE event model is used- } else if ( document.attachEvent ) {- // ensure firing before onload,- // maybe late but safe also for iframes- document.attachEvent( "onreadystatechange", DOMContentLoaded );-- // A fallback to window.onload, that will always work- window.attachEvent( "onload", jQuery.ready );-- // If IE and not a frame- // continually check to see if the document is ready- var toplevel = false;-- try {- toplevel = window.frameElement == null;- } catch(e) {}-- if ( document.documentElement.doScroll && toplevel ) {- doScrollCheck();- }- }- },-- // See test/unit/core.js for details concerning isFunction.- // Since version 1.3, DOM methods and functions like alert- // aren't supported. They return false on IE (#2968).- isFunction: function( obj ) {- return jQuery.type(obj) === "function";- },-- isArray: Array.isArray || function( obj ) {- return jQuery.type(obj) === "array";- },-- isWindow: function( obj ) {- return obj != null && obj == obj.window;- },-- isNumeric: function( obj ) {- return !isNaN( parseFloat(obj) ) && isFinite( obj );- },-- type: function( obj ) {- return obj == null ?- String( obj ) :- class2type[ toString.call(obj) ] || "object";- },-- isPlainObject: function( obj ) {- // Must be an Object.- // Because of IE, we also have to check the presence of the constructor property.- // Make sure that DOM nodes and window objects don't pass through, as well- if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {- return false;- }-- try {- // Not own constructor property must be Object- if ( obj.constructor &&- !hasOwn.call(obj, "constructor") &&- !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {- return false;- }- } catch ( e ) {- // IE8,9 Will throw exceptions on certain host objects #9897- return false;- }-- // Own properties are enumerated firstly, so to speed up,- // if last one is own, then all properties are own.-- var key;- for ( key in obj ) {}-- return key === undefined || hasOwn.call( obj, key );- },-- isEmptyObject: function( obj ) {- for ( var name in obj ) {- return false;- }- return true;- },-- error: function( msg ) {- throw new Error( msg );- },-- parseJSON: function( data ) {- if ( typeof data !== "string" || !data ) {- return null;- }-- // Make sure leading/trailing whitespace is removed (IE can't handle it)- data = jQuery.trim( data );-- // Attempt to parse using the native JSON parser first- if ( window.JSON && window.JSON.parse ) {- return window.JSON.parse( data );- }-- // Make sure the incoming data is actual JSON- // Logic borrowed from http://json.org/json2.js- if ( rvalidchars.test( data.replace( rvalidescape, "@" )- .replace( rvalidtokens, "]" )- .replace( rvalidbraces, "")) ) {-- return ( new Function( "return " + data ) )();-- }- jQuery.error( "Invalid JSON: " + data );- },-- // Cross-browser xml parsing- parseXML: function( data ) {- if ( typeof data !== "string" || !data ) {- return null;- }- var xml, tmp;- try {- if ( window.DOMParser ) { // Standard- tmp = new DOMParser();- xml = tmp.parseFromString( data , "text/xml" );- } else { // IE- xml = new ActiveXObject( "Microsoft.XMLDOM" );- xml.async = "false";- xml.loadXML( data );- }- } catch( e ) {- xml = undefined;- }- if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {- jQuery.error( "Invalid XML: " + data );- }- return xml;- },-- noop: function() {},-- // Evaluates a script in a global context- // Workarounds based on findings by Jim Driscoll- // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context- globalEval: function( data ) {- if ( data && rnotwhite.test( data ) ) {- // We use execScript on Internet Explorer- // We use an anonymous function so that context is window- // rather than jQuery in Firefox- ( window.execScript || function( data ) {- window[ "eval" ].call( window, data );- } )( data );- }- },-- // Convert dashed to camelCase; used by the css and data modules- // Microsoft forgot to hump their vendor prefix (#9572)- camelCase: function( string ) {- return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );- },-- nodeName: function( elem, name ) {- return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();- },-- // args is for internal usage only- each: function( object, callback, args ) {- var name, i = 0,- length = object.length,- isObj = length === undefined || jQuery.isFunction( object );-- if ( args ) {- if ( isObj ) {- for ( name in object ) {- if ( callback.apply( object[ name ], args ) === false ) {- break;- }- }- } else {- for ( ; i < length; ) {- if ( callback.apply( object[ i++ ], args ) === false ) {- break;- }- }- }-- // A special, fast, case for the most common use of each- } else {- if ( isObj ) {- for ( name in object ) {- if ( callback.call( object[ name ], name, object[ name ] ) === false ) {- break;- }- }- } else {- for ( ; i < length; ) {- if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {- break;- }- }- }- }-- return object;- },-- // Use native String.trim function wherever possible- trim: trim ?- function( text ) {- return text == null ?- "" :- trim.call( text );- } :-- // Otherwise use our own trimming functionality- function( text ) {- return text == null ?- "" :- text.toString().replace( trimLeft, "" ).replace( trimRight, "" );- },-- // results is for internal usage only- makeArray: function( array, results ) {- var ret = results || [];-- if ( array != null ) {- // The window, strings (and functions) also have 'length'- // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930- var type = jQuery.type( array );-- if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {- push.call( ret, array );- } else {- jQuery.merge( ret, array );- }- }-- return ret;- },-- inArray: function( elem, array, i ) {- var len;-- if ( array ) {- if ( indexOf ) {- return indexOf.call( array, elem, i );- }-- len = array.length;- i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;-- for ( ; i < len; i++ ) {- // Skip accessing in sparse arrays- if ( i in array && array[ i ] === elem ) {- return i;- }- }- }-- return -1;- },-- merge: function( first, second ) {- var i = first.length,- j = 0;-- if ( typeof second.length === "number" ) {- for ( var l = second.length; j < l; j++ ) {- first[ i++ ] = second[ j ];- }-- } else {- while ( second[j] !== undefined ) {- first[ i++ ] = second[ j++ ];- }- }-- first.length = i;-- return first;- },-- grep: function( elems, callback, inv ) {- var ret = [], retVal;- inv = !!inv;-- // Go through the array, only saving the items- // that pass the validator function- for ( var i = 0, length = elems.length; i < length; i++ ) {- retVal = !!callback( elems[ i ], i );- if ( inv !== retVal ) {- ret.push( elems[ i ] );- }- }-- return ret;- },-- // arg is for internal usage only- map: function( elems, callback, arg ) {- var value, key, ret = [],- i = 0,- length = elems.length,- // jquery objects are treated as arrays- isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;-- // Go through the array, translating each of the items to their- if ( isArray ) {- for ( ; i < length; i++ ) {- value = callback( elems[ i ], i, arg );-- if ( value != null ) {- ret[ ret.length ] = value;- }- }-- // Go through every key on the object,- } else {- for ( key in elems ) {- value = callback( elems[ key ], key, arg );-- if ( value != null ) {- ret[ ret.length ] = value;- }- }- }-- // Flatten any nested arrays- return ret.concat.apply( [], ret );- },-- // A global GUID counter for objects- guid: 1,-- // Bind a function to a context, optionally partially applying any- // arguments.- proxy: function( fn, context ) {- if ( typeof context === "string" ) {- var tmp = fn[ context ];- context = fn;- fn = tmp;- }-- // Quick check to determine if target is callable, in the spec- // this throws a TypeError, but we will just return undefined.- if ( !jQuery.isFunction( fn ) ) {- return undefined;- }-- // Simulated bind- var args = slice.call( arguments, 2 ),- proxy = function() {- return fn.apply( context, args.concat( slice.call( arguments ) ) );- };-- // Set the guid of unique handler to the same of original handler, so it can be removed- proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;-- return proxy;- },-- // Mutifunctional method to get and set values to a collection- // The value/s can optionally be executed if it's a function- access: function( elems, fn, key, value, chainable, emptyGet, pass ) {- var exec,- bulk = key == null,- i = 0,- length = elems.length;-- // Sets many values- if ( key && typeof key === "object" ) {- for ( i in key ) {- jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );- }- chainable = 1;-- // Sets one value- } else if ( value !== undefined ) {- // Optionally, function values get executed if exec is true- exec = pass === undefined && jQuery.isFunction( value );-- if ( bulk ) {- // Bulk operations only iterate when executing function values- if ( exec ) {- exec = fn;- fn = function( elem, key, value ) {- return exec.call( jQuery( elem ), value );- };-- // Otherwise they run against the entire set- } else {- fn.call( elems, value );- fn = null;- }- }-- if ( fn ) {- for (; i < length; i++ ) {- fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );- }- }-- chainable = 1;- }-- return chainable ?- elems :-- // Gets- bulk ?- fn.call( elems ) :- length ? fn( elems[0], key ) : emptyGet;- },-- now: function() {- return ( new Date() ).getTime();- },-- // Use of jQuery.browser is frowned upon.- // More details: http://docs.jquery.com/Utilities/jQuery.browser- uaMatch: function( ua ) {- ua = ua.toLowerCase();-- var match = rwebkit.exec( ua ) ||- ropera.exec( ua ) ||- rmsie.exec( ua ) ||- ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||- [];-- return { browser: match[1] || "", version: match[2] || "0" };- },-- sub: function() {- function jQuerySub( selector, context ) {- return new jQuerySub.fn.init( selector, context );- }- jQuery.extend( true, jQuerySub, this );- jQuerySub.superclass = this;- jQuerySub.fn = jQuerySub.prototype = this();- jQuerySub.fn.constructor = jQuerySub;- jQuerySub.sub = this.sub;- jQuerySub.fn.init = function init( selector, context ) {- if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {- context = jQuerySub( context );- }-- return jQuery.fn.init.call( this, selector, context, rootjQuerySub );- };- jQuerySub.fn.init.prototype = jQuerySub.fn;- var rootjQuerySub = jQuerySub(document);- return jQuerySub;- },-- browser: {}-});--// Populate the class2type map-jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {- class2type[ "[object " + name + "]" ] = name.toLowerCase();-});--browserMatch = jQuery.uaMatch( userAgent );-if ( browserMatch.browser ) {- jQuery.browser[ browserMatch.browser ] = true;- jQuery.browser.version = browserMatch.version;-}--// Deprecated, use jQuery.browser.webkit instead-if ( jQuery.browser.webkit ) {- jQuery.browser.safari = true;-}--// IE doesn't match non-breaking spaces with \s-if ( rnotwhite.test( "\xA0" ) ) {- trimLeft = /^[\s\xA0]+/;- trimRight = /[\s\xA0]+$/;-}--// All jQuery objects should point back to these-rootjQuery = jQuery(document);--// Cleanup functions for the document ready method-if ( document.addEventListener ) {- DOMContentLoaded = function() {- document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );- jQuery.ready();- };--} else if ( document.attachEvent ) {- DOMContentLoaded = function() {- // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).- if ( document.readyState === "complete" ) {- document.detachEvent( "onreadystatechange", DOMContentLoaded );- jQuery.ready();- }- };-}--// The DOM ready check for Internet Explorer-function doScrollCheck() {- if ( jQuery.isReady ) {- return;- }-- try {- // If IE is used, use the trick by Diego Perini- // http://javascript.nwbox.com/IEContentLoaded/- document.documentElement.doScroll("left");- } catch(e) {- setTimeout( doScrollCheck, 1 );- return;- }-- // and execute any waiting functions- jQuery.ready();-}--return jQuery;--})();---// String to Object flags format cache-var flagsCache = {};--// Convert String-formatted flags into Object-formatted ones and store in cache-function createFlags( flags ) {- var object = flagsCache[ flags ] = {},- i, length;- flags = flags.split( /\s+/ );- for ( i = 0, length = flags.length; i < length; i++ ) {- object[ flags[i] ] = true;- }- return object;-}--/*- * Create a callback list using the following parameters:- *- * flags: an optional list of space-separated flags that will change how- * the callback list behaves- *- * By default a callback list will act like an event callback list and can be- * "fired" multiple times.- *- * Possible flags:- *- * once: will ensure the callback list can only be fired once (like a Deferred)- *- * memory: will keep track of previous values and will call any callback added- * after the list has been fired right away with the latest "memorized"- * values (like a Deferred)- *- * unique: will ensure a callback can only be added once (no duplicate in the list)- *- * stopOnFalse: interrupt callings when a callback returns false- *- */-jQuery.Callbacks = function( flags ) {-- // Convert flags from String-formatted to Object-formatted- // (we check in cache first)- flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};-- var // Actual callback list- list = [],- // Stack of fire calls for repeatable lists- stack = [],- // Last fire value (for non-forgettable lists)- memory,- // Flag to know if list was already fired- fired,- // Flag to know if list is currently firing- firing,- // First callback to fire (used internally by add and fireWith)- firingStart,- // End of the loop when firing- firingLength,- // Index of currently firing callback (modified by remove if needed)- firingIndex,- // Add one or several callbacks to the list- add = function( args ) {- var i,- length,- elem,- type,- actual;- for ( i = 0, length = args.length; i < length; i++ ) {- elem = args[ i ];- type = jQuery.type( elem );- if ( type === "array" ) {- // Inspect recursively- add( elem );- } else if ( type === "function" ) {- // Add if not in unique mode and callback is not in- if ( !flags.unique || !self.has( elem ) ) {- list.push( elem );- }- }- }- },- // Fire callbacks- fire = function( context, args ) {- args = args || [];- memory = !flags.memory || [ context, args ];- fired = true;- firing = true;- firingIndex = firingStart || 0;- firingStart = 0;- firingLength = list.length;- for ( ; list && firingIndex < firingLength; firingIndex++ ) {- if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {- memory = true; // Mark as halted- break;- }- }- firing = false;- if ( list ) {- if ( !flags.once ) {- if ( stack && stack.length ) {- memory = stack.shift();- self.fireWith( memory[ 0 ], memory[ 1 ] );- }- } else if ( memory === true ) {- self.disable();- } else {- list = [];- }- }- },- // Actual Callbacks object- self = {- // Add a callback or a collection of callbacks to the list- add: function() {- if ( list ) {- var length = list.length;- add( arguments );- // Do we need to add the callbacks to the- // current firing batch?- if ( firing ) {- firingLength = list.length;- // With memory, if we're not firing then- // we should call right away, unless previous- // firing was halted (stopOnFalse)- } else if ( memory && memory !== true ) {- firingStart = length;- fire( memory[ 0 ], memory[ 1 ] );- }- }- return this;- },- // Remove a callback from the list- remove: function() {- if ( list ) {- var args = arguments,- argIndex = 0,- argLength = args.length;- for ( ; argIndex < argLength ; argIndex++ ) {- for ( var i = 0; i < list.length; i++ ) {- if ( args[ argIndex ] === list[ i ] ) {- // Handle firingIndex and firingLength- if ( firing ) {- if ( i <= firingLength ) {- firingLength--;- if ( i <= firingIndex ) {- firingIndex--;- }- }- }- // Remove the element- list.splice( i--, 1 );- // If we have some unicity property then- // we only need to do this once- if ( flags.unique ) {- break;- }- }- }- }- }- return this;- },- // Control if a given callback is in the list- has: function( fn ) {- if ( list ) {- var i = 0,- length = list.length;- for ( ; i < length; i++ ) {- if ( fn === list[ i ] ) {- return true;- }- }- }- return false;- },- // Remove all callbacks from the list- empty: function() {- list = [];- return this;- },- // Have the list do nothing anymore- disable: function() {- list = stack = memory = undefined;- return this;- },- // Is it disabled?- disabled: function() {- return !list;- },- // Lock the list in its current state- lock: function() {- stack = undefined;- if ( !memory || memory === true ) {- self.disable();- }- return this;- },- // Is it locked?- locked: function() {- return !stack;- },- // Call all callbacks with the given context and arguments- fireWith: function( context, args ) {- if ( stack ) {- if ( firing ) {- if ( !flags.once ) {- stack.push( [ context, args ] );- }- } else if ( !( flags.once && memory ) ) {- fire( context, args );- }- }- return this;- },- // Call all the callbacks with the given arguments- fire: function() {- self.fireWith( this, arguments );- return this;- },- // To know if the callbacks have already been called at least once- fired: function() {- return !!fired;- }- };-- return self;-};-----var // Static reference to slice- sliceDeferred = [].slice;--jQuery.extend({-- Deferred: function( func ) {- var doneList = jQuery.Callbacks( "once memory" ),- failList = jQuery.Callbacks( "once memory" ),- progressList = jQuery.Callbacks( "memory" ),- state = "pending",- lists = {- resolve: doneList,- reject: failList,- notify: progressList- },- promise = {- done: doneList.add,- fail: failList.add,- progress: progressList.add,-- state: function() {- return state;- },-- // Deprecated- isResolved: doneList.fired,- isRejected: failList.fired,-- then: function( doneCallbacks, failCallbacks, progressCallbacks ) {- deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );- return this;- },- always: function() {- deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );- return this;- },- pipe: function( fnDone, fnFail, fnProgress ) {- return jQuery.Deferred(function( newDefer ) {- jQuery.each( {- done: [ fnDone, "resolve" ],- fail: [ fnFail, "reject" ],- progress: [ fnProgress, "notify" ]- }, function( handler, data ) {- var fn = data[ 0 ],- action = data[ 1 ],- returned;- if ( jQuery.isFunction( fn ) ) {- deferred[ handler ](function() {- returned = fn.apply( this, arguments );- if ( returned && jQuery.isFunction( returned.promise ) ) {- returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );- } else {- newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );- }- });- } else {- deferred[ handler ]( newDefer[ action ] );- }- });- }).promise();- },- // Get a promise for this deferred- // If obj is provided, the promise aspect is added to the object- promise: function( obj ) {- if ( obj == null ) {- obj = promise;- } else {- for ( var key in promise ) {- obj[ key ] = promise[ key ];- }- }- return obj;- }- },- deferred = promise.promise({}),- key;-- for ( key in lists ) {- deferred[ key ] = lists[ key ].fire;- deferred[ key + "With" ] = lists[ key ].fireWith;- }-- // Handle state- deferred.done( function() {- state = "resolved";- }, failList.disable, progressList.lock ).fail( function() {- state = "rejected";- }, doneList.disable, progressList.lock );-- // Call given func if any- if ( func ) {- func.call( deferred, deferred );- }-- // All done!- return deferred;- },-- // Deferred helper- when: function( firstParam ) {- var args = sliceDeferred.call( arguments, 0 ),- i = 0,- length = args.length,- pValues = new Array( length ),- count = length,- pCount = length,- deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?- firstParam :- jQuery.Deferred(),- promise = deferred.promise();- function resolveFunc( i ) {- return function( value ) {- args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;- if ( !( --count ) ) {- deferred.resolveWith( deferred, args );- }- };- }- function progressFunc( i ) {- return function( value ) {- pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;- deferred.notifyWith( promise, pValues );- };- }- if ( length > 1 ) {- for ( ; i < length; i++ ) {- if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {- args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );- } else {- --count;- }- }- if ( !count ) {- deferred.resolveWith( deferred, args );- }- } else if ( deferred !== firstParam ) {- deferred.resolveWith( deferred, length ? [ firstParam ] : [] );- }- return promise;- }-});-----jQuery.support = (function() {-- var support,- all,- a,- select,- opt,- input,- fragment,- tds,- events,- eventName,- i,- isSupported,- div = document.createElement( "div" ),- documentElement = document.documentElement;-- // Preliminary tests- div.setAttribute("className", "t");- div.innerHTML = " <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";-- all = div.getElementsByTagName( "*" );- a = div.getElementsByTagName( "a" )[ 0 ];-- // Can't get basic test support- if ( !all || !all.length || !a ) {- return {};- }-- // First batch of supports tests- select = document.createElement( "select" );- opt = select.appendChild( document.createElement("option") );- input = div.getElementsByTagName( "input" )[ 0 ];-- support = {- // IE strips leading whitespace when .innerHTML is used- leadingWhitespace: ( div.firstChild.nodeType === 3 ),-- // Make sure that tbody elements aren't automatically inserted- // IE will insert them into empty tables- tbody: !div.getElementsByTagName("tbody").length,-- // Make sure that link elements get serialized correctly by innerHTML- // This requires a wrapper element in IE- htmlSerialize: !!div.getElementsByTagName("link").length,-- // Get the style information from getAttribute- // (IE uses .cssText instead)- style: /top/.test( a.getAttribute("style") ),-- // Make sure that URLs aren't manipulated- // (IE normalizes it by default)- hrefNormalized: ( a.getAttribute("href") === "/a" ),-- // Make sure that element opacity exists- // (IE uses filter instead)- // Use a regex to work around a WebKit issue. See #5145- opacity: /^0.55/.test( a.style.opacity ),-- // Verify style float existence- // (IE uses styleFloat instead of cssFloat)- cssFloat: !!a.style.cssFloat,-- // Make sure that if no value is specified for a checkbox- // that it defaults to "on".- // (WebKit defaults to "" instead)- checkOn: ( input.value === "on" ),-- // Make sure that a selected-by-default option has a working selected property.- // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)- optSelected: opt.selected,-- // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)- getSetAttribute: div.className !== "t",-- // Tests for enctype support on a form(#6743)- enctype: !!document.createElement("form").enctype,-- // Makes sure cloning an html5 element does not cause problems- // Where outerHTML is undefined, this still works- html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",-- // Will be defined later- submitBubbles: true,- changeBubbles: true,- focusinBubbles: false,- deleteExpando: true,- noCloneEvent: true,- inlineBlockNeedsLayout: false,- shrinkWrapBlocks: false,- reliableMarginRight: true,- pixelMargin: true- };-- // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead- jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");-- // Make sure checked status is properly cloned- input.checked = true;- support.noCloneChecked = input.cloneNode( true ).checked;-- // Make sure that the options inside disabled selects aren't marked as disabled- // (WebKit marks them as disabled)- select.disabled = true;- support.optDisabled = !opt.disabled;-- // Test to see if it's possible to delete an expando from an element- // Fails in Internet Explorer- try {- delete div.test;- } catch( e ) {- support.deleteExpando = false;- }-- if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {- div.attachEvent( "onclick", function() {- // Cloning a node shouldn't copy over any- // bound event handlers (IE does this)- support.noCloneEvent = false;- });- div.cloneNode( true ).fireEvent( "onclick" );- }-- // Check if a radio maintains its value- // after being appended to the DOM- input = document.createElement("input");- input.value = "t";- input.setAttribute("type", "radio");- support.radioValue = input.value === "t";-- input.setAttribute("checked", "checked");-- // #11217 - WebKit loses check when the name is after the checked attribute- input.setAttribute( "name", "t" );-- div.appendChild( input );- fragment = document.createDocumentFragment();- fragment.appendChild( div.lastChild );-- // WebKit doesn't clone checked state correctly in fragments- support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;-- // Check if a disconnected checkbox will retain its checked- // value of true after appended to the DOM (IE6/7)- support.appendChecked = input.checked;-- fragment.removeChild( input );- fragment.appendChild( div );-- // Technique from Juriy Zaytsev- // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/- // We only care about the case where non-standard event systems- // are used, namely in IE. Short-circuiting here helps us to- // avoid an eval call (in setAttribute) which can cause CSP- // to go haywire. See: https://developer.mozilla.org/en/Security/CSP- if ( div.attachEvent ) {- for ( i in {- submit: 1,- change: 1,- focusin: 1- }) {- eventName = "on" + i;- isSupported = ( eventName in div );- if ( !isSupported ) {- div.setAttribute( eventName, "return;" );- isSupported = ( typeof div[ eventName ] === "function" );- }- support[ i + "Bubbles" ] = isSupported;- }- }-- fragment.removeChild( div );-- // Null elements to avoid leaks in IE- fragment = select = opt = div = input = null;-- // Run tests that need a body at doc ready- jQuery(function() {- var container, outer, inner, table, td, offsetSupport,- marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,- paddingMarginBorderVisibility, paddingMarginBorder,- body = document.getElementsByTagName("body")[0];-- if ( !body ) {- // Return for frameset docs that don't have a body- return;- }-- conMarginTop = 1;- paddingMarginBorder = "padding:0;margin:0;border:";- positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";- paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";- style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";- html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +- "<table " + style + "' cellpadding='0' cellspacing='0'>" +- "<tr><td></td></tr></table>";-- container = document.createElement("div");- container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";- body.insertBefore( container, body.firstChild );-- // Construct the test element- div = document.createElement("div");- container.appendChild( div );-- // Check if table cells still have offsetWidth/Height when they are set- // to display:none and there are still other visible table cells in a- // table row; if so, offsetWidth/Height are not reliable for use when- // determining if an element has been hidden directly using- // display:none (it is still safe to use offsets if a parent element is- // hidden; don safety goggles and see bug #4512 for more information).- // (only IE 8 fails this test)- div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";- tds = div.getElementsByTagName( "td" );- isSupported = ( tds[ 0 ].offsetHeight === 0 );-- tds[ 0 ].style.display = "";- tds[ 1 ].style.display = "none";-- // Check if empty table cells still have offsetWidth/Height- // (IE <= 8 fail this test)- support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );-- // Check if div with explicit width and no margin-right incorrectly- // gets computed margin-right based on width of container. For more- // info see bug #3333- // Fails in WebKit before Feb 2011 nightlies- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right- if ( window.getComputedStyle ) {- div.innerHTML = "";- marginDiv = document.createElement( "div" );- marginDiv.style.width = "0";- marginDiv.style.marginRight = "0";- div.style.width = "2px";- div.appendChild( marginDiv );- support.reliableMarginRight =- ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;- }-- if ( typeof div.style.zoom !== "undefined" ) {- // Check if natively block-level elements act like inline-block- // elements when setting their display to 'inline' and giving- // them layout- // (IE < 8 does this)- div.innerHTML = "";- div.style.width = div.style.padding = "1px";- div.style.border = 0;- div.style.overflow = "hidden";- div.style.display = "inline";- div.style.zoom = 1;- support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );-- // Check if elements with layout shrink-wrap their children- // (IE 6 does this)- div.style.display = "block";- div.style.overflow = "visible";- div.innerHTML = "<div style='width:5px;'></div>";- support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );- }-- div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;- div.innerHTML = html;-- outer = div.firstChild;- inner = outer.firstChild;- td = outer.nextSibling.firstChild.firstChild;-- offsetSupport = {- doesNotAddBorder: ( inner.offsetTop !== 5 ),- doesAddBorderForTableAndCells: ( td.offsetTop === 5 )- };-- inner.style.position = "fixed";- inner.style.top = "20px";-- // safari subtracts parent border width here which is 5px- offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );- inner.style.position = inner.style.top = "";-- outer.style.overflow = "hidden";- outer.style.position = "relative";-- offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );- offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );-- if ( window.getComputedStyle ) {- div.style.marginTop = "1%";- support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";- }-- if ( typeof container.style.zoom !== "undefined" ) {- container.style.zoom = 1;- }-- body.removeChild( container );- marginDiv = div = container = null;-- jQuery.extend( support, offsetSupport );- });-- return support;-})();-----var rbrace = /^(?:\{.*\}|\[.*\])$/,- rmultiDash = /([A-Z])/g;--jQuery.extend({- cache: {},-- // Please use with caution- uuid: 0,-- // Unique for each copy of jQuery on the page- // Non-digits removed to match rinlinejQuery- expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),-- // The following elements throw uncatchable exceptions if you- // attempt to add expando properties to them.- noData: {- "embed": true,- // Ban all objects except for Flash (which handle expandos)- "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",- "applet": true- },-- hasData: function( elem ) {- elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];- return !!elem && !isEmptyDataObject( elem );- },-- data: function( elem, name, data, pvt /* Internal Use Only */ ) {- if ( !jQuery.acceptData( elem ) ) {- return;- }-- var privateCache, thisCache, ret,- internalKey = jQuery.expando,- getByName = typeof name === "string",-- // We have to handle DOM nodes and JS objects differently because IE6-7- // can't GC object references properly across the DOM-JS boundary- isNode = elem.nodeType,-- // Only DOM nodes need the global jQuery cache; JS object data is- // attached directly to the object so GC can occur automatically- cache = isNode ? jQuery.cache : elem,-- // Only defining an ID for JS objects if its cache already exists allows- // the code to shortcut on the same path as a DOM node with no cache- id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,- isEvents = name === "events";-- // Avoid doing any more work than we need to when trying to get data on an- // object that has no data at all- if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {- return;- }-- if ( !id ) {- // Only DOM nodes need a new unique ID for each element since their data- // ends up in the global cache- if ( isNode ) {- elem[ internalKey ] = id = ++jQuery.uuid;- } else {- id = internalKey;- }- }-- if ( !cache[ id ] ) {- cache[ id ] = {};-- // Avoids exposing jQuery metadata on plain JS objects when the object- // is serialized using JSON.stringify- if ( !isNode ) {- cache[ id ].toJSON = jQuery.noop;- }- }-- // An object can be passed to jQuery.data instead of a key/value pair; this gets- // shallow copied over onto the existing cache- if ( typeof name === "object" || typeof name === "function" ) {- if ( pvt ) {- cache[ id ] = jQuery.extend( cache[ id ], name );- } else {- cache[ id ].data = jQuery.extend( cache[ id ].data, name );- }- }-- privateCache = thisCache = cache[ id ];-- // jQuery data() is stored in a separate object inside the object's internal data- // cache in order to avoid key collisions between internal data and user-defined- // data.- if ( !pvt ) {- if ( !thisCache.data ) {- thisCache.data = {};- }-- thisCache = thisCache.data;- }-- if ( data !== undefined ) {- thisCache[ jQuery.camelCase( name ) ] = data;- }-- // Users should not attempt to inspect the internal events object using jQuery.data,- // it is undocumented and subject to change. But does anyone listen? No.- if ( isEvents && !thisCache[ name ] ) {- return privateCache.events;- }-- // Check for both converted-to-camel and non-converted data property names- // If a data property was specified- if ( getByName ) {-- // First Try to find as-is property data- ret = thisCache[ name ];-- // Test for null|undefined property data- if ( ret == null ) {-- // Try to find the camelCased property- ret = thisCache[ jQuery.camelCase( name ) ];- }- } else {- ret = thisCache;- }-- return ret;- },-- removeData: function( elem, name, pvt /* Internal Use Only */ ) {- if ( !jQuery.acceptData( elem ) ) {- return;- }-- var thisCache, i, l,-- // Reference to internal data cache key- internalKey = jQuery.expando,-- isNode = elem.nodeType,-- // See jQuery.data for more information- cache = isNode ? jQuery.cache : elem,-- // See jQuery.data for more information- id = isNode ? elem[ internalKey ] : internalKey;-- // If there is already no cache entry for this object, there is no- // purpose in continuing- if ( !cache[ id ] ) {- return;- }-- if ( name ) {-- thisCache = pvt ? cache[ id ] : cache[ id ].data;-- if ( thisCache ) {-- // Support array or space separated string names for data keys- if ( !jQuery.isArray( name ) ) {-- // try the string as a key before any manipulation- if ( name in thisCache ) {- name = [ name ];- } else {-- // split the camel cased version by spaces unless a key with the spaces exists- name = jQuery.camelCase( name );- if ( name in thisCache ) {- name = [ name ];- } else {- name = name.split( " " );- }- }- }-- for ( i = 0, l = name.length; i < l; i++ ) {- delete thisCache[ name[i] ];- }-- // If there is no data left in the cache, we want to continue- // and let the cache object itself get destroyed- if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {- return;- }- }- }-- // See jQuery.data for more information- if ( !pvt ) {- delete cache[ id ].data;-- // Don't destroy the parent cache unless the internal data object- // had been the only thing left in it- if ( !isEmptyDataObject(cache[ id ]) ) {- return;- }- }-- // Browsers that fail expando deletion also refuse to delete expandos on- // the window, but it will allow it on all other JS objects; other browsers- // don't care- // Ensure that `cache` is not a window object #10080- if ( jQuery.support.deleteExpando || !cache.setInterval ) {- delete cache[ id ];- } else {- cache[ id ] = null;- }-- // We destroyed the cache and need to eliminate the expando on the node to avoid- // false lookups in the cache for entries that no longer exist- if ( isNode ) {- // IE does not allow us to delete expando properties from nodes,- // nor does it have a removeAttribute function on Document nodes;- // we must handle all of these cases- if ( jQuery.support.deleteExpando ) {- delete elem[ internalKey ];- } else if ( elem.removeAttribute ) {- elem.removeAttribute( internalKey );- } else {- elem[ internalKey ] = null;- }- }- },-- // For internal use only.- _data: function( elem, name, data ) {- return jQuery.data( elem, name, data, true );- },-- // A method for determining if a DOM node can handle the data expando- acceptData: function( elem ) {- if ( elem.nodeName ) {- var match = jQuery.noData[ elem.nodeName.toLowerCase() ];-- if ( match ) {- return !(match === true || elem.getAttribute("classid") !== match);- }- }-- return true;- }-});--jQuery.fn.extend({- data: function( key, value ) {- var parts, part, attr, name, l,- elem = this[0],- i = 0,- data = null;-- // Gets all values- if ( key === undefined ) {- if ( this.length ) {- data = jQuery.data( elem );-- if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {- attr = elem.attributes;- for ( l = attr.length; i < l; i++ ) {- name = attr[i].name;-- if ( name.indexOf( "data-" ) === 0 ) {- name = jQuery.camelCase( name.substring(5) );-- dataAttr( elem, name, data[ name ] );- }- }- jQuery._data( elem, "parsedAttrs", true );- }- }-- return data;- }-- // Sets multiple values- if ( typeof key === "object" ) {- return this.each(function() {- jQuery.data( this, key );- });- }-- parts = key.split( ".", 2 );- parts[1] = parts[1] ? "." + parts[1] : "";- part = parts[1] + "!";-- return jQuery.access( this, function( value ) {-- if ( value === undefined ) {- data = this.triggerHandler( "getData" + part, [ parts[0] ] );-- // Try to fetch any internally stored data first- if ( data === undefined && elem ) {- data = jQuery.data( elem, key );- data = dataAttr( elem, key, data );- }-- return data === undefined && parts[1] ?- this.data( parts[0] ) :- data;- }-- parts[1] = value;- this.each(function() {- var self = jQuery( this );-- self.triggerHandler( "setData" + part, parts );- jQuery.data( this, key, value );- self.triggerHandler( "changeData" + part, parts );- });- }, null, value, arguments.length > 1, null, false );- },-- removeData: function( key ) {- return this.each(function() {- jQuery.removeData( this, key );- });- }-});--function dataAttr( elem, key, data ) {- // If nothing was found internally, try to fetch any- // data from the HTML5 data-* attribute- if ( data === undefined && elem.nodeType === 1 ) {-- var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();-- data = elem.getAttribute( name );-- if ( typeof data === "string" ) {- try {- data = data === "true" ? true :- data === "false" ? false :- data === "null" ? null :- jQuery.isNumeric( data ) ? +data :- rbrace.test( data ) ? jQuery.parseJSON( data ) :- data;- } catch( e ) {}-- // Make sure we set the data so it isn't changed later- jQuery.data( elem, key, data );-- } else {- data = undefined;- }- }-- return data;-}--// checks a cache object for emptiness-function isEmptyDataObject( obj ) {- for ( var name in obj ) {-- // if the public data object is empty, the private is still empty- if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {- continue;- }- if ( name !== "toJSON" ) {- return false;- }- }-- return true;-}-----function handleQueueMarkDefer( elem, type, src ) {- var deferDataKey = type + "defer",- queueDataKey = type + "queue",- markDataKey = type + "mark",- defer = jQuery._data( elem, deferDataKey );- if ( defer &&- ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&- ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {- // Give room for hard-coded callbacks to fire first- // and eventually mark/queue something else on the element- setTimeout( function() {- if ( !jQuery._data( elem, queueDataKey ) &&- !jQuery._data( elem, markDataKey ) ) {- jQuery.removeData( elem, deferDataKey, true );- defer.fire();- }- }, 0 );- }-}--jQuery.extend({-- _mark: function( elem, type ) {- if ( elem ) {- type = ( type || "fx" ) + "mark";- jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );- }- },-- _unmark: function( force, elem, type ) {- if ( force !== true ) {- type = elem;- elem = force;- force = false;- }- if ( elem ) {- type = type || "fx";- var key = type + "mark",- count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );- if ( count ) {- jQuery._data( elem, key, count );- } else {- jQuery.removeData( elem, key, true );- handleQueueMarkDefer( elem, type, "mark" );- }- }- },-- queue: function( elem, type, data ) {- var q;- if ( elem ) {- type = ( type || "fx" ) + "queue";- q = jQuery._data( elem, type );-- // Speed up dequeue by getting out quickly if this is just a lookup- if ( data ) {- if ( !q || jQuery.isArray(data) ) {- q = jQuery._data( elem, type, jQuery.makeArray(data) );- } else {- q.push( data );- }- }- return q || [];- }- },-- dequeue: function( elem, type ) {- type = type || "fx";-- var queue = jQuery.queue( elem, type ),- fn = queue.shift(),- hooks = {};-- // If the fx queue is dequeued, always remove the progress sentinel- if ( fn === "inprogress" ) {- fn = queue.shift();- }-- if ( fn ) {- // Add a progress sentinel to prevent the fx queue from being- // automatically dequeued- if ( type === "fx" ) {- queue.unshift( "inprogress" );- }-- jQuery._data( elem, type + ".run", hooks );- fn.call( elem, function() {- jQuery.dequeue( elem, type );- }, hooks );- }-- if ( !queue.length ) {- jQuery.removeData( elem, type + "queue " + type + ".run", true );- handleQueueMarkDefer( elem, type, "queue" );- }- }-});--jQuery.fn.extend({- queue: function( type, data ) {- var setter = 2;-- if ( typeof type !== "string" ) {- data = type;- type = "fx";- setter--;- }-- if ( arguments.length < setter ) {- return jQuery.queue( this[0], type );- }-- return data === undefined ?- this :- this.each(function() {- var queue = jQuery.queue( this, type, data );-- if ( type === "fx" && queue[0] !== "inprogress" ) {- jQuery.dequeue( this, type );- }- });- },- dequeue: function( type ) {- return this.each(function() {- jQuery.dequeue( this, type );- });- },- // Based off of the plugin by Clint Helfers, with permission.- // http://blindsignals.com/index.php/2009/07/jquery-delay/- delay: function( time, type ) {- time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;- type = type || "fx";-- return this.queue( type, function( next, hooks ) {- var timeout = setTimeout( next, time );- hooks.stop = function() {- clearTimeout( timeout );- };- });- },- clearQueue: function( type ) {- return this.queue( type || "fx", [] );- },- // Get a promise resolved when queues of a certain type- // are emptied (fx is the type by default)- promise: function( type, object ) {- if ( typeof type !== "string" ) {- object = type;- type = undefined;- }- type = type || "fx";- var defer = jQuery.Deferred(),- elements = this,- i = elements.length,- count = 1,- deferDataKey = type + "defer",- queueDataKey = type + "queue",- markDataKey = type + "mark",- tmp;- function resolve() {- if ( !( --count ) ) {- defer.resolveWith( elements, [ elements ] );- }- }- while( i-- ) {- if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||- ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||- jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&- jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {- count++;- tmp.add( resolve );- }- }- resolve();- return defer.promise( object );- }-});-----var rclass = /[\n\t\r]/g,- rspace = /\s+/,- rreturn = /\r/g,- rtype = /^(?:button|input)$/i,- rfocusable = /^(?:button|input|object|select|textarea)$/i,- rclickable = /^a(?:rea)?$/i,- rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,- getSetAttribute = jQuery.support.getSetAttribute,- nodeHook, boolHook, fixSpecified;--jQuery.fn.extend({- attr: function( name, value ) {- return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );- },-- removeAttr: function( name ) {- return this.each(function() {- jQuery.removeAttr( this, name );- });- },-- prop: function( name, value ) {- return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );- },-- removeProp: function( name ) {- name = jQuery.propFix[ name ] || name;- return this.each(function() {- // try/catch handles cases where IE balks (such as removing a property on window)- try {- this[ name ] = undefined;- delete this[ name ];- } catch( e ) {}- });- },-- addClass: function( value ) {- var classNames, i, l, elem,- setClass, c, cl;-- if ( jQuery.isFunction( value ) ) {- return this.each(function( j ) {- jQuery( this ).addClass( value.call(this, j, this.className) );- });- }-- if ( value && typeof value === "string" ) {- classNames = value.split( rspace );-- for ( i = 0, l = this.length; i < l; i++ ) {- elem = this[ i ];-- if ( elem.nodeType === 1 ) {- if ( !elem.className && classNames.length === 1 ) {- elem.className = value;-- } else {- setClass = " " + elem.className + " ";-- for ( c = 0, cl = classNames.length; c < cl; c++ ) {- if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {- setClass += classNames[ c ] + " ";- }- }- elem.className = jQuery.trim( setClass );- }- }- }- }-- return this;- },-- removeClass: function( value ) {- var classNames, i, l, elem, className, c, cl;-- if ( jQuery.isFunction( value ) ) {- return this.each(function( j ) {- jQuery( this ).removeClass( value.call(this, j, this.className) );- });- }-- if ( (value && typeof value === "string") || value === undefined ) {- classNames = ( value || "" ).split( rspace );-- for ( i = 0, l = this.length; i < l; i++ ) {- elem = this[ i ];-- if ( elem.nodeType === 1 && elem.className ) {- if ( value ) {- className = (" " + elem.className + " ").replace( rclass, " " );- for ( c = 0, cl = classNames.length; c < cl; c++ ) {- className = className.replace(" " + classNames[ c ] + " ", " ");- }- elem.className = jQuery.trim( className );-- } else {- elem.className = "";- }- }- }- }-- return this;- },-- toggleClass: function( value, stateVal ) {- var type = typeof value,- isBool = typeof stateVal === "boolean";-- if ( jQuery.isFunction( value ) ) {- return this.each(function( i ) {- jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );- });- }-- return this.each(function() {- if ( type === "string" ) {- // toggle individual class names- var className,- i = 0,- self = jQuery( this ),- state = stateVal,- classNames = value.split( rspace );-- while ( (className = classNames[ i++ ]) ) {- // check each className given, space seperated list- state = isBool ? state : !self.hasClass( className );- self[ state ? "addClass" : "removeClass" ]( className );- }-- } else if ( type === "undefined" || type === "boolean" ) {- if ( this.className ) {- // store className if set- jQuery._data( this, "__className__", this.className );- }-- // toggle whole className- this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";- }- });- },-- hasClass: function( selector ) {- var className = " " + selector + " ",- i = 0,- l = this.length;- for ( ; i < l; i++ ) {- if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {- return true;- }- }-- return false;- },-- val: function( value ) {- var hooks, ret, isFunction,- elem = this[0];-- if ( !arguments.length ) {- if ( elem ) {- hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];-- if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {- return ret;- }-- ret = elem.value;-- return typeof ret === "string" ?- // handle most common string cases- ret.replace(rreturn, "") :- // handle cases where value is null/undef or number- ret == null ? "" : ret;- }-- return;- }-- isFunction = jQuery.isFunction( value );-- return this.each(function( i ) {- var self = jQuery(this), val;-- if ( this.nodeType !== 1 ) {- return;- }-- if ( isFunction ) {- val = value.call( this, i, self.val() );- } else {- val = value;- }-- // Treat null/undefined as ""; convert numbers to string- if ( val == null ) {- val = "";- } else if ( typeof val === "number" ) {- val += "";- } else if ( jQuery.isArray( val ) ) {- val = jQuery.map(val, function ( value ) {- return value == null ? "" : value + "";- });- }-- hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];-- // If set returns undefined, fall back to normal setting- if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {- this.value = val;- }- });- }-});--jQuery.extend({- valHooks: {- option: {- get: function( elem ) {- // attributes.value is undefined in Blackberry 4.7 but- // uses .value. See #6932- var val = elem.attributes.value;- return !val || val.specified ? elem.value : elem.text;- }- },- select: {- get: function( elem ) {- var value, i, max, option,- index = elem.selectedIndex,- values = [],- options = elem.options,- one = elem.type === "select-one";-- // Nothing was selected- if ( index < 0 ) {- return null;- }-- // Loop through all the selected options- i = one ? index : 0;- max = one ? index + 1 : options.length;- for ( ; i < max; i++ ) {- option = options[ i ];-- // Don't return options that are disabled or in a disabled optgroup- if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&- (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {-- // Get the specific value for the option- value = jQuery( option ).val();-- // We don't need an array for one selects- if ( one ) {- return value;- }-- // Multi-Selects return an array- values.push( value );- }- }-- // Fixes Bug #2551 -- select.val() broken in IE after form.reset()- if ( one && !values.length && options.length ) {- return jQuery( options[ index ] ).val();- }-- return values;- },-- set: function( elem, value ) {- var values = jQuery.makeArray( value );-- jQuery(elem).find("option").each(function() {- this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;- });-- if ( !values.length ) {- elem.selectedIndex = -1;- }- return values;- }- }- },-- attrFn: {- val: true,- css: true,- html: true,- text: true,- data: true,- width: true,- height: true,- offset: true- },-- attr: function( elem, name, value, pass ) {- var ret, hooks, notxml,- nType = elem.nodeType;-- // don't get/set attributes on text, comment and attribute nodes- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {- return;- }-- if ( pass && name in jQuery.attrFn ) {- return jQuery( elem )[ name ]( value );- }-- // Fallback to prop when attributes are not supported- if ( typeof elem.getAttribute === "undefined" ) {- return jQuery.prop( elem, name, value );- }-- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );-- // All attributes are lowercase- // Grab necessary hook if one is defined- if ( notxml ) {- name = name.toLowerCase();- hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );- }-- if ( value !== undefined ) {-- if ( value === null ) {- jQuery.removeAttr( elem, name );- return;-- } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {- return ret;-- } else {- elem.setAttribute( name, "" + value );- return value;- }-- } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {- return ret;-- } else {-- ret = elem.getAttribute( name );-- // Non-existent attributes return null, we normalize to undefined- return ret === null ?- undefined :- ret;- }- },-- removeAttr: function( elem, value ) {- var propName, attrNames, name, l, isBool,- i = 0;-- if ( value && elem.nodeType === 1 ) {- attrNames = value.toLowerCase().split( rspace );- l = attrNames.length;-- for ( ; i < l; i++ ) {- name = attrNames[ i ];-- if ( name ) {- propName = jQuery.propFix[ name ] || name;- isBool = rboolean.test( name );-- // See #9699 for explanation of this approach (setting first, then removal)- // Do not do this for boolean attributes (see #10870)- if ( !isBool ) {- jQuery.attr( elem, name, "" );- }- elem.removeAttribute( getSetAttribute ? name : propName );-- // Set corresponding property to false for boolean attributes- if ( isBool && propName in elem ) {- elem[ propName ] = false;- }- }- }- }- },-- attrHooks: {- type: {- set: function( elem, value ) {- // We can't allow the type property to be changed (since it causes problems in IE)- if ( rtype.test( elem.nodeName ) && elem.parentNode ) {- jQuery.error( "type property can't be changed" );- } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {- // Setting the type on a radio button after the value resets the value in IE6-9- // Reset value to it's default in case type is set after value- // This is for element creation- var val = elem.value;- elem.setAttribute( "type", value );- if ( val ) {- elem.value = val;- }- return value;- }- }- },- // Use the value property for back compat- // Use the nodeHook for button elements in IE6/7 (#1954)- value: {- get: function( elem, name ) {- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {- return nodeHook.get( elem, name );- }- return name in elem ?- elem.value :- null;- },- set: function( elem, value, name ) {- if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {- return nodeHook.set( elem, value, name );- }- // Does not return so that setAttribute is also used- elem.value = value;- }- }- },-- propFix: {- tabindex: "tabIndex",- readonly: "readOnly",- "for": "htmlFor",- "class": "className",- maxlength: "maxLength",- cellspacing: "cellSpacing",- cellpadding: "cellPadding",- rowspan: "rowSpan",- colspan: "colSpan",- usemap: "useMap",- frameborder: "frameBorder",- contenteditable: "contentEditable"- },-- prop: function( elem, name, value ) {- var ret, hooks, notxml,- nType = elem.nodeType;-- // don't get/set properties on text, comment and attribute nodes- if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {- return;- }-- notxml = nType !== 1 || !jQuery.isXMLDoc( elem );-- if ( notxml ) {- // Fix name and attach hooks- name = jQuery.propFix[ name ] || name;- hooks = jQuery.propHooks[ name ];- }-- if ( value !== undefined ) {- if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {- return ret;-- } else {- return ( elem[ name ] = value );- }-- } else {- if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {- return ret;-- } else {- return elem[ name ];- }- }- },-- propHooks: {- tabIndex: {- get: function( elem ) {- // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set- // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/- var attributeNode = elem.getAttributeNode("tabindex");-- return attributeNode && attributeNode.specified ?- parseInt( attributeNode.value, 10 ) :- rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?- 0 :- undefined;- }- }- }-});--// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)-jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;--// Hook for boolean attributes-boolHook = {- get: function( elem, name ) {- // Align boolean attributes with corresponding properties- // Fall back to attribute presence where some booleans are not supported- var attrNode,- property = jQuery.prop( elem, name );- return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?- name.toLowerCase() :- undefined;- },- set: function( elem, value, name ) {- var propName;- if ( value === false ) {- // Remove boolean attributes when set to false- jQuery.removeAttr( elem, name );- } else {- // value is true since we know at this point it's type boolean and not false- // Set boolean attributes to the same name and set the DOM property- propName = jQuery.propFix[ name ] || name;- if ( propName in elem ) {- // Only set the IDL specifically if it already exists on the element- elem[ propName ] = true;- }-- elem.setAttribute( name, name.toLowerCase() );- }- return name;- }-};--// IE6/7 do not support getting/setting some attributes with get/setAttribute-if ( !getSetAttribute ) {-- fixSpecified = {- name: true,- id: true,- coords: true- };-- // Use this for any attribute in IE6/7- // This fixes almost every IE6/7 issue- nodeHook = jQuery.valHooks.button = {- get: function( elem, name ) {- var ret;- ret = elem.getAttributeNode( name );- return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?- ret.nodeValue :- undefined;- },- set: function( elem, value, name ) {- // Set the existing or create a new attribute node- var ret = elem.getAttributeNode( name );- if ( !ret ) {- ret = document.createAttribute( name );- elem.setAttributeNode( ret );- }- return ( ret.nodeValue = value + "" );- }- };-- // Apply the nodeHook to tabindex- jQuery.attrHooks.tabindex.set = nodeHook.set;-- // Set width and height to auto instead of 0 on empty string( Bug #8150 )- // This is for removals- jQuery.each([ "width", "height" ], function( i, name ) {- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {- set: function( elem, value ) {- if ( value === "" ) {- elem.setAttribute( name, "auto" );- return value;- }- }- });- });-- // Set contenteditable to false on removals(#10429)- // Setting to empty string throws an error as an invalid value- jQuery.attrHooks.contenteditable = {- get: nodeHook.get,- set: function( elem, value, name ) {- if ( value === "" ) {- value = "false";- }- nodeHook.set( elem, value, name );- }- };-}---// Some attributes require a special call on IE-if ( !jQuery.support.hrefNormalized ) {- jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {- jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {- get: function( elem ) {- var ret = elem.getAttribute( name, 2 );- return ret === null ? undefined : ret;- }- });- });-}--if ( !jQuery.support.style ) {- jQuery.attrHooks.style = {- get: function( elem ) {- // Return undefined in the case of empty string- // Normalize to lowercase since IE uppercases css property names- return elem.style.cssText.toLowerCase() || undefined;- },- set: function( elem, value ) {- return ( elem.style.cssText = "" + value );- }- };-}--// Safari mis-reports the default selected property of an option-// Accessing the parent's selectedIndex property fixes it-if ( !jQuery.support.optSelected ) {- jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {- get: function( elem ) {- var parent = elem.parentNode;-- if ( parent ) {- parent.selectedIndex;-- // Make sure that it also works with optgroups, see #5701- if ( parent.parentNode ) {- parent.parentNode.selectedIndex;- }- }- return null;- }- });-}--// IE6/7 call enctype encoding-if ( !jQuery.support.enctype ) {- jQuery.propFix.enctype = "encoding";-}--// Radios and checkboxes getter/setter-if ( !jQuery.support.checkOn ) {- jQuery.each([ "radio", "checkbox" ], function() {- jQuery.valHooks[ this ] = {- get: function( elem ) {- // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified- return elem.getAttribute("value") === null ? "on" : elem.value;- }- };- });-}-jQuery.each([ "radio", "checkbox" ], function() {- jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {- set: function( elem, value ) {- if ( jQuery.isArray( value ) ) {- return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );- }- }- });-});-----var rformElems = /^(?:textarea|input|select)$/i,- rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,- rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,- rkeyEvent = /^key/,- rmouseEvent = /^(?:mouse|contextmenu)|click/,- rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,- rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,- quickParse = function( selector ) {- var quick = rquickIs.exec( selector );- if ( quick ) {- // 0 1 2 3- // [ _, tag, id, class ]- quick[1] = ( quick[1] || "" ).toLowerCase();- quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );- }- return quick;- },- quickIs = function( elem, m ) {- var attrs = elem.attributes || {};- return (- (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&- (!m[2] || (attrs.id || {}).value === m[2]) &&- (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))- );- },- hoverHack = function( events ) {- return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );- };--/*- * Helper functions for managing events -- not part of the public interface.- * Props to Dean Edwards' addEvent library for many of the ideas.- */-jQuery.event = {-- add: function( elem, types, handler, data, selector ) {-- var elemData, eventHandle, events,- t, tns, type, namespaces, handleObj,- handleObjIn, quick, handlers, special;-- // Don't attach events to noData or text/comment nodes (allow plain objects tho)- if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {- return;- }-- // Caller can pass in an object of custom data in lieu of the handler- if ( handler.handler ) {- handleObjIn = handler;- handler = handleObjIn.handler;- selector = handleObjIn.selector;- }-- // Make sure that the handler has a unique ID, used to find/remove it later- if ( !handler.guid ) {- handler.guid = jQuery.guid++;- }-- // Init the element's event structure and main handler, if this is the first- events = elemData.events;- if ( !events ) {- elemData.events = events = {};- }- eventHandle = elemData.handle;- if ( !eventHandle ) {- elemData.handle = eventHandle = function( e ) {- // Discard the second event of a jQuery.event.trigger() and- // when an event is called after a page has unloaded- return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?- jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :- undefined;- };- // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events- eventHandle.elem = elem;- }-- // Handle multiple events separated by a space- // jQuery(...).bind("mouseover mouseout", fn);- types = jQuery.trim( hoverHack(types) ).split( " " );- for ( t = 0; t < types.length; t++ ) {-- tns = rtypenamespace.exec( types[t] ) || [];- type = tns[1];- namespaces = ( tns[2] || "" ).split( "." ).sort();-- // If event changes its type, use the special event handlers for the changed type- special = jQuery.event.special[ type ] || {};-- // If selector defined, determine special event api type, otherwise given type- type = ( selector ? special.delegateType : special.bindType ) || type;-- // Update special based on newly reset type- special = jQuery.event.special[ type ] || {};-- // handleObj is passed to all event handlers- handleObj = jQuery.extend({- type: type,- origType: tns[1],- data: data,- handler: handler,- guid: handler.guid,- selector: selector,- quick: selector && quickParse( selector ),- namespace: namespaces.join(".")- }, handleObjIn );-- // Init the event handler queue if we're the first- handlers = events[ type ];- if ( !handlers ) {- handlers = events[ type ] = [];- handlers.delegateCount = 0;-- // Only use addEventListener/attachEvent if the special events handler returns false- if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {- // Bind the global event handler to the element- if ( elem.addEventListener ) {- elem.addEventListener( type, eventHandle, false );-- } else if ( elem.attachEvent ) {- elem.attachEvent( "on" + type, eventHandle );- }- }- }-- if ( special.add ) {- special.add.call( elem, handleObj );-- if ( !handleObj.handler.guid ) {- handleObj.handler.guid = handler.guid;- }- }-- // Add to the element's handler list, delegates in front- if ( selector ) {- handlers.splice( handlers.delegateCount++, 0, handleObj );- } else {- handlers.push( handleObj );- }-- // Keep track of which events have ever been used, for event optimization- jQuery.event.global[ type ] = true;- }-- // Nullify elem to prevent memory leaks in IE- elem = null;- },-- global: {},-- // Detach an event or set of events from an element- remove: function( elem, types, handler, selector, mappedTypes ) {-- var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),- t, tns, type, origType, namespaces, origCount,- j, events, special, handle, eventType, handleObj;-- if ( !elemData || !(events = elemData.events) ) {- return;- }-- // Once for each type.namespace in types; type may be omitted- types = jQuery.trim( hoverHack( types || "" ) ).split(" ");- for ( t = 0; t < types.length; t++ ) {- tns = rtypenamespace.exec( types[t] ) || [];- type = origType = tns[1];- namespaces = tns[2];-- // Unbind all events (on this namespace, if provided) for the element- if ( !type ) {- for ( type in events ) {- jQuery.event.remove( elem, type + types[ t ], handler, selector, true );- }- continue;- }-- special = jQuery.event.special[ type ] || {};- type = ( selector? special.delegateType : special.bindType ) || type;- eventType = events[ type ] || [];- origCount = eventType.length;- namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;-- // Remove matching events- for ( j = 0; j < eventType.length; j++ ) {- handleObj = eventType[ j ];-- if ( ( mappedTypes || origType === handleObj.origType ) &&- ( !handler || handler.guid === handleObj.guid ) &&- ( !namespaces || namespaces.test( handleObj.namespace ) ) &&- ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {- eventType.splice( j--, 1 );-- if ( handleObj.selector ) {- eventType.delegateCount--;- }- if ( special.remove ) {- special.remove.call( elem, handleObj );- }- }- }-- // Remove generic event handler if we removed something and no more handlers exist- // (avoids potential for endless recursion during removal of special event handlers)- if ( eventType.length === 0 && origCount !== eventType.length ) {- if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {- jQuery.removeEvent( elem, type, elemData.handle );- }-- delete events[ type ];- }- }-- // Remove the expando if it's no longer used- if ( jQuery.isEmptyObject( events ) ) {- handle = elemData.handle;- if ( handle ) {- handle.elem = null;- }-- // removeData also checks for emptiness and clears the expando if empty- // so use it instead of delete- jQuery.removeData( elem, [ "events", "handle" ], true );- }- },-- // Events that are safe to short-circuit if no handlers are attached.- // Native DOM events should not be added, they may have inline handlers.- customEvent: {- "getData": true,- "setData": true,- "changeData": true- },-- trigger: function( event, data, elem, onlyHandlers ) {- // Don't do events on text and comment nodes- if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {- return;- }-- // Event object or event type- var type = event.type || event,- namespaces = [],- cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;-- // focus/blur morphs to focusin/out; ensure we're not firing them right now- if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {- return;- }-- if ( type.indexOf( "!" ) >= 0 ) {- // Exclusive events trigger only for the exact event (no namespaces)- type = type.slice(0, -1);- exclusive = true;- }-- if ( type.indexOf( "." ) >= 0 ) {- // Namespaced trigger; create a regexp to match event type in handle()- namespaces = type.split(".");- type = namespaces.shift();- namespaces.sort();- }-- if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {- // No jQuery handlers for this event type, and it can't have inline handlers- return;- }-- // Caller can pass in an Event, Object, or just an event type string- event = typeof event === "object" ?- // jQuery.Event object- event[ jQuery.expando ] ? event :- // Object literal- new jQuery.Event( type, event ) :- // Just the event type (string)- new jQuery.Event( type );-- event.type = type;- event.isTrigger = true;- event.exclusive = exclusive;- event.namespace = namespaces.join( "." );- event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;- ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";-- // Handle a global trigger- if ( !elem ) {-- // TODO: Stop taunting the data cache; remove global events and always attach to document- cache = jQuery.cache;- for ( i in cache ) {- if ( cache[ i ].events && cache[ i ].events[ type ] ) {- jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );- }- }- return;- }-- // Clean up the event in case it is being reused- event.result = undefined;- if ( !event.target ) {- event.target = elem;- }-- // Clone any incoming data and prepend the event, creating the handler arg list- data = data != null ? jQuery.makeArray( data ) : [];- data.unshift( event );-- // Allow special events to draw outside the lines- special = jQuery.event.special[ type ] || {};- if ( special.trigger && special.trigger.apply( elem, data ) === false ) {- return;- }-- // Determine event propagation path in advance, per W3C events spec (#9951)- // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)- eventPath = [[ elem, special.bindType || type ]];- if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {-- bubbleType = special.delegateType || type;- cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;- old = null;- for ( ; cur; cur = cur.parentNode ) {- eventPath.push([ cur, bubbleType ]);- old = cur;- }-- // Only add window if we got to document (e.g., not plain obj or detached DOM)- if ( old && old === elem.ownerDocument ) {- eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);- }- }-- // Fire handlers on the event path- for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {-- cur = eventPath[i][0];- event.type = eventPath[i][1];-- handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );- if ( handle ) {- handle.apply( cur, data );- }- // Note that this is a bare JS function and not a jQuery handler- handle = ontype && cur[ ontype ];- if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {- event.preventDefault();- }- }- event.type = type;-- // If nobody prevented the default action, do it now- if ( !onlyHandlers && !event.isDefaultPrevented() ) {-- if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&- !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {-- // Call a native DOM method on the target with the same name name as the event.- // Can't use an .isFunction() check here because IE6/7 fails that test.- // Don't do default actions on window, that's where global variables be (#6170)- // IE<9 dies on focus/blur to hidden element (#1486)- if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {-- // Don't re-trigger an onFOO event when we call its FOO() method- old = elem[ ontype ];-- if ( old ) {- elem[ ontype ] = null;- }-- // Prevent re-triggering of the same event, since we already bubbled it above- jQuery.event.triggered = type;- elem[ type ]();- jQuery.event.triggered = undefined;-- if ( old ) {- elem[ ontype ] = old;- }- }- }- }-- return event.result;- },-- dispatch: function( event ) {-- // Make a writable jQuery.Event from the native event object- event = jQuery.event.fix( event || window.event );-- var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),- delegateCount = handlers.delegateCount,- args = [].slice.call( arguments, 0 ),- run_all = !event.exclusive && !event.namespace,- special = jQuery.event.special[ event.type ] || {},- handlerQueue = [],- i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;-- // Use the fix-ed jQuery.Event rather than the (read-only) native event- args[0] = event;- event.delegateTarget = this;-- // Call the preDispatch hook for the mapped type, and let it bail if desired- if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {- return;- }-- // Determine handlers that should run if there are delegated events- // Avoid non-left-click bubbling in Firefox (#3861)- if ( delegateCount && !(event.button && event.type === "click") ) {-- // Pregenerate a single jQuery object for reuse with .is()- jqcur = jQuery(this);- jqcur.context = this.ownerDocument || this;-- for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {-- // Don't process events on disabled elements (#6911, #8165)- if ( cur.disabled !== true ) {- selMatch = {};- matches = [];- jqcur[0] = cur;- for ( i = 0; i < delegateCount; i++ ) {- handleObj = handlers[ i ];- sel = handleObj.selector;-- if ( selMatch[ sel ] === undefined ) {- selMatch[ sel ] = (- handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )- );- }- if ( selMatch[ sel ] ) {- matches.push( handleObj );- }- }- if ( matches.length ) {- handlerQueue.push({ elem: cur, matches: matches });- }- }- }- }-- // Add the remaining (directly-bound) handlers- if ( handlers.length > delegateCount ) {- handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });- }-- // Run delegates first; they may want to stop propagation beneath us- for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {- matched = handlerQueue[ i ];- event.currentTarget = matched.elem;-- for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {- handleObj = matched.matches[ j ];-- // Triggered event must either 1) be non-exclusive and have no namespace, or- // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).- if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {-- event.data = handleObj.data;- event.handleObj = handleObj;-- ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )- .apply( matched.elem, args );-- if ( ret !== undefined ) {- event.result = ret;- if ( ret === false ) {- event.preventDefault();- event.stopPropagation();- }- }- }- }- }-- // Call the postDispatch hook for the mapped type- if ( special.postDispatch ) {- special.postDispatch.call( this, event );- }-- return event.result;- },-- // Includes some event props shared by KeyEvent and MouseEvent- // *** attrChange attrName relatedNode srcElement are not normalized, non-W3C, deprecated, will be removed in 1.8 ***- props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),-- fixHooks: {},-- keyHooks: {- props: "char charCode key keyCode".split(" "),- filter: function( event, original ) {-- // Add which for key events- if ( event.which == null ) {- event.which = original.charCode != null ? original.charCode : original.keyCode;- }-- return event;- }- },-- mouseHooks: {- props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),- filter: function( event, original ) {- var eventDoc, doc, body,- button = original.button,- fromElement = original.fromElement;-- // Calculate pageX/Y if missing and clientX/Y available- if ( event.pageX == null && original.clientX != null ) {- eventDoc = event.target.ownerDocument || document;- doc = eventDoc.documentElement;- body = eventDoc.body;-- event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );- event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );- }-- // Add relatedTarget, if necessary- if ( !event.relatedTarget && fromElement ) {- event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;- }-- // Add which for click: 1 === left; 2 === middle; 3 === right- // Note: button is not normalized, so don't use it- if ( !event.which && button !== undefined ) {- event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );- }-- return event;- }- },-- fix: function( event ) {- if ( event[ jQuery.expando ] ) {- return event;- }-- // Create a writable copy of the event object and normalize some properties- var i, prop,- originalEvent = event,- fixHook = jQuery.event.fixHooks[ event.type ] || {},- copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;-- event = jQuery.Event( originalEvent );-- for ( i = copy.length; i; ) {- prop = copy[ --i ];- event[ prop ] = originalEvent[ prop ];- }-- // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)- if ( !event.target ) {- event.target = originalEvent.srcElement || document;- }-- // Target should not be a text node (#504, Safari)- if ( event.target.nodeType === 3 ) {- event.target = event.target.parentNode;- }-- // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)- if ( event.metaKey === undefined ) {- event.metaKey = event.ctrlKey;- }-- return fixHook.filter? fixHook.filter( event, originalEvent ) : event;- },-- special: {- ready: {- // Make sure the ready event is setup- setup: jQuery.bindReady- },-- load: {- // Prevent triggered image.load events from bubbling to window.load- noBubble: true- },-- focus: {- delegateType: "focusin"- },- blur: {- delegateType: "focusout"- },-- beforeunload: {- setup: function( data, namespaces, eventHandle ) {- // We only want to do this special case on windows- if ( jQuery.isWindow( this ) ) {- this.onbeforeunload = eventHandle;- }- },-- teardown: function( namespaces, eventHandle ) {- if ( this.onbeforeunload === eventHandle ) {- this.onbeforeunload = null;- }- }- }- },-- simulate: function( type, elem, event, bubble ) {- // Piggyback on a donor event to simulate a different one.- // Fake originalEvent to avoid donor's stopPropagation, but if the- // simulated event prevents default then we do the same on the donor.- var e = jQuery.extend(- new jQuery.Event(),- event,- { type: type,- isSimulated: true,- originalEvent: {}- }- );- if ( bubble ) {- jQuery.event.trigger( e, null, elem );- } else {- jQuery.event.dispatch.call( elem, e );- }- if ( e.isDefaultPrevented() ) {- event.preventDefault();- }- }-};--// Some plugins are using, but it's undocumented/deprecated and will be removed.-// The 1.7 special event interface should provide all the hooks needed now.-jQuery.event.handle = jQuery.event.dispatch;--jQuery.removeEvent = document.removeEventListener ?- function( elem, type, handle ) {- if ( elem.removeEventListener ) {- elem.removeEventListener( type, handle, false );- }- } :- function( elem, type, handle ) {- if ( elem.detachEvent ) {- elem.detachEvent( "on" + type, handle );- }- };--jQuery.Event = function( src, props ) {- // Allow instantiation without the 'new' keyword- if ( !(this instanceof jQuery.Event) ) {- return new jQuery.Event( src, props );- }-- // Event object- if ( src && src.type ) {- this.originalEvent = src;- this.type = src.type;-- // Events bubbling up the document may have been marked as prevented- // by a handler lower down the tree; reflect the correct value.- this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||- src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;-- // Event type- } else {- this.type = src;- }-- // Put explicitly provided properties onto the event object- if ( props ) {- jQuery.extend( this, props );- }-- // Create a timestamp if incoming event doesn't have one- this.timeStamp = src && src.timeStamp || jQuery.now();-- // Mark it as fixed- this[ jQuery.expando ] = true;-};--function returnFalse() {- return false;-}-function returnTrue() {- return true;-}--// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html-jQuery.Event.prototype = {- preventDefault: function() {- this.isDefaultPrevented = returnTrue;-- var e = this.originalEvent;- if ( !e ) {- return;- }-- // if preventDefault exists run it on the original event- if ( e.preventDefault ) {- e.preventDefault();-- // otherwise set the returnValue property of the original event to false (IE)- } else {- e.returnValue = false;- }- },- stopPropagation: function() {- this.isPropagationStopped = returnTrue;-- var e = this.originalEvent;- if ( !e ) {- return;- }- // if stopPropagation exists run it on the original event- if ( e.stopPropagation ) {- e.stopPropagation();- }- // otherwise set the cancelBubble property of the original event to true (IE)- e.cancelBubble = true;- },- stopImmediatePropagation: function() {- this.isImmediatePropagationStopped = returnTrue;- this.stopPropagation();- },- isDefaultPrevented: returnFalse,- isPropagationStopped: returnFalse,- isImmediatePropagationStopped: returnFalse-};--// Create mouseenter/leave events using mouseover/out and event-time checks-jQuery.each({- mouseenter: "mouseover",- mouseleave: "mouseout"-}, function( orig, fix ) {- jQuery.event.special[ orig ] = {- delegateType: fix,- bindType: fix,-- handle: function( event ) {- var target = this,- related = event.relatedTarget,- handleObj = event.handleObj,- selector = handleObj.selector,- ret;-- // For mousenter/leave call the handler if related is outside the target.- // NB: No relatedTarget if the mouse left/entered the browser window- if ( !related || (related !== target && !jQuery.contains( target, related )) ) {- event.type = handleObj.origType;- ret = handleObj.handler.apply( this, arguments );- event.type = fix;- }- return ret;- }- };-});--// IE submit delegation-if ( !jQuery.support.submitBubbles ) {-- jQuery.event.special.submit = {- setup: function() {- // Only need this for delegated form submit events- if ( jQuery.nodeName( this, "form" ) ) {- return false;- }-- // Lazy-add a submit handler when a descendant form may potentially be submitted- jQuery.event.add( this, "click._submit keypress._submit", function( e ) {- // Node name check avoids a VML-related crash in IE (#9807)- var elem = e.target,- form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;- if ( form && !form._submit_attached ) {- jQuery.event.add( form, "submit._submit", function( event ) {- event._submit_bubble = true;- });- form._submit_attached = true;- }- });- // return undefined since we don't need an event listener- },- - postDispatch: function( event ) {- // If form was submitted by the user, bubble the event up the tree- if ( event._submit_bubble ) {- delete event._submit_bubble;- if ( this.parentNode && !event.isTrigger ) {- jQuery.event.simulate( "submit", this.parentNode, event, true );- }- }- },-- teardown: function() {- // Only need this for delegated form submit events- if ( jQuery.nodeName( this, "form" ) ) {- return false;- }-- // Remove delegated handlers; cleanData eventually reaps submit handlers attached above- jQuery.event.remove( this, "._submit" );- }- };-}--// IE change delegation and checkbox/radio fix-if ( !jQuery.support.changeBubbles ) {-- jQuery.event.special.change = {-- setup: function() {-- if ( rformElems.test( this.nodeName ) ) {- // IE doesn't fire change on a check/radio until blur; trigger it on click- // after a propertychange. Eat the blur-change in special.change.handle.- // This still fires onchange a second time for check/radio after blur.- if ( this.type === "checkbox" || this.type === "radio" ) {- jQuery.event.add( this, "propertychange._change", function( event ) {- if ( event.originalEvent.propertyName === "checked" ) {- this._just_changed = true;- }- });- jQuery.event.add( this, "click._change", function( event ) {- if ( this._just_changed && !event.isTrigger ) {- this._just_changed = false;- jQuery.event.simulate( "change", this, event, true );- }- });- }- return false;- }- // Delegated event; lazy-add a change handler on descendant inputs- jQuery.event.add( this, "beforeactivate._change", function( e ) {- var elem = e.target;-- if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {- jQuery.event.add( elem, "change._change", function( event ) {- if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {- jQuery.event.simulate( "change", this.parentNode, event, true );- }- });- elem._change_attached = true;- }- });- },-- handle: function( event ) {- var elem = event.target;-- // Swallow native change events from checkbox/radio, we already triggered them above- if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {- return event.handleObj.handler.apply( this, arguments );- }- },-- teardown: function() {- jQuery.event.remove( this, "._change" );-- return rformElems.test( this.nodeName );- }- };-}--// Create "bubbling" focus and blur events-if ( !jQuery.support.focusinBubbles ) {- jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {-- // Attach a single capturing handler while someone wants focusin/focusout- var attaches = 0,- handler = function( event ) {- jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );- };-- jQuery.event.special[ fix ] = {- setup: function() {- if ( attaches++ === 0 ) {- document.addEventListener( orig, handler, true );- }- },- teardown: function() {- if ( --attaches === 0 ) {- document.removeEventListener( orig, handler, true );- }- }- };- });-}--jQuery.fn.extend({-- on: function( types, selector, data, fn, /*INTERNAL*/ one ) {- var origFn, type;-- // Types can be a map of types/handlers- if ( typeof types === "object" ) {- // ( types-Object, selector, data )- if ( typeof selector !== "string" ) { // && selector != null- // ( types-Object, data )- data = data || selector;- selector = undefined;- }- for ( type in types ) {- this.on( type, selector, data, types[ type ], one );- }- return this;- }-- if ( data == null && fn == null ) {- // ( types, fn )- fn = selector;- data = selector = undefined;- } else if ( fn == null ) {- if ( typeof selector === "string" ) {- // ( types, selector, fn )- fn = data;- data = undefined;- } else {- // ( types, data, fn )- fn = data;- data = selector;- selector = undefined;- }- }- if ( fn === false ) {- fn = returnFalse;- } else if ( !fn ) {- return this;- }-- if ( one === 1 ) {- origFn = fn;- fn = function( event ) {- // Can use an empty set, since event contains the info- jQuery().off( event );- return origFn.apply( this, arguments );- };- // Use same guid so caller can remove using origFn- fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );- }- return this.each( function() {- jQuery.event.add( this, types, fn, data, selector );- });- },- one: function( types, selector, data, fn ) {- return this.on( types, selector, data, fn, 1 );- },- off: function( types, selector, fn ) {- if ( types && types.preventDefault && types.handleObj ) {- // ( event ) dispatched jQuery.Event- var handleObj = types.handleObj;- jQuery( types.delegateTarget ).off(- handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,- handleObj.selector,- handleObj.handler- );- return this;- }- if ( typeof types === "object" ) {- // ( types-object [, selector] )- for ( var type in types ) {- this.off( type, selector, types[ type ] );- }- return this;- }- if ( selector === false || typeof selector === "function" ) {- // ( types [, fn] )- fn = selector;- selector = undefined;- }- if ( fn === false ) {- fn = returnFalse;- }- return this.each(function() {- jQuery.event.remove( this, types, fn, selector );- });- },-- bind: function( types, data, fn ) {- return this.on( types, null, data, fn );- },- unbind: function( types, fn ) {- return this.off( types, null, fn );- },-- live: function( types, data, fn ) {- jQuery( this.context ).on( types, this.selector, data, fn );- return this;- },- die: function( types, fn ) {- jQuery( this.context ).off( types, this.selector || "**", fn );- return this;- },-- delegate: function( selector, types, data, fn ) {- return this.on( types, selector, data, fn );- },- undelegate: function( selector, types, fn ) {- // ( namespace ) or ( selector, types [, fn] )- return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );- },-- trigger: function( type, data ) {- return this.each(function() {- jQuery.event.trigger( type, data, this );- });- },- triggerHandler: function( type, data ) {- if ( this[0] ) {- return jQuery.event.trigger( type, data, this[0], true );- }- },-- toggle: function( fn ) {- // Save reference to arguments for access in closure- var args = arguments,- guid = fn.guid || jQuery.guid++,- i = 0,- toggler = function( event ) {- // Figure out which function to execute- var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;- jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );-- // Make sure that clicks stop- event.preventDefault();-- // and execute the function- return args[ lastToggle ].apply( this, arguments ) || false;- };-- // link all the functions, so any of them can unbind this click handler- toggler.guid = guid;- while ( i < args.length ) {- args[ i++ ].guid = guid;- }-- return this.click( toggler );- },-- hover: function( fnOver, fnOut ) {- return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );- }-});--jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +- "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +- "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {-- // Handle event binding- jQuery.fn[ name ] = function( data, fn ) {- if ( fn == null ) {- fn = data;- data = null;- }-- return arguments.length > 0 ?- this.on( name, null, data, fn ) :- this.trigger( name );- };-- if ( jQuery.attrFn ) {- jQuery.attrFn[ name ] = true;- }-- if ( rkeyEvent.test( name ) ) {- jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;- }-- if ( rmouseEvent.test( name ) ) {- jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;- }-});----/*!- * Sizzle CSS Selector Engine- * Copyright 2011, The Dojo Foundation- * Released under the MIT, BSD, and GPL Licenses.- * More information: http://sizzlejs.com/- */-(function(){--var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,- expando = "sizcache" + (Math.random() + '').replace('.', ''),- done = 0,- toString = Object.prototype.toString,- hasDuplicate = false,- baseHasDuplicate = true,- rBackslash = /\\/g,- rReturn = /\r\n/g,- rNonWord = /\W/;--// Here we check if the JavaScript engine is using some sort of-// optimization where it does not always call our comparision-// function. If that is the case, discard the hasDuplicate value.-// Thus far that includes Google Chrome.-[0, 0].sort(function() {- baseHasDuplicate = false;- return 0;-});--var Sizzle = function( selector, context, results, seed ) {- results = results || [];- context = context || document;-- var origContext = context;-- if ( context.nodeType !== 1 && context.nodeType !== 9 ) {- return [];- }-- if ( !selector || typeof selector !== "string" ) {- return results;- }-- var m, set, checkSet, extra, ret, cur, pop, i,- prune = true,- contextXML = Sizzle.isXML( context ),- parts = [],- soFar = selector;-- // Reset the position of the chunker regexp (start from head)- do {- chunker.exec( "" );- m = chunker.exec( soFar );-- if ( m ) {- soFar = m[3];-- parts.push( m[1] );-- if ( m[2] ) {- extra = m[3];- break;- }- }- } while ( m );-- if ( parts.length > 1 && origPOS.exec( selector ) ) {-- if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {- set = posProcess( parts[0] + parts[1], context, seed );-- } else {- set = Expr.relative[ parts[0] ] ?- [ context ] :- Sizzle( parts.shift(), context );-- while ( parts.length ) {- selector = parts.shift();-- if ( Expr.relative[ selector ] ) {- selector += parts.shift();- }-- set = posProcess( selector, set, seed );- }- }-- } else {- // Take a shortcut and set the context if the root selector is an ID- // (but not if it'll be faster if the inner selector is an ID)- if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&- Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {-- ret = Sizzle.find( parts.shift(), context, contextXML );- context = ret.expr ?- Sizzle.filter( ret.expr, ret.set )[0] :- ret.set[0];- }-- if ( context ) {- ret = seed ?- { expr: parts.pop(), set: makeArray(seed) } :- Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );-- set = ret.expr ?- Sizzle.filter( ret.expr, ret.set ) :- ret.set;-- if ( parts.length > 0 ) {- checkSet = makeArray( set );-- } else {- prune = false;- }-- while ( parts.length ) {- cur = parts.pop();- pop = cur;-- if ( !Expr.relative[ cur ] ) {- cur = "";- } else {- pop = parts.pop();- }-- if ( pop == null ) {- pop = context;- }-- Expr.relative[ cur ]( checkSet, pop, contextXML );- }-- } else {- checkSet = parts = [];- }- }-- if ( !checkSet ) {- checkSet = set;- }-- if ( !checkSet ) {- Sizzle.error( cur || selector );- }-- if ( toString.call(checkSet) === "[object Array]" ) {- if ( !prune ) {- results.push.apply( results, checkSet );-- } else if ( context && context.nodeType === 1 ) {- for ( i = 0; checkSet[i] != null; i++ ) {- if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {- results.push( set[i] );- }- }-- } else {- for ( i = 0; checkSet[i] != null; i++ ) {- if ( checkSet[i] && checkSet[i].nodeType === 1 ) {- results.push( set[i] );- }- }- }-- } else {- makeArray( checkSet, results );- }-- if ( extra ) {- Sizzle( extra, origContext, results, seed );- Sizzle.uniqueSort( results );- }-- return results;-};--Sizzle.uniqueSort = function( results ) {- if ( sortOrder ) {- hasDuplicate = baseHasDuplicate;- results.sort( sortOrder );-- if ( hasDuplicate ) {- for ( var i = 1; i < results.length; i++ ) {- if ( results[i] === results[ i - 1 ] ) {- results.splice( i--, 1 );- }- }- }- }-- return results;-};--Sizzle.matches = function( expr, set ) {- return Sizzle( expr, null, null, set );-};--Sizzle.matchesSelector = function( node, expr ) {- return Sizzle( expr, null, null, [node] ).length > 0;-};--Sizzle.find = function( expr, context, isXML ) {- var set, i, len, match, type, left;-- if ( !expr ) {- return [];- }-- for ( i = 0, len = Expr.order.length; i < len; i++ ) {- type = Expr.order[i];-- if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {- left = match[1];- match.splice( 1, 1 );-- if ( left.substr( left.length - 1 ) !== "\\" ) {- match[1] = (match[1] || "").replace( rBackslash, "" );- set = Expr.find[ type ]( match, context, isXML );-- if ( set != null ) {- expr = expr.replace( Expr.match[ type ], "" );- break;- }- }- }- }-- if ( !set ) {- set = typeof context.getElementsByTagName !== "undefined" ?- context.getElementsByTagName( "*" ) :- [];- }-- return { set: set, expr: expr };-};--Sizzle.filter = function( expr, set, inplace, not ) {- var match, anyFound,- type, found, item, filter, left,- i, pass,- old = expr,- result = [],- curLoop = set,- isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );-- while ( expr && set.length ) {- for ( type in Expr.filter ) {- if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {- filter = Expr.filter[ type ];- left = match[1];-- anyFound = false;-- match.splice(1,1);-- if ( left.substr( left.length - 1 ) === "\\" ) {- continue;- }-- if ( curLoop === result ) {- result = [];- }-- if ( Expr.preFilter[ type ] ) {- match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );-- if ( !match ) {- anyFound = found = true;-- } else if ( match === true ) {- continue;- }- }-- if ( match ) {- for ( i = 0; (item = curLoop[i]) != null; i++ ) {- if ( item ) {- found = filter( item, match, i, curLoop );- pass = not ^ found;-- if ( inplace && found != null ) {- if ( pass ) {- anyFound = true;-- } else {- curLoop[i] = false;- }-- } else if ( pass ) {- result.push( item );- anyFound = true;- }- }- }- }-- if ( found !== undefined ) {- if ( !inplace ) {- curLoop = result;- }-- expr = expr.replace( Expr.match[ type ], "" );-- if ( !anyFound ) {- return [];- }-- break;- }- }- }-- // Improper expression- if ( expr === old ) {- if ( anyFound == null ) {- Sizzle.error( expr );-- } else {- break;- }- }-- old = expr;- }-- return curLoop;-};--Sizzle.error = function( msg ) {- throw new Error( "Syntax error, unrecognized expression: " + msg );-};--/**- * Utility function for retreiving the text value of an array of DOM nodes- * @param {Array|Element} elem- */-var getText = Sizzle.getText = function( elem ) {- var i, node,- nodeType = elem.nodeType,- ret = "";-- if ( nodeType ) {- if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {- // Use textContent || innerText for elements- if ( typeof elem.textContent === 'string' ) {- return elem.textContent;- } else if ( typeof elem.innerText === 'string' ) {- // Replace IE's carriage returns- return elem.innerText.replace( rReturn, '' );- } else {- // Traverse it's children- for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {- ret += getText( elem );- }- }- } else if ( nodeType === 3 || nodeType === 4 ) {- return elem.nodeValue;- }- } else {-- // If no nodeType, this is expected to be an array- for ( i = 0; (node = elem[i]); i++ ) {- // Do not traverse comment nodes- if ( node.nodeType !== 8 ) {- ret += getText( node );- }- }- }- return ret;-};--var Expr = Sizzle.selectors = {- order: [ "ID", "NAME", "TAG" ],-- match: {- ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,- CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,- NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,- ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,- TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,- CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,- POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,- PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/- },-- leftMatch: {},-- attrMap: {- "class": "className",- "for": "htmlFor"- },-- attrHandle: {- href: function( elem ) {- return elem.getAttribute( "href" );- },- type: function( elem ) {- return elem.getAttribute( "type" );- }- },-- relative: {- "+": function(checkSet, part){- var isPartStr = typeof part === "string",- isTag = isPartStr && !rNonWord.test( part ),- isPartStrNotTag = isPartStr && !isTag;-- if ( isTag ) {- part = part.toLowerCase();- }-- for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {- if ( (elem = checkSet[i]) ) {- while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}-- checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?- elem || false :- elem === part;- }- }-- if ( isPartStrNotTag ) {- Sizzle.filter( part, checkSet, true );- }- },-- ">": function( checkSet, part ) {- var elem,- isPartStr = typeof part === "string",- i = 0,- l = checkSet.length;-- if ( isPartStr && !rNonWord.test( part ) ) {- part = part.toLowerCase();-- for ( ; i < l; i++ ) {- elem = checkSet[i];-- if ( elem ) {- var parent = elem.parentNode;- checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;- }- }-- } else {- for ( ; i < l; i++ ) {- elem = checkSet[i];-- if ( elem ) {- checkSet[i] = isPartStr ?- elem.parentNode :- elem.parentNode === part;- }- }-- if ( isPartStr ) {- Sizzle.filter( part, checkSet, true );- }- }- },-- "": function(checkSet, part, isXML){- var nodeCheck,- doneName = done++,- checkFn = dirCheck;-- if ( typeof part === "string" && !rNonWord.test( part ) ) {- part = part.toLowerCase();- nodeCheck = part;- checkFn = dirNodeCheck;- }-- checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );- },-- "~": function( checkSet, part, isXML ) {- var nodeCheck,- doneName = done++,- checkFn = dirCheck;-- if ( typeof part === "string" && !rNonWord.test( part ) ) {- part = part.toLowerCase();- nodeCheck = part;- checkFn = dirNodeCheck;- }-- checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );- }- },-- find: {- ID: function( match, context, isXML ) {- if ( typeof context.getElementById !== "undefined" && !isXML ) {- var m = context.getElementById(match[1]);- // Check parentNode to catch when Blackberry 4.6 returns- // nodes that are no longer in the document #6963- return m && m.parentNode ? [m] : [];- }- },-- NAME: function( match, context ) {- if ( typeof context.getElementsByName !== "undefined" ) {- var ret = [],- results = context.getElementsByName( match[1] );-- for ( var i = 0, l = results.length; i < l; i++ ) {- if ( results[i].getAttribute("name") === match[1] ) {- ret.push( results[i] );- }- }-- return ret.length === 0 ? null : ret;- }- },-- TAG: function( match, context ) {- if ( typeof context.getElementsByTagName !== "undefined" ) {- return context.getElementsByTagName( match[1] );- }- }- },- preFilter: {- CLASS: function( match, curLoop, inplace, result, not, isXML ) {- match = " " + match[1].replace( rBackslash, "" ) + " ";-- if ( isXML ) {- return match;- }-- for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {- if ( elem ) {- if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {- if ( !inplace ) {- result.push( elem );- }-- } else if ( inplace ) {- curLoop[i] = false;- }- }- }-- return false;- },-- ID: function( match ) {- return match[1].replace( rBackslash, "" );- },-- TAG: function( match, curLoop ) {- return match[1].replace( rBackslash, "" ).toLowerCase();- },-- CHILD: function( match ) {- if ( match[1] === "nth" ) {- if ( !match[2] ) {- Sizzle.error( match[0] );- }-- match[2] = match[2].replace(/^\+|\s*/g, '');-- // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'- var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(- match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||- !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);-- // calculate the numbers (first)n+(last) including if they are negative- match[2] = (test[1] + (test[2] || 1)) - 0;- match[3] = test[3] - 0;- }- else if ( match[2] ) {- Sizzle.error( match[0] );- }-- // TODO: Move to normal caching system- match[0] = done++;-- return match;- },-- ATTR: function( match, curLoop, inplace, result, not, isXML ) {- var name = match[1] = match[1].replace( rBackslash, "" );-- if ( !isXML && Expr.attrMap[name] ) {- match[1] = Expr.attrMap[name];- }-- // Handle if an un-quoted value was used- match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );-- if ( match[2] === "~=" ) {- match[4] = " " + match[4] + " ";- }-- return match;- },-- PSEUDO: function( match, curLoop, inplace, result, not ) {- if ( match[1] === "not" ) {- // If we're dealing with a complex expression, or a simple one- if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {- match[3] = Sizzle(match[3], null, null, curLoop);-- } else {- var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);-- if ( !inplace ) {- result.push.apply( result, ret );- }-- return false;- }-- } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {- return true;- }-- return match;- },-- POS: function( match ) {- match.unshift( true );-- return match;- }- },-- filters: {- enabled: function( elem ) {- return elem.disabled === false && elem.type !== "hidden";- },-- disabled: function( elem ) {- return elem.disabled === true;- },-- checked: function( elem ) {- return elem.checked === true;- },-- selected: function( elem ) {- // Accessing this property makes selected-by-default- // options in Safari work properly- if ( elem.parentNode ) {- elem.parentNode.selectedIndex;- }-- return elem.selected === true;- },-- parent: function( elem ) {- return !!elem.firstChild;- },-- empty: function( elem ) {- return !elem.firstChild;- },-- has: function( elem, i, match ) {- return !!Sizzle( match[3], elem ).length;- },-- header: function( elem ) {- return (/h\d/i).test( elem.nodeName );- },-- text: function( elem ) {- var attr = elem.getAttribute( "type" ), type = elem.type;- // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)- // use getAttribute instead to test this case- return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );- },-- radio: function( elem ) {- return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;- },-- checkbox: function( elem ) {- return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;- },-- file: function( elem ) {- return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;- },-- password: function( elem ) {- return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;- },-- submit: function( elem ) {- var name = elem.nodeName.toLowerCase();- return (name === "input" || name === "button") && "submit" === elem.type;- },-- image: function( elem ) {- return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;- },-- reset: function( elem ) {- var name = elem.nodeName.toLowerCase();- return (name === "input" || name === "button") && "reset" === elem.type;- },-- button: function( elem ) {- var name = elem.nodeName.toLowerCase();- return name === "input" && "button" === elem.type || name === "button";- },-- input: function( elem ) {- return (/input|select|textarea|button/i).test( elem.nodeName );- },-- focus: function( elem ) {- return elem === elem.ownerDocument.activeElement;- }- },- setFilters: {- first: function( elem, i ) {- return i === 0;- },-- last: function( elem, i, match, array ) {- return i === array.length - 1;- },-- even: function( elem, i ) {- return i % 2 === 0;- },-- odd: function( elem, i ) {- return i % 2 === 1;- },-- lt: function( elem, i, match ) {- return i < match[3] - 0;- },-- gt: function( elem, i, match ) {- return i > match[3] - 0;- },-- nth: function( elem, i, match ) {- return match[3] - 0 === i;- },-- eq: function( elem, i, match ) {- return match[3] - 0 === i;- }- },- filter: {- PSEUDO: function( elem, match, i, array ) {- var name = match[1],- filter = Expr.filters[ name ];-- if ( filter ) {- return filter( elem, i, match, array );-- } else if ( name === "contains" ) {- return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;-- } else if ( name === "not" ) {- var not = match[3];-- for ( var j = 0, l = not.length; j < l; j++ ) {- if ( not[j] === elem ) {- return false;- }- }-- return true;-- } else {- Sizzle.error( name );- }- },-- CHILD: function( elem, match ) {- var first, last,- doneName, parent, cache,- count, diff,- type = match[1],- node = elem;-- switch ( type ) {- case "only":- case "first":- while ( (node = node.previousSibling) ) {- if ( node.nodeType === 1 ) {- return false;- }- }-- if ( type === "first" ) {- return true;- }-- node = elem;-- /* falls through */- case "last":- while ( (node = node.nextSibling) ) {- if ( node.nodeType === 1 ) {- return false;- }- }-- return true;-- case "nth":- first = match[2];- last = match[3];-- if ( first === 1 && last === 0 ) {- return true;- }-- doneName = match[0];- parent = elem.parentNode;-- if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {- count = 0;-- for ( node = parent.firstChild; node; node = node.nextSibling ) {- if ( node.nodeType === 1 ) {- node.nodeIndex = ++count;- }- }-- parent[ expando ] = doneName;- }-- diff = elem.nodeIndex - last;-- if ( first === 0 ) {- return diff === 0;-- } else {- return ( diff % first === 0 && diff / first >= 0 );- }- }- },-- ID: function( elem, match ) {- return elem.nodeType === 1 && elem.getAttribute("id") === match;- },-- TAG: function( elem, match ) {- return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;- },-- CLASS: function( elem, match ) {- return (" " + (elem.className || elem.getAttribute("class")) + " ")- .indexOf( match ) > -1;- },-- ATTR: function( elem, match ) {- var name = match[1],- result = Sizzle.attr ?- Sizzle.attr( elem, name ) :- Expr.attrHandle[ name ] ?- Expr.attrHandle[ name ]( elem ) :- elem[ name ] != null ?- elem[ name ] :- elem.getAttribute( name ),- value = result + "",- type = match[2],- check = match[4];-- return result == null ?- type === "!=" :- !type && Sizzle.attr ?- result != null :- type === "=" ?- value === check :- type === "*=" ?- value.indexOf(check) >= 0 :- type === "~=" ?- (" " + value + " ").indexOf(check) >= 0 :- !check ?- value && result !== false :- type === "!=" ?- value !== check :- type === "^=" ?- value.indexOf(check) === 0 :- type === "$=" ?- value.substr(value.length - check.length) === check :- type === "|=" ?- value === check || value.substr(0, check.length + 1) === check + "-" :- false;- },-- POS: function( elem, match, i, array ) {- var name = match[2],- filter = Expr.setFilters[ name ];-- if ( filter ) {- return filter( elem, i, match, array );- }- }- }-};--var origPOS = Expr.match.POS,- fescape = function(all, num){- return "\\" + (num - 0 + 1);- };--for ( var type in Expr.match ) {- Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );- Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );-}-// Expose origPOS-// "global" as in regardless of relation to brackets/parens-Expr.match.globalPOS = origPOS;--var makeArray = function( array, results ) {- array = Array.prototype.slice.call( array, 0 );-- if ( results ) {- results.push.apply( results, array );- return results;- }-- return array;-};--// Perform a simple check to determine if the browser is capable of-// converting a NodeList to an array using builtin methods.-// Also verifies that the returned array holds DOM nodes-// (which is not the case in the Blackberry browser)-try {- Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;--// Provide a fallback method if it does not work-} catch( e ) {- makeArray = function( array, results ) {- var i = 0,- ret = results || [];-- if ( toString.call(array) === "[object Array]" ) {- Array.prototype.push.apply( ret, array );-- } else {- if ( typeof array.length === "number" ) {- for ( var l = array.length; i < l; i++ ) {- ret.push( array[i] );- }-- } else {- for ( ; array[i]; i++ ) {- ret.push( array[i] );- }- }- }-- return ret;- };-}--var sortOrder, siblingCheck;--if ( document.documentElement.compareDocumentPosition ) {- sortOrder = function( a, b ) {- if ( a === b ) {- hasDuplicate = true;- return 0;- }-- if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {- return a.compareDocumentPosition ? -1 : 1;- }-- return a.compareDocumentPosition(b) & 4 ? -1 : 1;- };--} else {- sortOrder = function( a, b ) {- // The nodes are identical, we can exit early- if ( a === b ) {- hasDuplicate = true;- return 0;-- // Fallback to using sourceIndex (in IE) if it's available on both nodes- } else if ( a.sourceIndex && b.sourceIndex ) {- return a.sourceIndex - b.sourceIndex;- }-- var al, bl,- ap = [],- bp = [],- aup = a.parentNode,- bup = b.parentNode,- cur = aup;-- // If the nodes are siblings (or identical) we can do a quick check- if ( aup === bup ) {- return siblingCheck( a, b );-- // If no parents were found then the nodes are disconnected- } else if ( !aup ) {- return -1;-- } else if ( !bup ) {- return 1;- }-- // Otherwise they're somewhere else in the tree so we need- // to build up a full list of the parentNodes for comparison- while ( cur ) {- ap.unshift( cur );- cur = cur.parentNode;- }-- cur = bup;-- while ( cur ) {- bp.unshift( cur );- cur = cur.parentNode;- }-- al = ap.length;- bl = bp.length;-- // Start walking down the tree looking for a discrepancy- for ( var i = 0; i < al && i < bl; i++ ) {- if ( ap[i] !== bp[i] ) {- return siblingCheck( ap[i], bp[i] );- }- }-- // We ended someplace up the tree so do a sibling check- return i === al ?- siblingCheck( a, bp[i], -1 ) :- siblingCheck( ap[i], b, 1 );- };-- siblingCheck = function( a, b, ret ) {- if ( a === b ) {- return ret;- }-- var cur = a.nextSibling;-- while ( cur ) {- if ( cur === b ) {- return -1;- }-- cur = cur.nextSibling;- }-- return 1;- };-}--// Check to see if the browser returns elements by name when-// querying by getElementById (and provide a workaround)-(function(){- // We're going to inject a fake input element with a specified name- var form = document.createElement("div"),- id = "script" + (new Date()).getTime(),- root = document.documentElement;-- form.innerHTML = "<a name='" + id + "'/>";-- // Inject it into the root element, check its status, and remove it quickly- root.insertBefore( form, root.firstChild );-- // The workaround has to do additional checks after a getElementById- // Which slows things down for other browsers (hence the branching)- if ( document.getElementById( id ) ) {- Expr.find.ID = function( match, context, isXML ) {- if ( typeof context.getElementById !== "undefined" && !isXML ) {- var m = context.getElementById(match[1]);-- return m ?- m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?- [m] :- undefined :- [];- }- };-- Expr.filter.ID = function( elem, match ) {- var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");-- return elem.nodeType === 1 && node && node.nodeValue === match;- };- }-- root.removeChild( form );-- // release memory in IE- root = form = null;-})();--(function(){- // Check to see if the browser returns only elements- // when doing getElementsByTagName("*")-- // Create a fake element- var div = document.createElement("div");- div.appendChild( document.createComment("") );-- // Make sure no comments are found- if ( div.getElementsByTagName("*").length > 0 ) {- Expr.find.TAG = function( match, context ) {- var results = context.getElementsByTagName( match[1] );-- // Filter out possible comments- if ( match[1] === "*" ) {- var tmp = [];-- for ( var i = 0; results[i]; i++ ) {- if ( results[i].nodeType === 1 ) {- tmp.push( results[i] );- }- }-- results = tmp;- }-- return results;- };- }-- // Check to see if an attribute returns normalized href attributes- div.innerHTML = "<a href='#'></a>";-- if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&- div.firstChild.getAttribute("href") !== "#" ) {-- Expr.attrHandle.href = function( elem ) {- return elem.getAttribute( "href", 2 );- };- }-- // release memory in IE- div = null;-})();--if ( document.querySelectorAll ) {- (function(){- var oldSizzle = Sizzle,- div = document.createElement("div"),- id = "__sizzle__";-- div.innerHTML = "<p class='TEST'></p>";-- // Safari can't handle uppercase or unicode characters when- // in quirks mode.- if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {- return;- }-- Sizzle = function( query, context, extra, seed ) {- context = context || document;-- // Only use querySelectorAll on non-XML documents- // (ID selectors don't work in non-HTML documents)- if ( !seed && !Sizzle.isXML(context) ) {- // See if we find a selector to speed up- var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );-- if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {- // Speed-up: Sizzle("TAG")- if ( match[1] ) {- return makeArray( context.getElementsByTagName( query ), extra );-- // Speed-up: Sizzle(".CLASS")- } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {- return makeArray( context.getElementsByClassName( match[2] ), extra );- }- }-- if ( context.nodeType === 9 ) {- // Speed-up: Sizzle("body")- // The body element only exists once, optimize finding it- if ( query === "body" && context.body ) {- return makeArray( [ context.body ], extra );-- // Speed-up: Sizzle("#ID")- } else if ( match && match[3] ) {- var elem = context.getElementById( match[3] );-- // Check parentNode to catch when Blackberry 4.6 returns- // nodes that are no longer in the document #6963- if ( elem && elem.parentNode ) {- // Handle the case where IE and Opera return items- // by name instead of ID- if ( elem.id === match[3] ) {- return makeArray( [ elem ], extra );- }-- } else {- return makeArray( [], extra );- }- }-- try {- return makeArray( context.querySelectorAll(query), extra );- } catch(qsaError) {}-- // qSA works strangely on Element-rooted queries- // We can work around this by specifying an extra ID on the root- // and working up from there (Thanks to Andrew Dupont for the technique)- // IE 8 doesn't work on object elements- } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {- var oldContext = context,- old = context.getAttribute( "id" ),- nid = old || id,- hasParent = context.parentNode,- relativeHierarchySelector = /^\s*[+~]/.test( query );-- if ( !old ) {- context.setAttribute( "id", nid );- } else {- nid = nid.replace( /'/g, "\\$&" );- }- if ( relativeHierarchySelector && hasParent ) {- context = context.parentNode;- }-- try {- if ( !relativeHierarchySelector || hasParent ) {- return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );- }-- } catch(pseudoError) {- } finally {- if ( !old ) {- oldContext.removeAttribute( "id" );- }- }- }- }-- return oldSizzle(query, context, extra, seed);- };-- for ( var prop in oldSizzle ) {- Sizzle[ prop ] = oldSizzle[ prop ];- }-- // release memory in IE- div = null;- })();-}--(function(){- var html = document.documentElement,- matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;-- if ( matches ) {- // Check to see if it's possible to do matchesSelector- // on a disconnected node (IE 9 fails this)- var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),- pseudoWorks = false;-- try {- // This should fail with an exception- // Gecko does not error, returns false instead- matches.call( document.documentElement, "[test!='']:sizzle" );-- } catch( pseudoError ) {- pseudoWorks = true;- }-- Sizzle.matchesSelector = function( node, expr ) {- // Make sure that attribute selectors are quoted- expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");-- if ( !Sizzle.isXML( node ) ) {- try {- if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {- var ret = matches.call( node, expr );-- // IE 9's matchesSelector returns false on disconnected nodes- if ( ret || !disconnectedMatch ||- // As well, disconnected nodes are said to be in a document- // fragment in IE 9, so check for that- node.document && node.document.nodeType !== 11 ) {- return ret;- }- }- } catch(e) {}- }-- return Sizzle(expr, null, null, [node]).length > 0;- };- }-})();--(function(){- var div = document.createElement("div");-- div.innerHTML = "<div class='test e'></div><div class='test'></div>";-- // Opera can't find a second classname (in 9.6)- // Also, make sure that getElementsByClassName actually exists- if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {- return;- }-- // Safari caches class attributes, doesn't catch changes (in 3.2)- div.lastChild.className = "e";-- if ( div.getElementsByClassName("e").length === 1 ) {- return;- }-- Expr.order.splice(1, 0, "CLASS");- Expr.find.CLASS = function( match, context, isXML ) {- if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {- return context.getElementsByClassName(match[1]);- }- };-- // release memory in IE- div = null;-})();--function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {- for ( var i = 0, l = checkSet.length; i < l; i++ ) {- var elem = checkSet[i];-- if ( elem ) {- var match = false;-- elem = elem[dir];-- while ( elem ) {- if ( elem[ expando ] === doneName ) {- match = checkSet[elem.sizset];- break;- }-- if ( elem.nodeType === 1 && !isXML ){- elem[ expando ] = doneName;- elem.sizset = i;- }-- if ( elem.nodeName.toLowerCase() === cur ) {- match = elem;- break;- }-- elem = elem[dir];- }-- checkSet[i] = match;- }- }-}--function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {- for ( var i = 0, l = checkSet.length; i < l; i++ ) {- var elem = checkSet[i];-- if ( elem ) {- var match = false;-- elem = elem[dir];-- while ( elem ) {- if ( elem[ expando ] === doneName ) {- match = checkSet[elem.sizset];- break;- }-- if ( elem.nodeType === 1 ) {- if ( !isXML ) {- elem[ expando ] = doneName;- elem.sizset = i;- }-- if ( typeof cur !== "string" ) {- if ( elem === cur ) {- match = true;- break;- }-- } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {- match = elem;- break;- }- }-- elem = elem[dir];- }-- checkSet[i] = match;- }- }-}--if ( document.documentElement.contains ) {- Sizzle.contains = function( a, b ) {- return a !== b && (a.contains ? a.contains(b) : true);- };--} else if ( document.documentElement.compareDocumentPosition ) {- Sizzle.contains = function( a, b ) {- return !!(a.compareDocumentPosition(b) & 16);- };--} else {- Sizzle.contains = function() {- return false;- };-}--Sizzle.isXML = function( elem ) {- // documentElement is verified for cases where it doesn't yet exist- // (such as loading iframes in IE - #4833)- var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;-- return documentElement ? documentElement.nodeName !== "HTML" : false;-};--var posProcess = function( selector, context, seed ) {- var match,- tmpSet = [],- later = "",- root = context.nodeType ? [context] : context;-- // Position selectors must be done after the filter- // And so must :not(positional) so we move all PSEUDOs to the end- while ( (match = Expr.match.PSEUDO.exec( selector )) ) {- later += match[0];- selector = selector.replace( Expr.match.PSEUDO, "" );- }-- selector = Expr.relative[selector] ? selector + "*" : selector;-- for ( var i = 0, l = root.length; i < l; i++ ) {- Sizzle( selector, root[i], tmpSet, seed );- }-- return Sizzle.filter( later, tmpSet );-};--// EXPOSE-// Override sizzle attribute retrieval-Sizzle.attr = jQuery.attr;-Sizzle.selectors.attrMap = {};-jQuery.find = Sizzle;-jQuery.expr = Sizzle.selectors;-jQuery.expr[":"] = jQuery.expr.filters;-jQuery.unique = Sizzle.uniqueSort;-jQuery.text = Sizzle.getText;-jQuery.isXMLDoc = Sizzle.isXML;-jQuery.contains = Sizzle.contains;---})();---var runtil = /Until$/,- rparentsprev = /^(?:parents|prevUntil|prevAll)/,- // Note: This RegExp should be improved, or likely pulled from Sizzle- rmultiselector = /,/,- isSimple = /^.[^:#\[\.,]*$/,- slice = Array.prototype.slice,- POS = jQuery.expr.match.globalPOS,- // methods guaranteed to produce a unique set when starting from a unique set- guaranteedUnique = {- children: true,- contents: true,- next: true,- prev: true- };--jQuery.fn.extend({- find: function( selector ) {- var self = this,- i, l;-- if ( typeof selector !== "string" ) {- return jQuery( selector ).filter(function() {- for ( i = 0, l = self.length; i < l; i++ ) {- if ( jQuery.contains( self[ i ], this ) ) {- return true;- }- }- });- }-- var ret = this.pushStack( "", "find", selector ),- length, n, r;-- for ( i = 0, l = this.length; i < l; i++ ) {- length = ret.length;- jQuery.find( selector, this[i], ret );-- if ( i > 0 ) {- // Make sure that the results are unique- for ( n = length; n < ret.length; n++ ) {- for ( r = 0; r < length; r++ ) {- if ( ret[r] === ret[n] ) {- ret.splice(n--, 1);- break;- }- }- }- }- }-- return ret;- },-- has: function( target ) {- var targets = jQuery( target );- return this.filter(function() {- for ( var i = 0, l = targets.length; i < l; i++ ) {- if ( jQuery.contains( this, targets[i] ) ) {- return true;- }- }- });- },-- not: function( selector ) {- return this.pushStack( winnow(this, selector, false), "not", selector);- },-- filter: function( selector ) {- return this.pushStack( winnow(this, selector, true), "filter", selector );- },-- is: function( selector ) {- return !!selector && (- typeof selector === "string" ?- // If this is a positional selector, check membership in the returned set- // so $("p:first").is("p:last") won't return true for a doc with two "p".- POS.test( selector ) ?- jQuery( selector, this.context ).index( this[0] ) >= 0 :- jQuery.filter( selector, this ).length > 0 :- this.filter( selector ).length > 0 );- },-- closest: function( selectors, context ) {- var ret = [], i, l, cur = this[0];-- // Array (deprecated as of jQuery 1.7)- if ( jQuery.isArray( selectors ) ) {- var level = 1;-- while ( cur && cur.ownerDocument && cur !== context ) {- for ( i = 0; i < selectors.length; i++ ) {-- if ( jQuery( cur ).is( selectors[ i ] ) ) {- ret.push({ selector: selectors[ i ], elem: cur, level: level });- }- }-- cur = cur.parentNode;- level++;- }-- return ret;- }-- // String- var pos = POS.test( selectors ) || typeof selectors !== "string" ?- jQuery( selectors, context || this.context ) :- 0;-- for ( i = 0, l = this.length; i < l; i++ ) {- cur = this[i];-- while ( cur ) {- if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {- ret.push( cur );- break;-- } else {- cur = cur.parentNode;- if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {- break;- }- }- }- }-- ret = ret.length > 1 ? jQuery.unique( ret ) : ret;-- return this.pushStack( ret, "closest", selectors );- },-- // Determine the position of an element within- // the matched set of elements- index: function( elem ) {-- // No argument, return index in parent- if ( !elem ) {- return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;- }-- // index in selector- if ( typeof elem === "string" ) {- return jQuery.inArray( this[0], jQuery( elem ) );- }-- // Locate the position of the desired element- return jQuery.inArray(- // If it receives a jQuery object, the first element is used- elem.jquery ? elem[0] : elem, this );- },-- add: function( selector, context ) {- var set = typeof selector === "string" ?- jQuery( selector, context ) :- jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),- all = jQuery.merge( this.get(), set );-- return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?- all :- jQuery.unique( all ) );- },-- andSelf: function() {- return this.add( this.prevObject );- }-});--// A painfully simple check to see if an element is disconnected-// from a document (should be improved, where feasible).-function isDisconnected( node ) {- return !node || !node.parentNode || node.parentNode.nodeType === 11;-}--jQuery.each({- parent: function( elem ) {- var parent = elem.parentNode;- return parent && parent.nodeType !== 11 ? parent : null;- },- parents: function( elem ) {- return jQuery.dir( elem, "parentNode" );- },- parentsUntil: function( elem, i, until ) {- return jQuery.dir( elem, "parentNode", until );- },- next: function( elem ) {- return jQuery.nth( elem, 2, "nextSibling" );- },- prev: function( elem ) {- return jQuery.nth( elem, 2, "previousSibling" );- },- nextAll: function( elem ) {- return jQuery.dir( elem, "nextSibling" );- },- prevAll: function( elem ) {- return jQuery.dir( elem, "previousSibling" );- },- nextUntil: function( elem, i, until ) {- return jQuery.dir( elem, "nextSibling", until );- },- prevUntil: function( elem, i, until ) {- return jQuery.dir( elem, "previousSibling", until );- },- siblings: function( elem ) {- return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );- },- children: function( elem ) {- return jQuery.sibling( elem.firstChild );- },- contents: function( elem ) {- return jQuery.nodeName( elem, "iframe" ) ?- elem.contentDocument || elem.contentWindow.document :- jQuery.makeArray( elem.childNodes );- }-}, function( name, fn ) {- jQuery.fn[ name ] = function( until, selector ) {- var ret = jQuery.map( this, fn, until );-- if ( !runtil.test( name ) ) {- selector = until;- }-- if ( selector && typeof selector === "string" ) {- ret = jQuery.filter( selector, ret );- }-- ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;-- if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {- ret = ret.reverse();- }-- return this.pushStack( ret, name, slice.call( arguments ).join(",") );- };-});--jQuery.extend({- filter: function( expr, elems, not ) {- if ( not ) {- expr = ":not(" + expr + ")";- }-- return elems.length === 1 ?- jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :- jQuery.find.matches(expr, elems);- },-- dir: function( elem, dir, until ) {- var matched = [],- cur = elem[ dir ];-- while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {- if ( cur.nodeType === 1 ) {- matched.push( cur );- }- cur = cur[dir];- }- return matched;- },-- nth: function( cur, result, dir, elem ) {- result = result || 1;- var num = 0;-- for ( ; cur; cur = cur[dir] ) {- if ( cur.nodeType === 1 && ++num === result ) {- break;- }- }-- return cur;- },-- sibling: function( n, elem ) {- var r = [];-- for ( ; n; n = n.nextSibling ) {- if ( n.nodeType === 1 && n !== elem ) {- r.push( n );- }- }-- return r;- }-});--// Implement the identical functionality for filter and not-function winnow( elements, qualifier, keep ) {-- // Can't pass null or undefined to indexOf in Firefox 4- // Set to 0 to skip string check- qualifier = qualifier || 0;-- if ( jQuery.isFunction( qualifier ) ) {- return jQuery.grep(elements, function( elem, i ) {- var retVal = !!qualifier.call( elem, i, elem );- return retVal === keep;- });-- } else if ( qualifier.nodeType ) {- return jQuery.grep(elements, function( elem, i ) {- return ( elem === qualifier ) === keep;- });-- } else if ( typeof qualifier === "string" ) {- var filtered = jQuery.grep(elements, function( elem ) {- return elem.nodeType === 1;- });-- if ( isSimple.test( qualifier ) ) {- return jQuery.filter(qualifier, filtered, !keep);- } else {- qualifier = jQuery.filter( qualifier, filtered );- }- }-- return jQuery.grep(elements, function( elem, i ) {- return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;- });-}-----function createSafeFragment( document ) {- var list = nodeNames.split( "|" ),- safeFrag = document.createDocumentFragment();-- if ( safeFrag.createElement ) {- while ( list.length ) {- safeFrag.createElement(- list.pop()- );- }- }- return safeFrag;-}--var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +- "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",- rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,- rleadingWhitespace = /^\s+/,- rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,- rtagName = /<([\w:]+)/,- rtbody = /<tbody/i,- rhtml = /<|&#?\w+;/,- rnoInnerhtml = /<(?:script|style)/i,- rnocache = /<(?:script|object|embed|option|style)/i,- rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),- // checked="checked" or checked- rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,- rscriptType = /\/(java|ecma)script/i,- rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,- wrapMap = {- option: [ 1, "<select multiple='multiple'>", "</select>" ],- legend: [ 1, "<fieldset>", "</fieldset>" ],- thead: [ 1, "<table>", "</table>" ],- tr: [ 2, "<table><tbody>", "</tbody></table>" ],- td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],- col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],- area: [ 1, "<map>", "</map>" ],- _default: [ 0, "", "" ]- },- safeFragment = createSafeFragment( document );--wrapMap.optgroup = wrapMap.option;-wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;-wrapMap.th = wrapMap.td;--// IE can't serialize <link> and <script> tags normally-if ( !jQuery.support.htmlSerialize ) {- wrapMap._default = [ 1, "div<div>", "</div>" ];-}--jQuery.fn.extend({- text: function( value ) {- return jQuery.access( this, function( value ) {- return value === undefined ?- jQuery.text( this ) :- this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );- }, null, value, arguments.length );- },-- wrapAll: function( html ) {- if ( jQuery.isFunction( html ) ) {- return this.each(function(i) {- jQuery(this).wrapAll( html.call(this, i) );- });- }-- if ( this[0] ) {- // The elements to wrap the target around- var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);-- if ( this[0].parentNode ) {- wrap.insertBefore( this[0] );- }-- wrap.map(function() {- var elem = this;-- while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {- elem = elem.firstChild;- }-- return elem;- }).append( this );- }-- return this;- },-- wrapInner: function( html ) {- if ( jQuery.isFunction( html ) ) {- return this.each(function(i) {- jQuery(this).wrapInner( html.call(this, i) );- });- }-- return this.each(function() {- var self = jQuery( this ),- contents = self.contents();-- if ( contents.length ) {- contents.wrapAll( html );-- } else {- self.append( html );- }- });- },-- wrap: function( html ) {- var isFunction = jQuery.isFunction( html );-- return this.each(function(i) {- jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );- });- },-- unwrap: function() {- return this.parent().each(function() {- if ( !jQuery.nodeName( this, "body" ) ) {- jQuery( this ).replaceWith( this.childNodes );- }- }).end();- },-- append: function() {- return this.domManip(arguments, true, function( elem ) {- if ( this.nodeType === 1 ) {- this.appendChild( elem );- }- });- },-- prepend: function() {- return this.domManip(arguments, true, function( elem ) {- if ( this.nodeType === 1 ) {- this.insertBefore( elem, this.firstChild );- }- });- },-- before: function() {- if ( this[0] && this[0].parentNode ) {- return this.domManip(arguments, false, function( elem ) {- this.parentNode.insertBefore( elem, this );- });- } else if ( arguments.length ) {- var set = jQuery.clean( arguments );- set.push.apply( set, this.toArray() );- return this.pushStack( set, "before", arguments );- }- },-- after: function() {- if ( this[0] && this[0].parentNode ) {- return this.domManip(arguments, false, function( elem ) {- this.parentNode.insertBefore( elem, this.nextSibling );- });- } else if ( arguments.length ) {- var set = this.pushStack( this, "after", arguments );- set.push.apply( set, jQuery.clean(arguments) );- return set;- }- },-- // keepData is for internal use only--do not document- remove: function( selector, keepData ) {- for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {- if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {- if ( !keepData && elem.nodeType === 1 ) {- jQuery.cleanData( elem.getElementsByTagName("*") );- jQuery.cleanData( [ elem ] );- }-- if ( elem.parentNode ) {- elem.parentNode.removeChild( elem );- }- }- }-- return this;- },-- empty: function() {- for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {- // Remove element nodes and prevent memory leaks- if ( elem.nodeType === 1 ) {- jQuery.cleanData( elem.getElementsByTagName("*") );- }-- // Remove any remaining nodes- while ( elem.firstChild ) {- elem.removeChild( elem.firstChild );- }- }-- return this;- },-- clone: function( dataAndEvents, deepDataAndEvents ) {- dataAndEvents = dataAndEvents == null ? false : dataAndEvents;- deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;-- return this.map( function () {- return jQuery.clone( this, dataAndEvents, deepDataAndEvents );- });- },-- html: function( value ) {- return jQuery.access( this, function( value ) {- var elem = this[0] || {},- i = 0,- l = this.length;-- if ( value === undefined ) {- return elem.nodeType === 1 ?- elem.innerHTML.replace( rinlinejQuery, "" ) :- null;- }--- if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&- ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&- !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {-- value = value.replace( rxhtmlTag, "<$1></$2>" );-- try {- for (; i < l; i++ ) {- // Remove element nodes and prevent memory leaks- elem = this[i] || {};- if ( elem.nodeType === 1 ) {- jQuery.cleanData( elem.getElementsByTagName( "*" ) );- elem.innerHTML = value;- }- }-- elem = 0;-- // If using innerHTML throws an exception, use the fallback method- } catch(e) {}- }-- if ( elem ) {- this.empty().append( value );- }- }, null, value, arguments.length );- },-- replaceWith: function( value ) {- if ( this[0] && this[0].parentNode ) {- // Make sure that the elements are removed from the DOM before they are inserted- // this can help fix replacing a parent with child elements- if ( jQuery.isFunction( value ) ) {- return this.each(function(i) {- var self = jQuery(this), old = self.html();- self.replaceWith( value.call( this, i, old ) );- });- }-- if ( typeof value !== "string" ) {- value = jQuery( value ).detach();- }-- return this.each(function() {- var next = this.nextSibling,- parent = this.parentNode;-- jQuery( this ).remove();-- if ( next ) {- jQuery(next).before( value );- } else {- jQuery(parent).append( value );- }- });- } else {- return this.length ?- this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :- this;- }- },-- detach: function( selector ) {- return this.remove( selector, true );- },-- domManip: function( args, table, callback ) {- var results, first, fragment, parent,- value = args[0],- scripts = [];-- // We can't cloneNode fragments that contain checked, in WebKit- if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {- return this.each(function() {- jQuery(this).domManip( args, table, callback, true );- });- }-- if ( jQuery.isFunction(value) ) {- return this.each(function(i) {- var self = jQuery(this);- args[0] = value.call(this, i, table ? self.html() : undefined);- self.domManip( args, table, callback );- });- }-- if ( this[0] ) {- parent = value && value.parentNode;-- // If we're in a fragment, just use that instead of building a new one- if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {- results = { fragment: parent };-- } else {- results = jQuery.buildFragment( args, this, scripts );- }-- fragment = results.fragment;-- if ( fragment.childNodes.length === 1 ) {- first = fragment = fragment.firstChild;- } else {- first = fragment.firstChild;- }-- if ( first ) {- table = table && jQuery.nodeName( first, "tr" );-- for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {- callback.call(- table ?- root(this[i], first) :- this[i],- // Make sure that we do not leak memory by inadvertently discarding- // the original fragment (which might have attached data) instead of- // using it; in addition, use the original fragment object for the last- // item instead of first because it can end up being emptied incorrectly- // in certain situations (Bug #8070).- // Fragments from the fragment cache must always be cloned and never used- // in place.- results.cacheable || ( l > 1 && i < lastIndex ) ?- jQuery.clone( fragment, true, true ) :- fragment- );- }- }-- if ( scripts.length ) {- jQuery.each( scripts, function( i, elem ) {- if ( elem.src ) {- jQuery.ajax({- type: "GET",- global: false,- url: elem.src,- async: false,- dataType: "script"- });- } else {- jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );- }-- if ( elem.parentNode ) {- elem.parentNode.removeChild( elem );- }- });- }- }-- return this;- }-});--function root( elem, cur ) {- return jQuery.nodeName(elem, "table") ?- (elem.getElementsByTagName("tbody")[0] ||- elem.appendChild(elem.ownerDocument.createElement("tbody"))) :- elem;-}--function cloneCopyEvent( src, dest ) {-- if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {- return;- }-- var type, i, l,- oldData = jQuery._data( src ),- curData = jQuery._data( dest, oldData ),- events = oldData.events;-- if ( events ) {- delete curData.handle;- curData.events = {};-- for ( type in events ) {- for ( i = 0, l = events[ type ].length; i < l; i++ ) {- jQuery.event.add( dest, type, events[ type ][ i ] );- }- }- }-- // make the cloned public data object a copy from the original- if ( curData.data ) {- curData.data = jQuery.extend( {}, curData.data );- }-}--function cloneFixAttributes( src, dest ) {- var nodeName;-- // We do not need to do anything for non-Elements- if ( dest.nodeType !== 1 ) {- return;- }-- // clearAttributes removes the attributes, which we don't want,- // but also removes the attachEvent events, which we *do* want- if ( dest.clearAttributes ) {- dest.clearAttributes();- }-- // mergeAttributes, in contrast, only merges back on the- // original attributes, not the events- if ( dest.mergeAttributes ) {- dest.mergeAttributes( src );- }-- nodeName = dest.nodeName.toLowerCase();-- // IE6-8 fail to clone children inside object elements that use- // the proprietary classid attribute value (rather than the type- // attribute) to identify the type of content to display- if ( nodeName === "object" ) {- dest.outerHTML = src.outerHTML;-- } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {- // IE6-8 fails to persist the checked state of a cloned checkbox- // or radio button. Worse, IE6-7 fail to give the cloned element- // a checked appearance if the defaultChecked value isn't also set- if ( src.checked ) {- dest.defaultChecked = dest.checked = src.checked;- }-- // IE6-7 get confused and end up setting the value of a cloned- // checkbox/radio button to an empty string instead of "on"- if ( dest.value !== src.value ) {- dest.value = src.value;- }-- // IE6-8 fails to return the selected option to the default selected- // state when cloning options- } else if ( nodeName === "option" ) {- dest.selected = src.defaultSelected;-- // IE6-8 fails to set the defaultValue to the correct value when- // cloning other types of input fields- } else if ( nodeName === "input" || nodeName === "textarea" ) {- dest.defaultValue = src.defaultValue;-- // IE blanks contents when cloning scripts- } else if ( nodeName === "script" && dest.text !== src.text ) {- dest.text = src.text;- }-- // Event data gets referenced instead of copied if the expando- // gets copied too- dest.removeAttribute( jQuery.expando );-- // Clear flags for bubbling special change/submit events, they must- // be reattached when the newly cloned events are first activated- dest.removeAttribute( "_submit_attached" );- dest.removeAttribute( "_change_attached" );-}--jQuery.buildFragment = function( args, nodes, scripts ) {- var fragment, cacheable, cacheresults, doc,- first = args[ 0 ];-- // nodes may contain either an explicit document object,- // a jQuery collection or context object.- // If nodes[0] contains a valid object to assign to doc- if ( nodes && nodes[0] ) {- doc = nodes[0].ownerDocument || nodes[0];- }-- // Ensure that an attr object doesn't incorrectly stand in as a document object- // Chrome and Firefox seem to allow this to occur and will throw exception- // Fixes #8950- if ( !doc.createDocumentFragment ) {- doc = document;- }-- // Only cache "small" (1/2 KB) HTML strings that are associated with the main document- // Cloning options loses the selected state, so don't cache them- // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment- // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache- // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501- if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&- first.charAt(0) === "<" && !rnocache.test( first ) &&- (jQuery.support.checkClone || !rchecked.test( first )) &&- (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {-- cacheable = true;-- cacheresults = jQuery.fragments[ first ];- if ( cacheresults && cacheresults !== 1 ) {- fragment = cacheresults;- }- }-- if ( !fragment ) {- fragment = doc.createDocumentFragment();- jQuery.clean( args, doc, fragment, scripts );- }-- if ( cacheable ) {- jQuery.fragments[ first ] = cacheresults ? fragment : 1;- }-- return { fragment: fragment, cacheable: cacheable };-};--jQuery.fragments = {};--jQuery.each({- appendTo: "append",- prependTo: "prepend",- insertBefore: "before",- insertAfter: "after",- replaceAll: "replaceWith"-}, function( name, original ) {- jQuery.fn[ name ] = function( selector ) {- var ret = [],- insert = jQuery( selector ),- parent = this.length === 1 && this[0].parentNode;-- if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {- insert[ original ]( this[0] );- return this;-- } else {- for ( var i = 0, l = insert.length; i < l; i++ ) {- var elems = ( i > 0 ? this.clone(true) : this ).get();- jQuery( insert[i] )[ original ]( elems );- ret = ret.concat( elems );- }-- return this.pushStack( ret, name, insert.selector );- }- };-});--function getAll( elem ) {- if ( typeof elem.getElementsByTagName !== "undefined" ) {- return elem.getElementsByTagName( "*" );-- } else if ( typeof elem.querySelectorAll !== "undefined" ) {- return elem.querySelectorAll( "*" );-- } else {- return [];- }-}--// Used in clean, fixes the defaultChecked property-function fixDefaultChecked( elem ) {- if ( elem.type === "checkbox" || elem.type === "radio" ) {- elem.defaultChecked = elem.checked;- }-}-// Finds all inputs and passes them to fixDefaultChecked-function findInputs( elem ) {- var nodeName = ( elem.nodeName || "" ).toLowerCase();- if ( nodeName === "input" ) {- fixDefaultChecked( elem );- // Skip scripts, get other children- } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {- jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );- }-}--// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js-function shimCloneNode( elem ) {- var div = document.createElement( "div" );- safeFragment.appendChild( div );-- div.innerHTML = elem.outerHTML;- return div.firstChild;-}--jQuery.extend({- clone: function( elem, dataAndEvents, deepDataAndEvents ) {- var srcElements,- destElements,- i,- // IE<=8 does not properly clone detached, unknown element nodes- clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ?- elem.cloneNode( true ) :- shimCloneNode( elem );-- if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&- (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {- // IE copies events bound via attachEvent when using cloneNode.- // Calling detachEvent on the clone will also remove the events- // from the original. In order to get around this, we use some- // proprietary methods to clear the events. Thanks to MooTools- // guys for this hotness.-- cloneFixAttributes( elem, clone );-- // Using Sizzle here is crazy slow, so we use getElementsByTagName instead- srcElements = getAll( elem );- destElements = getAll( clone );-- // Weird iteration because IE will replace the length property- // with an element if you are cloning the body and one of the- // elements on the page has a name or id of "length"- for ( i = 0; srcElements[i]; ++i ) {- // Ensure that the destination node is not null; Fixes #9587- if ( destElements[i] ) {- cloneFixAttributes( srcElements[i], destElements[i] );- }- }- }-- // Copy the events from the original to the clone- if ( dataAndEvents ) {- cloneCopyEvent( elem, clone );-- if ( deepDataAndEvents ) {- srcElements = getAll( elem );- destElements = getAll( clone );-- for ( i = 0; srcElements[i]; ++i ) {- cloneCopyEvent( srcElements[i], destElements[i] );- }- }- }-- srcElements = destElements = null;-- // Return the cloned set- return clone;- },-- clean: function( elems, context, fragment, scripts ) {- var checkScriptType, script, j,- ret = [];-- context = context || document;-- // !context.createElement fails in IE with an error but returns typeof 'object'- if ( typeof context.createElement === "undefined" ) {- context = context.ownerDocument || context[0] && context[0].ownerDocument || document;- }-- for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {- if ( typeof elem === "number" ) {- elem += "";- }-- if ( !elem ) {- continue;- }-- // Convert html string into DOM nodes- if ( typeof elem === "string" ) {- if ( !rhtml.test( elem ) ) {- elem = context.createTextNode( elem );- } else {- // Fix "XHTML"-style tags in all browsers- elem = elem.replace(rxhtmlTag, "<$1></$2>");-- // Trim whitespace, otherwise indexOf won't work as expected- var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),- wrap = wrapMap[ tag ] || wrapMap._default,- depth = wrap[0],- div = context.createElement("div"),- safeChildNodes = safeFragment.childNodes,- remove;-- // Append wrapper element to unknown element safe doc fragment- if ( context === document ) {- // Use the fragment we've already created for this document- safeFragment.appendChild( div );- } else {- // Use a fragment created with the owner document- createSafeFragment( context ).appendChild( div );- }-- // Go to html and back, then peel off extra wrappers- div.innerHTML = wrap[1] + elem + wrap[2];-- // Move to the right depth- while ( depth-- ) {- div = div.lastChild;- }-- // Remove IE's autoinserted <tbody> from table fragments- if ( !jQuery.support.tbody ) {-- // String was a <table>, *may* have spurious <tbody>- var hasBody = rtbody.test(elem),- tbody = tag === "table" && !hasBody ?- div.firstChild && div.firstChild.childNodes :-- // String was a bare <thead> or <tfoot>- wrap[1] === "<table>" && !hasBody ?- div.childNodes :- [];-- for ( j = tbody.length - 1; j >= 0 ; --j ) {- if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {- tbody[ j ].parentNode.removeChild( tbody[ j ] );- }- }- }-- // IE completely kills leading whitespace when innerHTML is used- if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {- div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );- }-- elem = div.childNodes;-- // Clear elements from DocumentFragment (safeFragment or otherwise)- // to avoid hoarding elements. Fixes #11356- if ( div ) {- div.parentNode.removeChild( div );-- // Guard against -1 index exceptions in FF3.6- if ( safeChildNodes.length > 0 ) {- remove = safeChildNodes[ safeChildNodes.length - 1 ];-- if ( remove && remove.parentNode ) {- remove.parentNode.removeChild( remove );- }- }- }- }- }-- // Resets defaultChecked for any radios and checkboxes- // about to be appended to the DOM in IE 6/7 (#8060)- var len;- if ( !jQuery.support.appendChecked ) {- if ( elem[0] && typeof (len = elem.length) === "number" ) {- for ( j = 0; j < len; j++ ) {- findInputs( elem[j] );- }- } else {- findInputs( elem );- }- }-- if ( elem.nodeType ) {- ret.push( elem );- } else {- ret = jQuery.merge( ret, elem );- }- }-- if ( fragment ) {- checkScriptType = function( elem ) {- return !elem.type || rscriptType.test( elem.type );- };- for ( i = 0; ret[i]; i++ ) {- script = ret[i];- if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) {- scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );-- } else {- if ( script.nodeType === 1 ) {- var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType );-- ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );- }- fragment.appendChild( script );- }- }- }-- return ret;- },-- cleanData: function( elems ) {- var data, id,- cache = jQuery.cache,- special = jQuery.event.special,- deleteExpando = jQuery.support.deleteExpando;-- for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {- if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {- continue;- }-- id = elem[ jQuery.expando ];-- if ( id ) {- data = cache[ id ];-- if ( data && data.events ) {- for ( var type in data.events ) {- if ( special[ type ] ) {- jQuery.event.remove( elem, type );-- // This is a shortcut to avoid jQuery.event.remove's overhead- } else {- jQuery.removeEvent( elem, type, data.handle );- }- }-- // Null the DOM reference to avoid IE6/7/8 leak (#7054)- if ( data.handle ) {- data.handle.elem = null;- }- }-- if ( deleteExpando ) {- delete elem[ jQuery.expando ];-- } else if ( elem.removeAttribute ) {- elem.removeAttribute( jQuery.expando );- }-- delete cache[ id ];- }- }- }-});-----var ralpha = /alpha\([^)]*\)/i,- ropacity = /opacity=([^)]*)/,- // fixed for IE9, see #8346- rupper = /([A-Z]|^ms)/g,- rnum = /^[\-+]?(?:\d*\.)?\d+$/i,- rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,- rrelNum = /^([\-+])=([\-+.\de]+)/,- rmargin = /^margin/,-- cssShow = { position: "absolute", visibility: "hidden", display: "block" },-- // order is important!- cssExpand = [ "Top", "Right", "Bottom", "Left" ],-- curCSS,-- getComputedStyle,- currentStyle;--jQuery.fn.css = function( name, value ) {- return jQuery.access( this, function( elem, name, value ) {- return value !== undefined ?- jQuery.style( elem, name, value ) :- jQuery.css( elem, name );- }, name, value, arguments.length > 1 );-};--jQuery.extend({- // Add in style property hooks for overriding the default- // behavior of getting and setting a style property- cssHooks: {- opacity: {- get: function( elem, computed ) {- if ( computed ) {- // We should always get a number back from opacity- var ret = curCSS( elem, "opacity" );- return ret === "" ? "1" : ret;-- } else {- return elem.style.opacity;- }- }- }- },-- // Exclude the following css properties to add px- cssNumber: {- "fillOpacity": true,- "fontWeight": true,- "lineHeight": true,- "opacity": true,- "orphans": true,- "widows": true,- "zIndex": true,- "zoom": true- },-- // Add in properties whose names you wish to fix before- // setting or getting the value- cssProps: {- // normalize float css property- "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"- },-- // Get and set the style property on a DOM Node- style: function( elem, name, value, extra ) {- // Don't set styles on text and comment nodes- if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {- return;- }-- // Make sure that we're working with the right name- var ret, type, origName = jQuery.camelCase( name ),- style = elem.style, hooks = jQuery.cssHooks[ origName ];-- name = jQuery.cssProps[ origName ] || origName;-- // Check if we're setting a value- if ( value !== undefined ) {- type = typeof value;-- // convert relative number strings (+= or -=) to relative numbers. #7345- if ( type === "string" && (ret = rrelNum.exec( value )) ) {- value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );- // Fixes bug #9237- type = "number";- }-- // Make sure that NaN and null values aren't set. See: #7116- if ( value == null || type === "number" && isNaN( value ) ) {- return;- }-- // If a number was passed in, add 'px' to the (except for certain CSS properties)- if ( type === "number" && !jQuery.cssNumber[ origName ] ) {- value += "px";- }-- // If a hook was provided, use that value, otherwise just set the specified value- if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {- // Wrapped to prevent IE from throwing errors when 'invalid' values are provided- // Fixes bug #5509- try {- style[ name ] = value;- } catch(e) {}- }-- } else {- // If a hook was provided get the non-computed value from there- if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {- return ret;- }-- // Otherwise just get the value from the style object- return style[ name ];- }- },-- css: function( elem, name, extra ) {- var ret, hooks;-- // Make sure that we're working with the right name- name = jQuery.camelCase( name );- hooks = jQuery.cssHooks[ name ];- name = jQuery.cssProps[ name ] || name;-- // cssFloat needs a special treatment- if ( name === "cssFloat" ) {- name = "float";- }-- // If a hook was provided get the computed value from there- if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {- return ret;-- // Otherwise, if a way to get the computed value exists, use that- } else if ( curCSS ) {- return curCSS( elem, name );- }- },-- // A method for quickly swapping in/out CSS properties to get correct calculations- swap: function( elem, options, callback ) {- var old = {},- ret, name;-- // Remember the old values, and insert the new ones- for ( name in options ) {- old[ name ] = elem.style[ name ];- elem.style[ name ] = options[ name ];- }-- ret = callback.call( elem );-- // Revert the old values- for ( name in options ) {- elem.style[ name ] = old[ name ];- }-- return ret;- }-});--// DEPRECATED in 1.3, Use jQuery.css() instead-jQuery.curCSS = jQuery.css;--if ( document.defaultView && document.defaultView.getComputedStyle ) {- getComputedStyle = function( elem, name ) {- var ret, defaultView, computedStyle, width,- style = elem.style;-- name = name.replace( rupper, "-$1" ).toLowerCase();-- if ( (defaultView = elem.ownerDocument.defaultView) &&- (computedStyle = defaultView.getComputedStyle( elem, null )) ) {-- ret = computedStyle.getPropertyValue( name );- if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {- ret = jQuery.style( elem, name );- }- }-- // A tribute to the "awesome hack by Dean Edwards"- // WebKit uses "computed value (percentage if specified)" instead of "used value" for margins- // which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values- if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {- width = style.width;- style.width = ret;- ret = computedStyle.width;- style.width = width;- }-- return ret;- };-}--if ( document.documentElement.currentStyle ) {- currentStyle = function( elem, name ) {- var left, rsLeft, uncomputed,- ret = elem.currentStyle && elem.currentStyle[ name ],- style = elem.style;-- // Avoid setting ret to empty string here- // so we don't default to auto- if ( ret == null && style && (uncomputed = style[ name ]) ) {- ret = uncomputed;- }-- // From the awesome hack by Dean Edwards- // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291-- // If we're not dealing with a regular pixel number- // but a number that has a weird ending, we need to convert it to pixels- if ( rnumnonpx.test( ret ) ) {-- // Remember the original values- left = style.left;- rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;-- // Put in the new values to get a computed value out- if ( rsLeft ) {- elem.runtimeStyle.left = elem.currentStyle.left;- }- style.left = name === "fontSize" ? "1em" : ret;- ret = style.pixelLeft + "px";-- // Revert the changed values- style.left = left;- if ( rsLeft ) {- elem.runtimeStyle.left = rsLeft;- }- }-- return ret === "" ? "auto" : ret;- };-}--curCSS = getComputedStyle || currentStyle;--function getWidthOrHeight( elem, name, extra ) {-- // Start with offset property- var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,- i = name === "width" ? 1 : 0,- len = 4;-- if ( val > 0 ) {- if ( extra !== "border" ) {- for ( ; i < len; i += 2 ) {- if ( !extra ) {- val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;- }- if ( extra === "margin" ) {- val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;- } else {- val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;- }- }- }-- return val + "px";- }-- // Fall back to computed then uncomputed css if necessary- val = curCSS( elem, name );- if ( val < 0 || val == null ) {- val = elem.style[ name ];- }-- // Computed unit is not pixels. Stop here and return.- if ( rnumnonpx.test(val) ) {- return val;- }-- // Normalize "", auto, and prepare for extra- val = parseFloat( val ) || 0;-- // Add padding, border, margin- if ( extra ) {- for ( ; i < len; i += 2 ) {- val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;- if ( extra !== "padding" ) {- val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;- }- if ( extra === "margin" ) {- val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;- }- }- }-- return val + "px";-}--jQuery.each([ "height", "width" ], function( i, name ) {- jQuery.cssHooks[ name ] = {- get: function( elem, computed, extra ) {- if ( computed ) {- if ( elem.offsetWidth !== 0 ) {- return getWidthOrHeight( elem, name, extra );- } else {- return jQuery.swap( elem, cssShow, function() {- return getWidthOrHeight( elem, name, extra );- });- }- }- },-- set: function( elem, value ) {- return rnum.test( value ) ?- value + "px" :- value;- }- };-});--if ( !jQuery.support.opacity ) {- jQuery.cssHooks.opacity = {- get: function( elem, computed ) {- // IE uses filters for opacity- return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?- ( parseFloat( RegExp.$1 ) / 100 ) + "" :- computed ? "1" : "";- },-- set: function( elem, value ) {- var style = elem.style,- currentStyle = elem.currentStyle,- opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",- filter = currentStyle && currentStyle.filter || style.filter || "";-- // IE has trouble with opacity if it does not have layout- // Force it by setting the zoom level- style.zoom = 1;-- // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652- if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {-- // Setting style.filter to null, "" & " " still leave "filter:" in the cssText- // if "filter:" is present at all, clearType is disabled, we want to avoid this- // style.removeAttribute is IE Only, but so apparently is this code path...- style.removeAttribute( "filter" );-- // if there there is no filter style applied in a css rule, we are done- if ( currentStyle && !currentStyle.filter ) {- return;- }- }-- // otherwise, set new filter values- style.filter = ralpha.test( filter ) ?- filter.replace( ralpha, opacity ) :- filter + " " + opacity;- }- };-}--jQuery(function() {- // This hook cannot be added until DOM ready because the support test- // for it is not run until after DOM ready- if ( !jQuery.support.reliableMarginRight ) {- jQuery.cssHooks.marginRight = {- get: function( elem, computed ) {- // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right- // Work around by temporarily setting element display to inline-block- return jQuery.swap( elem, { "display": "inline-block" }, function() {- if ( computed ) {- return curCSS( elem, "margin-right" );- } else {- return elem.style.marginRight;- }- });- }- };- }-});--if ( jQuery.expr && jQuery.expr.filters ) {- jQuery.expr.filters.hidden = function( elem ) {- var width = elem.offsetWidth,- height = elem.offsetHeight;-- return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");- };-- jQuery.expr.filters.visible = function( elem ) {- return !jQuery.expr.filters.hidden( elem );- };-}--// These hooks are used by animate to expand properties-jQuery.each({- margin: "",- padding: "",- border: "Width"-}, function( prefix, suffix ) {-- jQuery.cssHooks[ prefix + suffix ] = {- expand: function( value ) {- var i,-- // assumes a single number if not a string- parts = typeof value === "string" ? value.split(" ") : [ value ],- expanded = {};-- for ( i = 0; i < 4; i++ ) {- expanded[ prefix + cssExpand[ i ] + suffix ] =- parts[ i ] || parts[ i - 2 ] || parts[ 0 ];- }-- return expanded;- }- };-});-----var r20 = /%20/g,- rbracket = /\[\]$/,- rCRLF = /\r?\n/g,- rhash = /#.*$/,- rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL- rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,- // #7653, #8125, #8152: local protocol detection- rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,- rnoContent = /^(?:GET|HEAD)$/,- rprotocol = /^\/\//,- rquery = /\?/,- rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,- rselectTextarea = /^(?:select|textarea)/i,- rspacesAjax = /\s+/,- rts = /([?&])_=[^&]*/,- rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,-- // Keep a copy of the old load method- _load = jQuery.fn.load,-- /* Prefilters- * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)- * 2) These are called:- * - BEFORE asking for a transport- * - AFTER param serialization (s.data is a string if s.processData is true)- * 3) key is the dataType- * 4) the catchall symbol "*" can be used- * 5) execution will start with transport dataType and THEN continue down to "*" if needed- */- prefilters = {},-- /* Transports bindings- * 1) key is the dataType- * 2) the catchall symbol "*" can be used- * 3) selection will start with transport dataType and THEN go to "*" if needed- */- transports = {},-- // Document location- ajaxLocation,-- // Document location segments- ajaxLocParts,-- // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression- allTypes = ["*/"] + ["*"];--// #8138, IE may throw an exception when accessing-// a field from window.location if document.domain has been set-try {- ajaxLocation = location.href;-} catch( e ) {- // Use the href attribute of an A element- // since IE will modify it given document.location- ajaxLocation = document.createElement( "a" );- ajaxLocation.href = "";- ajaxLocation = ajaxLocation.href;-}--// Segment location into parts-ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];--// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport-function addToPrefiltersOrTransports( structure ) {-- // dataTypeExpression is optional and defaults to "*"- return function( dataTypeExpression, func ) {-- if ( typeof dataTypeExpression !== "string" ) {- func = dataTypeExpression;- dataTypeExpression = "*";- }-- if ( jQuery.isFunction( func ) ) {- var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),- i = 0,- length = dataTypes.length,- dataType,- list,- placeBefore;-- // For each dataType in the dataTypeExpression- for ( ; i < length; i++ ) {- dataType = dataTypes[ i ];- // We control if we're asked to add before- // any existing element- placeBefore = /^\+/.test( dataType );- if ( placeBefore ) {- dataType = dataType.substr( 1 ) || "*";- }- list = structure[ dataType ] = structure[ dataType ] || [];- // then we add to the structure accordingly- list[ placeBefore ? "unshift" : "push" ]( func );- }- }- };-}--// Base inspection function for prefilters and transports-function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,- dataType /* internal */, inspected /* internal */ ) {-- dataType = dataType || options.dataTypes[ 0 ];- inspected = inspected || {};-- inspected[ dataType ] = true;-- var list = structure[ dataType ],- i = 0,- length = list ? list.length : 0,- executeOnly = ( structure === prefilters ),- selection;-- for ( ; i < length && ( executeOnly || !selection ); i++ ) {- selection = list[ i ]( options, originalOptions, jqXHR );- // If we got redirected to another dataType- // we try there if executing only and not done already- if ( typeof selection === "string" ) {- if ( !executeOnly || inspected[ selection ] ) {- selection = undefined;- } else {- options.dataTypes.unshift( selection );- selection = inspectPrefiltersOrTransports(- structure, options, originalOptions, jqXHR, selection, inspected );- }- }- }- // If we're only executing or nothing was selected- // we try the catchall dataType if not done already- if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {- selection = inspectPrefiltersOrTransports(- structure, options, originalOptions, jqXHR, "*", inspected );- }- // unnecessary when only executing (prefilters)- // but it'll be ignored by the caller in that case- return selection;-}--// A special extend for ajax options-// that takes "flat" options (not to be deep extended)-// Fixes #9887-function ajaxExtend( target, src ) {- var key, deep,- flatOptions = jQuery.ajaxSettings.flatOptions || {};- for ( key in src ) {- if ( src[ key ] !== undefined ) {- ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];- }- }- if ( deep ) {- jQuery.extend( true, target, deep );- }-}--jQuery.fn.extend({- load: function( url, params, callback ) {- if ( typeof url !== "string" && _load ) {- return _load.apply( this, arguments );-- // Don't do a request if no elements are being requested- } else if ( !this.length ) {- return this;- }-- var off = url.indexOf( " " );- if ( off >= 0 ) {- var selector = url.slice( off, url.length );- url = url.slice( 0, off );- }-- // Default to a GET request- var type = "GET";-- // If the second parameter was provided- if ( params ) {- // If it's a function- if ( jQuery.isFunction( params ) ) {- // We assume that it's the callback- callback = params;- params = undefined;-- // Otherwise, build a param string- } else if ( typeof params === "object" ) {- params = jQuery.param( params, jQuery.ajaxSettings.traditional );- type = "POST";- }- }-- var self = this;-- // Request the remote document- jQuery.ajax({- url: url,- type: type,- dataType: "html",- data: params,- // Complete callback (responseText is used internally)- complete: function( jqXHR, status, responseText ) {- // Store the response as specified by the jqXHR object- responseText = jqXHR.responseText;- // If successful, inject the HTML into all the matched elements- if ( jqXHR.isResolved() ) {- // #4825: Get the actual response in case- // a dataFilter is present in ajaxSettings- jqXHR.done(function( r ) {- responseText = r;- });- // See if a selector was specified- self.html( selector ?- // Create a dummy div to hold the results- jQuery("<div>")- // inject the contents of the document in, removing the scripts- // to avoid any 'Permission Denied' errors in IE- .append(responseText.replace(rscript, ""))-- // Locate the specified elements- .find(selector) :-- // If not, just inject the full result- responseText );- }-- if ( callback ) {- self.each( callback, [ responseText, status, jqXHR ] );- }- }- });-- return this;- },-- serialize: function() {- return jQuery.param( this.serializeArray() );- },-- serializeArray: function() {- return this.map(function(){- return this.elements ? jQuery.makeArray( this.elements ) : this;- })- .filter(function(){- return this.name && !this.disabled &&- ( this.checked || rselectTextarea.test( this.nodeName ) ||- rinput.test( this.type ) );- })- .map(function( i, elem ){- var val = jQuery( this ).val();-- return val == null ?- null :- jQuery.isArray( val ) ?- jQuery.map( val, function( val, i ){- return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };- }) :- { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };- }).get();- }-});--// Attach a bunch of functions for handling common AJAX events-jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){- jQuery.fn[ o ] = function( f ){- return this.on( o, f );- };-});--jQuery.each( [ "get", "post" ], function( i, method ) {- jQuery[ method ] = function( url, data, callback, type ) {- // shift arguments if data argument was omitted- if ( jQuery.isFunction( data ) ) {- type = type || callback;- callback = data;- data = undefined;- }-- return jQuery.ajax({- type: method,- url: url,- data: data,- success: callback,- dataType: type- });- };-});--jQuery.extend({-- getScript: function( url, callback ) {- return jQuery.get( url, undefined, callback, "script" );- },-- getJSON: function( url, data, callback ) {- return jQuery.get( url, data, callback, "json" );- },-- // Creates a full fledged settings object into target- // with both ajaxSettings and settings fields.- // If target is omitted, writes into ajaxSettings.- ajaxSetup: function( target, settings ) {- if ( settings ) {- // Building a settings object- ajaxExtend( target, jQuery.ajaxSettings );- } else {- // Extending ajaxSettings- settings = target;- target = jQuery.ajaxSettings;- }- ajaxExtend( target, settings );- return target;- },-- ajaxSettings: {- url: ajaxLocation,- isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),- global: true,- type: "GET",- contentType: "application/x-www-form-urlencoded; charset=UTF-8",- processData: true,- async: true,- /*- timeout: 0,- data: null,- dataType: null,- username: null,- password: null,- cache: null,- traditional: false,- headers: {},- */-- accepts: {- xml: "application/xml, text/xml",- html: "text/html",- text: "text/plain",- json: "application/json, text/javascript",- "*": allTypes- },-- contents: {- xml: /xml/,- html: /html/,- json: /json/- },-- responseFields: {- xml: "responseXML",- text: "responseText"- },-- // List of data converters- // 1) key format is "source_type destination_type" (a single space in-between)- // 2) the catchall symbol "*" can be used for source_type- converters: {-- // Convert anything to text- "* text": window.String,-- // Text to html (true = no transformation)- "text html": true,-- // Evaluate text as a json expression- "text json": jQuery.parseJSON,-- // Parse text as xml- "text xml": jQuery.parseXML- },-- // For options that shouldn't be deep extended:- // you can add your own custom options here if- // and when you create one that shouldn't be- // deep extended (see ajaxExtend)- flatOptions: {- context: true,- url: true- }- },-- ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),- ajaxTransport: addToPrefiltersOrTransports( transports ),-- // Main method- ajax: function( url, options ) {-- // If url is an object, simulate pre-1.5 signature- if ( typeof url === "object" ) {- options = url;- url = undefined;- }-- // Force options to be an object- options = options || {};-- var // Create the final options object- s = jQuery.ajaxSetup( {}, options ),- // Callbacks context- callbackContext = s.context || s,- // Context for global events- // It's the callbackContext if one was provided in the options- // and if it's a DOM node or a jQuery collection- globalEventContext = callbackContext !== s &&- ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?- jQuery( callbackContext ) : jQuery.event,- // Deferreds- deferred = jQuery.Deferred(),- completeDeferred = jQuery.Callbacks( "once memory" ),- // Status-dependent callbacks- statusCode = s.statusCode || {},- // ifModified key- ifModifiedKey,- // Headers (they are sent all at once)- requestHeaders = {},- requestHeadersNames = {},- // Response headers- responseHeadersString,- responseHeaders,- // transport- transport,- // timeout handle- timeoutTimer,- // Cross-domain detection vars- parts,- // The jqXHR state- state = 0,- // To know if global events are to be dispatched- fireGlobals,- // Loop variable- i,- // Fake xhr- jqXHR = {-- readyState: 0,-- // Caches the header- setRequestHeader: function( name, value ) {- if ( !state ) {- var lname = name.toLowerCase();- name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;- requestHeaders[ name ] = value;- }- return this;- },-- // Raw string- getAllResponseHeaders: function() {- return state === 2 ? responseHeadersString : null;- },-- // Builds headers hashtable if needed- getResponseHeader: function( key ) {- var match;- if ( state === 2 ) {- if ( !responseHeaders ) {- responseHeaders = {};- while( ( match = rheaders.exec( responseHeadersString ) ) ) {- responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];- }- }- match = responseHeaders[ key.toLowerCase() ];- }- return match === undefined ? null : match;- },-- // Overrides response content-type header- overrideMimeType: function( type ) {- if ( !state ) {- s.mimeType = type;- }- return this;- },-- // Cancel the request- abort: function( statusText ) {- statusText = statusText || "abort";- if ( transport ) {- transport.abort( statusText );- }- done( 0, statusText );- return this;- }- };-- // Callback for when everything is done- // It is defined here because jslint complains if it is declared- // at the end of the function (which would be more logical and readable)- function done( status, nativeStatusText, responses, headers ) {-- // Called once- if ( state === 2 ) {- return;- }-- // State is "done" now- state = 2;-- // Clear timeout if it exists- if ( timeoutTimer ) {- clearTimeout( timeoutTimer );- }-- // Dereference transport for early garbage collection- // (no matter how long the jqXHR object will be used)- transport = undefined;-- // Cache response headers- responseHeadersString = headers || "";-- // Set readyState- jqXHR.readyState = status > 0 ? 4 : 0;-- var isSuccess,- success,- error,- statusText = nativeStatusText,- response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,- lastModified,- etag;-- // If successful, handle type chaining- if ( status >= 200 && status < 300 || status === 304 ) {-- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.- if ( s.ifModified ) {-- if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {- jQuery.lastModified[ ifModifiedKey ] = lastModified;- }- if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {- jQuery.etag[ ifModifiedKey ] = etag;- }- }-- // If not modified- if ( status === 304 ) {-- statusText = "notmodified";- isSuccess = true;-- // If we have data- } else {-- try {- success = ajaxConvert( s, response );- statusText = "success";- isSuccess = true;- } catch(e) {- // We have a parsererror- statusText = "parsererror";- error = e;- }- }- } else {- // We extract error from statusText- // then normalize statusText and status for non-aborts- error = statusText;- if ( !statusText || status ) {- statusText = "error";- if ( status < 0 ) {- status = 0;- }- }- }-- // Set data for the fake xhr object- jqXHR.status = status;- jqXHR.statusText = "" + ( nativeStatusText || statusText );-- // Success/Error- if ( isSuccess ) {- deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );- } else {- deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );- }-- // Status-dependent callbacks- jqXHR.statusCode( statusCode );- statusCode = undefined;-- if ( fireGlobals ) {- globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),- [ jqXHR, s, isSuccess ? success : error ] );- }-- // Complete- completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );-- if ( fireGlobals ) {- globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );- // Handle the global AJAX counter- if ( !( --jQuery.active ) ) {- jQuery.event.trigger( "ajaxStop" );- }- }- }-- // Attach deferreds- deferred.promise( jqXHR );- jqXHR.success = jqXHR.done;- jqXHR.error = jqXHR.fail;- jqXHR.complete = completeDeferred.add;-- // Status-dependent callbacks- jqXHR.statusCode = function( map ) {- if ( map ) {- var tmp;- if ( state < 2 ) {- for ( tmp in map ) {- statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];- }- } else {- tmp = map[ jqXHR.status ];- jqXHR.then( tmp, tmp );- }- }- return this;- };-- // Remove hash character (#7531: and string promotion)- // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)- // We also use the url parameter if available- s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );-- // Extract dataTypes list- s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );-- // Determine if a cross-domain request is in order- if ( s.crossDomain == null ) {- parts = rurl.exec( s.url.toLowerCase() );- s.crossDomain = !!( parts &&- ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||- ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=- ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )- );- }-- // Convert data if not already a string- if ( s.data && s.processData && typeof s.data !== "string" ) {- s.data = jQuery.param( s.data, s.traditional );- }-- // Apply prefilters- inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );-- // If request was aborted inside a prefilter, stop there- if ( state === 2 ) {- return false;- }-- // We can fire global events as of now if asked to- fireGlobals = s.global;-- // Uppercase the type- s.type = s.type.toUpperCase();-- // Determine if request has content- s.hasContent = !rnoContent.test( s.type );-- // Watch for a new set of requests- if ( fireGlobals && jQuery.active++ === 0 ) {- jQuery.event.trigger( "ajaxStart" );- }-- // More options handling for requests with no content- if ( !s.hasContent ) {-- // If data is available, append data to url- if ( s.data ) {- s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;- // #9682: remove data so that it's not used in an eventual retry- delete s.data;- }-- // Get ifModifiedKey before adding the anti-cache parameter- ifModifiedKey = s.url;-- // Add anti-cache in url if needed- if ( s.cache === false ) {-- var ts = jQuery.now(),- // try replacing _= if it is there- ret = s.url.replace( rts, "$1_=" + ts );-- // if nothing was replaced, add timestamp to the end- s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );- }- }-- // Set the correct header, if data is being sent- if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {- jqXHR.setRequestHeader( "Content-Type", s.contentType );- }-- // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.- if ( s.ifModified ) {- ifModifiedKey = ifModifiedKey || s.url;- if ( jQuery.lastModified[ ifModifiedKey ] ) {- jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );- }- if ( jQuery.etag[ ifModifiedKey ] ) {- jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );- }- }-- // Set the Accepts header for the server, depending on the dataType- jqXHR.setRequestHeader(- "Accept",- s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?- s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :- s.accepts[ "*" ]- );-- // Check for headers option- for ( i in s.headers ) {- jqXHR.setRequestHeader( i, s.headers[ i ] );- }-- // Allow custom headers/mimetypes and early abort- if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {- // Abort if not done already- jqXHR.abort();- return false;-- }-- // Install callbacks on deferreds- for ( i in { success: 1, error: 1, complete: 1 } ) {- jqXHR[ i ]( s[ i ] );- }-- // Get transport- transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );-- // If no transport, we auto-abort- if ( !transport ) {- done( -1, "No Transport" );- } else {- jqXHR.readyState = 1;- // Send global event- if ( fireGlobals ) {- globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );- }- // Timeout- if ( s.async && s.timeout > 0 ) {- timeoutTimer = setTimeout( function(){- jqXHR.abort( "timeout" );- }, s.timeout );- }-- try {- state = 1;- transport.send( requestHeaders, done );- } catch (e) {- // Propagate exception as error if not done- if ( state < 2 ) {- done( -1, e );- // Simply rethrow otherwise- } else {- throw e;- }- }- }-- return jqXHR;- },-- // Serialize an array of form elements or a set of- // key/values into a query string- param: function( a, traditional ) {- var s = [],- add = function( key, value ) {- // If value is a function, invoke it and return its value- value = jQuery.isFunction( value ) ? value() : value;- s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );- };-- // Set traditional to true for jQuery <= 1.3.2 behavior.- if ( traditional === undefined ) {- traditional = jQuery.ajaxSettings.traditional;- }-- // If an array was passed in, assume that it is an array of form elements.- if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {- // Serialize the form elements- jQuery.each( a, function() {- add( this.name, this.value );- });-- } else {- // If traditional, encode the "old" way (the way 1.3.2 or older- // did it), otherwise encode params recursively.- for ( var prefix in a ) {- buildParams( prefix, a[ prefix ], traditional, add );- }- }-- // Return the resulting serialization- return s.join( "&" ).replace( r20, "+" );- }-});--function buildParams( prefix, obj, traditional, add ) {- if ( jQuery.isArray( obj ) ) {- // Serialize array item.- jQuery.each( obj, function( i, v ) {- if ( traditional || rbracket.test( prefix ) ) {- // Treat each array item as a scalar.- add( prefix, v );-- } else {- // If array item is non-scalar (array or object), encode its- // numeric index to resolve deserialization ambiguity issues.- // Note that rack (as of 1.0.0) can't currently deserialize- // nested arrays properly, and attempting to do so may cause- // a server error. Possible fixes are to modify rack's- // deserialization algorithm or to provide an option or flag- // to force array serialization to be shallow.- buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );- }- });-- } else if ( !traditional && jQuery.type( obj ) === "object" ) {- // Serialize object item.- for ( var name in obj ) {- buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );- }-- } else {- // Serialize scalar item.- add( prefix, obj );- }-}--// This is still on the jQuery object... for now-// Want to move this to jQuery.ajax some day-jQuery.extend({-- // Counter for holding the number of active queries- active: 0,-- // Last-Modified header cache for next request- lastModified: {},- etag: {}--});--/* Handles responses to an ajax request:- * - sets all responseXXX fields accordingly- * - finds the right dataType (mediates between content-type and expected dataType)- * - returns the corresponding response- */-function ajaxHandleResponses( s, jqXHR, responses ) {-- var contents = s.contents,- dataTypes = s.dataTypes,- responseFields = s.responseFields,- ct,- type,- finalDataType,- firstDataType;-- // Fill responseXXX fields- for ( type in responseFields ) {- if ( type in responses ) {- jqXHR[ responseFields[type] ] = responses[ type ];- }- }-- // Remove auto dataType and get content-type in the process- while( dataTypes[ 0 ] === "*" ) {- dataTypes.shift();- if ( ct === undefined ) {- ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );- }- }-- // Check if we're dealing with a known content-type- if ( ct ) {- for ( type in contents ) {- if ( contents[ type ] && contents[ type ].test( ct ) ) {- dataTypes.unshift( type );- break;- }- }- }-- // Check to see if we have a response for the expected dataType- if ( dataTypes[ 0 ] in responses ) {- finalDataType = dataTypes[ 0 ];- } else {- // Try convertible dataTypes- for ( type in responses ) {- if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {- finalDataType = type;- break;- }- if ( !firstDataType ) {- firstDataType = type;- }- }- // Or just use first one- finalDataType = finalDataType || firstDataType;- }-- // If we found a dataType- // We add the dataType to the list if needed- // and return the corresponding response- if ( finalDataType ) {- if ( finalDataType !== dataTypes[ 0 ] ) {- dataTypes.unshift( finalDataType );- }- return responses[ finalDataType ];- }-}--// Chain conversions given the request and the original response-function ajaxConvert( s, response ) {-- // Apply the dataFilter if provided- if ( s.dataFilter ) {- response = s.dataFilter( response, s.dataType );- }-- var dataTypes = s.dataTypes,- converters = {},- i,- key,- length = dataTypes.length,- tmp,- // Current and previous dataTypes- current = dataTypes[ 0 ],- prev,- // Conversion expression- conversion,- // Conversion function- conv,- // Conversion functions (transitive conversion)- conv1,- conv2;-- // For each dataType in the chain- for ( i = 1; i < length; i++ ) {-- // Create converters map- // with lowercased keys- if ( i === 1 ) {- for ( key in s.converters ) {- if ( typeof key === "string" ) {- converters[ key.toLowerCase() ] = s.converters[ key ];- }- }- }-- // Get the dataTypes- prev = current;- current = dataTypes[ i ];-- // If current is auto dataType, update it to prev- if ( current === "*" ) {- current = prev;- // If no auto and dataTypes are actually different- } else if ( prev !== "*" && prev !== current ) {-- // Get the converter- conversion = prev + " " + current;- conv = converters[ conversion ] || converters[ "* " + current ];-- // If there is no direct converter, search transitively- if ( !conv ) {- conv2 = undefined;- for ( conv1 in converters ) {- tmp = conv1.split( " " );- if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {- conv2 = converters[ tmp[1] + " " + current ];- if ( conv2 ) {- conv1 = converters[ conv1 ];- if ( conv1 === true ) {- conv = conv2;- } else if ( conv2 === true ) {- conv = conv1;- }- break;- }- }- }- }- // If we found no converter, dispatch an error- if ( !( conv || conv2 ) ) {- jQuery.error( "No conversion from " + conversion.replace(" "," to ") );- }- // If found converter is not an equivalence- if ( conv !== true ) {- // Convert with 1 or 2 converters accordingly- response = conv ? conv( response ) : conv2( conv1(response) );- }- }- }- return response;-}-----var jsc = jQuery.now(),- jsre = /(\=)\?(&|$)|\?\?/i;--// Default jsonp settings-jQuery.ajaxSetup({- jsonp: "callback",- jsonpCallback: function() {- return jQuery.expando + "_" + ( jsc++ );- }-});--// Detect, normalize options and install callbacks for jsonp requests-jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {-- var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );-- if ( s.dataTypes[ 0 ] === "jsonp" ||- s.jsonp !== false && ( jsre.test( s.url ) ||- inspectData && jsre.test( s.data ) ) ) {-- var responseContainer,- jsonpCallback = s.jsonpCallback =- jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,- previous = window[ jsonpCallback ],- url = s.url,- data = s.data,- replace = "$1" + jsonpCallback + "$2";-- if ( s.jsonp !== false ) {- url = url.replace( jsre, replace );- if ( s.url === url ) {- if ( inspectData ) {- data = data.replace( jsre, replace );- }- if ( s.data === data ) {- // Add callback manually- url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;- }- }- }-- s.url = url;- s.data = data;-- // Install callback- window[ jsonpCallback ] = function( response ) {- responseContainer = [ response ];- };-- // Clean-up function- jqXHR.always(function() {- // Set callback back to previous value- window[ jsonpCallback ] = previous;- // Call if it was a function and we have a response- if ( responseContainer && jQuery.isFunction( previous ) ) {- window[ jsonpCallback ]( responseContainer[ 0 ] );- }- });-- // Use data converter to retrieve json after script execution- s.converters["script json"] = function() {- if ( !responseContainer ) {- jQuery.error( jsonpCallback + " was not called" );- }- return responseContainer[ 0 ];- };-- // force json dataType- s.dataTypes[ 0 ] = "json";-- // Delegate to script- return "script";- }-});-----// Install script dataType-jQuery.ajaxSetup({- accepts: {- script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"- },- contents: {- script: /javascript|ecmascript/- },- converters: {- "text script": function( text ) {- jQuery.globalEval( text );- return text;- }- }-});--// Handle cache's special case and global-jQuery.ajaxPrefilter( "script", function( s ) {- if ( s.cache === undefined ) {- s.cache = false;- }- if ( s.crossDomain ) {- s.type = "GET";- s.global = false;- }-});--// Bind script tag hack transport-jQuery.ajaxTransport( "script", function(s) {-- // This transport only deals with cross domain requests- if ( s.crossDomain ) {-- var script,- head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;-- return {-- send: function( _, callback ) {-- script = document.createElement( "script" );-- script.async = "async";-- if ( s.scriptCharset ) {- script.charset = s.scriptCharset;- }-- script.src = s.url;-- // Attach handlers for all browsers- script.onload = script.onreadystatechange = function( _, isAbort ) {-- if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {-- // Handle memory leak in IE- script.onload = script.onreadystatechange = null;-- // Remove the script- if ( head && script.parentNode ) {- head.removeChild( script );- }-- // Dereference the script- script = undefined;-- // Callback if not abort- if ( !isAbort ) {- callback( 200, "success" );- }- }- };- // Use insertBefore instead of appendChild to circumvent an IE6 bug.- // This arises when a base node is used (#2709 and #4378).- head.insertBefore( script, head.firstChild );- },-- abort: function() {- if ( script ) {- script.onload( 0, 1 );- }- }- };- }-});-----var // #5280: Internet Explorer will keep connections alive if we don't abort on unload- xhrOnUnloadAbort = window.ActiveXObject ? function() {- // Abort all pending requests- for ( var key in xhrCallbacks ) {- xhrCallbacks[ key ]( 0, 1 );- }- } : false,- xhrId = 0,- xhrCallbacks;--// Functions to create xhrs-function createStandardXHR() {- try {- return new window.XMLHttpRequest();- } catch( e ) {}-}--function createActiveXHR() {- try {- return new window.ActiveXObject( "Microsoft.XMLHTTP" );- } catch( e ) {}-}--// Create the request object-// (This is still attached to ajaxSettings for backward compatibility)-jQuery.ajaxSettings.xhr = window.ActiveXObject ?- /* Microsoft failed to properly- * implement the XMLHttpRequest in IE7 (can't request local files),- * so we use the ActiveXObject when it is available- * Additionally XMLHttpRequest can be disabled in IE7/IE8 so- * we need a fallback.- */- function() {- return !this.isLocal && createStandardXHR() || createActiveXHR();- } :- // For all other browsers, use the standard XMLHttpRequest object- createStandardXHR;--// Determine support properties-(function( xhr ) {- jQuery.extend( jQuery.support, {- ajax: !!xhr,- cors: !!xhr && ( "withCredentials" in xhr )- });-})( jQuery.ajaxSettings.xhr() );--// Create transport if the browser can provide an xhr-if ( jQuery.support.ajax ) {-- jQuery.ajaxTransport(function( s ) {- // Cross domain only allowed if supported through XMLHttpRequest- if ( !s.crossDomain || jQuery.support.cors ) {-- var callback;-- return {- send: function( headers, complete ) {-- // Get a new xhr- var xhr = s.xhr(),- handle,- i;-- // Open the socket- // Passing null username, generates a login popup on Opera (#2865)- if ( s.username ) {- xhr.open( s.type, s.url, s.async, s.username, s.password );- } else {- xhr.open( s.type, s.url, s.async );- }-- // Apply custom fields if provided- if ( s.xhrFields ) {- for ( i in s.xhrFields ) {- xhr[ i ] = s.xhrFields[ i ];- }- }-- // Override mime type if needed- if ( s.mimeType && xhr.overrideMimeType ) {- xhr.overrideMimeType( s.mimeType );- }-- // X-Requested-With header- // For cross-domain requests, seeing as conditions for a preflight are- // akin to a jigsaw puzzle, we simply never set it to be sure.- // (it can always be set on a per-request basis or even using ajaxSetup)- // For same-domain requests, won't change header if already provided.- if ( !s.crossDomain && !headers["X-Requested-With"] ) {- headers[ "X-Requested-With" ] = "XMLHttpRequest";- }-- // Need an extra try/catch for cross domain requests in Firefox 3- try {- for ( i in headers ) {- xhr.setRequestHeader( i, headers[ i ] );- }- } catch( _ ) {}-- // Do send the request- // This may raise an exception which is actually- // handled in jQuery.ajax (so no try/catch here)- xhr.send( ( s.hasContent && s.data ) || null );-- // Listener- callback = function( _, isAbort ) {-- var status,- statusText,- responseHeaders,- responses,- xml;-- // Firefox throws exceptions when accessing properties- // of an xhr when a network error occured- // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)- try {-- // Was never called and is aborted or complete- if ( callback && ( isAbort || xhr.readyState === 4 ) ) {-- // Only called once- callback = undefined;-- // Do not keep as active anymore- if ( handle ) {- xhr.onreadystatechange = jQuery.noop;- if ( xhrOnUnloadAbort ) {- delete xhrCallbacks[ handle ];- }- }-- // If it's an abort- if ( isAbort ) {- // Abort it manually if needed- if ( xhr.readyState !== 4 ) {- xhr.abort();- }- } else {- status = xhr.status;- responseHeaders = xhr.getAllResponseHeaders();- responses = {};- xml = xhr.responseXML;-- // Construct response list- if ( xml && xml.documentElement /* #4958 */ ) {- responses.xml = xml;- }-- // When requesting binary data, IE6-9 will throw an exception- // on any attempt to access responseText (#11426)- try {- responses.text = xhr.responseText;- } catch( _ ) {- }-- // Firefox throws an exception when accessing- // statusText for faulty cross-domain requests- try {- statusText = xhr.statusText;- } catch( e ) {- // We normalize with Webkit giving an empty statusText- statusText = "";- }-- // Filter status for non standard behaviors-- // If the request is local and we have data: assume a success- // (success with no data won't get notified, that's the best we- // can do given current implementations)- if ( !status && s.isLocal && !s.crossDomain ) {- status = responses.text ? 200 : 404;- // IE - #1450: sometimes returns 1223 when it should be 204- } else if ( status === 1223 ) {- status = 204;- }- }- }- } catch( firefoxAccessException ) {- if ( !isAbort ) {- complete( -1, firefoxAccessException );- }- }-- // Call complete if needed- if ( responses ) {- complete( status, statusText, responses, responseHeaders );- }- };-- // if we're in sync mode or it's in cache- // and has been retrieved directly (IE6 & IE7)- // we need to manually fire the callback- if ( !s.async || xhr.readyState === 4 ) {- callback();- } else {- handle = ++xhrId;- if ( xhrOnUnloadAbort ) {- // Create the active xhrs callbacks list if needed- // and attach the unload handler- if ( !xhrCallbacks ) {- xhrCallbacks = {};- jQuery( window ).unload( xhrOnUnloadAbort );- }- // Add to list of active xhrs callbacks- xhrCallbacks[ handle ] = callback;- }- xhr.onreadystatechange = callback;- }- },-- abort: function() {- if ( callback ) {- callback(0,1);- }- }- };- }- });-}-----var elemdisplay = {},- iframe, iframeDoc,- rfxtypes = /^(?:toggle|show|hide)$/,- rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,- timerId,- fxAttrs = [- // height animations- [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],- // width animations- [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],- // opacity animations- [ "opacity" ]- ],- fxNow;--jQuery.fn.extend({- show: function( speed, easing, callback ) {- var elem, display;-- if ( speed || speed === 0 ) {- return this.animate( genFx("show", 3), speed, easing, callback );-- } else {- for ( var i = 0, j = this.length; i < j; i++ ) {- elem = this[ i ];-- if ( elem.style ) {- display = elem.style.display;-- // Reset the inline display of this element to learn if it is- // being hidden by cascaded rules or not- if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {- display = elem.style.display = "";- }-- // Set elements which have been overridden with display: none- // in a stylesheet to whatever the default browser style is- // for such an element- if ( (display === "" && jQuery.css(elem, "display") === "none") ||- !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {- jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );- }- }- }-- // Set the display of most of the elements in a second loop- // to avoid the constant reflow- for ( i = 0; i < j; i++ ) {- elem = this[ i ];-- if ( elem.style ) {- display = elem.style.display;-- if ( display === "" || display === "none" ) {- elem.style.display = jQuery._data( elem, "olddisplay" ) || "";- }- }- }-- return this;- }- },-- hide: function( speed, easing, callback ) {- if ( speed || speed === 0 ) {- return this.animate( genFx("hide", 3), speed, easing, callback);-- } else {- var elem, display,- i = 0,- j = this.length;-- for ( ; i < j; i++ ) {- elem = this[i];- if ( elem.style ) {- display = jQuery.css( elem, "display" );-- if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {- jQuery._data( elem, "olddisplay", display );- }- }- }-- // Set the display of the elements in a second loop- // to avoid the constant reflow- for ( i = 0; i < j; i++ ) {- if ( this[i].style ) {- this[i].style.display = "none";- }- }-- return this;- }- },-- // Save the old toggle function- _toggle: jQuery.fn.toggle,-- toggle: function( fn, fn2, callback ) {- var bool = typeof fn === "boolean";-- if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {- this._toggle.apply( this, arguments );-- } else if ( fn == null || bool ) {- this.each(function() {- var state = bool ? fn : jQuery(this).is(":hidden");- jQuery(this)[ state ? "show" : "hide" ]();- });-- } else {- this.animate(genFx("toggle", 3), fn, fn2, callback);- }-- return this;- },-- fadeTo: function( speed, to, easing, callback ) {- return this.filter(":hidden").css("opacity", 0).show().end()- .animate({opacity: to}, speed, easing, callback);- },-- animate: function( prop, speed, easing, callback ) {- var optall = jQuery.speed( speed, easing, callback );-- if ( jQuery.isEmptyObject( prop ) ) {- return this.each( optall.complete, [ false ] );- }-- // Do not change referenced properties as per-property easing will be lost- prop = jQuery.extend( {}, prop );-- function doAnimation() {- // XXX 'this' does not always have a nodeName when running the- // test suite-- if ( optall.queue === false ) {- jQuery._mark( this );- }-- var opt = jQuery.extend( {}, optall ),- isElement = this.nodeType === 1,- hidden = isElement && jQuery(this).is(":hidden"),- name, val, p, e, hooks, replace,- parts, start, end, unit,- method;-- // will store per property easing and be used to determine when an animation is complete- opt.animatedProperties = {};-- // first pass over propertys to expand / normalize- for ( p in prop ) {- name = jQuery.camelCase( p );- if ( p !== name ) {- prop[ name ] = prop[ p ];- delete prop[ p ];- }-- if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) {- replace = hooks.expand( prop[ name ] );- delete prop[ name ];-- // not quite $.extend, this wont overwrite keys already present.- // also - reusing 'p' from above because we have the correct "name"- for ( p in replace ) {- if ( ! ( p in prop ) ) {- prop[ p ] = replace[ p ];- }- }- }- }-- for ( name in prop ) {- val = prop[ name ];- // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)- if ( jQuery.isArray( val ) ) {- opt.animatedProperties[ name ] = val[ 1 ];- val = prop[ name ] = val[ 0 ];- } else {- opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';- }-- if ( val === "hide" && hidden || val === "show" && !hidden ) {- return opt.complete.call( this );- }-- if ( isElement && ( name === "height" || name === "width" ) ) {- // Make sure that nothing sneaks out- // Record all 3 overflow attributes because IE does not- // change the overflow attribute when overflowX and- // overflowY are set to the same value- opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];-- // Set display property to inline-block for height/width- // animations on inline elements that are having width/height animated- if ( jQuery.css( this, "display" ) === "inline" &&- jQuery.css( this, "float" ) === "none" ) {-- // inline-level elements accept inline-block;- // block-level elements need to be inline with layout- if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {- this.style.display = "inline-block";-- } else {- this.style.zoom = 1;- }- }- }- }-- if ( opt.overflow != null ) {- this.style.overflow = "hidden";- }-- for ( p in prop ) {- e = new jQuery.fx( this, opt, p );- val = prop[ p ];-- if ( rfxtypes.test( val ) ) {-- // Tracks whether to show or hide based on private- // data attached to the element- method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );- if ( method ) {- jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );- e[ method ]();- } else {- e[ val ]();- }-- } else {- parts = rfxnum.exec( val );- start = e.cur();-- if ( parts ) {- end = parseFloat( parts[2] );- unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );-- // We need to compute starting value- if ( unit !== "px" ) {- jQuery.style( this, p, (end || 1) + unit);- start = ( (end || 1) / e.cur() ) * start;- jQuery.style( this, p, start + unit);- }-- // If a +=/-= token was provided, we're doing a relative animation- if ( parts[1] ) {- end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;- }-- e.custom( start, end, unit );-- } else {- e.custom( start, val, "" );- }- }- }-- // For JS strict compliance- return true;- }-- return optall.queue === false ?- this.each( doAnimation ) :- this.queue( optall.queue, doAnimation );- },-- stop: function( type, clearQueue, gotoEnd ) {- if ( typeof type !== "string" ) {- gotoEnd = clearQueue;- clearQueue = type;- type = undefined;- }- if ( clearQueue && type !== false ) {- this.queue( type || "fx", [] );- }-- return this.each(function() {- var index,- hadTimers = false,- timers = jQuery.timers,- data = jQuery._data( this );-- // clear marker counters if we know they won't be- if ( !gotoEnd ) {- jQuery._unmark( true, this );- }-- function stopQueue( elem, data, index ) {- var hooks = data[ index ];- jQuery.removeData( elem, index, true );- hooks.stop( gotoEnd );- }-- if ( type == null ) {- for ( index in data ) {- if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {- stopQueue( this, data, index );- }- }- } else if ( data[ index = type + ".run" ] && data[ index ].stop ){- stopQueue( this, data, index );- }-- for ( index = timers.length; index--; ) {- if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {- if ( gotoEnd ) {-- // force the next step to be the last- timers[ index ]( true );- } else {- timers[ index ].saveState();- }- hadTimers = true;- timers.splice( index, 1 );- }- }-- // start the next in the queue if the last step wasn't forced- // timers currently will call their complete callbacks, which will dequeue- // but only if they were gotoEnd- if ( !( gotoEnd && hadTimers ) ) {- jQuery.dequeue( this, type );- }- });- }--});--// Animations created synchronously will run synchronously-function createFxNow() {- setTimeout( clearFxNow, 0 );- return ( fxNow = jQuery.now() );-}--function clearFxNow() {- fxNow = undefined;-}--// Generate parameters to create a standard animation-function genFx( type, num ) {- var obj = {};-- jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {- obj[ this ] = type;- });-- return obj;-}--// Generate shortcuts for custom animations-jQuery.each({- slideDown: genFx( "show", 1 ),- slideUp: genFx( "hide", 1 ),- slideToggle: genFx( "toggle", 1 ),- fadeIn: { opacity: "show" },- fadeOut: { opacity: "hide" },- fadeToggle: { opacity: "toggle" }-}, function( name, props ) {- jQuery.fn[ name ] = function( speed, easing, callback ) {- return this.animate( props, speed, easing, callback );- };-});--jQuery.extend({- speed: function( speed, easing, fn ) {- var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {- complete: fn || !fn && easing ||- jQuery.isFunction( speed ) && speed,- duration: speed,- easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing- };-- opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :- opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;-- // normalize opt.queue - true/undefined/null -> "fx"- if ( opt.queue == null || opt.queue === true ) {- opt.queue = "fx";- }-- // Queueing- opt.old = opt.complete;-- opt.complete = function( noUnmark ) {- if ( jQuery.isFunction( opt.old ) ) {- opt.old.call( this );- }-- if ( opt.queue ) {- jQuery.dequeue( this, opt.queue );- } else if ( noUnmark !== false ) {- jQuery._unmark( this );- }- };-- return opt;- },-- easing: {- linear: function( p ) {- return p;- },- swing: function( p ) {- return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;- }- },-- timers: [],-- fx: function( elem, options, prop ) {- this.options = options;- this.elem = elem;- this.prop = prop;-- options.orig = options.orig || {};- }--});--jQuery.fx.prototype = {- // Simple function for setting a style value- update: function() {- if ( this.options.step ) {- this.options.step.call( this.elem, this.now, this );- }-- ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );- },-- // Get the current size- cur: function() {- if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {- return this.elem[ this.prop ];- }-- var parsed,- r = jQuery.css( this.elem, this.prop );- // Empty strings, null, undefined and "auto" are converted to 0,- // complex values such as "rotate(1rad)" are returned as is,- // simple values such as "10px" are parsed to Float.- return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;- },-- // Start an animation from one number to another- custom: function( from, to, unit ) {- var self = this,- fx = jQuery.fx;-- this.startTime = fxNow || createFxNow();- this.end = to;- this.now = this.start = from;- this.pos = this.state = 0;- this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );-- function t( gotoEnd ) {- return self.step( gotoEnd );- }-- t.queue = this.options.queue;- t.elem = this.elem;- t.saveState = function() {- if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {- if ( self.options.hide ) {- jQuery._data( self.elem, "fxshow" + self.prop, self.start );- } else if ( self.options.show ) {- jQuery._data( self.elem, "fxshow" + self.prop, self.end );- }- }- };-- if ( t() && jQuery.timers.push(t) && !timerId ) {- timerId = setInterval( fx.tick, fx.interval );- }- },-- // Simple 'show' function- show: function() {- var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );-- // Remember where we started, so that we can go back to it later- this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );- this.options.show = true;-- // Begin the animation- // Make sure that we start at a small width/height to avoid any flash of content- if ( dataShow !== undefined ) {- // This show is picking up where a previous hide or show left off- this.custom( this.cur(), dataShow );- } else {- this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );- }-- // Start by showing the element- jQuery( this.elem ).show();- },-- // Simple 'hide' function- hide: function() {- // Remember where we started, so that we can go back to it later- this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );- this.options.hide = true;-- // Begin the animation- this.custom( this.cur(), 0 );- },-- // Each step of an animation- step: function( gotoEnd ) {- var p, n, complete,- t = fxNow || createFxNow(),- done = true,- elem = this.elem,- options = this.options;-- if ( gotoEnd || t >= options.duration + this.startTime ) {- this.now = this.end;- this.pos = this.state = 1;- this.update();-- options.animatedProperties[ this.prop ] = true;-- for ( p in options.animatedProperties ) {- if ( options.animatedProperties[ p ] !== true ) {- done = false;- }- }-- if ( done ) {- // Reset the overflow- if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {-- jQuery.each( [ "", "X", "Y" ], function( index, value ) {- elem.style[ "overflow" + value ] = options.overflow[ index ];- });- }-- // Hide the element if the "hide" operation was done- if ( options.hide ) {- jQuery( elem ).hide();- }-- // Reset the properties, if the item has been hidden or shown- if ( options.hide || options.show ) {- for ( p in options.animatedProperties ) {- jQuery.style( elem, p, options.orig[ p ] );- jQuery.removeData( elem, "fxshow" + p, true );- // Toggle data is no longer needed- jQuery.removeData( elem, "toggle" + p, true );- }- }-- // Execute the complete function- // in the event that the complete function throws an exception- // we must ensure it won't be called twice. #5684-- complete = options.complete;- if ( complete ) {-- options.complete = false;- complete.call( elem );- }- }-- return false;-- } else {- // classical easing cannot be used with an Infinity duration- if ( options.duration == Infinity ) {- this.now = t;- } else {- n = t - this.startTime;- this.state = n / options.duration;-- // Perform the easing function, defaults to swing- this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );- this.now = this.start + ( (this.end - this.start) * this.pos );- }- // Perform the next step of the animation- this.update();- }-- return true;- }-};--jQuery.extend( jQuery.fx, {- tick: function() {- var timer,- timers = jQuery.timers,- i = 0;-- for ( ; i < timers.length; i++ ) {- timer = timers[ i ];- // Checks the timer has not already been removed- if ( !timer() && timers[ i ] === timer ) {- timers.splice( i--, 1 );- }- }-- if ( !timers.length ) {- jQuery.fx.stop();- }- },-- interval: 13,-- stop: function() {- clearInterval( timerId );- timerId = null;- },-- speeds: {- slow: 600,- fast: 200,- // Default speed- _default: 400- },-- step: {- opacity: function( fx ) {- jQuery.style( fx.elem, "opacity", fx.now );- },-- _default: function( fx ) {- if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {- fx.elem.style[ fx.prop ] = fx.now + fx.unit;- } else {- fx.elem[ fx.prop ] = fx.now;- }- }- }-});--// Ensure props that can't be negative don't go there on undershoot easing-jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {- // exclude marginTop, marginLeft, marginBottom and marginRight from this list- if ( prop.indexOf( "margin" ) ) {- jQuery.fx.step[ prop ] = function( fx ) {- jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );- };- }-});--if ( jQuery.expr && jQuery.expr.filters ) {- jQuery.expr.filters.animated = function( elem ) {- return jQuery.grep(jQuery.timers, function( fn ) {- return elem === fn.elem;- }).length;- };-}--// Try to restore the default display value of an element-function defaultDisplay( nodeName ) {-- if ( !elemdisplay[ nodeName ] ) {-- var body = document.body,- elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),- display = elem.css( "display" );- elem.remove();-- // If the simple way fails,- // get element's real default display by attaching it to a temp iframe- if ( display === "none" || display === "" ) {- // No iframe to use yet, so create it- if ( !iframe ) {- iframe = document.createElement( "iframe" );- iframe.frameBorder = iframe.width = iframe.height = 0;- }-- body.appendChild( iframe );-- // Create a cacheable copy of the iframe document on first call.- // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML- // document to it; WebKit & Firefox won't allow reusing the iframe document.- if ( !iframeDoc || !iframe.createElement ) {- iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;- iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" );- iframeDoc.close();- }-- elem = iframeDoc.createElement( nodeName );-- iframeDoc.body.appendChild( elem );-- display = jQuery.css( elem, "display" );- body.removeChild( iframe );- }-- // Store the correct default display- elemdisplay[ nodeName ] = display;- }-- return elemdisplay[ nodeName ];-}-----var getOffset,- rtable = /^t(?:able|d|h)$/i,- rroot = /^(?:body|html)$/i;--if ( "getBoundingClientRect" in document.documentElement ) {- getOffset = function( elem, doc, docElem, box ) {- try {- box = elem.getBoundingClientRect();- } catch(e) {}-- // Make sure we're not dealing with a disconnected DOM node- if ( !box || !jQuery.contains( docElem, elem ) ) {- return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };- }-- var body = doc.body,- win = getWindow( doc ),- clientTop = docElem.clientTop || body.clientTop || 0,- clientLeft = docElem.clientLeft || body.clientLeft || 0,- scrollTop = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop || body.scrollTop,- scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,- top = box.top + scrollTop - clientTop,- left = box.left + scrollLeft - clientLeft;-- return { top: top, left: left };- };--} else {- getOffset = function( elem, doc, docElem ) {- var computedStyle,- offsetParent = elem.offsetParent,- prevOffsetParent = elem,- body = doc.body,- defaultView = doc.defaultView,- prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,- top = elem.offsetTop,- left = elem.offsetLeft;-- while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {- if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {- break;- }-- computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;- top -= elem.scrollTop;- left -= elem.scrollLeft;-- if ( elem === offsetParent ) {- top += elem.offsetTop;- left += elem.offsetLeft;-- if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {- top += parseFloat( computedStyle.borderTopWidth ) || 0;- left += parseFloat( computedStyle.borderLeftWidth ) || 0;- }-- prevOffsetParent = offsetParent;- offsetParent = elem.offsetParent;- }-- if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {- top += parseFloat( computedStyle.borderTopWidth ) || 0;- left += parseFloat( computedStyle.borderLeftWidth ) || 0;- }-- prevComputedStyle = computedStyle;- }-- if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {- top += body.offsetTop;- left += body.offsetLeft;- }-- if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {- top += Math.max( docElem.scrollTop, body.scrollTop );- left += Math.max( docElem.scrollLeft, body.scrollLeft );- }-- return { top: top, left: left };- };-}--jQuery.fn.offset = function( options ) {- if ( arguments.length ) {- return options === undefined ?- this :- this.each(function( i ) {- jQuery.offset.setOffset( this, options, i );- });- }-- var elem = this[0],- doc = elem && elem.ownerDocument;-- if ( !doc ) {- return null;- }-- if ( elem === doc.body ) {- return jQuery.offset.bodyOffset( elem );- }-- return getOffset( elem, doc, doc.documentElement );-};--jQuery.offset = {-- bodyOffset: function( body ) {- var top = body.offsetTop,- left = body.offsetLeft;-- if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {- top += parseFloat( jQuery.css(body, "marginTop") ) || 0;- left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;- }-- return { top: top, left: left };- },-- setOffset: function( elem, options, i ) {- var position = jQuery.css( elem, "position" );-- // set position first, in-case top/left are set even on static elem- if ( position === "static" ) {- elem.style.position = "relative";- }-- var curElem = jQuery( elem ),- curOffset = curElem.offset(),- curCSSTop = jQuery.css( elem, "top" ),- curCSSLeft = jQuery.css( elem, "left" ),- calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,- props = {}, curPosition = {}, curTop, curLeft;-- // need to be able to calculate position if either top or left is auto and position is either absolute or fixed- if ( calculatePosition ) {- curPosition = curElem.position();- curTop = curPosition.top;- curLeft = curPosition.left;- } else {- curTop = parseFloat( curCSSTop ) || 0;- curLeft = parseFloat( curCSSLeft ) || 0;- }-- if ( jQuery.isFunction( options ) ) {- options = options.call( elem, i, curOffset );- }-- if ( options.top != null ) {- props.top = ( options.top - curOffset.top ) + curTop;- }- if ( options.left != null ) {- props.left = ( options.left - curOffset.left ) + curLeft;- }-- if ( "using" in options ) {- options.using.call( elem, props );- } else {- curElem.css( props );- }- }-};---jQuery.fn.extend({-- position: function() {- if ( !this[0] ) {- return null;- }-- var elem = this[0],-- // Get *real* offsetParent- offsetParent = this.offsetParent(),-- // Get correct offsets- offset = this.offset(),- parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();-- // Subtract element margins- // note: when an element has margin: auto the offsetLeft and marginLeft- // are the same in Safari causing offset.left to incorrectly be 0- offset.top -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;- offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;-- // Add offsetParent borders- parentOffset.top += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;- parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;-- // Subtract the two offsets- return {- top: offset.top - parentOffset.top,- left: offset.left - parentOffset.left- };- },-- offsetParent: function() {- return this.map(function() {- var offsetParent = this.offsetParent || document.body;- while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {- offsetParent = offsetParent.offsetParent;- }- return offsetParent;- });- }-});---// Create scrollLeft and scrollTop methods-jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {- var top = /Y/.test( prop );-- jQuery.fn[ method ] = function( val ) {- return jQuery.access( this, function( elem, method, val ) {- var win = getWindow( elem );-- if ( val === undefined ) {- return win ? (prop in win) ? win[ prop ] :- jQuery.support.boxModel && win.document.documentElement[ method ] ||- win.document.body[ method ] :- elem[ method ];- }-- if ( win ) {- win.scrollTo(- !top ? val : jQuery( win ).scrollLeft(),- top ? val : jQuery( win ).scrollTop()- );-- } else {- elem[ method ] = val;- }- }, method, val, arguments.length, null );- };-});--function getWindow( elem ) {- return jQuery.isWindow( elem ) ?- elem :- elem.nodeType === 9 ?- elem.defaultView || elem.parentWindow :- false;-}-----// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods-jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {- var clientProp = "client" + name,- scrollProp = "scroll" + name,- offsetProp = "offset" + name;-- // innerHeight and innerWidth- jQuery.fn[ "inner" + name ] = function() {- var elem = this[0];- return elem ?- elem.style ?- parseFloat( jQuery.css( elem, type, "padding" ) ) :- this[ type ]() :- null;- };-- // outerHeight and outerWidth- jQuery.fn[ "outer" + name ] = function( margin ) {- var elem = this[0];- return elem ?- elem.style ?- parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :- this[ type ]() :- null;- };-- jQuery.fn[ type ] = function( value ) {- return jQuery.access( this, function( elem, type, value ) {- var doc, docElemProp, orig, ret;-- if ( jQuery.isWindow( elem ) ) {- // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat- doc = elem.document;- docElemProp = doc.documentElement[ clientProp ];- return jQuery.support.boxModel && docElemProp ||- doc.body && doc.body[ clientProp ] || docElemProp;- }-- // Get document width or height- if ( elem.nodeType === 9 ) {- // Either scroll[Width/Height] or offset[Width/Height], whichever is greater- doc = elem.documentElement;-- // when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]- // so we can't use max, as it'll choose the incorrect offset[Width/Height]- // instead we use the correct client[Width/Height]- // support:IE6- if ( doc[ clientProp ] >= doc[ scrollProp ] ) {- return doc[ clientProp ];- }-- return Math.max(- elem.body[ scrollProp ], doc[ scrollProp ],- elem.body[ offsetProp ], doc[ offsetProp ]- );- }-- // Get width or height on the element- if ( value === undefined ) {- orig = jQuery.css( elem, type );- ret = parseFloat( orig );- return jQuery.isNumeric( ret ) ? ret : orig;- }-- // Set the width or height on the element- jQuery( elem ).css( type, value );- }, type, value, arguments.length, null );- };-});-----// Expose jQuery to the global object-window.jQuery = window.$ = jQuery;--// Expose jQuery as an AMD module, but only for AMD loaders that-// understand the issues with loading multiple versions of jQuery-// in a page that all might call define(). The loader will indicate-// they have special allowances for multiple jQuery versions by-// specifying define.amd.jQuery = true. Register as a named module,-// since jQuery can be concatenated with other files that may use define,-// but not use a proper concatenation script that understands anonymous-// AMD modules. A named AMD is safest and most robust way to register.-// Lowercase jquery is used because AMD module names are derived from-// file names, and jQuery is normally delivered in a lowercase file name.-// Do this after creating the global so that if an AMD module wants to call-// noConflict to hide this version of jQuery, it will work.-if ( typeof define === "function" && define.amd && define.amd.jQuery ) {- define( "jquery", [], function () { return jQuery; } );-}----})( window );
− static/jquery.ui.core.js
@@ -1,324 +0,0 @@-/*!- * jQuery UI Core 1.10.1- * http://jqueryui.com- *- * Copyright 2013 jQuery Foundation and other contributors- * Released under the MIT license.- * http://jquery.org/license- *- * http://api.jqueryui.com/category/ui-core/- */-(function( $, undefined ) {--var uuid = 0,- runiqueId = /^ui-id-\d+$/;--// prevent duplicate loading-// this is only a problem because we proxy existing functions-// and we don't want to double proxy them-$.ui = $.ui || {};-if ( $.ui.version ) {- return;-}--$.extend( $.ui, {- version: "1.10.1",-- keyCode: {- BACKSPACE: 8,- COMMA: 188,- DELETE: 46,- DOWN: 40,- END: 35,- ENTER: 13,- ESCAPE: 27,- HOME: 36,- LEFT: 37,- NUMPAD_ADD: 107,- NUMPAD_DECIMAL: 110,- NUMPAD_DIVIDE: 111,- NUMPAD_ENTER: 108,- NUMPAD_MULTIPLY: 106,- NUMPAD_SUBTRACT: 109,- PAGE_DOWN: 34,- PAGE_UP: 33,- PERIOD: 190,- RIGHT: 39,- SPACE: 32,- TAB: 9,- UP: 38- }-});--// plugins-$.fn.extend({- _focus: $.fn.focus,- focus: function( delay, fn ) {- return typeof delay === "number" ?- this.each(function() {- var elem = this;- setTimeout(function() {- $( elem ).focus();- if ( fn ) {- fn.call( elem );- }- }, delay );- }) :- this._focus.apply( this, arguments );- },-- scrollParent: function() {- var scrollParent;- if (($.ui.ie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) {- scrollParent = this.parents().filter(function() {- return (/(relative|absolute|fixed)/).test($.css(this,"position")) && (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));- }).eq(0);- } else {- scrollParent = this.parents().filter(function() {- return (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));- }).eq(0);- }-- return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(document) : scrollParent;- },-- zIndex: function( zIndex ) {- if ( zIndex !== undefined ) {- return this.css( "zIndex", zIndex );- }-- if ( this.length ) {- var elem = $( this[ 0 ] ), position, value;- while ( elem.length && elem[ 0 ] !== document ) {- // Ignore z-index if position is set to a value where z-index is ignored by the browser- // This makes behavior of this function consistent across browsers- // WebKit always returns auto if the element is positioned- position = elem.css( "position" );- if ( position === "absolute" || position === "relative" || position === "fixed" ) {- // IE returns 0 when zIndex is not specified- // other browsers return a string- // we ignore the case of nested elements with an explicit value of 0- // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>- value = parseInt( elem.css( "zIndex" ), 10 );- if ( !isNaN( value ) && value !== 0 ) {- return value;- }- }- elem = elem.parent();- }- }-- return 0;- },-- uniqueId: function() {- return this.each(function() {- if ( !this.id ) {- this.id = "ui-id-" + (++uuid);- }- });- },-- removeUniqueId: function() {- return this.each(function() {- if ( runiqueId.test( this.id ) ) {- $( this ).removeAttr( "id" );- }- });- }-});--// selectors-function focusable( element, isTabIndexNotNaN ) {- var map, mapName, img,- nodeName = element.nodeName.toLowerCase();- if ( "area" === nodeName ) {- map = element.parentNode;- mapName = map.name;- if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {- return false;- }- img = $( "img[usemap=#" + mapName + "]" )[0];- return !!img && visible( img );- }- return ( /input|select|textarea|button|object/.test( nodeName ) ?- !element.disabled :- "a" === nodeName ?- element.href || isTabIndexNotNaN :- isTabIndexNotNaN) &&- // the element and all of its ancestors must be visible- visible( element );-}--function visible( element ) {- return $.expr.filters.visible( element ) &&- !$( element ).parents().addBack().filter(function() {- return $.css( this, "visibility" ) === "hidden";- }).length;-}--$.extend( $.expr[ ":" ], {- data: $.expr.createPseudo ?- $.expr.createPseudo(function( dataName ) {- return function( elem ) {- return !!$.data( elem, dataName );- };- }) :- // support: jQuery <1.8- function( elem, i, match ) {- return !!$.data( elem, match[ 3 ] );- },-- focusable: function( element ) {- return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );- },-- tabbable: function( element ) {- var tabIndex = $.attr( element, "tabindex" ),- isTabIndexNaN = isNaN( tabIndex );- return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );- }-});--// support: jQuery <1.8-if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {- $.each( [ "Width", "Height" ], function( i, name ) {- var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],- type = name.toLowerCase(),- orig = {- innerWidth: $.fn.innerWidth,- innerHeight: $.fn.innerHeight,- outerWidth: $.fn.outerWidth,- outerHeight: $.fn.outerHeight- };-- function reduce( elem, size, border, margin ) {- $.each( side, function() {- size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;- if ( border ) {- size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;- }- if ( margin ) {- size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;- }- });- return size;- }-- $.fn[ "inner" + name ] = function( size ) {- if ( size === undefined ) {- return orig[ "inner" + name ].call( this );- }-- return this.each(function() {- $( this ).css( type, reduce( this, size ) + "px" );- });- };-- $.fn[ "outer" + name] = function( size, margin ) {- if ( typeof size !== "number" ) {- return orig[ "outer" + name ].call( this, size );- }-- return this.each(function() {- $( this).css( type, reduce( this, size, true, margin ) + "px" );- });- };- });-}--// support: jQuery <1.8-if ( !$.fn.addBack ) {- $.fn.addBack = function( selector ) {- return this.add( selector == null ?- this.prevObject : this.prevObject.filter( selector )- );- };-}--// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)-if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {- $.fn.removeData = (function( removeData ) {- return function( key ) {- if ( arguments.length ) {- return removeData.call( this, $.camelCase( key ) );- } else {- return removeData.call( this );- }- };- })( $.fn.removeData );-}------// deprecated-$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );--$.support.selectstart = "onselectstart" in document.createElement( "div" );-$.fn.extend({- disableSelection: function() {- return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) +- ".ui-disableSelection", function( event ) {- event.preventDefault();- });- },-- enableSelection: function() {- return this.unbind( ".ui-disableSelection" );- }-});--$.extend( $.ui, {- // $.ui.plugin is deprecated. Use the proxy pattern instead.- plugin: {- add: function( module, option, set ) {- var i,- proto = $.ui[ module ].prototype;- for ( i in set ) {- proto.plugins[ i ] = proto.plugins[ i ] || [];- proto.plugins[ i ].push( [ option, set[ i ] ] );- }- },- call: function( instance, name, args ) {- var i,- set = instance.plugins[ name ];- if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {- return;- }-- for ( i = 0; i < set.length; i++ ) {- if ( instance.options[ set[ i ][ 0 ] ] ) {- set[ i ][ 1 ].apply( instance.element, args );- }- }- }- },-- // only used by resizable- hasScroll: function( el, a ) {-- //If overflow is hidden, the element might have extra content, but the user wants to hide it- if ( $( el ).css( "overflow" ) === "hidden") {- return false;- }-- var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",- has = false;-- if ( el[ scroll ] > 0 ) {- return true;- }-- // TODO: determine which cases actually cause this to happen- // if the element doesn't have the scroll set, see if it's possible to- // set the scroll- el[ scroll ] = 1;- has = ( el[ scroll ] > 0 );- el[ scroll ] = 0;- return has;- }-});--})( jQuery );
− static/jquery.ui.mouse.js
@@ -1,169 +0,0 @@-/*!- * jQuery UI Mouse 1.10.1- * http://jqueryui.com- *- * Copyright 2013 jQuery Foundation and other contributors- * Released under the MIT license.- * http://jquery.org/license- *- * http://api.jqueryui.com/mouse/- *- * Depends:- * jquery.ui.widget.js- */-(function( $, undefined ) {--var mouseHandled = false;-$( document ).mouseup( function() {- mouseHandled = false;-});--$.widget("ui.mouse", {- version: "1.10.1",- options: {- cancel: "input,textarea,button,select,option",- distance: 1,- delay: 0- },- _mouseInit: function() {- var that = this;-- this.element- .bind("mousedown."+this.widgetName, function(event) {- return that._mouseDown(event);- })- .bind("click."+this.widgetName, function(event) {- if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {- $.removeData(event.target, that.widgetName + ".preventClickEvent");- event.stopImmediatePropagation();- return false;- }- });-- this.started = false;- },-- // TODO: make sure destroying one instance of mouse doesn't mess with- // other instances of mouse- _mouseDestroy: function() {- this.element.unbind("."+this.widgetName);- if ( this._mouseMoveDelegate ) {- $(document)- .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)- .unbind("mouseup."+this.widgetName, this._mouseUpDelegate);- }- },-- _mouseDown: function(event) {- // don't let more than one widget handle mouseStart- if( mouseHandled ) { return; }-- // we may have missed mouseup (out of window)- (this._mouseStarted && this._mouseUp(event));-- this._mouseDownEvent = event;-- var that = this,- btnIsLeft = (event.which === 1),- // event.target.nodeName works around a bug in IE 8 with- // disabled inputs (#7620)- elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);- if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {- return true;- }-- this.mouseDelayMet = !this.options.delay;- if (!this.mouseDelayMet) {- this._mouseDelayTimer = setTimeout(function() {- that.mouseDelayMet = true;- }, this.options.delay);- }-- if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {- this._mouseStarted = (this._mouseStart(event) !== false);- if (!this._mouseStarted) {- event.preventDefault();- return true;- }- }-- // Click event may never have fired (Gecko & Opera)- if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {- $.removeData(event.target, this.widgetName + ".preventClickEvent");- }-- // these delegates are required to keep context- this._mouseMoveDelegate = function(event) {- return that._mouseMove(event);- };- this._mouseUpDelegate = function(event) {- return that._mouseUp(event);- };- $(document)- .bind("mousemove."+this.widgetName, this._mouseMoveDelegate)- .bind("mouseup."+this.widgetName, this._mouseUpDelegate);-- event.preventDefault();-- mouseHandled = true;- return true;- },-- _mouseMove: function(event) {- // IE mouseup check - mouseup happened when mouse was out of window- if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {- return this._mouseUp(event);- }-- if (this._mouseStarted) {- this._mouseDrag(event);- return event.preventDefault();- }-- if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {- this._mouseStarted =- (this._mouseStart(this._mouseDownEvent, event) !== false);- (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));- }-- return !this._mouseStarted;- },-- _mouseUp: function(event) {- $(document)- .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)- .unbind("mouseup."+this.widgetName, this._mouseUpDelegate);-- if (this._mouseStarted) {- this._mouseStarted = false;-- if (event.target === this._mouseDownEvent.target) {- $.data(event.target, this.widgetName + ".preventClickEvent", true);- }-- this._mouseStop(event);- }-- return false;- },-- _mouseDistanceMet: function(event) {- return (Math.max(- Math.abs(this._mouseDownEvent.pageX - event.pageX),- Math.abs(this._mouseDownEvent.pageY - event.pageY)- ) >= this.options.distance- );- },-- _mouseDelayMet: function(/* event */) {- return this.mouseDelayMet;- },-- // These are placeholder methods, to be overriden by extending plugin- _mouseStart: function(/* event */) {},- _mouseDrag: function(/* event */) {},- _mouseStop: function(/* event */) {},- _mouseCapture: function(/* event */) { return true; }-});--})(jQuery);
− static/jquery.ui.sortable.js
@@ -1,1250 +0,0 @@-/*!- * jQuery UI Sortable 1.10.1- * http://jqueryui.com- *- * Copyright 2013 jQuery Foundation and other contributors- * Released under the MIT license.- * http://jquery.org/license- *- * http://api.jqueryui.com/sortable/- *- * Depends:- * jquery.ui.core.js- * jquery.ui.mouse.js- * jquery.ui.widget.js- */-(function( $, undefined ) {--/*jshint loopfunc: true */--function isOverAxis( x, reference, size ) {- return ( x > reference ) && ( x < ( reference + size ) );-}--$.widget("ui.sortable", $.ui.mouse, {- version: "1.10.1",- widgetEventPrefix: "sort",- ready: false,- options: {- appendTo: "parent",- axis: false,- connectWith: false,- containment: false,- cursor: "auto",- cursorAt: false,- dropOnEmpty: true,- forcePlaceholderSize: false,- forceHelperSize: false,- grid: false,- handle: false,- helper: "original",- items: "> *",- opacity: false,- placeholder: false,- revert: false,- scroll: true,- scrollSensitivity: 20,- scrollSpeed: 20,- scope: "default",- tolerance: "intersect",- zIndex: 1000,-- // callbacks- activate: null,- beforeStop: null,- change: null,- deactivate: null,- out: null,- over: null,- receive: null,- remove: null,- sort: null,- start: null,- stop: null,- update: null- },- _create: function() {-- var o = this.options;- this.containerCache = {};- this.element.addClass("ui-sortable");-- //Get the items- this.refresh();-- //Let's determine if the items are being displayed horizontally- this.floating = this.items.length ? o.axis === "x" || (/left|right/).test(this.items[0].item.css("float")) || (/inline|table-cell/).test(this.items[0].item.css("display")) : false;-- //Let's determine the parent's offset- this.offset = this.element.offset();-- //Initialize mouse events for interaction- this._mouseInit();-- //We're ready to go- this.ready = true;-- },-- _destroy: function() {- this.element- .removeClass("ui-sortable ui-sortable-disabled");- this._mouseDestroy();-- for ( var i = this.items.length - 1; i >= 0; i-- ) {- this.items[i].item.removeData(this.widgetName + "-item");- }-- return this;- },-- _setOption: function(key, value){- if ( key === "disabled" ) {- this.options[ key ] = value;-- this.widget().toggleClass( "ui-sortable-disabled", !!value );- } else {- // Don't call widget base _setOption for disable as it adds ui-state-disabled class- $.Widget.prototype._setOption.apply(this, arguments);- }- },-- _mouseCapture: function(event, overrideHandle) {- var currentItem = null,- validHandle = false,- that = this;-- if (this.reverting) {- return false;- }-- if(this.options.disabled || this.options.type === "static") {- return false;- }-- //We have to refresh the items data once first- this._refreshItems(event);-- //Find out if the clicked node (or one of its parents) is a actual item in this.items- $(event.target).parents().each(function() {- if($.data(this, that.widgetName + "-item") === that) {- currentItem = $(this);- return false;- }- });- if($.data(event.target, that.widgetName + "-item") === that) {- currentItem = $(event.target);- }-- if(!currentItem) {- return false;- }- if(this.options.handle && !overrideHandle) {- $(this.options.handle, currentItem).find("*").addBack().each(function() {- if(this === event.target) {- validHandle = true;- }- });- if(!validHandle) {- return false;- }- }-- this.currentItem = currentItem;- this._removeCurrentsFromItems();- return true;-- },-- _mouseStart: function(event, overrideHandle, noActivation) {-- var i,- o = this.options;-- this.currentContainer = this;-- //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture- this.refreshPositions();-- //Create and append the visible helper- this.helper = this._createHelper(event);-- //Cache the helper size- this._cacheHelperProportions();-- /*- * - Position generation -- * This block generates everything position related - it's the core of draggables.- */-- //Cache the margins of the original element- this._cacheMargins();-- //Get the next scrolling parent- this.scrollParent = this.helper.scrollParent();-- //The element's absolute position on the page minus margins- this.offset = this.currentItem.offset();- this.offset = {- top: this.offset.top - this.margins.top,- left: this.offset.left - this.margins.left- };-- $.extend(this.offset, {- click: { //Where the click happened, relative to the element- left: event.pageX - this.offset.left,- top: event.pageY - this.offset.top- },- parent: this._getParentOffset(),- relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper- });-- // Only after we got the offset, we can change the helper's position to absolute- // TODO: Still need to figure out a way to make relative sorting possible- this.helper.css("position", "absolute");- this.cssPosition = this.helper.css("position");-- //Generate the original position- this.originalPosition = this._generatePosition(event);- this.originalPageX = event.pageX;- this.originalPageY = event.pageY;-- //Adjust the mouse offset relative to the helper if "cursorAt" is supplied- (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));-- //Cache the former DOM position- this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };-- //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way- if(this.helper[0] !== this.currentItem[0]) {- this.currentItem.hide();- }-- //Create the placeholder- this._createPlaceholder();-- //Set a containment if given in the options- if(o.containment) {- this._setContainment();- }-- if(o.cursor) { // cursor option- if ($("body").css("cursor")) {- this._storedCursor = $("body").css("cursor");- }- $("body").css("cursor", o.cursor);- }-- if(o.opacity) { // opacity option- if (this.helper.css("opacity")) {- this._storedOpacity = this.helper.css("opacity");- }- this.helper.css("opacity", o.opacity);- }-- if(o.zIndex) { // zIndex option- if (this.helper.css("zIndex")) {- this._storedZIndex = this.helper.css("zIndex");- }- this.helper.css("zIndex", o.zIndex);- }-- //Prepare scrolling- if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {- this.overflowOffset = this.scrollParent.offset();- }-- //Call callbacks- this._trigger("start", event, this._uiHash());-- //Recache the helper size- if(!this._preserveHelperProportions) {- this._cacheHelperProportions();- }--- //Post "activate" events to possible containers- if( !noActivation ) {- for ( i = this.containers.length - 1; i >= 0; i-- ) {- this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );- }- }-- //Prepare possible droppables- if($.ui.ddmanager) {- $.ui.ddmanager.current = this;- }-- if ($.ui.ddmanager && !o.dropBehaviour) {- $.ui.ddmanager.prepareOffsets(this, event);- }-- this.dragging = true;-- this.helper.addClass("ui-sortable-helper");- this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position- return true;-- },-- _mouseDrag: function(event) {- var i, item, itemElement, intersection,- o = this.options,- scrolled = false;-- //Compute the helpers position- this.position = this._generatePosition(event);- this.positionAbs = this._convertPositionTo("absolute");-- if (!this.lastPositionAbs) {- this.lastPositionAbs = this.positionAbs;- }-- //Do scrolling- if(this.options.scroll) {- if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {-- if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {- this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;- } else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {- this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;- }-- if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {- this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;- } else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {- this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;- }-- } else {-- if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {- scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);- } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {- scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);- }-- if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {- scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);- } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {- scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);- }-- }-- if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {- $.ui.ddmanager.prepareOffsets(this, event);- }- }-- //Regenerate the absolute position used for position checks- this.positionAbs = this._convertPositionTo("absolute");-- //Set the helper position- if(!this.options.axis || this.options.axis !== "y") {- this.helper[0].style.left = this.position.left+"px";- }- if(!this.options.axis || this.options.axis !== "x") {- this.helper[0].style.top = this.position.top+"px";- }-- //Rearrange- for (i = this.items.length - 1; i >= 0; i--) {-- //Cache variables and intersection, continue if no intersection- item = this.items[i];- itemElement = item.item[0];- intersection = this._intersectsWithPointer(item);- if (!intersection) {- continue;- }-- // Only put the placeholder inside the current Container, skip all- // items form other containers. This works because when moving- // an item from one container to another the- // currentContainer is switched before the placeholder is moved.- //- // Without this moving items in "sub-sortables" can cause the placeholder to jitter- // beetween the outer and inner container.- if (item.instance !== this.currentContainer) {- continue;- }-- // cannot intersect with itself- // no useless actions that have been done before- // no action if the item moved is the parent of the item checked- if (itemElement !== this.currentItem[0] &&- this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&- !$.contains(this.placeholder[0], itemElement) &&- (this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)- ) {-- this.direction = intersection === 1 ? "down" : "up";-- if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {- this._rearrange(event, item);- } else {- break;- }-- this._trigger("change", event, this._uiHash());- break;- }- }-- //Post events to containers- this._contactContainers(event);-- //Interconnect with droppables- if($.ui.ddmanager) {- $.ui.ddmanager.drag(this, event);- }-- //Call callbacks- this._trigger("sort", event, this._uiHash());-- this.lastPositionAbs = this.positionAbs;- return false;-- },-- _mouseStop: function(event, noPropagation) {-- if(!event) {- return;- }-- //If we are using droppables, inform the manager about the drop- if ($.ui.ddmanager && !this.options.dropBehaviour) {- $.ui.ddmanager.drop(this, event);- }-- if(this.options.revert) {- var that = this,- cur = this.placeholder.offset();-- this.reverting = true;-- $(this.helper).animate({- left: cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollLeft),- top: cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollTop)- }, parseInt(this.options.revert, 10) || 500, function() {- that._clear(event);- });- } else {- this._clear(event, noPropagation);- }-- return false;-- },-- cancel: function() {-- if(this.dragging) {-- this._mouseUp({ target: null });-- if(this.options.helper === "original") {- this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");- } else {- this.currentItem.show();- }-- //Post deactivating events to containers- for (var i = this.containers.length - 1; i >= 0; i--){- this.containers[i]._trigger("deactivate", null, this._uiHash(this));- if(this.containers[i].containerCache.over) {- this.containers[i]._trigger("out", null, this._uiHash(this));- this.containers[i].containerCache.over = 0;- }- }-- }-- if (this.placeholder) {- //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!- if(this.placeholder[0].parentNode) {- this.placeholder[0].parentNode.removeChild(this.placeholder[0]);- }- if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {- this.helper.remove();- }-- $.extend(this, {- helper: null,- dragging: false,- reverting: false,- _noFinalSort: null- });-- if(this.domPosition.prev) {- $(this.domPosition.prev).after(this.currentItem);- } else {- $(this.domPosition.parent).prepend(this.currentItem);- }- }-- return this;-- },-- serialize: function(o) {-- var items = this._getItemsAsjQuery(o && o.connected),- str = [];- o = o || {};-- $(items).each(function() {- var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));- if (res) {- str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));- }- });-- if(!str.length && o.key) {- str.push(o.key + "=");- }-- return str.join("&");-- },-- toArray: function(o) {-- var items = this._getItemsAsjQuery(o && o.connected),- ret = [];-- o = o || {};-- items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });- return ret;-- },-- /* Be careful with the following core functions */- _intersectsWith: function(item) {-- var x1 = this.positionAbs.left,- x2 = x1 + this.helperProportions.width,- y1 = this.positionAbs.top,- y2 = y1 + this.helperProportions.height,- l = item.left,- r = l + item.width,- t = item.top,- b = t + item.height,- dyClick = this.offset.click.top,- dxClick = this.offset.click.left,- isOverElement = (y1 + dyClick) > t && (y1 + dyClick) < b && (x1 + dxClick) > l && (x1 + dxClick) < r;-- if ( this.options.tolerance === "pointer" ||- this.options.forcePointerForContainers ||- (this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])- ) {- return isOverElement;- } else {-- return (l < x1 + (this.helperProportions.width / 2) && // Right Half- x2 - (this.helperProportions.width / 2) < r && // Left Half- t < y1 + (this.helperProportions.height / 2) && // Bottom Half- y2 - (this.helperProportions.height / 2) < b ); // Top Half-- }- },-- _intersectsWithPointer: function(item) {-- var isOverElementHeight = (this.options.axis === "x") || isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),- isOverElementWidth = (this.options.axis === "y") || isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),- isOverElement = isOverElementHeight && isOverElementWidth,- verticalDirection = this._getDragVerticalDirection(),- horizontalDirection = this._getDragHorizontalDirection();-- if (!isOverElement) {- return false;- }-- return this.floating ?- ( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )- : ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );-- },-- _intersectsWithSides: function(item) {-- var isOverBottomHalf = isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),- isOverRightHalf = isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),- verticalDirection = this._getDragVerticalDirection(),- horizontalDirection = this._getDragHorizontalDirection();-- if (this.floating && horizontalDirection) {- return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));- } else {- return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));- }-- },-- _getDragVerticalDirection: function() {- var delta = this.positionAbs.top - this.lastPositionAbs.top;- return delta !== 0 && (delta > 0 ? "down" : "up");- },-- _getDragHorizontalDirection: function() {- var delta = this.positionAbs.left - this.lastPositionAbs.left;- return delta !== 0 && (delta > 0 ? "right" : "left");- },-- refresh: function(event) {- this._refreshItems(event);- this.refreshPositions();- return this;- },-- _connectWith: function() {- var options = this.options;- return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;- },-- _getItemsAsjQuery: function(connected) {-- var i, j, cur, inst,- items = [],- queries = [],- connectWith = this._connectWith();-- if(connectWith && connected) {- for (i = connectWith.length - 1; i >= 0; i--){- cur = $(connectWith[i]);- for ( j = cur.length - 1; j >= 0; j--){- inst = $.data(cur[j], this.widgetFullName);- if(inst && inst !== this && !inst.options.disabled) {- queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]);- }- }- }- }-- queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]);-- for (i = queries.length - 1; i >= 0; i--){- queries[i][0].each(function() {- items.push(this);- });- }-- return $(items);-- },-- _removeCurrentsFromItems: function() {-- var list = this.currentItem.find(":data(" + this.widgetName + "-item)");-- this.items = $.grep(this.items, function (item) {- for (var j=0; j < list.length; j++) {- if(list[j] === item.item[0]) {- return false;- }- }- return true;- });-- },-- _refreshItems: function(event) {-- this.items = [];- this.containers = [this];-- var i, j, cur, inst, targetData, _queries, item, queriesLength,- items = this.items,- queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],- connectWith = this._connectWith();-- if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down- for (i = connectWith.length - 1; i >= 0; i--){- cur = $(connectWith[i]);- for (j = cur.length - 1; j >= 0; j--){- inst = $.data(cur[j], this.widgetFullName);- if(inst && inst !== this && !inst.options.disabled) {- queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);- this.containers.push(inst);- }- }- }- }-- for (i = queries.length - 1; i >= 0; i--) {- targetData = queries[i][1];- _queries = queries[i][0];-- for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {- item = $(_queries[j]);-- item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)-- items.push({- item: item,- instance: targetData,- width: 0, height: 0,- left: 0, top: 0- });- }- }-- },-- refreshPositions: function(fast) {-- //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change- if(this.offsetParent && this.helper) {- this.offset.parent = this._getParentOffset();- }-- var i, item, t, p;-- for (i = this.items.length - 1; i >= 0; i--){- item = this.items[i];-- //We ignore calculating positions of all connected containers when we're not over them- if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {- continue;- }-- t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;-- if (!fast) {- item.width = t.outerWidth();- item.height = t.outerHeight();- }-- p = t.offset();- item.left = p.left;- item.top = p.top;- }-- if(this.options.custom && this.options.custom.refreshContainers) {- this.options.custom.refreshContainers.call(this);- } else {- for (i = this.containers.length - 1; i >= 0; i--){- p = this.containers[i].element.offset();- this.containers[i].containerCache.left = p.left;- this.containers[i].containerCache.top = p.top;- this.containers[i].containerCache.width = this.containers[i].element.outerWidth();- this.containers[i].containerCache.height = this.containers[i].element.outerHeight();- }- }-- return this;- },-- _createPlaceholder: function(that) {- that = that || this;- var className,- o = that.options;-- if(!o.placeholder || o.placeholder.constructor === String) {- className = o.placeholder;- o.placeholder = {- element: function() {-- var el = $(document.createElement(that.currentItem[0].nodeName))- .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")- .removeClass("ui-sortable-helper")[0];-- if(!className) {- el.style.visibility = "hidden";- }-- return el;- },- update: function(container, p) {-- // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that- // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified- if(className && !o.forcePlaceholderSize) {- return;- }-- //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item- if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }- if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }- }- };- }-- //Create the placeholder- that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));-- //Append it after the actual current item- that.currentItem.after(that.placeholder);-- //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)- o.placeholder.update(that, that.placeholder);-- },-- _contactContainers: function(event) {- var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, base, cur, nearBottom,- innermostContainer = null,- innermostIndex = null;-- // get innermost container that intersects with item- for (i = this.containers.length - 1; i >= 0; i--) {-- // never consider a container that's located within the item itself- if($.contains(this.currentItem[0], this.containers[i].element[0])) {- continue;- }-- if(this._intersectsWith(this.containers[i].containerCache)) {-- // if we've already found a container and it's more "inner" than this, then continue- if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {- continue;- }-- innermostContainer = this.containers[i];- innermostIndex = i;-- } else {- // container doesn't intersect. trigger "out" event if necessary- if(this.containers[i].containerCache.over) {- this.containers[i]._trigger("out", event, this._uiHash(this));- this.containers[i].containerCache.over = 0;- }- }-- }-- // if no intersecting containers found, return- if(!innermostContainer) {- return;- }-- // move the item into the container if it's not there already- if(this.containers.length === 1) {- this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));- this.containers[innermostIndex].containerCache.over = 1;- } else {-- //When entering a new container, we will find the item with the least distance and append our item near it- dist = 10000;- itemWithLeastDistance = null;- posProperty = this.containers[innermostIndex].floating ? "left" : "top";- sizeProperty = this.containers[innermostIndex].floating ? "width" : "height";- base = this.positionAbs[posProperty] + this.offset.click[posProperty];- for (j = this.items.length - 1; j >= 0; j--) {- if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {- continue;- }- if(this.items[j].item[0] === this.currentItem[0]) {- continue;- }- cur = this.items[j].item.offset()[posProperty];- nearBottom = false;- if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){- nearBottom = true;- cur += this.items[j][sizeProperty];- }-- if(Math.abs(cur - base) < dist) {- dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];- this.direction = nearBottom ? "up": "down";- }- }-- //Check if dropOnEmpty is enabled- if(!itemWithLeastDistance && !this.options.dropOnEmpty) {- return;- }-- this.currentContainer = this.containers[innermostIndex];- itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);- this._trigger("change", event, this._uiHash());- this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));-- //Update the placeholder- this.options.placeholder.update(this.currentContainer, this.placeholder);-- this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));- this.containers[innermostIndex].containerCache.over = 1;- }--- },-- _createHelper: function(event) {-- var o = this.options,- helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);-- //Add the helper to the DOM if that didn't happen already- if(!helper.parents("body").length) {- $(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);- }-- if(helper[0] === this.currentItem[0]) {- this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };- }-- if(!helper[0].style.width || o.forceHelperSize) {- helper.width(this.currentItem.width());- }- if(!helper[0].style.height || o.forceHelperSize) {- helper.height(this.currentItem.height());- }-- return helper;-- },-- _adjustOffsetFromHelper: function(obj) {- if (typeof obj === "string") {- obj = obj.split(" ");- }- if ($.isArray(obj)) {- obj = {left: +obj[0], top: +obj[1] || 0};- }- if ("left" in obj) {- this.offset.click.left = obj.left + this.margins.left;- }- if ("right" in obj) {- this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;- }- if ("top" in obj) {- this.offset.click.top = obj.top + this.margins.top;- }- if ("bottom" in obj) {- this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;- }- },-- _getParentOffset: function() {--- //Get the offsetParent and cache its position- this.offsetParent = this.helper.offsetParent();- var po = this.offsetParent.offset();-- // This is a special case where we need to modify a offset calculated on start, since the following happened:- // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent- // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that- // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag- if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {- po.left += this.scrollParent.scrollLeft();- po.top += this.scrollParent.scrollTop();- }-- // This needs to be actually done for all browsers, since pageX/pageY includes this information- // with an ugly IE fix- if( this.offsetParent[0] === document.body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {- po = { top: 0, left: 0 };- }-- return {- top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),- left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)- };-- },-- _getRelativeOffset: function() {-- if(this.cssPosition === "relative") {- var p = this.currentItem.position();- return {- top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),- left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()- };- } else {- return { top: 0, left: 0 };- }-- },-- _cacheMargins: function() {- this.margins = {- left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),- top: (parseInt(this.currentItem.css("marginTop"),10) || 0)- };- },-- _cacheHelperProportions: function() {- this.helperProportions = {- width: this.helper.outerWidth(),- height: this.helper.outerHeight()- };- },-- _setContainment: function() {-- var ce, co, over,- o = this.options;- if(o.containment === "parent") {- o.containment = this.helper[0].parentNode;- }- if(o.containment === "document" || o.containment === "window") {- this.containment = [- 0 - this.offset.relative.left - this.offset.parent.left,- 0 - this.offset.relative.top - this.offset.parent.top,- $(o.containment === "document" ? document : window).width() - this.helperProportions.width - this.margins.left,- ($(o.containment === "document" ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top- ];- }-- if(!(/^(document|window|parent)$/).test(o.containment)) {- ce = $(o.containment)[0];- co = $(o.containment).offset();- over = ($(ce).css("overflow") !== "hidden");-- this.containment = [- co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,- co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,- co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,- co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top- ];- }-- },-- _convertPositionTo: function(d, pos) {-- if(!pos) {- pos = this.position;- }- var mod = d === "absolute" ? 1 : -1,- scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,- scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);-- return {- top: (- pos.top + // The absolute mouse position- this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent- this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border)- ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)- ),- left: (- pos.left + // The absolute mouse position- this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent- this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border)- ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)- )- };-- },-- _generatePosition: function(event) {-- var top, left,- o = this.options,- pageX = event.pageX,- pageY = event.pageY,- scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);-- // This is another very weird special case that only happens for relative elements:- // 1. If the css position is relative- // 2. and the scroll parent is the document or similar to the offset parent- // we have to refresh the relative offset during the scroll so there are no jumps- if(this.cssPosition === "relative" && !(this.scrollParent[0] !== document && this.scrollParent[0] !== this.offsetParent[0])) {- this.offset.relative = this._getRelativeOffset();- }-- /*- * - Position constraining -- * Constrain the position to a mix of grid, containment.- */-- if(this.originalPosition) { //If we are not dragging yet, we won't check for options-- if(this.containment) {- if(event.pageX - this.offset.click.left < this.containment[0]) {- pageX = this.containment[0] + this.offset.click.left;- }- if(event.pageY - this.offset.click.top < this.containment[1]) {- pageY = this.containment[1] + this.offset.click.top;- }- if(event.pageX - this.offset.click.left > this.containment[2]) {- pageX = this.containment[2] + this.offset.click.left;- }- if(event.pageY - this.offset.click.top > this.containment[3]) {- pageY = this.containment[3] + this.offset.click.top;- }- }-- if(o.grid) {- top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];- pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;-- left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];- pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;- }-- }-- return {- top: (- pageY - // The absolute mouse position- this.offset.click.top - // Click offset (relative to the element)- this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent- this.offset.parent.top + // The offsetParent's offset without borders (offset + border)- ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))- ),- left: (- pageX - // The absolute mouse position- this.offset.click.left - // Click offset (relative to the element)- this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent- this.offset.parent.left + // The offsetParent's offset without borders (offset + border)- ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))- )- };-- },-- _rearrange: function(event, i, a, hardRefresh) {-- a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling));-- //Various things done here to improve the performance:- // 1. we create a setTimeout, that calls refreshPositions- // 2. on the instance, we have a counter variable, that get's higher after every append- // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same- // 4. this lets only the last addition to the timeout stack through- this.counter = this.counter ? ++this.counter : 1;- var counter = this.counter;-- this._delay(function() {- if(counter === this.counter) {- this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove- }- });-- },-- _clear: function(event, noPropagation) {-- this.reverting = false;- // We delay all events that have to be triggered to after the point where the placeholder has been removed and- // everything else normalized again- var i,- delayedTriggers = [];-- // We first have to update the dom position of the actual currentItem- // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)- if(!this._noFinalSort && this.currentItem.parent().length) {- this.placeholder.before(this.currentItem);- }- this._noFinalSort = null;-- if(this.helper[0] === this.currentItem[0]) {- for(i in this._storedCSS) {- if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {- this._storedCSS[i] = "";- }- }- this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");- } else {- this.currentItem.show();- }-- if(this.fromOutside && !noPropagation) {- delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });- }- if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {- delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed- }-- // Check if the items Container has Changed and trigger appropriate- // events.- if (this !== this.currentContainer) {- if(!noPropagation) {- delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });- delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.currentContainer));- delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.currentContainer));- }- }--- //Post events to containers- for (i = this.containers.length - 1; i >= 0; i--){- if(!noPropagation) {- delayedTriggers.push((function(c) { return function(event) { c._trigger("deactivate", event, this._uiHash(this)); }; }).call(this, this.containers[i]));- }- if(this.containers[i].containerCache.over) {- delayedTriggers.push((function(c) { return function(event) { c._trigger("out", event, this._uiHash(this)); }; }).call(this, this.containers[i]));- this.containers[i].containerCache.over = 0;- }- }-- //Do what was originally in plugins- if(this._storedCursor) {- $("body").css("cursor", this._storedCursor);- }- if(this._storedOpacity) {- this.helper.css("opacity", this._storedOpacity);- }- if(this._storedZIndex) {- this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);- }-- this.dragging = false;- if(this.cancelHelperRemoval) {- if(!noPropagation) {- this._trigger("beforeStop", event, this._uiHash());- for (i=0; i < delayedTriggers.length; i++) {- delayedTriggers[i].call(this, event);- } //Trigger all delayed events- this._trigger("stop", event, this._uiHash());- }-- this.fromOutside = false;- return false;- }-- if(!noPropagation) {- this._trigger("beforeStop", event, this._uiHash());- }-- //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!- this.placeholder[0].parentNode.removeChild(this.placeholder[0]);-- if(this.helper[0] !== this.currentItem[0]) {- this.helper.remove();- }- this.helper = null;-- if(!noPropagation) {- for (i=0; i < delayedTriggers.length; i++) {- delayedTriggers[i].call(this, event);- } //Trigger all delayed events- this._trigger("stop", event, this._uiHash());- }-- this.fromOutside = false;- return true;-- },-- _trigger: function() {- if ($.Widget.prototype._trigger.apply(this, arguments) === false) {- this.cancel();- }- },-- _uiHash: function(_inst) {- var inst = _inst || this;- return {- helper: inst.helper,- placeholder: inst.placeholder || $([]),- position: inst.position,- originalPosition: inst.originalPosition,- offset: inst.positionAbs,- item: inst.currentItem,- sender: _inst ? _inst.element : null- };- }--});--})(jQuery);
− static/jquery.ui.widget.js
@@ -1,521 +0,0 @@-/*!- * jQuery UI Widget 1.10.1- * http://jqueryui.com- *- * Copyright 2013 jQuery Foundation and other contributors- * Released under the MIT license.- * http://jquery.org/license- *- * http://api.jqueryui.com/jQuery.widget/- */-(function( $, undefined ) {--var uuid = 0,- slice = Array.prototype.slice,- _cleanData = $.cleanData;-$.cleanData = function( elems ) {- for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {- try {- $( elem ).triggerHandler( "remove" );- // http://bugs.jquery.com/ticket/8235- } catch( e ) {}- }- _cleanData( elems );-};--$.widget = function( name, base, prototype ) {- var fullName, existingConstructor, constructor, basePrototype,- // proxiedPrototype allows the provided prototype to remain unmodified- // so that it can be used as a mixin for multiple widgets (#8876)- proxiedPrototype = {},- namespace = name.split( "." )[ 0 ];-- name = name.split( "." )[ 1 ];- fullName = namespace + "-" + name;-- if ( !prototype ) {- prototype = base;- base = $.Widget;- }-- // create selector for plugin- $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {- return !!$.data( elem, fullName );- };-- $[ namespace ] = $[ namespace ] || {};- existingConstructor = $[ namespace ][ name ];- constructor = $[ namespace ][ name ] = function( options, element ) {- // allow instantiation without "new" keyword- if ( !this._createWidget ) {- return new constructor( options, element );- }-- // allow instantiation without initializing for simple inheritance- // must use "new" keyword (the code above always passes args)- if ( arguments.length ) {- this._createWidget( options, element );- }- };- // extend with the existing constructor to carry over any static properties- $.extend( constructor, existingConstructor, {- version: prototype.version,- // copy the object used to create the prototype in case we need to- // redefine the widget later- _proto: $.extend( {}, prototype ),- // track widgets that inherit from this widget in case this widget is- // redefined after a widget inherits from it- _childConstructors: []- });-- basePrototype = new base();- // we need to make the options hash a property directly on the new instance- // otherwise we'll modify the options hash on the prototype that we're- // inheriting from- basePrototype.options = $.widget.extend( {}, basePrototype.options );- $.each( prototype, function( prop, value ) {- if ( !$.isFunction( value ) ) {- proxiedPrototype[ prop ] = value;- return;- }- proxiedPrototype[ prop ] = (function() {- var _super = function() {- return base.prototype[ prop ].apply( this, arguments );- },- _superApply = function( args ) {- return base.prototype[ prop ].apply( this, args );- };- return function() {- var __super = this._super,- __superApply = this._superApply,- returnValue;-- this._super = _super;- this._superApply = _superApply;-- returnValue = value.apply( this, arguments );-- this._super = __super;- this._superApply = __superApply;-- return returnValue;- };- })();- });- constructor.prototype = $.widget.extend( basePrototype, {- // TODO: remove support for widgetEventPrefix- // always use the name + a colon as the prefix, e.g., draggable:start- // don't prefix for widgets that aren't DOM-based- widgetEventPrefix: existingConstructor ? basePrototype.widgetEventPrefix : name- }, proxiedPrototype, {- constructor: constructor,- namespace: namespace,- widgetName: name,- widgetFullName: fullName- });-- // If this widget is being redefined then we need to find all widgets that- // are inheriting from it and redefine all of them so that they inherit from- // the new version of this widget. We're essentially trying to replace one- // level in the prototype chain.- if ( existingConstructor ) {- $.each( existingConstructor._childConstructors, function( i, child ) {- var childPrototype = child.prototype;-- // redefine the child widget using the same prototype that was- // originally used, but inherit from the new version of the base- $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );- });- // remove the list of existing child constructors from the old constructor- // so the old child constructors can be garbage collected- delete existingConstructor._childConstructors;- } else {- base._childConstructors.push( constructor );- }-- $.widget.bridge( name, constructor );-};--$.widget.extend = function( target ) {- var input = slice.call( arguments, 1 ),- inputIndex = 0,- inputLength = input.length,- key,- value;- for ( ; inputIndex < inputLength; inputIndex++ ) {- for ( key in input[ inputIndex ] ) {- value = input[ inputIndex ][ key ];- if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {- // Clone objects- if ( $.isPlainObject( value ) ) {- target[ key ] = $.isPlainObject( target[ key ] ) ?- $.widget.extend( {}, target[ key ], value ) :- // Don't extend strings, arrays, etc. with objects- $.widget.extend( {}, value );- // Copy everything else by reference- } else {- target[ key ] = value;- }- }- }- }- return target;-};--$.widget.bridge = function( name, object ) {- var fullName = object.prototype.widgetFullName || name;- $.fn[ name ] = function( options ) {- var isMethodCall = typeof options === "string",- args = slice.call( arguments, 1 ),- returnValue = this;-- // allow multiple hashes to be passed on init- options = !isMethodCall && args.length ?- $.widget.extend.apply( null, [ options ].concat(args) ) :- options;-- if ( isMethodCall ) {- this.each(function() {- var methodValue,- instance = $.data( this, fullName );- if ( !instance ) {- return $.error( "cannot call methods on " + name + " prior to initialization; " +- "attempted to call method '" + options + "'" );- }- if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {- return $.error( "no such method '" + options + "' for " + name + " widget instance" );- }- methodValue = instance[ options ].apply( instance, args );- if ( methodValue !== instance && methodValue !== undefined ) {- returnValue = methodValue && methodValue.jquery ?- returnValue.pushStack( methodValue.get() ) :- methodValue;- return false;- }- });- } else {- this.each(function() {- var instance = $.data( this, fullName );- if ( instance ) {- instance.option( options || {} )._init();- } else {- $.data( this, fullName, new object( options, this ) );- }- });- }-- return returnValue;- };-};--$.Widget = function( /* options, element */ ) {};-$.Widget._childConstructors = [];--$.Widget.prototype = {- widgetName: "widget",- widgetEventPrefix: "",- defaultElement: "<div>",- options: {- disabled: false,-- // callbacks- create: null- },- _createWidget: function( options, element ) {- element = $( element || this.defaultElement || this )[ 0 ];- this.element = $( element );- this.uuid = uuid++;- this.eventNamespace = "." + this.widgetName + this.uuid;- this.options = $.widget.extend( {},- this.options,- this._getCreateOptions(),- options );-- this.bindings = $();- this.hoverable = $();- this.focusable = $();-- if ( element !== this ) {- $.data( element, this.widgetFullName, this );- this._on( true, this.element, {- remove: function( event ) {- if ( event.target === element ) {- this.destroy();- }- }- });- this.document = $( element.style ?- // element within the document- element.ownerDocument :- // element is window or document- element.document || element );- this.window = $( this.document[0].defaultView || this.document[0].parentWindow );- }-- this._create();- this._trigger( "create", null, this._getCreateEventData() );- this._init();- },- _getCreateOptions: $.noop,- _getCreateEventData: $.noop,- _create: $.noop,- _init: $.noop,-- destroy: function() {- this._destroy();- // we can probably remove the unbind calls in 2.0- // all event bindings should go through this._on()- this.element- .unbind( this.eventNamespace )- // 1.9 BC for #7810- // TODO remove dual storage- .removeData( this.widgetName )- .removeData( this.widgetFullName )- // support: jquery <1.6.3- // http://bugs.jquery.com/ticket/9413- .removeData( $.camelCase( this.widgetFullName ) );- this.widget()- .unbind( this.eventNamespace )- .removeAttr( "aria-disabled" )- .removeClass(- this.widgetFullName + "-disabled " +- "ui-state-disabled" );-- // clean up events and states- this.bindings.unbind( this.eventNamespace );- this.hoverable.removeClass( "ui-state-hover" );- this.focusable.removeClass( "ui-state-focus" );- },- _destroy: $.noop,-- widget: function() {- return this.element;- },-- option: function( key, value ) {- var options = key,- parts,- curOption,- i;-- if ( arguments.length === 0 ) {- // don't return a reference to the internal hash- return $.widget.extend( {}, this.options );- }-- if ( typeof key === "string" ) {- // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }- options = {};- parts = key.split( "." );- key = parts.shift();- if ( parts.length ) {- curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );- for ( i = 0; i < parts.length - 1; i++ ) {- curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};- curOption = curOption[ parts[ i ] ];- }- key = parts.pop();- if ( value === undefined ) {- return curOption[ key ] === undefined ? null : curOption[ key ];- }- curOption[ key ] = value;- } else {- if ( value === undefined ) {- return this.options[ key ] === undefined ? null : this.options[ key ];- }- options[ key ] = value;- }- }-- this._setOptions( options );-- return this;- },- _setOptions: function( options ) {- var key;-- for ( key in options ) {- this._setOption( key, options[ key ] );- }-- return this;- },- _setOption: function( key, value ) {- this.options[ key ] = value;-- if ( key === "disabled" ) {- this.widget()- .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )- .attr( "aria-disabled", value );- this.hoverable.removeClass( "ui-state-hover" );- this.focusable.removeClass( "ui-state-focus" );- }-- return this;- },-- enable: function() {- return this._setOption( "disabled", false );- },- disable: function() {- return this._setOption( "disabled", true );- },-- _on: function( suppressDisabledCheck, element, handlers ) {- var delegateElement,- instance = this;-- // no suppressDisabledCheck flag, shuffle arguments- if ( typeof suppressDisabledCheck !== "boolean" ) {- handlers = element;- element = suppressDisabledCheck;- suppressDisabledCheck = false;- }-- // no element argument, shuffle and use this.element- if ( !handlers ) {- handlers = element;- element = this.element;- delegateElement = this.widget();- } else {- // accept selectors, DOM elements- element = delegateElement = $( element );- this.bindings = this.bindings.add( element );- }-- $.each( handlers, function( event, handler ) {- function handlerProxy() {- // allow widgets to customize the disabled handling- // - disabled as an array instead of boolean- // - disabled class as method for disabling individual parts- if ( !suppressDisabledCheck &&- ( instance.options.disabled === true ||- $( this ).hasClass( "ui-state-disabled" ) ) ) {- return;- }- return ( typeof handler === "string" ? instance[ handler ] : handler )- .apply( instance, arguments );- }-- // copy the guid so direct unbinding works- if ( typeof handler !== "string" ) {- handlerProxy.guid = handler.guid =- handler.guid || handlerProxy.guid || $.guid++;- }-- var match = event.match( /^(\w+)\s*(.*)$/ ),- eventName = match[1] + instance.eventNamespace,- selector = match[2];- if ( selector ) {- delegateElement.delegate( selector, eventName, handlerProxy );- } else {- element.bind( eventName, handlerProxy );- }- });- },-- _off: function( element, eventName ) {- eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;- element.unbind( eventName ).undelegate( eventName );- },-- _delay: function( handler, delay ) {- function handlerProxy() {- return ( typeof handler === "string" ? instance[ handler ] : handler )- .apply( instance, arguments );- }- var instance = this;- return setTimeout( handlerProxy, delay || 0 );- },-- _hoverable: function( element ) {- this.hoverable = this.hoverable.add( element );- this._on( element, {- mouseenter: function( event ) {- $( event.currentTarget ).addClass( "ui-state-hover" );- },- mouseleave: function( event ) {- $( event.currentTarget ).removeClass( "ui-state-hover" );- }- });- },-- _focusable: function( element ) {- this.focusable = this.focusable.add( element );- this._on( element, {- focusin: function( event ) {- $( event.currentTarget ).addClass( "ui-state-focus" );- },- focusout: function( event ) {- $( event.currentTarget ).removeClass( "ui-state-focus" );- }- });- },-- _trigger: function( type, event, data ) {- var prop, orig,- callback = this.options[ type ];-- data = data || {};- event = $.Event( event );- event.type = ( type === this.widgetEventPrefix ?- type :- this.widgetEventPrefix + type ).toLowerCase();- // the original event may come from any element- // so we need to reset the target on the new event- event.target = this.element[ 0 ];-- // copy original event properties over to the new event- orig = event.originalEvent;- if ( orig ) {- for ( prop in orig ) {- if ( !( prop in event ) ) {- event[ prop ] = orig[ prop ];- }- }- }-- this.element.trigger( event, data );- return !( $.isFunction( callback ) &&- callback.apply( this.element[0], [ event ].concat( data ) ) === false ||- event.isDefaultPrevented() );- }-};--$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {- $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {- if ( typeof options === "string" ) {- options = { effect: options };- }- var hasOptions,- effectName = !options ?- method :- options === true || typeof options === "number" ?- defaultEffect :- options.effect || defaultEffect;- options = options || {};- if ( typeof options === "number" ) {- options = { duration: options };- }- hasOptions = !$.isEmptyObject( options );- options.complete = callback;- if ( options.delay ) {- element.delay( options.delay );- }- if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {- element[ method ]( options );- } else if ( effectName !== method && element[ effectName ] ) {- element[ effectName ]( options.duration, options.easing, callback );- } else {- element.queue(function( next ) {- $( this )[ method ]();- if ( callback ) {- callback.call( element[ 0 ] );- }- next();- });- }- };-});--})( jQuery );
+ static/js/bootstrap.js view
@@ -0,0 +1,1951 @@+/*!+ * Bootstrap v3.1.1 (http://getbootstrap.com)+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ */++if (typeof jQuery === 'undefined') { throw new Error('Bootstrap\'s JavaScript requires jQuery') }++/* ========================================================================+ * Bootstrap: transition.js v3.1.1+ * http://getbootstrap.com/javascript/#transitions+ * ========================================================================+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ * ======================================================================== */++++function ($) {+ 'use strict';++ // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)+ // ============================================================++ function transitionEnd() {+ var el = document.createElement('bootstrap')++ var transEndEventNames = {+ 'WebkitTransition' : 'webkitTransitionEnd',+ 'MozTransition' : 'transitionend',+ 'OTransition' : 'oTransitionEnd otransitionend',+ 'transition' : 'transitionend'+ }++ for (var name in transEndEventNames) {+ if (el.style[name] !== undefined) {+ return { end: transEndEventNames[name] }+ }+ }++ return false // explicit for ie8 ( ._.)+ }++ // http://blog.alexmaccaw.com/css-transitions+ $.fn.emulateTransitionEnd = function (duration) {+ var called = false, $el = this+ $(this).one($.support.transition.end, function () { called = true })+ var callback = function () { if (!called) $($el).trigger($.support.transition.end) }+ setTimeout(callback, duration)+ return this+ }++ $(function () {+ $.support.transition = transitionEnd()+ })++}(jQuery);++/* ========================================================================+ * Bootstrap: alert.js v3.1.1+ * http://getbootstrap.com/javascript/#alerts+ * ========================================================================+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ * ======================================================================== */++++function ($) {+ 'use strict';++ // ALERT CLASS DEFINITION+ // ======================++ var dismiss = '[data-dismiss="alert"]'+ var Alert = function (el) {+ $(el).on('click', dismiss, this.close)+ }++ Alert.prototype.close = function (e) {+ var $this = $(this)+ var selector = $this.attr('data-target')++ if (!selector) {+ selector = $this.attr('href')+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7+ }++ var $parent = $(selector)++ if (e) e.preventDefault()++ if (!$parent.length) {+ $parent = $this.hasClass('alert') ? $this : $this.parent()+ }++ $parent.trigger(e = $.Event('close.bs.alert'))++ if (e.isDefaultPrevented()) return++ $parent.removeClass('in')++ function removeElement() {+ $parent.trigger('closed.bs.alert').remove()+ }++ $.support.transition && $parent.hasClass('fade') ?+ $parent+ .one($.support.transition.end, removeElement)+ .emulateTransitionEnd(150) :+ removeElement()+ }+++ // ALERT PLUGIN DEFINITION+ // =======================++ var old = $.fn.alert++ $.fn.alert = function (option) {+ return this.each(function () {+ var $this = $(this)+ var data = $this.data('bs.alert')++ if (!data) $this.data('bs.alert', (data = new Alert(this)))+ if (typeof option == 'string') data[option].call($this)+ })+ }++ $.fn.alert.Constructor = Alert+++ // ALERT NO CONFLICT+ // =================++ $.fn.alert.noConflict = function () {+ $.fn.alert = old+ return this+ }+++ // ALERT DATA-API+ // ==============++ $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)++}(jQuery);++/* ========================================================================+ * Bootstrap: button.js v3.1.1+ * http://getbootstrap.com/javascript/#buttons+ * ========================================================================+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ * ======================================================================== */++++function ($) {+ 'use strict';++ // BUTTON PUBLIC CLASS DEFINITION+ // ==============================++ var Button = function (element, options) {+ this.$element = $(element)+ this.options = $.extend({}, Button.DEFAULTS, options)+ this.isLoading = false+ }++ Button.DEFAULTS = {+ loadingText: 'loading...'+ }++ Button.prototype.setState = function (state) {+ var d = 'disabled'+ var $el = this.$element+ var val = $el.is('input') ? 'val' : 'html'+ var data = $el.data()++ state = state + 'Text'++ if (!data.resetText) $el.data('resetText', $el[val]())++ $el[val](data[state] || this.options[state])++ // push to event loop to allow forms to submit+ setTimeout($.proxy(function () {+ if (state == 'loadingText') {+ this.isLoading = true+ $el.addClass(d).attr(d, d)+ } else if (this.isLoading) {+ this.isLoading = false+ $el.removeClass(d).removeAttr(d)+ }+ }, this), 0)+ }++ Button.prototype.toggle = function () {+ var changed = true+ var $parent = this.$element.closest('[data-toggle="buttons"]')++ if ($parent.length) {+ var $input = this.$element.find('input')+ if ($input.prop('type') == 'radio') {+ if ($input.prop('checked') && this.$element.hasClass('active')) changed = false+ else $parent.find('.active').removeClass('active')+ }+ if (changed) $input.prop('checked', !this.$element.hasClass('active')).trigger('change')+ }++ if (changed) this.$element.toggleClass('active')+ }+++ // BUTTON PLUGIN DEFINITION+ // ========================++ var old = $.fn.button++ $.fn.button = function (option) {+ return this.each(function () {+ var $this = $(this)+ var data = $this.data('bs.button')+ var options = typeof option == 'object' && option++ if (!data) $this.data('bs.button', (data = new Button(this, options)))++ if (option == 'toggle') data.toggle()+ else if (option) data.setState(option)+ })+ }++ $.fn.button.Constructor = Button+++ // BUTTON NO CONFLICT+ // ==================++ $.fn.button.noConflict = function () {+ $.fn.button = old+ return this+ }+++ // BUTTON DATA-API+ // ===============++ $(document).on('click.bs.button.data-api', '[data-toggle^=button]', function (e) {+ var $btn = $(e.target)+ if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')+ $btn.button('toggle')+ e.preventDefault()+ })++}(jQuery);++/* ========================================================================+ * Bootstrap: carousel.js v3.1.1+ * http://getbootstrap.com/javascript/#carousel+ * ========================================================================+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ * ======================================================================== */++++function ($) {+ 'use strict';++ // CAROUSEL CLASS DEFINITION+ // =========================++ var Carousel = function (element, options) {+ this.$element = $(element)+ this.$indicators = this.$element.find('.carousel-indicators')+ this.options = options+ this.paused =+ this.sliding =+ this.interval =+ this.$active =+ this.$items = null++ this.options.pause == 'hover' && this.$element+ .on('mouseenter', $.proxy(this.pause, this))+ .on('mouseleave', $.proxy(this.cycle, this))+ }++ Carousel.DEFAULTS = {+ interval: 5000,+ pause: 'hover',+ wrap: true+ }++ Carousel.prototype.cycle = function (e) {+ e || (this.paused = false)++ this.interval && clearInterval(this.interval)++ this.options.interval+ && !this.paused+ && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))++ return this+ }++ Carousel.prototype.getActiveIndex = function () {+ this.$active = this.$element.find('.item.active')+ this.$items = this.$active.parent().children()++ return this.$items.index(this.$active)+ }++ Carousel.prototype.to = function (pos) {+ var that = this+ var activeIndex = this.getActiveIndex()++ if (pos > (this.$items.length - 1) || pos < 0) return++ if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) })+ if (activeIndex == pos) return this.pause().cycle()++ return this.slide(pos > activeIndex ? 'next' : 'prev', $(this.$items[pos]))+ }++ Carousel.prototype.pause = function (e) {+ e || (this.paused = true)++ if (this.$element.find('.next, .prev').length && $.support.transition) {+ this.$element.trigger($.support.transition.end)+ this.cycle(true)+ }++ this.interval = clearInterval(this.interval)++ return this+ }++ Carousel.prototype.next = function () {+ if (this.sliding) return+ return this.slide('next')+ }++ Carousel.prototype.prev = function () {+ if (this.sliding) return+ return this.slide('prev')+ }++ Carousel.prototype.slide = function (type, next) {+ var $active = this.$element.find('.item.active')+ var $next = next || $active[type]()+ var isCycling = this.interval+ var direction = type == 'next' ? 'left' : 'right'+ var fallback = type == 'next' ? 'first' : 'last'+ var that = this++ if (!$next.length) {+ if (!this.options.wrap) return+ $next = this.$element.find('.item')[fallback]()+ }++ if ($next.hasClass('active')) return this.sliding = false++ var e = $.Event('slide.bs.carousel', { relatedTarget: $next[0], direction: direction })+ this.$element.trigger(e)+ if (e.isDefaultPrevented()) return++ this.sliding = true++ isCycling && this.pause()++ if (this.$indicators.length) {+ this.$indicators.find('.active').removeClass('active')+ this.$element.one('slid.bs.carousel', function () {+ var $nextIndicator = $(that.$indicators.children()[that.getActiveIndex()])+ $nextIndicator && $nextIndicator.addClass('active')+ })+ }++ if ($.support.transition && this.$element.hasClass('slide')) {+ $next.addClass(type)+ $next[0].offsetWidth // force reflow+ $active.addClass(direction)+ $next.addClass(direction)+ $active+ .one($.support.transition.end, function () {+ $next.removeClass([type, direction].join(' ')).addClass('active')+ $active.removeClass(['active', direction].join(' '))+ that.sliding = false+ setTimeout(function () { that.$element.trigger('slid.bs.carousel') }, 0)+ })+ .emulateTransitionEnd($active.css('transition-duration').slice(0, -1) * 1000)+ } else {+ $active.removeClass('active')+ $next.addClass('active')+ this.sliding = false+ this.$element.trigger('slid.bs.carousel')+ }++ isCycling && this.cycle()++ return this+ }+++ // CAROUSEL PLUGIN DEFINITION+ // ==========================++ var old = $.fn.carousel++ $.fn.carousel = function (option) {+ return this.each(function () {+ var $this = $(this)+ var data = $this.data('bs.carousel')+ var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)+ var action = typeof option == 'string' ? option : options.slide++ if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))+ if (typeof option == 'number') data.to(option)+ else if (action) data[action]()+ else if (options.interval) data.pause().cycle()+ })+ }++ $.fn.carousel.Constructor = Carousel+++ // CAROUSEL NO CONFLICT+ // ====================++ $.fn.carousel.noConflict = function () {+ $.fn.carousel = old+ return this+ }+++ // CAROUSEL DATA-API+ // =================++ $(document).on('click.bs.carousel.data-api', '[data-slide], [data-slide-to]', function (e) {+ var $this = $(this), href+ var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7+ var options = $.extend({}, $target.data(), $this.data())+ var slideIndex = $this.attr('data-slide-to')+ if (slideIndex) options.interval = false++ $target.carousel(options)++ if (slideIndex = $this.attr('data-slide-to')) {+ $target.data('bs.carousel').to(slideIndex)+ }++ e.preventDefault()+ })++ $(window).on('load', function () {+ $('[data-ride="carousel"]').each(function () {+ var $carousel = $(this)+ $carousel.carousel($carousel.data())+ })+ })++}(jQuery);++/* ========================================================================+ * Bootstrap: collapse.js v3.1.1+ * http://getbootstrap.com/javascript/#collapse+ * ========================================================================+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ * ======================================================================== */++++function ($) {+ 'use strict';++ // COLLAPSE PUBLIC CLASS DEFINITION+ // ================================++ var Collapse = function (element, options) {+ this.$element = $(element)+ this.options = $.extend({}, Collapse.DEFAULTS, options)+ this.transitioning = null++ if (this.options.parent) this.$parent = $(this.options.parent)+ if (this.options.toggle) this.toggle()+ }++ Collapse.DEFAULTS = {+ toggle: true+ }++ Collapse.prototype.dimension = function () {+ var hasWidth = this.$element.hasClass('width')+ return hasWidth ? 'width' : 'height'+ }++ Collapse.prototype.show = function () {+ if (this.transitioning || this.$element.hasClass('in')) return++ var startEvent = $.Event('show.bs.collapse')+ this.$element.trigger(startEvent)+ if (startEvent.isDefaultPrevented()) return++ var actives = this.$parent && this.$parent.find('> .panel > .in')++ if (actives && actives.length) {+ var hasData = actives.data('bs.collapse')+ if (hasData && hasData.transitioning) return+ actives.collapse('hide')+ hasData || actives.data('bs.collapse', null)+ }++ var dimension = this.dimension()++ this.$element+ .removeClass('collapse')+ .addClass('collapsing')+ [dimension](0)++ this.transitioning = 1++ var complete = function () {+ this.$element+ .removeClass('collapsing')+ .addClass('collapse in')+ [dimension]('auto')+ this.transitioning = 0+ this.$element.trigger('shown.bs.collapse')+ }++ if (!$.support.transition) return complete.call(this)++ var scrollSize = $.camelCase(['scroll', dimension].join('-'))++ this.$element+ .one($.support.transition.end, $.proxy(complete, this))+ .emulateTransitionEnd(350)+ [dimension](this.$element[0][scrollSize])+ }++ Collapse.prototype.hide = function () {+ if (this.transitioning || !this.$element.hasClass('in')) return++ var startEvent = $.Event('hide.bs.collapse')+ this.$element.trigger(startEvent)+ if (startEvent.isDefaultPrevented()) return++ var dimension = this.dimension()++ this.$element+ [dimension](this.$element[dimension]())+ [0].offsetHeight++ this.$element+ .addClass('collapsing')+ .removeClass('collapse')+ .removeClass('in')++ this.transitioning = 1++ var complete = function () {+ this.transitioning = 0+ this.$element+ .trigger('hidden.bs.collapse')+ .removeClass('collapsing')+ .addClass('collapse')+ }++ if (!$.support.transition) return complete.call(this)++ this.$element+ [dimension](0)+ .one($.support.transition.end, $.proxy(complete, this))+ .emulateTransitionEnd(350)+ }++ Collapse.prototype.toggle = function () {+ this[this.$element.hasClass('in') ? 'hide' : 'show']()+ }+++ // COLLAPSE PLUGIN DEFINITION+ // ==========================++ var old = $.fn.collapse++ $.fn.collapse = function (option) {+ return this.each(function () {+ var $this = $(this)+ var data = $this.data('bs.collapse')+ var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)++ if (!data && options.toggle && option == 'show') option = !option+ if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))+ if (typeof option == 'string') data[option]()+ })+ }++ $.fn.collapse.Constructor = Collapse+++ // COLLAPSE NO CONFLICT+ // ====================++ $.fn.collapse.noConflict = function () {+ $.fn.collapse = old+ return this+ }+++ // COLLAPSE DATA-API+ // =================++ $(document).on('click.bs.collapse.data-api', '[data-toggle=collapse]', function (e) {+ var $this = $(this), href+ var target = $this.attr('data-target')+ || e.preventDefault()+ || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') //strip for ie7+ var $target = $(target)+ var data = $target.data('bs.collapse')+ var option = data ? 'toggle' : $this.data()+ var parent = $this.attr('data-parent')+ var $parent = parent && $(parent)++ if (!data || !data.transitioning) {+ if ($parent) $parent.find('[data-toggle=collapse][data-parent="' + parent + '"]').not($this).addClass('collapsed')+ $this[$target.hasClass('in') ? 'addClass' : 'removeClass']('collapsed')+ }++ $target.collapse(option)+ })++}(jQuery);++/* ========================================================================+ * Bootstrap: dropdown.js v3.1.1+ * http://getbootstrap.com/javascript/#dropdowns+ * ========================================================================+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ * ======================================================================== */++++function ($) {+ 'use strict';++ // DROPDOWN CLASS DEFINITION+ // =========================++ var backdrop = '.dropdown-backdrop'+ var toggle = '[data-toggle=dropdown]'+ var Dropdown = function (element) {+ $(element).on('click.bs.dropdown', this.toggle)+ }++ Dropdown.prototype.toggle = function (e) {+ var $this = $(this)++ if ($this.is('.disabled, :disabled')) return++ var $parent = getParent($this)+ var isActive = $parent.hasClass('open')++ clearMenus()++ if (!isActive) {+ if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {+ // if mobile we use a backdrop because click events don't delegate+ $('<div class="dropdown-backdrop"/>').insertAfter($(this)).on('click', clearMenus)+ }++ var relatedTarget = { relatedTarget: this }+ $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))++ if (e.isDefaultPrevented()) return++ $parent+ .toggleClass('open')+ .trigger('shown.bs.dropdown', relatedTarget)++ $this.focus()+ }++ return false+ }++ Dropdown.prototype.keydown = function (e) {+ if (!/(38|40|27)/.test(e.keyCode)) return++ var $this = $(this)++ e.preventDefault()+ e.stopPropagation()++ if ($this.is('.disabled, :disabled')) return++ var $parent = getParent($this)+ var isActive = $parent.hasClass('open')++ if (!isActive || (isActive && e.keyCode == 27)) {+ if (e.which == 27) $parent.find(toggle).focus()+ return $this.click()+ }++ var desc = ' li:not(.divider):visible a'+ var $items = $parent.find('[role=menu]' + desc + ', [role=listbox]' + desc)++ if (!$items.length) return++ var index = $items.index($items.filter(':focus'))++ if (e.keyCode == 38 && index > 0) index-- // up+ if (e.keyCode == 40 && index < $items.length - 1) index++ // down+ if (!~index) index = 0++ $items.eq(index).focus()+ }++ function clearMenus(e) {+ $(backdrop).remove()+ $(toggle).each(function () {+ var $parent = getParent($(this))+ var relatedTarget = { relatedTarget: this }+ if (!$parent.hasClass('open')) return+ $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))+ if (e.isDefaultPrevented()) return+ $parent.removeClass('open').trigger('hidden.bs.dropdown', relatedTarget)+ })+ }++ function getParent($this) {+ var selector = $this.attr('data-target')++ if (!selector) {+ selector = $this.attr('href')+ selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7+ }++ var $parent = selector && $(selector)++ return $parent && $parent.length ? $parent : $this.parent()+ }+++ // DROPDOWN PLUGIN DEFINITION+ // ==========================++ var old = $.fn.dropdown++ $.fn.dropdown = function (option) {+ return this.each(function () {+ var $this = $(this)+ var data = $this.data('bs.dropdown')++ if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))+ if (typeof option == 'string') data[option].call($this)+ })+ }++ $.fn.dropdown.Constructor = Dropdown+++ // DROPDOWN NO CONFLICT+ // ====================++ $.fn.dropdown.noConflict = function () {+ $.fn.dropdown = old+ return this+ }+++ // APPLY TO STANDARD DROPDOWN ELEMENTS+ // ===================================++ $(document)+ .on('click.bs.dropdown.data-api', clearMenus)+ .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })+ .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)+ .on('keydown.bs.dropdown.data-api', toggle + ', [role=menu], [role=listbox]', Dropdown.prototype.keydown)++}(jQuery);++/* ========================================================================+ * Bootstrap: modal.js v3.1.1+ * http://getbootstrap.com/javascript/#modals+ * ========================================================================+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ * ======================================================================== */++++function ($) {+ 'use strict';++ // MODAL CLASS DEFINITION+ // ======================++ var Modal = function (element, options) {+ this.options = options+ this.$element = $(element)+ this.$backdrop =+ this.isShown = null++ if (this.options.remote) {+ this.$element+ .find('.modal-content')+ .load(this.options.remote, $.proxy(function () {+ this.$element.trigger('loaded.bs.modal')+ }, this))+ }+ }++ Modal.DEFAULTS = {+ backdrop: true,+ keyboard: true,+ show: true+ }++ Modal.prototype.toggle = function (_relatedTarget) {+ return this[!this.isShown ? 'show' : 'hide'](_relatedTarget)+ }++ Modal.prototype.show = function (_relatedTarget) {+ var that = this+ var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })++ this.$element.trigger(e)++ if (this.isShown || e.isDefaultPrevented()) return++ this.isShown = true++ this.escape()++ this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))++ this.backdrop(function () {+ var transition = $.support.transition && that.$element.hasClass('fade')++ if (!that.$element.parent().length) {+ that.$element.appendTo(document.body) // don't move modals dom position+ }++ that.$element+ .show()+ .scrollTop(0)++ if (transition) {+ that.$element[0].offsetWidth // force reflow+ }++ that.$element+ .addClass('in')+ .attr('aria-hidden', false)++ that.enforceFocus()++ var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })++ transition ?+ that.$element.find('.modal-dialog') // wait for modal to slide in+ .one($.support.transition.end, function () {+ that.$element.focus().trigger(e)+ })+ .emulateTransitionEnd(300) :+ that.$element.focus().trigger(e)+ })+ }++ Modal.prototype.hide = function (e) {+ if (e) e.preventDefault()++ e = $.Event('hide.bs.modal')++ this.$element.trigger(e)++ if (!this.isShown || e.isDefaultPrevented()) return++ this.isShown = false++ this.escape()++ $(document).off('focusin.bs.modal')++ this.$element+ .removeClass('in')+ .attr('aria-hidden', true)+ .off('click.dismiss.bs.modal')++ $.support.transition && this.$element.hasClass('fade') ?+ this.$element+ .one($.support.transition.end, $.proxy(this.hideModal, this))+ .emulateTransitionEnd(300) :+ this.hideModal()+ }++ Modal.prototype.enforceFocus = function () {+ $(document)+ .off('focusin.bs.modal') // guard against infinite focus loop+ .on('focusin.bs.modal', $.proxy(function (e) {+ if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {+ this.$element.focus()+ }+ }, this))+ }++ Modal.prototype.escape = function () {+ if (this.isShown && this.options.keyboard) {+ this.$element.on('keyup.dismiss.bs.modal', $.proxy(function (e) {+ e.which == 27 && this.hide()+ }, this))+ } else if (!this.isShown) {+ this.$element.off('keyup.dismiss.bs.modal')+ }+ }++ Modal.prototype.hideModal = function () {+ var that = this+ this.$element.hide()+ this.backdrop(function () {+ that.removeBackdrop()+ that.$element.trigger('hidden.bs.modal')+ })+ }++ Modal.prototype.removeBackdrop = function () {+ this.$backdrop && this.$backdrop.remove()+ this.$backdrop = null+ }++ Modal.prototype.backdrop = function (callback) {+ var animate = this.$element.hasClass('fade') ? 'fade' : ''++ if (this.isShown && this.options.backdrop) {+ var doAnimate = $.support.transition && animate++ this.$backdrop = $('<div class="modal-backdrop ' + animate + '" />')+ .appendTo(document.body)++ this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {+ if (e.target !== e.currentTarget) return+ this.options.backdrop == 'static'+ ? this.$element[0].focus.call(this.$element[0])+ : this.hide.call(this)+ }, this))++ if (doAnimate) this.$backdrop[0].offsetWidth // force reflow++ this.$backdrop.addClass('in')++ if (!callback) return++ doAnimate ?+ this.$backdrop+ .one($.support.transition.end, callback)+ .emulateTransitionEnd(150) :+ callback()++ } else if (!this.isShown && this.$backdrop) {+ this.$backdrop.removeClass('in')++ $.support.transition && this.$element.hasClass('fade') ?+ this.$backdrop+ .one($.support.transition.end, callback)+ .emulateTransitionEnd(150) :+ callback()++ } else if (callback) {+ callback()+ }+ }+++ // MODAL PLUGIN DEFINITION+ // =======================++ var old = $.fn.modal++ $.fn.modal = function (option, _relatedTarget) {+ return this.each(function () {+ var $this = $(this)+ var data = $this.data('bs.modal')+ var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)++ if (!data) $this.data('bs.modal', (data = new Modal(this, options)))+ if (typeof option == 'string') data[option](_relatedTarget)+ else if (options.show) data.show(_relatedTarget)+ })+ }++ $.fn.modal.Constructor = Modal+++ // MODAL NO CONFLICT+ // =================++ $.fn.modal.noConflict = function () {+ $.fn.modal = old+ return this+ }+++ // MODAL DATA-API+ // ==============++ $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {+ var $this = $(this)+ var href = $this.attr('href')+ var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) //strip for ie7+ var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())++ if ($this.is('a')) e.preventDefault()++ $target+ .modal(option, this)+ .one('hide', function () {+ $this.is(':visible') && $this.focus()+ })+ })++ $(document)+ .on('show.bs.modal', '.modal', function () { $(document.body).addClass('modal-open') })+ .on('hidden.bs.modal', '.modal', function () { $(document.body).removeClass('modal-open') })++}(jQuery);++/* ========================================================================+ * Bootstrap: tooltip.js v3.1.1+ * http://getbootstrap.com/javascript/#tooltip+ * Inspired by the original jQuery.tipsy by Jason Frame+ * ========================================================================+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ * ======================================================================== */++++function ($) {+ 'use strict';++ // TOOLTIP PUBLIC CLASS DEFINITION+ // ===============================++ var Tooltip = function (element, options) {+ this.type =+ this.options =+ this.enabled =+ this.timeout =+ this.hoverState =+ this.$element = null++ this.init('tooltip', element, options)+ }++ Tooltip.DEFAULTS = {+ animation: true,+ placement: 'top',+ selector: false,+ template: '<div class="tooltip"><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>',+ trigger: 'hover focus',+ title: '',+ delay: 0,+ html: false,+ container: false+ }++ Tooltip.prototype.init = function (type, element, options) {+ this.enabled = true+ this.type = type+ this.$element = $(element)+ this.options = this.getOptions(options)++ var triggers = this.options.trigger.split(' ')++ for (var i = triggers.length; i--;) {+ var trigger = triggers[i]++ if (trigger == 'click') {+ this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))+ } else if (trigger != 'manual') {+ var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'+ var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'++ this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))+ this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))+ }+ }++ this.options.selector ?+ (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :+ this.fixTitle()+ }++ Tooltip.prototype.getDefaults = function () {+ return Tooltip.DEFAULTS+ }++ Tooltip.prototype.getOptions = function (options) {+ options = $.extend({}, this.getDefaults(), this.$element.data(), options)++ if (options.delay && typeof options.delay == 'number') {+ options.delay = {+ show: options.delay,+ hide: options.delay+ }+ }++ return options+ }++ Tooltip.prototype.getDelegateOptions = function () {+ var options = {}+ var defaults = this.getDefaults()++ this._options && $.each(this._options, function (key, value) {+ if (defaults[key] != value) options[key] = value+ })++ return options+ }++ Tooltip.prototype.enter = function (obj) {+ var self = obj instanceof this.constructor ?+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)++ clearTimeout(self.timeout)++ self.hoverState = 'in'++ if (!self.options.delay || !self.options.delay.show) return self.show()++ self.timeout = setTimeout(function () {+ if (self.hoverState == 'in') self.show()+ }, self.options.delay.show)+ }++ Tooltip.prototype.leave = function (obj) {+ var self = obj instanceof this.constructor ?+ obj : $(obj.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type)++ clearTimeout(self.timeout)++ self.hoverState = 'out'++ if (!self.options.delay || !self.options.delay.hide) return self.hide()++ self.timeout = setTimeout(function () {+ if (self.hoverState == 'out') self.hide()+ }, self.options.delay.hide)+ }++ Tooltip.prototype.show = function () {+ var e = $.Event('show.bs.' + this.type)++ if (this.hasContent() && this.enabled) {+ this.$element.trigger(e)++ if (e.isDefaultPrevented()) return+ var that = this;++ var $tip = this.tip()++ this.setContent()++ if (this.options.animation) $tip.addClass('fade')++ var placement = typeof this.options.placement == 'function' ?+ this.options.placement.call(this, $tip[0], this.$element[0]) :+ this.options.placement++ var autoToken = /\s?auto?\s?/i+ var autoPlace = autoToken.test(placement)+ if (autoPlace) placement = placement.replace(autoToken, '') || 'top'++ $tip+ .detach()+ .css({ top: 0, left: 0, display: 'block' })+ .addClass(placement)++ this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)++ var pos = this.getPosition()+ var actualWidth = $tip[0].offsetWidth+ var actualHeight = $tip[0].offsetHeight++ if (autoPlace) {+ var $parent = this.$element.parent()++ var orgPlacement = placement+ var docScroll = document.documentElement.scrollTop || document.body.scrollTop+ var parentWidth = this.options.container == 'body' ? window.innerWidth : $parent.outerWidth()+ var parentHeight = this.options.container == 'body' ? window.innerHeight : $parent.outerHeight()+ var parentLeft = this.options.container == 'body' ? 0 : $parent.offset().left++ placement = placement == 'bottom' && pos.top + pos.height + actualHeight - docScroll > parentHeight ? 'top' :+ placement == 'top' && pos.top - docScroll - actualHeight < 0 ? 'bottom' :+ placement == 'right' && pos.right + actualWidth > parentWidth ? 'left' :+ placement == 'left' && pos.left - actualWidth < parentLeft ? 'right' :+ placement++ $tip+ .removeClass(orgPlacement)+ .addClass(placement)+ }++ var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)++ this.applyPlacement(calculatedOffset, placement)+ this.hoverState = null++ var complete = function() {+ that.$element.trigger('shown.bs.' + that.type)+ }++ $.support.transition && this.$tip.hasClass('fade') ?+ $tip+ .one($.support.transition.end, complete)+ .emulateTransitionEnd(150) :+ complete()+ }+ }++ Tooltip.prototype.applyPlacement = function (offset, placement) {+ var replace+ var $tip = this.tip()+ var width = $tip[0].offsetWidth+ var height = $tip[0].offsetHeight++ // manually read margins because getBoundingClientRect includes difference+ var marginTop = parseInt($tip.css('margin-top'), 10)+ var marginLeft = parseInt($tip.css('margin-left'), 10)++ // we must check for NaN for ie 8/9+ if (isNaN(marginTop)) marginTop = 0+ if (isNaN(marginLeft)) marginLeft = 0++ offset.top = offset.top + marginTop+ offset.left = offset.left + marginLeft++ // $.fn.offset doesn't round pixel values+ // so we use setOffset directly with our own function B-0+ $.offset.setOffset($tip[0], $.extend({+ using: function (props) {+ $tip.css({+ top: Math.round(props.top),+ left: Math.round(props.left)+ })+ }+ }, offset), 0)++ $tip.addClass('in')++ // check to see if placing tip in new offset caused the tip to resize itself+ var actualWidth = $tip[0].offsetWidth+ var actualHeight = $tip[0].offsetHeight++ if (placement == 'top' && actualHeight != height) {+ replace = true+ offset.top = offset.top + height - actualHeight+ }++ if (/bottom|top/.test(placement)) {+ var delta = 0++ if (offset.left < 0) {+ delta = offset.left * -2+ offset.left = 0++ $tip.offset(offset)++ actualWidth = $tip[0].offsetWidth+ actualHeight = $tip[0].offsetHeight+ }++ this.replaceArrow(delta - width + actualWidth, actualWidth, 'left')+ } else {+ this.replaceArrow(actualHeight - height, actualHeight, 'top')+ }++ if (replace) $tip.offset(offset)+ }++ Tooltip.prototype.replaceArrow = function (delta, dimension, position) {+ this.arrow().css(position, delta ? (50 * (1 - delta / dimension) + '%') : '')+ }++ Tooltip.prototype.setContent = function () {+ var $tip = this.tip()+ var title = this.getTitle()++ $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)+ $tip.removeClass('fade in top bottom left right')+ }++ Tooltip.prototype.hide = function () {+ var that = this+ var $tip = this.tip()+ var e = $.Event('hide.bs.' + this.type)++ function complete() {+ if (that.hoverState != 'in') $tip.detach()+ that.$element.trigger('hidden.bs.' + that.type)+ }++ this.$element.trigger(e)++ if (e.isDefaultPrevented()) return++ $tip.removeClass('in')++ $.support.transition && this.$tip.hasClass('fade') ?+ $tip+ .one($.support.transition.end, complete)+ .emulateTransitionEnd(150) :+ complete()++ this.hoverState = null++ return this+ }++ Tooltip.prototype.fixTitle = function () {+ var $e = this.$element+ if ($e.attr('title') || typeof($e.attr('data-original-title')) != 'string') {+ $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')+ }+ }++ Tooltip.prototype.hasContent = function () {+ return this.getTitle()+ }++ Tooltip.prototype.getPosition = function () {+ var el = this.$element[0]+ return $.extend({}, (typeof el.getBoundingClientRect == 'function') ? el.getBoundingClientRect() : {+ width: el.offsetWidth,+ height: el.offsetHeight+ }, this.$element.offset())+ }++ Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {+ return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :+ placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :+ placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :+ /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }+ }++ Tooltip.prototype.getTitle = function () {+ var title+ var $e = this.$element+ var o = this.options++ title = $e.attr('data-original-title')+ || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)++ return title+ }++ Tooltip.prototype.tip = function () {+ return this.$tip = this.$tip || $(this.options.template)+ }++ Tooltip.prototype.arrow = function () {+ return this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow')+ }++ Tooltip.prototype.validate = function () {+ if (!this.$element[0].parentNode) {+ this.hide()+ this.$element = null+ this.options = null+ }+ }++ Tooltip.prototype.enable = function () {+ this.enabled = true+ }++ Tooltip.prototype.disable = function () {+ this.enabled = false+ }++ Tooltip.prototype.toggleEnabled = function () {+ this.enabled = !this.enabled+ }++ Tooltip.prototype.toggle = function (e) {+ var self = e ? $(e.currentTarget)[this.type](this.getDelegateOptions()).data('bs.' + this.type) : this+ self.tip().hasClass('in') ? self.leave(self) : self.enter(self)+ }++ Tooltip.prototype.destroy = function () {+ clearTimeout(this.timeout)+ this.hide().$element.off('.' + this.type).removeData('bs.' + this.type)+ }+++ // TOOLTIP PLUGIN DEFINITION+ // =========================++ var old = $.fn.tooltip++ $.fn.tooltip = function (option) {+ return this.each(function () {+ var $this = $(this)+ var data = $this.data('bs.tooltip')+ var options = typeof option == 'object' && option++ if (!data && option == 'destroy') return+ if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))+ if (typeof option == 'string') data[option]()+ })+ }++ $.fn.tooltip.Constructor = Tooltip+++ // TOOLTIP NO CONFLICT+ // ===================++ $.fn.tooltip.noConflict = function () {+ $.fn.tooltip = old+ return this+ }++}(jQuery);++/* ========================================================================+ * Bootstrap: popover.js v3.1.1+ * http://getbootstrap.com/javascript/#popovers+ * ========================================================================+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ * ======================================================================== */++++function ($) {+ 'use strict';++ // POPOVER PUBLIC CLASS DEFINITION+ // ===============================++ var Popover = function (element, options) {+ this.init('popover', element, options)+ }++ if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')++ Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {+ placement: 'right',+ trigger: 'click',+ content: '',+ template: '<div class="popover"><div class="arrow"></div><h3 class="popover-title"></h3><div class="popover-content"></div></div>'+ })+++ // NOTE: POPOVER EXTENDS tooltip.js+ // ================================++ Popover.prototype = $.extend({}, $.fn.tooltip.Constructor.prototype)++ Popover.prototype.constructor = Popover++ Popover.prototype.getDefaults = function () {+ return Popover.DEFAULTS+ }++ Popover.prototype.setContent = function () {+ var $tip = this.tip()+ var title = this.getTitle()+ var content = this.getContent()++ $tip.find('.popover-title')[this.options.html ? 'html' : 'text'](title)+ $tip.find('.popover-content')[ // we use append for html objects to maintain js events+ this.options.html ? (typeof content == 'string' ? 'html' : 'append') : 'text'+ ](content)++ $tip.removeClass('fade top bottom left right in')++ // IE8 doesn't accept hiding via the `:empty` pseudo selector, we have to do+ // this manually by checking the contents.+ if (!$tip.find('.popover-title').html()) $tip.find('.popover-title').hide()+ }++ Popover.prototype.hasContent = function () {+ return this.getTitle() || this.getContent()+ }++ Popover.prototype.getContent = function () {+ var $e = this.$element+ var o = this.options++ return $e.attr('data-content')+ || (typeof o.content == 'function' ?+ o.content.call($e[0]) :+ o.content)+ }++ Popover.prototype.arrow = function () {+ return this.$arrow = this.$arrow || this.tip().find('.arrow')+ }++ Popover.prototype.tip = function () {+ if (!this.$tip) this.$tip = $(this.options.template)+ return this.$tip+ }+++ // POPOVER PLUGIN DEFINITION+ // =========================++ var old = $.fn.popover++ $.fn.popover = function (option) {+ return this.each(function () {+ var $this = $(this)+ var data = $this.data('bs.popover')+ var options = typeof option == 'object' && option++ if (!data && option == 'destroy') return+ if (!data) $this.data('bs.popover', (data = new Popover(this, options)))+ if (typeof option == 'string') data[option]()+ })+ }++ $.fn.popover.Constructor = Popover+++ // POPOVER NO CONFLICT+ // ===================++ $.fn.popover.noConflict = function () {+ $.fn.popover = old+ return this+ }++}(jQuery);++/* ========================================================================+ * Bootstrap: scrollspy.js v3.1.1+ * http://getbootstrap.com/javascript/#scrollspy+ * ========================================================================+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ * ======================================================================== */++++function ($) {+ 'use strict';++ // SCROLLSPY CLASS DEFINITION+ // ==========================++ function ScrollSpy(element, options) {+ var href+ var process = $.proxy(this.process, this)++ this.$element = $(element).is('body') ? $(window) : $(element)+ this.$body = $('body')+ this.$scrollElement = this.$element.on('scroll.bs.scroll-spy.data-api', process)+ this.options = $.extend({}, ScrollSpy.DEFAULTS, options)+ this.selector = (this.options.target+ || ((href = $(element).attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) //strip for ie7+ || '') + ' .nav li > a'+ this.offsets = $([])+ this.targets = $([])+ this.activeTarget = null++ this.refresh()+ this.process()+ }++ ScrollSpy.DEFAULTS = {+ offset: 10+ }++ ScrollSpy.prototype.refresh = function () {+ var offsetMethod = this.$element[0] == window ? 'offset' : 'position'++ this.offsets = $([])+ this.targets = $([])++ var self = this+ var $targets = this.$body+ .find(this.selector)+ .map(function () {+ var $el = $(this)+ var href = $el.data('target') || $el.attr('href')+ var $href = /^#./.test(href) && $(href)++ return ($href+ && $href.length+ && $href.is(':visible')+ && [[ $href[offsetMethod]().top + (!$.isWindow(self.$scrollElement.get(0)) && self.$scrollElement.scrollTop()), href ]]) || null+ })+ .sort(function (a, b) { return a[0] - b[0] })+ .each(function () {+ self.offsets.push(this[0])+ self.targets.push(this[1])+ })+ }++ ScrollSpy.prototype.process = function () {+ var scrollTop = this.$scrollElement.scrollTop() + this.options.offset+ var scrollHeight = this.$scrollElement[0].scrollHeight || this.$body[0].scrollHeight+ var maxScroll = scrollHeight - this.$scrollElement.height()+ var offsets = this.offsets+ var targets = this.targets+ var activeTarget = this.activeTarget+ var i++ if (scrollTop >= maxScroll) {+ return activeTarget != (i = targets.last()[0]) && this.activate(i)+ }++ if (activeTarget && scrollTop <= offsets[0]) {+ return activeTarget != (i = targets[0]) && this.activate(i)+ }++ for (i = offsets.length; i--;) {+ activeTarget != targets[i]+ && scrollTop >= offsets[i]+ && (!offsets[i + 1] || scrollTop <= offsets[i + 1])+ && this.activate( targets[i] )+ }+ }++ ScrollSpy.prototype.activate = function (target) {+ this.activeTarget = target++ $(this.selector)+ .parentsUntil(this.options.target, '.active')+ .removeClass('active')++ var selector = this.selector ++ '[data-target="' + target + '"],' ++ this.selector + '[href="' + target + '"]'++ var active = $(selector)+ .parents('li')+ .addClass('active')++ if (active.parent('.dropdown-menu').length) {+ active = active+ .closest('li.dropdown')+ .addClass('active')+ }++ active.trigger('activate.bs.scrollspy')+ }+++ // SCROLLSPY PLUGIN DEFINITION+ // ===========================++ var old = $.fn.scrollspy++ $.fn.scrollspy = function (option) {+ return this.each(function () {+ var $this = $(this)+ var data = $this.data('bs.scrollspy')+ var options = typeof option == 'object' && option++ if (!data) $this.data('bs.scrollspy', (data = new ScrollSpy(this, options)))+ if (typeof option == 'string') data[option]()+ })+ }++ $.fn.scrollspy.Constructor = ScrollSpy+++ // SCROLLSPY NO CONFLICT+ // =====================++ $.fn.scrollspy.noConflict = function () {+ $.fn.scrollspy = old+ return this+ }+++ // SCROLLSPY DATA-API+ // ==================++ $(window).on('load', function () {+ $('[data-spy="scroll"]').each(function () {+ var $spy = $(this)+ $spy.scrollspy($spy.data())+ })+ })++}(jQuery);++/* ========================================================================+ * Bootstrap: tab.js v3.1.1+ * http://getbootstrap.com/javascript/#tabs+ * ========================================================================+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ * ======================================================================== */++++function ($) {+ 'use strict';++ // TAB CLASS DEFINITION+ // ====================++ var Tab = function (element) {+ this.element = $(element)+ }++ Tab.prototype.show = function () {+ var $this = this.element+ var $ul = $this.closest('ul:not(.dropdown-menu)')+ var selector = $this.data('target')++ if (!selector) {+ selector = $this.attr('href')+ selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') //strip for ie7+ }++ if ($this.parent('li').hasClass('active')) return++ var previous = $ul.find('.active:last a')[0]+ var e = $.Event('show.bs.tab', {+ relatedTarget: previous+ })++ $this.trigger(e)++ if (e.isDefaultPrevented()) return++ var $target = $(selector)++ this.activate($this.parent('li'), $ul)+ this.activate($target, $target.parent(), function () {+ $this.trigger({+ type: 'shown.bs.tab',+ relatedTarget: previous+ })+ })+ }++ Tab.prototype.activate = function (element, container, callback) {+ var $active = container.find('> .active')+ var transition = callback+ && $.support.transition+ && $active.hasClass('fade')++ function next() {+ $active+ .removeClass('active')+ .find('> .dropdown-menu > .active')+ .removeClass('active')++ element.addClass('active')++ if (transition) {+ element[0].offsetWidth // reflow for transition+ element.addClass('in')+ } else {+ element.removeClass('fade')+ }++ if (element.parent('.dropdown-menu')) {+ element.closest('li.dropdown').addClass('active')+ }++ callback && callback()+ }++ transition ?+ $active+ .one($.support.transition.end, next)+ .emulateTransitionEnd(150) :+ next()++ $active.removeClass('in')+ }+++ // TAB PLUGIN DEFINITION+ // =====================++ var old = $.fn.tab++ $.fn.tab = function ( option ) {+ return this.each(function () {+ var $this = $(this)+ var data = $this.data('bs.tab')++ if (!data) $this.data('bs.tab', (data = new Tab(this)))+ if (typeof option == 'string') data[option]()+ })+ }++ $.fn.tab.Constructor = Tab+++ // TAB NO CONFLICT+ // ===============++ $.fn.tab.noConflict = function () {+ $.fn.tab = old+ return this+ }+++ // TAB DATA-API+ // ============++ $(document).on('click.bs.tab.data-api', '[data-toggle="tab"], [data-toggle="pill"]', function (e) {+ e.preventDefault()+ $(this).tab('show')+ })++}(jQuery);++/* ========================================================================+ * Bootstrap: affix.js v3.1.1+ * http://getbootstrap.com/javascript/#affix+ * ========================================================================+ * Copyright 2011-2014 Twitter, Inc.+ * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)+ * ======================================================================== */++++function ($) {+ 'use strict';++ // AFFIX CLASS DEFINITION+ // ======================++ var Affix = function (element, options) {+ this.options = $.extend({}, Affix.DEFAULTS, options)+ this.$window = $(window)+ .on('scroll.bs.affix.data-api', $.proxy(this.checkPosition, this))+ .on('click.bs.affix.data-api', $.proxy(this.checkPositionWithEventLoop, this))++ this.$element = $(element)+ this.affixed =+ this.unpin =+ this.pinnedOffset = null++ this.checkPosition()+ }++ Affix.RESET = 'affix affix-top affix-bottom'++ Affix.DEFAULTS = {+ offset: 0+ }++ Affix.prototype.getPinnedOffset = function () {+ if (this.pinnedOffset) return this.pinnedOffset+ this.$element.removeClass(Affix.RESET).addClass('affix')+ var scrollTop = this.$window.scrollTop()+ var position = this.$element.offset()+ return (this.pinnedOffset = position.top - scrollTop)+ }++ Affix.prototype.checkPositionWithEventLoop = function () {+ setTimeout($.proxy(this.checkPosition, this), 1)+ }++ Affix.prototype.checkPosition = function () {+ if (!this.$element.is(':visible')) return++ var scrollHeight = $(document).height()+ var scrollTop = this.$window.scrollTop()+ var position = this.$element.offset()+ var offset = this.options.offset+ var offsetTop = offset.top+ var offsetBottom = offset.bottom++ if (this.affixed == 'top') position.top += scrollTop++ if (typeof offset != 'object') offsetBottom = offsetTop = offset+ if (typeof offsetTop == 'function') offsetTop = offset.top(this.$element)+ if (typeof offsetBottom == 'function') offsetBottom = offset.bottom(this.$element)++ var affix = this.unpin != null && (scrollTop + this.unpin <= position.top) ? false :+ offsetBottom != null && (position.top + this.$element.height() >= scrollHeight - offsetBottom) ? 'bottom' :+ offsetTop != null && (scrollTop <= offsetTop) ? 'top' : false++ if (this.affixed === affix) return+ if (this.unpin) this.$element.css('top', '')++ var affixType = 'affix' + (affix ? '-' + affix : '')+ var e = $.Event(affixType + '.bs.affix')++ this.$element.trigger(e)++ if (e.isDefaultPrevented()) return++ this.affixed = affix+ this.unpin = affix == 'bottom' ? this.getPinnedOffset() : null++ this.$element+ .removeClass(Affix.RESET)+ .addClass(affixType)+ .trigger($.Event(affixType.replace('affix', 'affixed')))++ if (affix == 'bottom') {+ this.$element.offset({ top: scrollHeight - offsetBottom - this.$element.height() })+ }+ }+++ // AFFIX PLUGIN DEFINITION+ // =======================++ var old = $.fn.affix++ $.fn.affix = function (option) {+ return this.each(function () {+ var $this = $(this)+ var data = $this.data('bs.affix')+ var options = typeof option == 'object' && option++ if (!data) $this.data('bs.affix', (data = new Affix(this, options)))+ if (typeof option == 'string') data[option]()+ })+ }++ $.fn.affix.Constructor = Affix+++ // AFFIX NO CONFLICT+ // =================++ $.fn.affix.noConflict = function () {+ $.fn.affix = old+ return this+ }+++ // AFFIX DATA-API+ // ==============++ $(window).on('load', function () {+ $('[data-spy="affix"]').each(function () {+ var $spy = $(this)+ var data = $spy.data()++ data.offset = data.offset || {}++ if (data.offsetBottom) data.offset.bottom = data.offsetBottom+ if (data.offsetTop) data.offset.top = data.offsetTop++ $spy.affix(data)+ })+ })++}(jQuery);
+ static/js/jquery.full.js view
@@ -0,0 +1,9111 @@+/*!+ * jQuery JavaScript Library v2.1.0+ * http://jquery.com/+ *+ * Includes Sizzle.js+ * http://sizzlejs.com/+ *+ * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors+ * Released under the MIT license+ * http://jquery.org/license+ *+ * Date: 2014-01-23T21:10Z+ */++(function( global, factory ) {++ if ( typeof module === "object" && typeof module.exports === "object" ) {+ // For CommonJS and CommonJS-like environments where a proper window is present,+ // execute the factory and get jQuery+ // For environments that do not inherently posses a window with a document+ // (such as Node.js), expose a jQuery-making factory as module.exports+ // This accentuates the need for the creation of a real window+ // e.g. var jQuery = require("jquery")(window);+ // See ticket #14549 for more info+ module.exports = global.document ?+ factory( global, true ) :+ function( w ) {+ if ( !w.document ) {+ throw new Error( "jQuery requires a window with a document" );+ }+ return factory( w );+ };+ } else {+ factory( global );+ }++// Pass this if window is not defined yet+}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {++// Can't do this because several apps including ASP.NET trace+// the stack via arguments.caller.callee and Firefox dies if+// you try to trace through "use strict" call chains. (#13335)+// Support: Firefox 18++//++var arr = [];++var slice = arr.slice;++var concat = arr.concat;++var push = arr.push;++var indexOf = arr.indexOf;++var class2type = {};++var toString = class2type.toString;++var hasOwn = class2type.hasOwnProperty;++var trim = "".trim;++var support = {};++++var+ // Use the correct document accordingly with window argument (sandbox)+ document = window.document,++ version = "2.1.0",++ // Define a local copy of jQuery+ jQuery = function( selector, context ) {+ // The jQuery object is actually just the init constructor 'enhanced'+ // Need init if jQuery is called (just allow error to be thrown if not included)+ return new jQuery.fn.init( selector, context );+ },++ // Matches dashed string for camelizing+ rmsPrefix = /^-ms-/,+ rdashAlpha = /-([\da-z])/gi,++ // Used by jQuery.camelCase as callback to replace()+ fcamelCase = function( all, letter ) {+ return letter.toUpperCase();+ };++jQuery.fn = jQuery.prototype = {+ // The current version of jQuery being used+ jquery: version,++ constructor: jQuery,++ // Start with an empty selector+ selector: "",++ // The default length of a jQuery object is 0+ length: 0,++ toArray: function() {+ return slice.call( this );+ },++ // Get the Nth element in the matched element set OR+ // Get the whole matched element set as a clean array+ get: function( num ) {+ return num != null ?++ // Return a 'clean' array+ ( num < 0 ? this[ num + this.length ] : this[ num ] ) :++ // Return just the object+ slice.call( this );+ },++ // Take an array of elements and push it onto the stack+ // (returning the new matched element set)+ pushStack: function( elems ) {++ // Build a new jQuery matched element set+ var ret = jQuery.merge( this.constructor(), elems );++ // Add the old object onto the stack (as a reference)+ ret.prevObject = this;+ ret.context = this.context;++ // Return the newly-formed element set+ return ret;+ },++ // Execute a callback for every element in the matched set.+ // (You can seed the arguments with an array of args, but this is+ // only used internally.)+ each: function( callback, args ) {+ return jQuery.each( this, callback, args );+ },++ map: function( callback ) {+ return this.pushStack( jQuery.map(this, function( elem, i ) {+ return callback.call( elem, i, elem );+ }));+ },++ slice: function() {+ return this.pushStack( slice.apply( this, arguments ) );+ },++ first: function() {+ return this.eq( 0 );+ },++ last: function() {+ return this.eq( -1 );+ },++ eq: function( i ) {+ var len = this.length,+ j = +i + ( i < 0 ? len : 0 );+ return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] );+ },++ end: function() {+ return this.prevObject || this.constructor(null);+ },++ // For internal use only.+ // Behaves like an Array's method, not like a jQuery method.+ push: push,+ sort: arr.sort,+ splice: arr.splice+};++jQuery.extend = jQuery.fn.extend = function() {+ var options, name, src, copy, copyIsArray, clone,+ target = arguments[0] || {},+ i = 1,+ length = arguments.length,+ deep = false;++ // Handle a deep copy situation+ if ( typeof target === "boolean" ) {+ deep = target;++ // skip the boolean and the target+ target = arguments[ i ] || {};+ i++;+ }++ // Handle case when target is a string or something (possible in deep copy)+ if ( typeof target !== "object" && !jQuery.isFunction(target) ) {+ target = {};+ }++ // extend jQuery itself if only one argument is passed+ if ( i === length ) {+ target = this;+ i--;+ }++ for ( ; i < length; i++ ) {+ // Only deal with non-null/undefined values+ if ( (options = arguments[ i ]) != null ) {+ // Extend the base object+ for ( name in options ) {+ src = target[ name ];+ copy = options[ name ];++ // Prevent never-ending loop+ if ( target === copy ) {+ continue;+ }++ // Recurse if we're merging plain objects or arrays+ if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {+ if ( copyIsArray ) {+ copyIsArray = false;+ clone = src && jQuery.isArray(src) ? src : [];++ } else {+ clone = src && jQuery.isPlainObject(src) ? src : {};+ }++ // Never move original objects, clone them+ target[ name ] = jQuery.extend( deep, clone, copy );++ // Don't bring in undefined values+ } else if ( copy !== undefined ) {+ target[ name ] = copy;+ }+ }+ }+ }++ // Return the modified object+ return target;+};++jQuery.extend({+ // Unique for each copy of jQuery on the page+ expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),++ // Assume jQuery is ready without the ready module+ isReady: true,++ error: function( msg ) {+ throw new Error( msg );+ },++ noop: function() {},++ // See test/unit/core.js for details concerning isFunction.+ // Since version 1.3, DOM methods and functions like alert+ // aren't supported. They return false on IE (#2968).+ isFunction: function( obj ) {+ return jQuery.type(obj) === "function";+ },++ isArray: Array.isArray,++ isWindow: function( obj ) {+ return obj != null && obj === obj.window;+ },++ isNumeric: function( obj ) {+ // parseFloat NaNs numeric-cast false positives (null|true|false|"")+ // ...but misinterprets leading-number strings, particularly hex literals ("0x...")+ // subtraction forces infinities to NaN+ return obj - parseFloat( obj ) >= 0;+ },++ isPlainObject: function( obj ) {+ // Not plain objects:+ // - Any object or value whose internal [[Class]] property is not "[object Object]"+ // - DOM nodes+ // - window+ if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {+ return false;+ }++ // Support: Firefox <20+ // The try/catch suppresses exceptions thrown when attempting to access+ // the "constructor" property of certain host objects, ie. |window.location|+ // https://bugzilla.mozilla.org/show_bug.cgi?id=814622+ try {+ if ( obj.constructor &&+ !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) {+ return false;+ }+ } catch ( e ) {+ return false;+ }++ // If the function hasn't returned already, we're confident that+ // |obj| is a plain object, created by {} or constructed with new Object+ return true;+ },++ isEmptyObject: function( obj ) {+ var name;+ for ( name in obj ) {+ return false;+ }+ return true;+ },++ type: function( obj ) {+ if ( obj == null ) {+ return obj + "";+ }+ // Support: Android < 4.0, iOS < 6 (functionish RegExp)+ return typeof obj === "object" || typeof obj === "function" ?+ class2type[ toString.call(obj) ] || "object" :+ typeof obj;+ },++ // Evaluates a script in a global context+ globalEval: function( code ) {+ var script,+ indirect = eval;++ code = jQuery.trim( code );++ if ( code ) {+ // If the code includes a valid, prologue position+ // strict mode pragma, execute code by injecting a+ // script tag into the document.+ if ( code.indexOf("use strict") === 1 ) {+ script = document.createElement("script");+ script.text = code;+ document.head.appendChild( script ).parentNode.removeChild( script );+ } else {+ // Otherwise, avoid the DOM node creation, insertion+ // and removal by using an indirect global eval+ indirect( code );+ }+ }+ },++ // Convert dashed to camelCase; used by the css and data modules+ // Microsoft forgot to hump their vendor prefix (#9572)+ camelCase: function( string ) {+ return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );+ },++ nodeName: function( elem, name ) {+ return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();+ },++ // args is for internal usage only+ each: function( obj, callback, args ) {+ var value,+ i = 0,+ length = obj.length,+ isArray = isArraylike( obj );++ if ( args ) {+ if ( isArray ) {+ for ( ; i < length; i++ ) {+ value = callback.apply( obj[ i ], args );++ if ( value === false ) {+ break;+ }+ }+ } else {+ for ( i in obj ) {+ value = callback.apply( obj[ i ], args );++ if ( value === false ) {+ break;+ }+ }+ }++ // A special, fast, case for the most common use of each+ } else {+ if ( isArray ) {+ for ( ; i < length; i++ ) {+ value = callback.call( obj[ i ], i, obj[ i ] );++ if ( value === false ) {+ break;+ }+ }+ } else {+ for ( i in obj ) {+ value = callback.call( obj[ i ], i, obj[ i ] );++ if ( value === false ) {+ break;+ }+ }+ }+ }++ return obj;+ },++ trim: function( text ) {+ return text == null ? "" : trim.call( text );+ },++ // results is for internal usage only+ makeArray: function( arr, results ) {+ var ret = results || [];++ if ( arr != null ) {+ if ( isArraylike( Object(arr) ) ) {+ jQuery.merge( ret,+ typeof arr === "string" ?+ [ arr ] : arr+ );+ } else {+ push.call( ret, arr );+ }+ }++ return ret;+ },++ inArray: function( elem, arr, i ) {+ return arr == null ? -1 : indexOf.call( arr, elem, i );+ },++ merge: function( first, second ) {+ var len = +second.length,+ j = 0,+ i = first.length;++ for ( ; j < len; j++ ) {+ first[ i++ ] = second[ j ];+ }++ first.length = i;++ return first;+ },++ grep: function( elems, callback, invert ) {+ var callbackInverse,+ matches = [],+ i = 0,+ length = elems.length,+ callbackExpect = !invert;++ // Go through the array, only saving the items+ // that pass the validator function+ for ( ; i < length; i++ ) {+ callbackInverse = !callback( elems[ i ], i );+ if ( callbackInverse !== callbackExpect ) {+ matches.push( elems[ i ] );+ }+ }++ return matches;+ },++ // arg is for internal usage only+ map: function( elems, callback, arg ) {+ var value,+ i = 0,+ length = elems.length,+ isArray = isArraylike( elems ),+ ret = [];++ // Go through the array, translating each of the items to their new values+ if ( isArray ) {+ for ( ; i < length; i++ ) {+ value = callback( elems[ i ], i, arg );++ if ( value != null ) {+ ret.push( value );+ }+ }++ // Go through every key on the object,+ } else {+ for ( i in elems ) {+ value = callback( elems[ i ], i, arg );++ if ( value != null ) {+ ret.push( value );+ }+ }+ }++ // Flatten any nested arrays+ return concat.apply( [], ret );+ },++ // A global GUID counter for objects+ guid: 1,++ // Bind a function to a context, optionally partially applying any+ // arguments.+ proxy: function( fn, context ) {+ var tmp, args, proxy;++ if ( typeof context === "string" ) {+ tmp = fn[ context ];+ context = fn;+ fn = tmp;+ }++ // Quick check to determine if target is callable, in the spec+ // this throws a TypeError, but we will just return undefined.+ if ( !jQuery.isFunction( fn ) ) {+ return undefined;+ }++ // Simulated bind+ args = slice.call( arguments, 2 );+ proxy = function() {+ return fn.apply( context || this, args.concat( slice.call( arguments ) ) );+ };++ // Set the guid of unique handler to the same of original handler, so it can be removed+ proxy.guid = fn.guid = fn.guid || jQuery.guid++;++ return proxy;+ },++ now: Date.now,++ // jQuery.support is not used in Core but other projects attach their+ // properties to it so it needs to exist.+ support: support+});++// Populate the class2type map+jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) {+ class2type[ "[object " + name + "]" ] = name.toLowerCase();+});++function isArraylike( obj ) {+ var length = obj.length,+ type = jQuery.type( obj );++ if ( type === "function" || jQuery.isWindow( obj ) ) {+ return false;+ }++ if ( obj.nodeType === 1 && length ) {+ return true;+ }++ return type === "array" || length === 0 ||+ typeof length === "number" && length > 0 && ( length - 1 ) in obj;+}+var Sizzle =+/*!+ * Sizzle CSS Selector Engine v1.10.16+ * http://sizzlejs.com/+ *+ * Copyright 2013 jQuery Foundation, Inc. and other contributors+ * Released under the MIT license+ * http://jquery.org/license+ *+ * Date: 2014-01-13+ */+(function( window ) {++var i,+ support,+ Expr,+ getText,+ isXML,+ compile,+ outermostContext,+ sortInput,+ hasDuplicate,++ // Local document vars+ setDocument,+ document,+ docElem,+ documentIsHTML,+ rbuggyQSA,+ rbuggyMatches,+ matches,+ contains,++ // Instance-specific data+ expando = "sizzle" + -(new Date()),+ preferredDoc = window.document,+ dirruns = 0,+ done = 0,+ classCache = createCache(),+ tokenCache = createCache(),+ compilerCache = createCache(),+ sortOrder = function( a, b ) {+ if ( a === b ) {+ hasDuplicate = true;+ }+ return 0;+ },++ // General-purpose constants+ strundefined = typeof undefined,+ MAX_NEGATIVE = 1 << 31,++ // Instance methods+ hasOwn = ({}).hasOwnProperty,+ arr = [],+ pop = arr.pop,+ push_native = arr.push,+ push = arr.push,+ slice = arr.slice,+ // Use a stripped-down indexOf if we can't use a native one+ indexOf = arr.indexOf || function( elem ) {+ var i = 0,+ len = this.length;+ for ( ; i < len; i++ ) {+ if ( this[i] === elem ) {+ return i;+ }+ }+ return -1;+ },++ booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",++ // Regular expressions++ // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace+ whitespace = "[\\x20\\t\\r\\n\\f]",+ // http://www.w3.org/TR/css3-syntax/#characters+ characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",++ // Loosely modeled on CSS identifier characters+ // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors+ // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier+ identifier = characterEncoding.replace( "w", "w#" ),++ // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors+ attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace ++ "*(?:([*^$|!~]?=)" + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",++ // Prefer arguments quoted,+ // then not containing pseudos/brackets,+ // then attribute selectors/non-parenthetical expressions,+ // then anything else+ // These preferences are here to reduce the number of selectors+ // needing tokenize in the PSEUDO preFilter+ pseudos = ":(" + characterEncoding + ")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|" + attributes.replace( 3, 8 ) + ")*)|.*)\\)|)",++ // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter+ rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),++ rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),+ rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),++ rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),++ rpseudo = new RegExp( pseudos ),+ ridentifier = new RegExp( "^" + identifier + "$" ),++ matchExpr = {+ "ID": new RegExp( "^#(" + characterEncoding + ")" ),+ "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),+ "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),+ "ATTR": new RegExp( "^" + attributes ),+ "PSEUDO": new RegExp( "^" + pseudos ),+ "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace ++ "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace ++ "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),+ "bool": new RegExp( "^(?:" + booleans + ")$", "i" ),+ // For use in libraries implementing .is()+ // We use this for POS matching in `select`+ "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" ++ whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )+ },++ rinputs = /^(?:input|select|textarea|button)$/i,+ rheader = /^h\d$/i,++ rnative = /^[^{]+\{\s*\[native \w/,++ // Easily-parseable/retrievable ID or TAG or CLASS selectors+ rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,++ rsibling = /[+~]/,+ rescape = /'|\\/g,++ // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters+ runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),+ funescape = function( _, escaped, escapedWhitespace ) {+ var high = "0x" + escaped - 0x10000;+ // NaN means non-codepoint+ // Support: Firefox+ // Workaround erroneous numeric interpretation of +"0x"+ return high !== high || escapedWhitespace ?+ escaped :+ high < 0 ?+ // BMP codepoint+ String.fromCharCode( high + 0x10000 ) :+ // Supplemental Plane codepoint (surrogate pair)+ String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );+ };++// Optimize for push.apply( _, NodeList )+try {+ push.apply(+ (arr = slice.call( preferredDoc.childNodes )),+ preferredDoc.childNodes+ );+ // Support: Android<4.0+ // Detect silently failing push.apply+ arr[ preferredDoc.childNodes.length ].nodeType;+} catch ( e ) {+ push = { apply: arr.length ?++ // Leverage slice if possible+ function( target, els ) {+ push_native.apply( target, slice.call(els) );+ } :++ // Support: IE<9+ // Otherwise append directly+ function( target, els ) {+ var j = target.length,+ i = 0;+ // Can't trust NodeList.length+ while ( (target[j++] = els[i++]) ) {}+ target.length = j - 1;+ }+ };+}++function Sizzle( selector, context, results, seed ) {+ var match, elem, m, nodeType,+ // QSA vars+ i, groups, old, nid, newContext, newSelector;++ if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {+ setDocument( context );+ }++ context = context || document;+ results = results || [];++ if ( !selector || typeof selector !== "string" ) {+ return results;+ }++ if ( (nodeType = context.nodeType) !== 1 && nodeType !== 9 ) {+ return [];+ }++ if ( documentIsHTML && !seed ) {++ // Shortcuts+ if ( (match = rquickExpr.exec( selector )) ) {+ // Speed-up: Sizzle("#ID")+ if ( (m = match[1]) ) {+ if ( nodeType === 9 ) {+ elem = context.getElementById( m );+ // Check parentNode to catch when Blackberry 4.6 returns+ // nodes that are no longer in the document (jQuery #6963)+ if ( elem && elem.parentNode ) {+ // Handle the case where IE, Opera, and Webkit return items+ // by name instead of ID+ if ( elem.id === m ) {+ results.push( elem );+ return results;+ }+ } else {+ return results;+ }+ } else {+ // Context is not a document+ if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&+ contains( context, elem ) && elem.id === m ) {+ results.push( elem );+ return results;+ }+ }++ // Speed-up: Sizzle("TAG")+ } else if ( match[2] ) {+ push.apply( results, context.getElementsByTagName( selector ) );+ return results;++ // Speed-up: Sizzle(".CLASS")+ } else if ( (m = match[3]) && support.getElementsByClassName && context.getElementsByClassName ) {+ push.apply( results, context.getElementsByClassName( m ) );+ return results;+ }+ }++ // QSA path+ if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {+ nid = old = expando;+ newContext = context;+ newSelector = nodeType === 9 && selector;++ // qSA works strangely on Element-rooted queries+ // We can work around this by specifying an extra ID on the root+ // and working up from there (Thanks to Andrew Dupont for the technique)+ // IE 8 doesn't work on object elements+ if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {+ groups = tokenize( selector );++ if ( (old = context.getAttribute("id")) ) {+ nid = old.replace( rescape, "\\$&" );+ } else {+ context.setAttribute( "id", nid );+ }+ nid = "[id='" + nid + "'] ";++ i = groups.length;+ while ( i-- ) {+ groups[i] = nid + toSelector( groups[i] );+ }+ newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context;+ newSelector = groups.join(",");+ }++ if ( newSelector ) {+ try {+ push.apply( results,+ newContext.querySelectorAll( newSelector )+ );+ return results;+ } catch(qsaError) {+ } finally {+ if ( !old ) {+ context.removeAttribute("id");+ }+ }+ }+ }+ }++ // All others+ return select( selector.replace( rtrim, "$1" ), context, results, seed );+}++/**+ * Create key-value caches of limited size+ * @returns {Function(string, Object)} Returns the Object data after storing it on itself with+ * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)+ * deleting the oldest entry+ */+function createCache() {+ var keys = [];++ function cache( key, value ) {+ // Use (key + " ") to avoid collision with native prototype properties (see Issue #157)+ if ( keys.push( key + " " ) > Expr.cacheLength ) {+ // Only keep the most recent entries+ delete cache[ keys.shift() ];+ }+ return (cache[ key + " " ] = value);+ }+ return cache;+}++/**+ * Mark a function for special use by Sizzle+ * @param {Function} fn The function to mark+ */+function markFunction( fn ) {+ fn[ expando ] = true;+ return fn;+}++/**+ * Support testing using an element+ * @param {Function} fn Passed the created div and expects a boolean result+ */+function assert( fn ) {+ var div = document.createElement("div");++ try {+ return !!fn( div );+ } catch (e) {+ return false;+ } finally {+ // Remove from its parent by default+ if ( div.parentNode ) {+ div.parentNode.removeChild( div );+ }+ // release memory in IE+ div = null;+ }+}++/**+ * Adds the same handler for all of the specified attrs+ * @param {String} attrs Pipe-separated list of attributes+ * @param {Function} handler The method that will be applied+ */+function addHandle( attrs, handler ) {+ var arr = attrs.split("|"),+ i = attrs.length;++ while ( i-- ) {+ Expr.attrHandle[ arr[i] ] = handler;+ }+}++/**+ * Checks document order of two siblings+ * @param {Element} a+ * @param {Element} b+ * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b+ */+function siblingCheck( a, b ) {+ var cur = b && a,+ diff = cur && a.nodeType === 1 && b.nodeType === 1 &&+ ( ~b.sourceIndex || MAX_NEGATIVE ) -+ ( ~a.sourceIndex || MAX_NEGATIVE );++ // Use IE sourceIndex if available on both nodes+ if ( diff ) {+ return diff;+ }++ // Check if b follows a+ if ( cur ) {+ while ( (cur = cur.nextSibling) ) {+ if ( cur === b ) {+ return -1;+ }+ }+ }++ return a ? 1 : -1;+}++/**+ * Returns a function to use in pseudos for input types+ * @param {String} type+ */+function createInputPseudo( type ) {+ return function( elem ) {+ var name = elem.nodeName.toLowerCase();+ return name === "input" && elem.type === type;+ };+}++/**+ * Returns a function to use in pseudos for buttons+ * @param {String} type+ */+function createButtonPseudo( type ) {+ return function( elem ) {+ var name = elem.nodeName.toLowerCase();+ return (name === "input" || name === "button") && elem.type === type;+ };+}++/**+ * Returns a function to use in pseudos for positionals+ * @param {Function} fn+ */+function createPositionalPseudo( fn ) {+ return markFunction(function( argument ) {+ argument = +argument;+ return markFunction(function( seed, matches ) {+ var j,+ matchIndexes = fn( [], seed.length, argument ),+ i = matchIndexes.length;++ // Match elements found at the specified indexes+ while ( i-- ) {+ if ( seed[ (j = matchIndexes[i]) ] ) {+ seed[j] = !(matches[j] = seed[j]);+ }+ }+ });+ });+}++/**+ * Checks a node for validity as a Sizzle context+ * @param {Element|Object=} context+ * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value+ */+function testContext( context ) {+ return context && typeof context.getElementsByTagName !== strundefined && context;+}++// Expose support vars for convenience+support = Sizzle.support = {};++/**+ * Detects XML nodes+ * @param {Element|Object} elem An element or a document+ * @returns {Boolean} True iff elem is a non-HTML XML node+ */+isXML = Sizzle.isXML = function( elem ) {+ // documentElement is verified for cases where it doesn't yet exist+ // (such as loading iframes in IE - #4833)+ var documentElement = elem && (elem.ownerDocument || elem).documentElement;+ return documentElement ? documentElement.nodeName !== "HTML" : false;+};++/**+ * Sets document-related variables once based on the current document+ * @param {Element|Object} [doc] An element or document object to use to set the document+ * @returns {Object} Returns the current document+ */+setDocument = Sizzle.setDocument = function( node ) {+ var hasCompare,+ doc = node ? node.ownerDocument || node : preferredDoc,+ parent = doc.defaultView;++ // If no document and documentElement is available, return+ if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {+ return document;+ }++ // Set our document+ document = doc;+ docElem = doc.documentElement;++ // Support tests+ documentIsHTML = !isXML( doc );++ // Support: IE>8+ // If iframe document is assigned to "document" variable and if iframe has been reloaded,+ // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936+ // IE6-8 do not support the defaultView property so parent will be undefined+ if ( parent && parent !== parent.top ) {+ // IE11 does not have attachEvent, so all must suffer+ if ( parent.addEventListener ) {+ parent.addEventListener( "unload", function() {+ setDocument();+ }, false );+ } else if ( parent.attachEvent ) {+ parent.attachEvent( "onunload", function() {+ setDocument();+ });+ }+ }++ /* Attributes+ ---------------------------------------------------------------------- */++ // Support: IE<8+ // Verify that getAttribute really returns attributes and not properties (excepting IE8 booleans)+ support.attributes = assert(function( div ) {+ div.className = "i";+ return !div.getAttribute("className");+ });++ /* getElement(s)By*+ ---------------------------------------------------------------------- */++ // Check if getElementsByTagName("*") returns only elements+ support.getElementsByTagName = assert(function( div ) {+ div.appendChild( doc.createComment("") );+ return !div.getElementsByTagName("*").length;+ });++ // Check if getElementsByClassName can be trusted+ support.getElementsByClassName = rnative.test( doc.getElementsByClassName ) && assert(function( div ) {+ div.innerHTML = "<div class='a'></div><div class='a i'></div>";++ // Support: Safari<4+ // Catch class over-caching+ div.firstChild.className = "i";+ // Support: Opera<10+ // Catch gEBCN failure to find non-leading classes+ return div.getElementsByClassName("i").length === 2;+ });++ // Support: IE<10+ // Check if getElementById returns elements by name+ // The broken getElementById methods don't pick up programatically-set names,+ // so use a roundabout getElementsByName test+ support.getById = assert(function( div ) {+ docElem.appendChild( div ).id = expando;+ return !doc.getElementsByName || !doc.getElementsByName( expando ).length;+ });++ // ID find and filter+ if ( support.getById ) {+ Expr.find["ID"] = function( id, context ) {+ if ( typeof context.getElementById !== strundefined && documentIsHTML ) {+ var m = context.getElementById( id );+ // Check parentNode to catch when Blackberry 4.6 returns+ // nodes that are no longer in the document #6963+ return m && m.parentNode ? [m] : [];+ }+ };+ Expr.filter["ID"] = function( id ) {+ var attrId = id.replace( runescape, funescape );+ return function( elem ) {+ return elem.getAttribute("id") === attrId;+ };+ };+ } else {+ // Support: IE6/7+ // getElementById is not reliable as a find shortcut+ delete Expr.find["ID"];++ Expr.filter["ID"] = function( id ) {+ var attrId = id.replace( runescape, funescape );+ return function( elem ) {+ var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");+ return node && node.value === attrId;+ };+ };+ }++ // Tag+ Expr.find["TAG"] = support.getElementsByTagName ?+ function( tag, context ) {+ if ( typeof context.getElementsByTagName !== strundefined ) {+ return context.getElementsByTagName( tag );+ }+ } :+ function( tag, context ) {+ var elem,+ tmp = [],+ i = 0,+ results = context.getElementsByTagName( tag );++ // Filter out possible comments+ if ( tag === "*" ) {+ while ( (elem = results[i++]) ) {+ if ( elem.nodeType === 1 ) {+ tmp.push( elem );+ }+ }++ return tmp;+ }+ return results;+ };++ // Class+ Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {+ if ( typeof context.getElementsByClassName !== strundefined && documentIsHTML ) {+ return context.getElementsByClassName( className );+ }+ };++ /* QSA/matchesSelector+ ---------------------------------------------------------------------- */++ // QSA and matchesSelector support++ // matchesSelector(:active) reports false when true (IE9/Opera 11.5)+ rbuggyMatches = [];++ // qSa(:focus) reports false when true (Chrome 21)+ // We allow this because of a bug in IE8/9 that throws an error+ // whenever `document.activeElement` is accessed on an iframe+ // So, we allow :focus to pass through QSA all the time to avoid the IE error+ // See http://bugs.jquery.com/ticket/13378+ rbuggyQSA = [];++ if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) {+ // Build QSA regex+ // Regex strategy adopted from Diego Perini+ assert(function( div ) {+ // Select is set to empty string on purpose+ // This is to test IE's treatment of not explicitly+ // setting a boolean content attribute,+ // since its presence should be enough+ // http://bugs.jquery.com/ticket/12359+ div.innerHTML = "<select t=''><option selected=''></option></select>";++ // Support: IE8, Opera 10-12+ // Nothing should be selected when empty strings follow ^= or $= or *=+ if ( div.querySelectorAll("[t^='']").length ) {+ rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );+ }++ // Support: IE8+ // Boolean attributes and "value" are not treated correctly+ if ( !div.querySelectorAll("[selected]").length ) {+ rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );+ }++ // Webkit/Opera - :checked should return selected option elements+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked+ // IE8 throws error here and will not see later tests+ if ( !div.querySelectorAll(":checked").length ) {+ rbuggyQSA.push(":checked");+ }+ });++ assert(function( div ) {+ // Support: Windows 8 Native Apps+ // The type and name attributes are restricted during .innerHTML assignment+ var input = doc.createElement("input");+ input.setAttribute( "type", "hidden" );+ div.appendChild( input ).setAttribute( "name", "D" );++ // Support: IE8+ // Enforce case-sensitivity of name attribute+ if ( div.querySelectorAll("[name=d]").length ) {+ rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );+ }++ // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)+ // IE8 throws error here and will not see later tests+ if ( !div.querySelectorAll(":enabled").length ) {+ rbuggyQSA.push( ":enabled", ":disabled" );+ }++ // Opera 10-11 does not throw on post-comma invalid pseudos+ div.querySelectorAll("*,:x");+ rbuggyQSA.push(",.*:");+ });+ }++ if ( (support.matchesSelector = rnative.test( (matches = docElem.webkitMatchesSelector ||+ docElem.mozMatchesSelector ||+ docElem.oMatchesSelector ||+ docElem.msMatchesSelector) )) ) {++ assert(function( div ) {+ // Check to see if it's possible to do matchesSelector+ // on a disconnected node (IE 9)+ support.disconnectedMatch = matches.call( div, "div" );++ // This should fail with an exception+ // Gecko does not error, returns false instead+ matches.call( div, "[s!='']:x" );+ rbuggyMatches.push( "!=", pseudos );+ });+ }++ rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );+ rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );++ /* Contains+ ---------------------------------------------------------------------- */+ hasCompare = rnative.test( docElem.compareDocumentPosition );++ // Element contains another+ // Purposefully does not implement inclusive descendent+ // As in, an element does not contain itself+ contains = hasCompare || rnative.test( docElem.contains ) ?+ function( a, b ) {+ var adown = a.nodeType === 9 ? a.documentElement : a,+ bup = b && b.parentNode;+ return a === bup || !!( bup && bup.nodeType === 1 && (+ adown.contains ?+ adown.contains( bup ) :+ a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16+ ));+ } :+ function( a, b ) {+ if ( b ) {+ while ( (b = b.parentNode) ) {+ if ( b === a ) {+ return true;+ }+ }+ }+ return false;+ };++ /* Sorting+ ---------------------------------------------------------------------- */++ // Document order sorting+ sortOrder = hasCompare ?+ function( a, b ) {++ // Flag for duplicate removal+ if ( a === b ) {+ hasDuplicate = true;+ return 0;+ }++ // Sort on method existence if only one input has compareDocumentPosition+ var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;+ if ( compare ) {+ return compare;+ }++ // Calculate position if both inputs belong to the same document+ compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?+ a.compareDocumentPosition( b ) :++ // Otherwise we know they are disconnected+ 1;++ // Disconnected nodes+ if ( compare & 1 ||+ (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {++ // Choose the first element that is related to our preferred document+ if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {+ return -1;+ }+ if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {+ return 1;+ }++ // Maintain original order+ return sortInput ?+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :+ 0;+ }++ return compare & 4 ? -1 : 1;+ } :+ function( a, b ) {+ // Exit early if the nodes are identical+ if ( a === b ) {+ hasDuplicate = true;+ return 0;+ }++ var cur,+ i = 0,+ aup = a.parentNode,+ bup = b.parentNode,+ ap = [ a ],+ bp = [ b ];++ // Parentless nodes are either documents or disconnected+ if ( !aup || !bup ) {+ return a === doc ? -1 :+ b === doc ? 1 :+ aup ? -1 :+ bup ? 1 :+ sortInput ?+ ( indexOf.call( sortInput, a ) - indexOf.call( sortInput, b ) ) :+ 0;++ // If the nodes are siblings, we can do a quick check+ } else if ( aup === bup ) {+ return siblingCheck( a, b );+ }++ // Otherwise we need full lists of their ancestors for comparison+ cur = a;+ while ( (cur = cur.parentNode) ) {+ ap.unshift( cur );+ }+ cur = b;+ while ( (cur = cur.parentNode) ) {+ bp.unshift( cur );+ }++ // Walk down the tree looking for a discrepancy+ while ( ap[i] === bp[i] ) {+ i++;+ }++ return i ?+ // Do a sibling check if the nodes have a common ancestor+ siblingCheck( ap[i], bp[i] ) :++ // Otherwise nodes in our document sort first+ ap[i] === preferredDoc ? -1 :+ bp[i] === preferredDoc ? 1 :+ 0;+ };++ return doc;+};++Sizzle.matches = function( expr, elements ) {+ return Sizzle( expr, null, null, elements );+};++Sizzle.matchesSelector = function( elem, expr ) {+ // Set document vars if needed+ if ( ( elem.ownerDocument || elem ) !== document ) {+ setDocument( elem );+ }++ // Make sure that attribute selectors are quoted+ expr = expr.replace( rattributeQuotes, "='$1']" );++ if ( support.matchesSelector && documentIsHTML &&+ ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&+ ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) {++ try {+ var ret = matches.call( elem, expr );++ // IE 9's matchesSelector returns false on disconnected nodes+ if ( ret || support.disconnectedMatch ||+ // As well, disconnected nodes are said to be in a document+ // fragment in IE 9+ elem.document && elem.document.nodeType !== 11 ) {+ return ret;+ }+ } catch(e) {}+ }++ return Sizzle( expr, document, null, [elem] ).length > 0;+};++Sizzle.contains = function( context, elem ) {+ // Set document vars if needed+ if ( ( context.ownerDocument || context ) !== document ) {+ setDocument( context );+ }+ return contains( context, elem );+};++Sizzle.attr = function( elem, name ) {+ // Set document vars if needed+ if ( ( elem.ownerDocument || elem ) !== document ) {+ setDocument( elem );+ }++ var fn = Expr.attrHandle[ name.toLowerCase() ],+ // Don't get fooled by Object.prototype properties (jQuery #13807)+ val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?+ fn( elem, name, !documentIsHTML ) :+ undefined;++ return val !== undefined ?+ val :+ support.attributes || !documentIsHTML ?+ elem.getAttribute( name ) :+ (val = elem.getAttributeNode(name)) && val.specified ?+ val.value :+ null;+};++Sizzle.error = function( msg ) {+ throw new Error( "Syntax error, unrecognized expression: " + msg );+};++/**+ * Document sorting and removing duplicates+ * @param {ArrayLike} results+ */+Sizzle.uniqueSort = function( results ) {+ var elem,+ duplicates = [],+ j = 0,+ i = 0;++ // Unless we *know* we can detect duplicates, assume their presence+ hasDuplicate = !support.detectDuplicates;+ sortInput = !support.sortStable && results.slice( 0 );+ results.sort( sortOrder );++ if ( hasDuplicate ) {+ while ( (elem = results[i++]) ) {+ if ( elem === results[ i ] ) {+ j = duplicates.push( i );+ }+ }+ while ( j-- ) {+ results.splice( duplicates[ j ], 1 );+ }+ }++ // Clear input after sorting to release objects+ // See https://github.com/jquery/sizzle/pull/225+ sortInput = null;++ return results;+};++/**+ * Utility function for retrieving the text value of an array of DOM nodes+ * @param {Array|Element} elem+ */+getText = Sizzle.getText = function( elem ) {+ var node,+ ret = "",+ i = 0,+ nodeType = elem.nodeType;++ if ( !nodeType ) {+ // If no nodeType, this is expected to be an array+ while ( (node = elem[i++]) ) {+ // Do not traverse comment nodes+ ret += getText( node );+ }+ } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {+ // Use textContent for elements+ // innerText usage removed for consistency of new lines (jQuery #11153)+ if ( typeof elem.textContent === "string" ) {+ return elem.textContent;+ } else {+ // Traverse its children+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {+ ret += getText( elem );+ }+ }+ } else if ( nodeType === 3 || nodeType === 4 ) {+ return elem.nodeValue;+ }+ // Do not include comment or processing instruction nodes++ return ret;+};++Expr = Sizzle.selectors = {++ // Can be adjusted by the user+ cacheLength: 50,++ createPseudo: markFunction,++ match: matchExpr,++ attrHandle: {},++ find: {},++ relative: {+ ">": { dir: "parentNode", first: true },+ " ": { dir: "parentNode" },+ "+": { dir: "previousSibling", first: true },+ "~": { dir: "previousSibling" }+ },++ preFilter: {+ "ATTR": function( match ) {+ match[1] = match[1].replace( runescape, funescape );++ // Move the given value to match[3] whether quoted or unquoted+ match[3] = ( match[4] || match[5] || "" ).replace( runescape, funescape );++ if ( match[2] === "~=" ) {+ match[3] = " " + match[3] + " ";+ }++ return match.slice( 0, 4 );+ },++ "CHILD": function( match ) {+ /* matches from matchExpr["CHILD"]+ 1 type (only|nth|...)+ 2 what (child|of-type)+ 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)+ 4 xn-component of xn+y argument ([+-]?\d*n|)+ 5 sign of xn-component+ 6 x of xn-component+ 7 sign of y-component+ 8 y of y-component+ */+ match[1] = match[1].toLowerCase();++ if ( match[1].slice( 0, 3 ) === "nth" ) {+ // nth-* requires argument+ if ( !match[3] ) {+ Sizzle.error( match[0] );+ }++ // numeric x and y parameters for Expr.filter.CHILD+ // remember that false/true cast respectively to 0/1+ match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );+ match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );++ // other types prohibit arguments+ } else if ( match[3] ) {+ Sizzle.error( match[0] );+ }++ return match;+ },++ "PSEUDO": function( match ) {+ var excess,+ unquoted = !match[5] && match[2];++ if ( matchExpr["CHILD"].test( match[0] ) ) {+ return null;+ }++ // Accept quoted arguments as-is+ if ( match[3] && match[4] !== undefined ) {+ match[2] = match[4];++ // Strip excess characters from unquoted arguments+ } else if ( unquoted && rpseudo.test( unquoted ) &&+ // Get excess from tokenize (recursively)+ (excess = tokenize( unquoted, true )) &&+ // advance to the next closing parenthesis+ (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {++ // excess is a negative index+ match[0] = match[0].slice( 0, excess );+ match[2] = unquoted.slice( 0, excess );+ }++ // Return only captures needed by the pseudo filter method (type and argument)+ return match.slice( 0, 3 );+ }+ },++ filter: {++ "TAG": function( nodeNameSelector ) {+ var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();+ return nodeNameSelector === "*" ?+ function() { return true; } :+ function( elem ) {+ return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;+ };+ },++ "CLASS": function( className ) {+ var pattern = classCache[ className + " " ];++ return pattern ||+ (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&+ classCache( className, function( elem ) {+ return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== strundefined && elem.getAttribute("class") || "" );+ });+ },++ "ATTR": function( name, operator, check ) {+ return function( elem ) {+ var result = Sizzle.attr( elem, name );++ if ( result == null ) {+ return operator === "!=";+ }+ if ( !operator ) {+ return true;+ }++ result += "";++ return operator === "=" ? result === check :+ operator === "!=" ? result !== check :+ operator === "^=" ? check && result.indexOf( check ) === 0 :+ operator === "*=" ? check && result.indexOf( check ) > -1 :+ operator === "$=" ? check && result.slice( -check.length ) === check :+ operator === "~=" ? ( " " + result + " " ).indexOf( check ) > -1 :+ operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :+ false;+ };+ },++ "CHILD": function( type, what, argument, first, last ) {+ var simple = type.slice( 0, 3 ) !== "nth",+ forward = type.slice( -4 ) !== "last",+ ofType = what === "of-type";++ return first === 1 && last === 0 ?++ // Shortcut for :nth-*(n)+ function( elem ) {+ return !!elem.parentNode;+ } :++ function( elem, context, xml ) {+ var cache, outerCache, node, diff, nodeIndex, start,+ dir = simple !== forward ? "nextSibling" : "previousSibling",+ parent = elem.parentNode,+ name = ofType && elem.nodeName.toLowerCase(),+ useCache = !xml && !ofType;++ if ( parent ) {++ // :(first|last|only)-(child|of-type)+ if ( simple ) {+ while ( dir ) {+ node = elem;+ while ( (node = node[ dir ]) ) {+ if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) {+ return false;+ }+ }+ // Reverse direction for :only-* (if we haven't yet done so)+ start = dir = type === "only" && !start && "nextSibling";+ }+ return true;+ }++ start = [ forward ? parent.firstChild : parent.lastChild ];++ // non-xml :nth-child(...) stores cache data on `parent`+ if ( forward && useCache ) {+ // Seek `elem` from a previously-cached index+ outerCache = parent[ expando ] || (parent[ expando ] = {});+ cache = outerCache[ type ] || [];+ nodeIndex = cache[0] === dirruns && cache[1];+ diff = cache[0] === dirruns && cache[2];+ node = nodeIndex && parent.childNodes[ nodeIndex ];++ while ( (node = ++nodeIndex && node && node[ dir ] ||++ // Fallback to seeking `elem` from the start+ (diff = nodeIndex = 0) || start.pop()) ) {++ // When found, cache indexes on `parent` and break+ if ( node.nodeType === 1 && ++diff && node === elem ) {+ outerCache[ type ] = [ dirruns, nodeIndex, diff ];+ break;+ }+ }++ // Use previously-cached element index if available+ } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) {+ diff = cache[1];++ // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...)+ } else {+ // Use the same loop as above to seek `elem` from the start+ while ( (node = ++nodeIndex && node && node[ dir ] ||+ (diff = nodeIndex = 0) || start.pop()) ) {++ if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) {+ // Cache the index of each encountered element+ if ( useCache ) {+ (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ];+ }++ if ( node === elem ) {+ break;+ }+ }+ }+ }++ // Incorporate the offset, then check against cycle size+ diff -= last;+ return diff === first || ( diff % first === 0 && diff / first >= 0 );+ }+ };+ },++ "PSEUDO": function( pseudo, argument ) {+ // pseudo-class names are case-insensitive+ // http://www.w3.org/TR/selectors/#pseudo-classes+ // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters+ // Remember that setFilters inherits from pseudos+ var args,+ fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||+ Sizzle.error( "unsupported pseudo: " + pseudo );++ // The user may use createPseudo to indicate that+ // arguments are needed to create the filter function+ // just as Sizzle does+ if ( fn[ expando ] ) {+ return fn( argument );+ }++ // But maintain support for old signatures+ if ( fn.length > 1 ) {+ args = [ pseudo, pseudo, "", argument ];+ return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?+ markFunction(function( seed, matches ) {+ var idx,+ matched = fn( seed, argument ),+ i = matched.length;+ while ( i-- ) {+ idx = indexOf.call( seed, matched[i] );+ seed[ idx ] = !( matches[ idx ] = matched[i] );+ }+ }) :+ function( elem ) {+ return fn( elem, 0, args );+ };+ }++ return fn;+ }+ },++ pseudos: {+ // Potentially complex pseudos+ "not": markFunction(function( selector ) {+ // Trim the selector passed to compile+ // to avoid treating leading and trailing+ // spaces as combinators+ var input = [],+ results = [],+ matcher = compile( selector.replace( rtrim, "$1" ) );++ return matcher[ expando ] ?+ markFunction(function( seed, matches, context, xml ) {+ var elem,+ unmatched = matcher( seed, null, xml, [] ),+ i = seed.length;++ // Match elements unmatched by `matcher`+ while ( i-- ) {+ if ( (elem = unmatched[i]) ) {+ seed[i] = !(matches[i] = elem);+ }+ }+ }) :+ function( elem, context, xml ) {+ input[0] = elem;+ matcher( input, null, xml, results );+ return !results.pop();+ };+ }),++ "has": markFunction(function( selector ) {+ return function( elem ) {+ return Sizzle( selector, elem ).length > 0;+ };+ }),++ "contains": markFunction(function( text ) {+ return function( elem ) {+ return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;+ };+ }),++ // "Whether an element is represented by a :lang() selector+ // is based solely on the element's language value+ // being equal to the identifier C,+ // or beginning with the identifier C immediately followed by "-".+ // The matching of C against the element's language value is performed case-insensitively.+ // The identifier C does not have to be a valid language name."+ // http://www.w3.org/TR/selectors/#lang-pseudo+ "lang": markFunction( function( lang ) {+ // lang value must be a valid identifier+ if ( !ridentifier.test(lang || "") ) {+ Sizzle.error( "unsupported lang: " + lang );+ }+ lang = lang.replace( runescape, funescape ).toLowerCase();+ return function( elem ) {+ var elemLang;+ do {+ if ( (elemLang = documentIsHTML ?+ elem.lang :+ elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {++ elemLang = elemLang.toLowerCase();+ return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;+ }+ } while ( (elem = elem.parentNode) && elem.nodeType === 1 );+ return false;+ };+ }),++ // Miscellaneous+ "target": function( elem ) {+ var hash = window.location && window.location.hash;+ return hash && hash.slice( 1 ) === elem.id;+ },++ "root": function( elem ) {+ return elem === docElem;+ },++ "focus": function( elem ) {+ return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);+ },++ // Boolean properties+ "enabled": function( elem ) {+ return elem.disabled === false;+ },++ "disabled": function( elem ) {+ return elem.disabled === true;+ },++ "checked": function( elem ) {+ // In CSS3, :checked should return both checked and selected elements+ // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked+ var nodeName = elem.nodeName.toLowerCase();+ return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);+ },++ "selected": function( elem ) {+ // Accessing this property makes selected-by-default+ // options in Safari work properly+ if ( elem.parentNode ) {+ elem.parentNode.selectedIndex;+ }++ return elem.selected === true;+ },++ // Contents+ "empty": function( elem ) {+ // http://www.w3.org/TR/selectors/#empty-pseudo+ // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),+ // but not by others (comment: 8; processing instruction: 7; etc.)+ // nodeType < 6 works because attributes (2) do not appear as children+ for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {+ if ( elem.nodeType < 6 ) {+ return false;+ }+ }+ return true;+ },++ "parent": function( elem ) {+ return !Expr.pseudos["empty"]( elem );+ },++ // Element/input types+ "header": function( elem ) {+ return rheader.test( elem.nodeName );+ },++ "input": function( elem ) {+ return rinputs.test( elem.nodeName );+ },++ "button": function( elem ) {+ var name = elem.nodeName.toLowerCase();+ return name === "input" && elem.type === "button" || name === "button";+ },++ "text": function( elem ) {+ var attr;+ return elem.nodeName.toLowerCase() === "input" &&+ elem.type === "text" &&++ // Support: IE<8+ // New HTML5 attribute values (e.g., "search") appear with elem.type === "text"+ ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );+ },++ // Position-in-collection+ "first": createPositionalPseudo(function() {+ return [ 0 ];+ }),++ "last": createPositionalPseudo(function( matchIndexes, length ) {+ return [ length - 1 ];+ }),++ "eq": createPositionalPseudo(function( matchIndexes, length, argument ) {+ return [ argument < 0 ? argument + length : argument ];+ }),++ "even": createPositionalPseudo(function( matchIndexes, length ) {+ var i = 0;+ for ( ; i < length; i += 2 ) {+ matchIndexes.push( i );+ }+ return matchIndexes;+ }),++ "odd": createPositionalPseudo(function( matchIndexes, length ) {+ var i = 1;+ for ( ; i < length; i += 2 ) {+ matchIndexes.push( i );+ }+ return matchIndexes;+ }),++ "lt": createPositionalPseudo(function( matchIndexes, length, argument ) {+ var i = argument < 0 ? argument + length : argument;+ for ( ; --i >= 0; ) {+ matchIndexes.push( i );+ }+ return matchIndexes;+ }),++ "gt": createPositionalPseudo(function( matchIndexes, length, argument ) {+ var i = argument < 0 ? argument + length : argument;+ for ( ; ++i < length; ) {+ matchIndexes.push( i );+ }+ return matchIndexes;+ })+ }+};++Expr.pseudos["nth"] = Expr.pseudos["eq"];++// Add button/input type pseudos+for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {+ Expr.pseudos[ i ] = createInputPseudo( i );+}+for ( i in { submit: true, reset: true } ) {+ Expr.pseudos[ i ] = createButtonPseudo( i );+}++// Easy API for creating new setFilters+function setFilters() {}+setFilters.prototype = Expr.filters = Expr.pseudos;+Expr.setFilters = new setFilters();++function tokenize( selector, parseOnly ) {+ var matched, match, tokens, type,+ soFar, groups, preFilters,+ cached = tokenCache[ selector + " " ];++ if ( cached ) {+ return parseOnly ? 0 : cached.slice( 0 );+ }++ soFar = selector;+ groups = [];+ preFilters = Expr.preFilter;++ while ( soFar ) {++ // Comma and first run+ if ( !matched || (match = rcomma.exec( soFar )) ) {+ if ( match ) {+ // Don't consume trailing commas as valid+ soFar = soFar.slice( match[0].length ) || soFar;+ }+ groups.push( (tokens = []) );+ }++ matched = false;++ // Combinators+ if ( (match = rcombinators.exec( soFar )) ) {+ matched = match.shift();+ tokens.push({+ value: matched,+ // Cast descendant combinators to space+ type: match[0].replace( rtrim, " " )+ });+ soFar = soFar.slice( matched.length );+ }++ // Filters+ for ( type in Expr.filter ) {+ if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||+ (match = preFilters[ type ]( match ))) ) {+ matched = match.shift();+ tokens.push({+ value: matched,+ type: type,+ matches: match+ });+ soFar = soFar.slice( matched.length );+ }+ }++ if ( !matched ) {+ break;+ }+ }++ // Return the length of the invalid excess+ // if we're just parsing+ // Otherwise, throw an error or return tokens+ return parseOnly ?+ soFar.length :+ soFar ?+ Sizzle.error( selector ) :+ // Cache the tokens+ tokenCache( selector, groups ).slice( 0 );+}++function toSelector( tokens ) {+ var i = 0,+ len = tokens.length,+ selector = "";+ for ( ; i < len; i++ ) {+ selector += tokens[i].value;+ }+ return selector;+}++function addCombinator( matcher, combinator, base ) {+ var dir = combinator.dir,+ checkNonElements = base && dir === "parentNode",+ doneName = done++;++ return combinator.first ?+ // Check against closest ancestor/preceding element+ function( elem, context, xml ) {+ while ( (elem = elem[ dir ]) ) {+ if ( elem.nodeType === 1 || checkNonElements ) {+ return matcher( elem, context, xml );+ }+ }+ } :++ // Check against all ancestor/preceding elements+ function( elem, context, xml ) {+ var oldCache, outerCache,+ newCache = [ dirruns, doneName ];++ // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching+ if ( xml ) {+ while ( (elem = elem[ dir ]) ) {+ if ( elem.nodeType === 1 || checkNonElements ) {+ if ( matcher( elem, context, xml ) ) {+ return true;+ }+ }+ }+ } else {+ while ( (elem = elem[ dir ]) ) {+ if ( elem.nodeType === 1 || checkNonElements ) {+ outerCache = elem[ expando ] || (elem[ expando ] = {});+ if ( (oldCache = outerCache[ dir ]) &&+ oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {++ // Assign to newCache so results back-propagate to previous elements+ return (newCache[ 2 ] = oldCache[ 2 ]);+ } else {+ // Reuse newcache so results back-propagate to previous elements+ outerCache[ dir ] = newCache;++ // A match means we're done; a fail means we have to keep checking+ if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {+ return true;+ }+ }+ }+ }+ }+ };+}++function elementMatcher( matchers ) {+ return matchers.length > 1 ?+ function( elem, context, xml ) {+ var i = matchers.length;+ while ( i-- ) {+ if ( !matchers[i]( elem, context, xml ) ) {+ return false;+ }+ }+ return true;+ } :+ matchers[0];+}++function condense( unmatched, map, filter, context, xml ) {+ var elem,+ newUnmatched = [],+ i = 0,+ len = unmatched.length,+ mapped = map != null;++ for ( ; i < len; i++ ) {+ if ( (elem = unmatched[i]) ) {+ if ( !filter || filter( elem, context, xml ) ) {+ newUnmatched.push( elem );+ if ( mapped ) {+ map.push( i );+ }+ }+ }+ }++ return newUnmatched;+}++function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {+ if ( postFilter && !postFilter[ expando ] ) {+ postFilter = setMatcher( postFilter );+ }+ if ( postFinder && !postFinder[ expando ] ) {+ postFinder = setMatcher( postFinder, postSelector );+ }+ return markFunction(function( seed, results, context, xml ) {+ var temp, i, elem,+ preMap = [],+ postMap = [],+ preexisting = results.length,++ // Get initial elements from seed or context+ elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),++ // Prefilter to get matcher input, preserving a map for seed-results synchronization+ matcherIn = preFilter && ( seed || !selector ) ?+ condense( elems, preMap, preFilter, context, xml ) :+ elems,++ matcherOut = matcher ?+ // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,+ postFinder || ( seed ? preFilter : preexisting || postFilter ) ?++ // ...intermediate processing is necessary+ [] :++ // ...otherwise use results directly+ results :+ matcherIn;++ // Find primary matches+ if ( matcher ) {+ matcher( matcherIn, matcherOut, context, xml );+ }++ // Apply postFilter+ if ( postFilter ) {+ temp = condense( matcherOut, postMap );+ postFilter( temp, [], context, xml );++ // Un-match failing elements by moving them back to matcherIn+ i = temp.length;+ while ( i-- ) {+ if ( (elem = temp[i]) ) {+ matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);+ }+ }+ }++ if ( seed ) {+ if ( postFinder || preFilter ) {+ if ( postFinder ) {+ // Get the final matcherOut by condensing this intermediate into postFinder contexts+ temp = [];+ i = matcherOut.length;+ while ( i-- ) {+ if ( (elem = matcherOut[i]) ) {+ // Restore matcherIn since elem is not yet a final match+ temp.push( (matcherIn[i] = elem) );+ }+ }+ postFinder( null, (matcherOut = []), temp, xml );+ }++ // Move matched elements from seed to results to keep them synchronized+ i = matcherOut.length;+ while ( i-- ) {+ if ( (elem = matcherOut[i]) &&+ (temp = postFinder ? indexOf.call( seed, elem ) : preMap[i]) > -1 ) {++ seed[temp] = !(results[temp] = elem);+ }+ }+ }++ // Add elements to results, through postFinder if defined+ } else {+ matcherOut = condense(+ matcherOut === results ?+ matcherOut.splice( preexisting, matcherOut.length ) :+ matcherOut+ );+ if ( postFinder ) {+ postFinder( null, results, matcherOut, xml );+ } else {+ push.apply( results, matcherOut );+ }+ }+ });+}++function matcherFromTokens( tokens ) {+ var checkContext, matcher, j,+ len = tokens.length,+ leadingRelative = Expr.relative[ tokens[0].type ],+ implicitRelative = leadingRelative || Expr.relative[" "],+ i = leadingRelative ? 1 : 0,++ // The foundational matcher ensures that elements are reachable from top-level context(s)+ matchContext = addCombinator( function( elem ) {+ return elem === checkContext;+ }, implicitRelative, true ),+ matchAnyContext = addCombinator( function( elem ) {+ return indexOf.call( checkContext, elem ) > -1;+ }, implicitRelative, true ),+ matchers = [ function( elem, context, xml ) {+ return ( !leadingRelative && ( xml || context !== outermostContext ) ) || (+ (checkContext = context).nodeType ?+ matchContext( elem, context, xml ) :+ matchAnyContext( elem, context, xml ) );+ } ];++ for ( ; i < len; i++ ) {+ if ( (matcher = Expr.relative[ tokens[i].type ]) ) {+ matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];+ } else {+ matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );++ // Return special upon seeing a positional matcher+ if ( matcher[ expando ] ) {+ // Find the next relative operator (if any) for proper handling+ j = ++i;+ for ( ; j < len; j++ ) {+ if ( Expr.relative[ tokens[j].type ] ) {+ break;+ }+ }+ return setMatcher(+ i > 1 && elementMatcher( matchers ),+ i > 1 && toSelector(+ // If the preceding token was a descendant combinator, insert an implicit any-element `*`+ tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })+ ).replace( rtrim, "$1" ),+ matcher,+ i < j && matcherFromTokens( tokens.slice( i, j ) ),+ j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),+ j < len && toSelector( tokens )+ );+ }+ matchers.push( matcher );+ }+ }++ return elementMatcher( matchers );+}++function matcherFromGroupMatchers( elementMatchers, setMatchers ) {+ var bySet = setMatchers.length > 0,+ byElement = elementMatchers.length > 0,+ superMatcher = function( seed, context, xml, results, outermost ) {+ var elem, j, matcher,+ matchedCount = 0,+ i = "0",+ unmatched = seed && [],+ setMatched = [],+ contextBackup = outermostContext,+ // We must always have either seed elements or outermost context+ elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),+ // Use integer dirruns iff this is the outermost matcher+ dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),+ len = elems.length;++ if ( outermost ) {+ outermostContext = context !== document && context;+ }++ // Add elements passing elementMatchers directly to results+ // Keep `i` a string if there are no elements so `matchedCount` will be "00" below+ // Support: IE<9, Safari+ // Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id+ for ( ; i !== len && (elem = elems[i]) != null; i++ ) {+ if ( byElement && elem ) {+ j = 0;+ while ( (matcher = elementMatchers[j++]) ) {+ if ( matcher( elem, context, xml ) ) {+ results.push( elem );+ break;+ }+ }+ if ( outermost ) {+ dirruns = dirrunsUnique;+ }+ }++ // Track unmatched elements for set filters+ if ( bySet ) {+ // They will have gone through all possible matchers+ if ( (elem = !matcher && elem) ) {+ matchedCount--;+ }++ // Lengthen the array for every element, matched or not+ if ( seed ) {+ unmatched.push( elem );+ }+ }+ }++ // Apply set filters to unmatched elements+ matchedCount += i;+ if ( bySet && i !== matchedCount ) {+ j = 0;+ while ( (matcher = setMatchers[j++]) ) {+ matcher( unmatched, setMatched, context, xml );+ }++ if ( seed ) {+ // Reintegrate element matches to eliminate the need for sorting+ if ( matchedCount > 0 ) {+ while ( i-- ) {+ if ( !(unmatched[i] || setMatched[i]) ) {+ setMatched[i] = pop.call( results );+ }+ }+ }++ // Discard index placeholder values to get only actual matches+ setMatched = condense( setMatched );+ }++ // Add matches to results+ push.apply( results, setMatched );++ // Seedless set matches succeeding multiple successful matchers stipulate sorting+ if ( outermost && !seed && setMatched.length > 0 &&+ ( matchedCount + setMatchers.length ) > 1 ) {++ Sizzle.uniqueSort( results );+ }+ }++ // Override manipulation of globals by nested matchers+ if ( outermost ) {+ dirruns = dirrunsUnique;+ outermostContext = contextBackup;+ }++ return unmatched;+ };++ return bySet ?+ markFunction( superMatcher ) :+ superMatcher;+}++compile = Sizzle.compile = function( selector, group /* Internal Use Only */ ) {+ var i,+ setMatchers = [],+ elementMatchers = [],+ cached = compilerCache[ selector + " " ];++ if ( !cached ) {+ // Generate a function of recursive functions that can be used to check each element+ if ( !group ) {+ group = tokenize( selector );+ }+ i = group.length;+ while ( i-- ) {+ cached = matcherFromTokens( group[i] );+ if ( cached[ expando ] ) {+ setMatchers.push( cached );+ } else {+ elementMatchers.push( cached );+ }+ }++ // Cache the compiled function+ cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );+ }+ return cached;+};++function multipleContexts( selector, contexts, results ) {+ var i = 0,+ len = contexts.length;+ for ( ; i < len; i++ ) {+ Sizzle( selector, contexts[i], results );+ }+ return results;+}++function select( selector, context, results, seed ) {+ var i, tokens, token, type, find,+ match = tokenize( selector );++ if ( !seed ) {+ // Try to minimize operations if there is only one group+ if ( match.length === 1 ) {++ // Take a shortcut and set the context if the root selector is an ID+ tokens = match[0] = match[0].slice( 0 );+ if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&+ support.getById && context.nodeType === 9 && documentIsHTML &&+ Expr.relative[ tokens[1].type ] ) {++ context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];+ if ( !context ) {+ return results;+ }+ selector = selector.slice( tokens.shift().value.length );+ }++ // Fetch a seed set for right-to-left matching+ i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;+ while ( i-- ) {+ token = tokens[i];++ // Abort if we hit a combinator+ if ( Expr.relative[ (type = token.type) ] ) {+ break;+ }+ if ( (find = Expr.find[ type ]) ) {+ // Search, expanding context for leading sibling combinators+ if ( (seed = find(+ token.matches[0].replace( runescape, funescape ),+ rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context+ )) ) {++ // If seed is empty or no tokens remain, we can return early+ tokens.splice( i, 1 );+ selector = seed.length && toSelector( tokens );+ if ( !selector ) {+ push.apply( results, seed );+ return results;+ }++ break;+ }+ }+ }+ }+ }++ // Compile and execute a filtering function+ // Provide `match` to avoid retokenization if we modified the selector above+ compile( selector, match )(+ seed,+ context,+ !documentIsHTML,+ results,+ rsibling.test( selector ) && testContext( context.parentNode ) || context+ );+ return results;+}++// One-time assignments++// Sort stability+support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;++// Support: Chrome<14+// Always assume duplicates if they aren't passed to the comparison function+support.detectDuplicates = !!hasDuplicate;++// Initialize against the default document+setDocument();++// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)+// Detached nodes confoundingly follow *each other*+support.sortDetached = assert(function( div1 ) {+ // Should return 1, but returns 4 (following)+ return div1.compareDocumentPosition( document.createElement("div") ) & 1;+});++// Support: IE<8+// Prevent attribute/property "interpolation"+// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx+if ( !assert(function( div ) {+ div.innerHTML = "<a href='#'></a>";+ return div.firstChild.getAttribute("href") === "#" ;+}) ) {+ addHandle( "type|href|height|width", function( elem, name, isXML ) {+ if ( !isXML ) {+ return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );+ }+ });+}++// Support: IE<9+// Use defaultValue in place of getAttribute("value")+if ( !support.attributes || !assert(function( div ) {+ div.innerHTML = "<input/>";+ div.firstChild.setAttribute( "value", "" );+ return div.firstChild.getAttribute( "value" ) === "";+}) ) {+ addHandle( "value", function( elem, name, isXML ) {+ if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {+ return elem.defaultValue;+ }+ });+}++// Support: IE<9+// Use getAttributeNode to fetch booleans when getAttribute lies+if ( !assert(function( div ) {+ return div.getAttribute("disabled") == null;+}) ) {+ addHandle( booleans, function( elem, name, isXML ) {+ var val;+ if ( !isXML ) {+ return elem[ name ] === true ? name.toLowerCase() :+ (val = elem.getAttributeNode( name )) && val.specified ?+ val.value :+ null;+ }+ });+}++return Sizzle;++})( window );++++jQuery.find = Sizzle;+jQuery.expr = Sizzle.selectors;+jQuery.expr[":"] = jQuery.expr.pseudos;+jQuery.unique = Sizzle.uniqueSort;+jQuery.text = Sizzle.getText;+jQuery.isXMLDoc = Sizzle.isXML;+jQuery.contains = Sizzle.contains;++++var rneedsContext = jQuery.expr.match.needsContext;++var rsingleTag = (/^<(\w+)\s*\/?>(?:<\/\1>|)$/);++++var risSimple = /^.[^:#\[\.,]*$/;++// Implement the identical functionality for filter and not+function winnow( elements, qualifier, not ) {+ if ( jQuery.isFunction( qualifier ) ) {+ return jQuery.grep( elements, function( elem, i ) {+ /* jshint -W018 */+ return !!qualifier.call( elem, i, elem ) !== not;+ });++ }++ if ( qualifier.nodeType ) {+ return jQuery.grep( elements, function( elem ) {+ return ( elem === qualifier ) !== not;+ });++ }++ if ( typeof qualifier === "string" ) {+ if ( risSimple.test( qualifier ) ) {+ return jQuery.filter( qualifier, elements, not );+ }++ qualifier = jQuery.filter( qualifier, elements );+ }++ return jQuery.grep( elements, function( elem ) {+ return ( indexOf.call( qualifier, elem ) >= 0 ) !== not;+ });+}++jQuery.filter = function( expr, elems, not ) {+ var elem = elems[ 0 ];++ if ( not ) {+ expr = ":not(" + expr + ")";+ }++ return elems.length === 1 && elem.nodeType === 1 ?+ jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :+ jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {+ return elem.nodeType === 1;+ }));+};++jQuery.fn.extend({+ find: function( selector ) {+ var i,+ len = this.length,+ ret = [],+ self = this;++ if ( typeof selector !== "string" ) {+ return this.pushStack( jQuery( selector ).filter(function() {+ for ( i = 0; i < len; i++ ) {+ if ( jQuery.contains( self[ i ], this ) ) {+ return true;+ }+ }+ }) );+ }++ for ( i = 0; i < len; i++ ) {+ jQuery.find( selector, self[ i ], ret );+ }++ // Needed because $( selector, context ) becomes $( context ).find( selector )+ ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );+ ret.selector = this.selector ? this.selector + " " + selector : selector;+ return ret;+ },+ filter: function( selector ) {+ return this.pushStack( winnow(this, selector || [], false) );+ },+ not: function( selector ) {+ return this.pushStack( winnow(this, selector || [], true) );+ },+ is: function( selector ) {+ return !!winnow(+ this,++ // If this is a positional/relative selector, check membership in the returned set+ // so $("p:first").is("p:last") won't return true for a doc with two "p".+ typeof selector === "string" && rneedsContext.test( selector ) ?+ jQuery( selector ) :+ selector || [],+ false+ ).length;+ }+});+++// Initialize a jQuery object+++// A central reference to the root jQuery(document)+var rootjQuery,++ // A simple way to check for HTML strings+ // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)+ // Strict HTML recognition (#11290: must start with <)+ rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,++ init = jQuery.fn.init = function( selector, context ) {+ var match, elem;++ // HANDLE: $(""), $(null), $(undefined), $(false)+ if ( !selector ) {+ return this;+ }++ // Handle HTML strings+ if ( typeof selector === "string" ) {+ if ( selector[0] === "<" && selector[ selector.length - 1 ] === ">" && selector.length >= 3 ) {+ // Assume that strings that start and end with <> are HTML and skip the regex check+ match = [ null, selector, null ];++ } else {+ match = rquickExpr.exec( selector );+ }++ // Match html or make sure no context is specified for #id+ if ( match && (match[1] || !context) ) {++ // HANDLE: $(html) -> $(array)+ if ( match[1] ) {+ context = context instanceof jQuery ? context[0] : context;++ // scripts is true for back-compat+ // Intentionally let the error be thrown if parseHTML is not present+ jQuery.merge( this, jQuery.parseHTML(+ match[1],+ context && context.nodeType ? context.ownerDocument || context : document,+ true+ ) );++ // HANDLE: $(html, props)+ if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {+ for ( match in context ) {+ // Properties of context are called as methods if possible+ if ( jQuery.isFunction( this[ match ] ) ) {+ this[ match ]( context[ match ] );++ // ...and otherwise set as attributes+ } else {+ this.attr( match, context[ match ] );+ }+ }+ }++ return this;++ // HANDLE: $(#id)+ } else {+ elem = document.getElementById( match[2] );++ // Check parentNode to catch when Blackberry 4.6 returns+ // nodes that are no longer in the document #6963+ if ( elem && elem.parentNode ) {+ // Inject the element directly into the jQuery object+ this.length = 1;+ this[0] = elem;+ }++ this.context = document;+ this.selector = selector;+ return this;+ }++ // HANDLE: $(expr, $(...))+ } else if ( !context || context.jquery ) {+ return ( context || rootjQuery ).find( selector );++ // HANDLE: $(expr, context)+ // (which is just equivalent to: $(context).find(expr)+ } else {+ return this.constructor( context ).find( selector );+ }++ // HANDLE: $(DOMElement)+ } else if ( selector.nodeType ) {+ this.context = this[0] = selector;+ this.length = 1;+ return this;++ // HANDLE: $(function)+ // Shortcut for document ready+ } else if ( jQuery.isFunction( selector ) ) {+ return typeof rootjQuery.ready !== "undefined" ?+ rootjQuery.ready( selector ) :+ // Execute immediately if ready is not present+ selector( jQuery );+ }++ if ( selector.selector !== undefined ) {+ this.selector = selector.selector;+ this.context = selector.context;+ }++ return jQuery.makeArray( selector, this );+ };++// Give the init function the jQuery prototype for later instantiation+init.prototype = jQuery.fn;++// Initialize central reference+rootjQuery = jQuery( document );+++var rparentsprev = /^(?:parents|prev(?:Until|All))/,+ // methods guaranteed to produce a unique set when starting from a unique set+ guaranteedUnique = {+ children: true,+ contents: true,+ next: true,+ prev: true+ };++jQuery.extend({+ dir: function( elem, dir, until ) {+ var matched = [],+ truncate = until !== undefined;++ while ( (elem = elem[ dir ]) && elem.nodeType !== 9 ) {+ if ( elem.nodeType === 1 ) {+ if ( truncate && jQuery( elem ).is( until ) ) {+ break;+ }+ matched.push( elem );+ }+ }+ return matched;+ },++ sibling: function( n, elem ) {+ var matched = [];++ for ( ; n; n = n.nextSibling ) {+ if ( n.nodeType === 1 && n !== elem ) {+ matched.push( n );+ }+ }++ return matched;+ }+});++jQuery.fn.extend({+ has: function( target ) {+ var targets = jQuery( target, this ),+ l = targets.length;++ return this.filter(function() {+ var i = 0;+ for ( ; i < l; i++ ) {+ if ( jQuery.contains( this, targets[i] ) ) {+ return true;+ }+ }+ });+ },++ closest: function( selectors, context ) {+ var cur,+ i = 0,+ l = this.length,+ matched = [],+ pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?+ jQuery( selectors, context || this.context ) :+ 0;++ for ( ; i < l; i++ ) {+ for ( cur = this[i]; cur && cur !== context; cur = cur.parentNode ) {+ // Always skip document fragments+ if ( cur.nodeType < 11 && (pos ?+ pos.index(cur) > -1 :++ // Don't pass non-elements to Sizzle+ cur.nodeType === 1 &&+ jQuery.find.matchesSelector(cur, selectors)) ) {++ matched.push( cur );+ break;+ }+ }+ }++ return this.pushStack( matched.length > 1 ? jQuery.unique( matched ) : matched );+ },++ // Determine the position of an element within+ // the matched set of elements+ index: function( elem ) {++ // No argument, return index in parent+ if ( !elem ) {+ return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;+ }++ // index in selector+ if ( typeof elem === "string" ) {+ return indexOf.call( jQuery( elem ), this[ 0 ] );+ }++ // Locate the position of the desired element+ return indexOf.call( this,++ // If it receives a jQuery object, the first element is used+ elem.jquery ? elem[ 0 ] : elem+ );+ },++ add: function( selector, context ) {+ return this.pushStack(+ jQuery.unique(+ jQuery.merge( this.get(), jQuery( selector, context ) )+ )+ );+ },++ addBack: function( selector ) {+ return this.add( selector == null ?+ this.prevObject : this.prevObject.filter(selector)+ );+ }+});++function sibling( cur, dir ) {+ while ( (cur = cur[dir]) && cur.nodeType !== 1 ) {}+ return cur;+}++jQuery.each({+ parent: function( elem ) {+ var parent = elem.parentNode;+ return parent && parent.nodeType !== 11 ? parent : null;+ },+ parents: function( elem ) {+ return jQuery.dir( elem, "parentNode" );+ },+ parentsUntil: function( elem, i, until ) {+ return jQuery.dir( elem, "parentNode", until );+ },+ next: function( elem ) {+ return sibling( elem, "nextSibling" );+ },+ prev: function( elem ) {+ return sibling( elem, "previousSibling" );+ },+ nextAll: function( elem ) {+ return jQuery.dir( elem, "nextSibling" );+ },+ prevAll: function( elem ) {+ return jQuery.dir( elem, "previousSibling" );+ },+ nextUntil: function( elem, i, until ) {+ return jQuery.dir( elem, "nextSibling", until );+ },+ prevUntil: function( elem, i, until ) {+ return jQuery.dir( elem, "previousSibling", until );+ },+ siblings: function( elem ) {+ return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );+ },+ children: function( elem ) {+ return jQuery.sibling( elem.firstChild );+ },+ contents: function( elem ) {+ return elem.contentDocument || jQuery.merge( [], elem.childNodes );+ }+}, function( name, fn ) {+ jQuery.fn[ name ] = function( until, selector ) {+ var matched = jQuery.map( this, fn, until );++ if ( name.slice( -5 ) !== "Until" ) {+ selector = until;+ }++ if ( selector && typeof selector === "string" ) {+ matched = jQuery.filter( selector, matched );+ }++ if ( this.length > 1 ) {+ // Remove duplicates+ if ( !guaranteedUnique[ name ] ) {+ jQuery.unique( matched );+ }++ // Reverse order for parents* and prev-derivatives+ if ( rparentsprev.test( name ) ) {+ matched.reverse();+ }+ }++ return this.pushStack( matched );+ };+});+var rnotwhite = (/\S+/g);++++// String to Object options format cache+var optionsCache = {};++// Convert String-formatted options into Object-formatted ones and store in cache+function createOptions( options ) {+ var object = optionsCache[ options ] = {};+ jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {+ object[ flag ] = true;+ });+ return object;+}++/*+ * Create a callback list using the following parameters:+ *+ * options: an optional list of space-separated options that will change how+ * the callback list behaves or a more traditional option object+ *+ * By default a callback list will act like an event callback list and can be+ * "fired" multiple times.+ *+ * Possible options:+ *+ * once: will ensure the callback list can only be fired once (like a Deferred)+ *+ * memory: will keep track of previous values and will call any callback added+ * after the list has been fired right away with the latest "memorized"+ * values (like a Deferred)+ *+ * unique: will ensure a callback can only be added once (no duplicate in the list)+ *+ * stopOnFalse: interrupt callings when a callback returns false+ *+ */+jQuery.Callbacks = function( options ) {++ // Convert options from String-formatted to Object-formatted if needed+ // (we check in cache first)+ options = typeof options === "string" ?+ ( optionsCache[ options ] || createOptions( options ) ) :+ jQuery.extend( {}, options );++ var // Last fire value (for non-forgettable lists)+ memory,+ // Flag to know if list was already fired+ fired,+ // Flag to know if list is currently firing+ firing,+ // First callback to fire (used internally by add and fireWith)+ firingStart,+ // End of the loop when firing+ firingLength,+ // Index of currently firing callback (modified by remove if needed)+ firingIndex,+ // Actual callback list+ list = [],+ // Stack of fire calls for repeatable lists+ stack = !options.once && [],+ // Fire callbacks+ fire = function( data ) {+ memory = options.memory && data;+ fired = true;+ firingIndex = firingStart || 0;+ firingStart = 0;+ firingLength = list.length;+ firing = true;+ for ( ; list && firingIndex < firingLength; firingIndex++ ) {+ if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {+ memory = false; // To prevent further calls using add+ break;+ }+ }+ firing = false;+ if ( list ) {+ if ( stack ) {+ if ( stack.length ) {+ fire( stack.shift() );+ }+ } else if ( memory ) {+ list = [];+ } else {+ self.disable();+ }+ }+ },+ // Actual Callbacks object+ self = {+ // Add a callback or a collection of callbacks to the list+ add: function() {+ if ( list ) {+ // First, we save the current length+ var start = list.length;+ (function add( args ) {+ jQuery.each( args, function( _, arg ) {+ var type = jQuery.type( arg );+ if ( type === "function" ) {+ if ( !options.unique || !self.has( arg ) ) {+ list.push( arg );+ }+ } else if ( arg && arg.length && type !== "string" ) {+ // Inspect recursively+ add( arg );+ }+ });+ })( arguments );+ // Do we need to add the callbacks to the+ // current firing batch?+ if ( firing ) {+ firingLength = list.length;+ // With memory, if we're not firing then+ // we should call right away+ } else if ( memory ) {+ firingStart = start;+ fire( memory );+ }+ }+ return this;+ },+ // Remove a callback from the list+ remove: function() {+ if ( list ) {+ jQuery.each( arguments, function( _, arg ) {+ var index;+ while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {+ list.splice( index, 1 );+ // Handle firing indexes+ if ( firing ) {+ if ( index <= firingLength ) {+ firingLength--;+ }+ if ( index <= firingIndex ) {+ firingIndex--;+ }+ }+ }+ });+ }+ return this;+ },+ // Check if a given callback is in the list.+ // If no argument is given, return whether or not list has callbacks attached.+ has: function( fn ) {+ return fn ? jQuery.inArray( fn, list ) > -1 : !!( list && list.length );+ },+ // Remove all callbacks from the list+ empty: function() {+ list = [];+ firingLength = 0;+ return this;+ },+ // Have the list do nothing anymore+ disable: function() {+ list = stack = memory = undefined;+ return this;+ },+ // Is it disabled?+ disabled: function() {+ return !list;+ },+ // Lock the list in its current state+ lock: function() {+ stack = undefined;+ if ( !memory ) {+ self.disable();+ }+ return this;+ },+ // Is it locked?+ locked: function() {+ return !stack;+ },+ // Call all callbacks with the given context and arguments+ fireWith: function( context, args ) {+ if ( list && ( !fired || stack ) ) {+ args = args || [];+ args = [ context, args.slice ? args.slice() : args ];+ if ( firing ) {+ stack.push( args );+ } else {+ fire( args );+ }+ }+ return this;+ },+ // Call all the callbacks with the given arguments+ fire: function() {+ self.fireWith( this, arguments );+ return this;+ },+ // To know if the callbacks have already been called at least once+ fired: function() {+ return !!fired;+ }+ };++ return self;+};+++jQuery.extend({++ Deferred: function( func ) {+ var tuples = [+ // action, add listener, listener list, final state+ [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],+ [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],+ [ "notify", "progress", jQuery.Callbacks("memory") ]+ ],+ state = "pending",+ promise = {+ state: function() {+ return state;+ },+ always: function() {+ deferred.done( arguments ).fail( arguments );+ return this;+ },+ then: function( /* fnDone, fnFail, fnProgress */ ) {+ var fns = arguments;+ return jQuery.Deferred(function( newDefer ) {+ jQuery.each( tuples, function( i, tuple ) {+ var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];+ // deferred[ done | fail | progress ] for forwarding actions to newDefer+ deferred[ tuple[1] ](function() {+ var returned = fn && fn.apply( this, arguments );+ if ( returned && jQuery.isFunction( returned.promise ) ) {+ returned.promise()+ .done( newDefer.resolve )+ .fail( newDefer.reject )+ .progress( newDefer.notify );+ } else {+ newDefer[ tuple[ 0 ] + "With" ]( this === promise ? newDefer.promise() : this, fn ? [ returned ] : arguments );+ }+ });+ });+ fns = null;+ }).promise();+ },+ // Get a promise for this deferred+ // If obj is provided, the promise aspect is added to the object+ promise: function( obj ) {+ return obj != null ? jQuery.extend( obj, promise ) : promise;+ }+ },+ deferred = {};++ // Keep pipe for back-compat+ promise.pipe = promise.then;++ // Add list-specific methods+ jQuery.each( tuples, function( i, tuple ) {+ var list = tuple[ 2 ],+ stateString = tuple[ 3 ];++ // promise[ done | fail | progress ] = list.add+ promise[ tuple[1] ] = list.add;++ // Handle state+ if ( stateString ) {+ list.add(function() {+ // state = [ resolved | rejected ]+ state = stateString;++ // [ reject_list | resolve_list ].disable; progress_list.lock+ }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );+ }++ // deferred[ resolve | reject | notify ]+ deferred[ tuple[0] ] = function() {+ deferred[ tuple[0] + "With" ]( this === deferred ? promise : this, arguments );+ return this;+ };+ deferred[ tuple[0] + "With" ] = list.fireWith;+ });++ // Make the deferred a promise+ promise.promise( deferred );++ // Call given func if any+ if ( func ) {+ func.call( deferred, deferred );+ }++ // All done!+ return deferred;+ },++ // Deferred helper+ when: function( subordinate /* , ..., subordinateN */ ) {+ var i = 0,+ resolveValues = slice.call( arguments ),+ length = resolveValues.length,++ // the count of uncompleted subordinates+ remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,++ // the master Deferred. If resolveValues consist of only a single Deferred, just use that.+ deferred = remaining === 1 ? subordinate : jQuery.Deferred(),++ // Update function for both resolve and progress values+ updateFunc = function( i, contexts, values ) {+ return function( value ) {+ contexts[ i ] = this;+ values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;+ if ( values === progressValues ) {+ deferred.notifyWith( contexts, values );+ } else if ( !( --remaining ) ) {+ deferred.resolveWith( contexts, values );+ }+ };+ },++ progressValues, progressContexts, resolveContexts;++ // add listeners to Deferred subordinates; treat others as resolved+ if ( length > 1 ) {+ progressValues = new Array( length );+ progressContexts = new Array( length );+ resolveContexts = new Array( length );+ for ( ; i < length; i++ ) {+ if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {+ resolveValues[ i ].promise()+ .done( updateFunc( i, resolveContexts, resolveValues ) )+ .fail( deferred.reject )+ .progress( updateFunc( i, progressContexts, progressValues ) );+ } else {+ --remaining;+ }+ }+ }++ // if we're not waiting on anything, resolve the master+ if ( !remaining ) {+ deferred.resolveWith( resolveContexts, resolveValues );+ }++ return deferred.promise();+ }+});+++// The deferred used on DOM ready+var readyList;++jQuery.fn.ready = function( fn ) {+ // Add the callback+ jQuery.ready.promise().done( fn );++ return this;+};++jQuery.extend({+ // Is the DOM ready to be used? Set to true once it occurs.+ isReady: false,++ // A counter to track how many items to wait for before+ // the ready event fires. See #6781+ readyWait: 1,++ // Hold (or release) the ready event+ holdReady: function( hold ) {+ if ( hold ) {+ jQuery.readyWait++;+ } else {+ jQuery.ready( true );+ }+ },++ // Handle when the DOM is ready+ ready: function( wait ) {++ // Abort if there are pending holds or we're already ready+ if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {+ return;+ }++ // Remember that the DOM is ready+ jQuery.isReady = true;++ // If a normal DOM Ready event fired, decrement, and wait if need be+ if ( wait !== true && --jQuery.readyWait > 0 ) {+ return;+ }++ // If there are functions bound, to execute+ readyList.resolveWith( document, [ jQuery ] );++ // Trigger any bound ready events+ if ( jQuery.fn.trigger ) {+ jQuery( document ).trigger("ready").off("ready");+ }+ }+});++/**+ * The ready event handler and self cleanup method+ */+function completed() {+ document.removeEventListener( "DOMContentLoaded", completed, false );+ window.removeEventListener( "load", completed, false );+ jQuery.ready();+}++jQuery.ready.promise = function( obj ) {+ if ( !readyList ) {++ readyList = jQuery.Deferred();++ // Catch cases where $(document).ready() is called after the browser event has already occurred.+ // we once tried to use readyState "interactive" here, but it caused issues like the one+ // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15+ if ( document.readyState === "complete" ) {+ // Handle it asynchronously to allow scripts the opportunity to delay ready+ setTimeout( jQuery.ready );++ } else {++ // Use the handy event callback+ document.addEventListener( "DOMContentLoaded", completed, false );++ // A fallback to window.onload, that will always work+ window.addEventListener( "load", completed, false );+ }+ }+ return readyList.promise( obj );+};++// Kick off the DOM ready check even if the user does not+jQuery.ready.promise();+++++// Multifunctional method to get and set values of a collection+// The value/s can optionally be executed if it's a function+var access = jQuery.access = function( elems, fn, key, value, chainable, emptyGet, raw ) {+ var i = 0,+ len = elems.length,+ bulk = key == null;++ // Sets many values+ if ( jQuery.type( key ) === "object" ) {+ chainable = true;+ for ( i in key ) {+ jQuery.access( elems, fn, i, key[i], true, emptyGet, raw );+ }++ // Sets one value+ } else if ( value !== undefined ) {+ chainable = true;++ if ( !jQuery.isFunction( value ) ) {+ raw = true;+ }++ if ( bulk ) {+ // Bulk operations run against the entire set+ if ( raw ) {+ fn.call( elems, value );+ fn = null;++ // ...except when executing function values+ } else {+ bulk = fn;+ fn = function( elem, key, value ) {+ return bulk.call( jQuery( elem ), value );+ };+ }+ }++ if ( fn ) {+ for ( ; i < len; i++ ) {+ fn( elems[i], key, raw ? value : value.call( elems[i], i, fn( elems[i], key ) ) );+ }+ }+ }++ return chainable ?+ elems :++ // Gets+ bulk ?+ fn.call( elems ) :+ len ? fn( elems[0], key ) : emptyGet;+};+++/**+ * Determines whether an object can have data+ */+jQuery.acceptData = function( owner ) {+ // Accepts only:+ // - Node+ // - Node.ELEMENT_NODE+ // - Node.DOCUMENT_NODE+ // - Object+ // - Any+ /* jshint -W018 */+ return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );+};+++function Data() {+ // Support: Android < 4,+ // Old WebKit does not have Object.preventExtensions/freeze method,+ // return new empty object instead with no [[set]] accessor+ Object.defineProperty( this.cache = {}, 0, {+ get: function() {+ return {};+ }+ });++ this.expando = jQuery.expando + Math.random();+}++Data.uid = 1;+Data.accepts = jQuery.acceptData;++Data.prototype = {+ key: function( owner ) {+ // We can accept data for non-element nodes in modern browsers,+ // but we should not, see #8335.+ // Always return the key for a frozen object.+ if ( !Data.accepts( owner ) ) {+ return 0;+ }++ var descriptor = {},+ // Check if the owner object already has a cache key+ unlock = owner[ this.expando ];++ // If not, create one+ if ( !unlock ) {+ unlock = Data.uid++;++ // Secure it in a non-enumerable, non-writable property+ try {+ descriptor[ this.expando ] = { value: unlock };+ Object.defineProperties( owner, descriptor );++ // Support: Android < 4+ // Fallback to a less secure definition+ } catch ( e ) {+ descriptor[ this.expando ] = unlock;+ jQuery.extend( owner, descriptor );+ }+ }++ // Ensure the cache object+ if ( !this.cache[ unlock ] ) {+ this.cache[ unlock ] = {};+ }++ return unlock;+ },+ set: function( owner, data, value ) {+ var prop,+ // There may be an unlock assigned to this node,+ // if there is no entry for this "owner", create one inline+ // and set the unlock as though an owner entry had always existed+ unlock = this.key( owner ),+ cache = this.cache[ unlock ];++ // Handle: [ owner, key, value ] args+ if ( typeof data === "string" ) {+ cache[ data ] = value;++ // Handle: [ owner, { properties } ] args+ } else {+ // Fresh assignments by object are shallow copied+ if ( jQuery.isEmptyObject( cache ) ) {+ jQuery.extend( this.cache[ unlock ], data );+ // Otherwise, copy the properties one-by-one to the cache object+ } else {+ for ( prop in data ) {+ cache[ prop ] = data[ prop ];+ }+ }+ }+ return cache;+ },+ get: function( owner, key ) {+ // Either a valid cache is found, or will be created.+ // New caches will be created and the unlock returned,+ // allowing direct access to the newly created+ // empty data object. A valid owner object must be provided.+ var cache = this.cache[ this.key( owner ) ];++ return key === undefined ?+ cache : cache[ key ];+ },+ access: function( owner, key, value ) {+ var stored;+ // In cases where either:+ //+ // 1. No key was specified+ // 2. A string key was specified, but no value provided+ //+ // Take the "read" path and allow the get method to determine+ // which value to return, respectively either:+ //+ // 1. The entire cache object+ // 2. The data stored at the key+ //+ if ( key === undefined ||+ ((key && typeof key === "string") && value === undefined) ) {++ stored = this.get( owner, key );++ return stored !== undefined ?+ stored : this.get( owner, jQuery.camelCase(key) );+ }++ // [*]When the key is not a string, or both a key and value+ // are specified, set or extend (existing objects) with either:+ //+ // 1. An object of properties+ // 2. A key and value+ //+ this.set( owner, key, value );++ // Since the "set" path can have two possible entry points+ // return the expected data based on which path was taken[*]+ return value !== undefined ? value : key;+ },+ remove: function( owner, key ) {+ var i, name, camel,+ unlock = this.key( owner ),+ cache = this.cache[ unlock ];++ if ( key === undefined ) {+ this.cache[ unlock ] = {};++ } else {+ // Support array or space separated string of keys+ if ( jQuery.isArray( key ) ) {+ // If "name" is an array of keys...+ // When data is initially created, via ("key", "val") signature,+ // keys will be converted to camelCase.+ // Since there is no way to tell _how_ a key was added, remove+ // both plain key and camelCase key. #12786+ // This will only penalize the array argument path.+ name = key.concat( key.map( jQuery.camelCase ) );+ } else {+ camel = jQuery.camelCase( key );+ // Try the string as a key before any manipulation+ if ( key in cache ) {+ name = [ key, camel ];+ } else {+ // If a key with the spaces exists, use it.+ // Otherwise, create an array by matching non-whitespace+ name = camel;+ name = name in cache ?+ [ name ] : ( name.match( rnotwhite ) || [] );+ }+ }++ i = name.length;+ while ( i-- ) {+ delete cache[ name[ i ] ];+ }+ }+ },+ hasData: function( owner ) {+ return !jQuery.isEmptyObject(+ this.cache[ owner[ this.expando ] ] || {}+ );+ },+ discard: function( owner ) {+ if ( owner[ this.expando ] ) {+ delete this.cache[ owner[ this.expando ] ];+ }+ }+};+var data_priv = new Data();++var data_user = new Data();++++/*+ Implementation Summary++ 1. Enforce API surface and semantic compatibility with 1.9.x branch+ 2. Improve the module's maintainability by reducing the storage+ paths to a single mechanism.+ 3. Use the same single mechanism to support "private" and "user" data.+ 4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)+ 5. Avoid exposing implementation details on user objects (eg. expando properties)+ 6. Provide a clear path for implementation upgrade to WeakMap in 2014+*/+var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,+ rmultiDash = /([A-Z])/g;++function dataAttr( elem, key, data ) {+ var name;++ // If nothing was found internally, try to fetch any+ // data from the HTML5 data-* attribute+ if ( data === undefined && elem.nodeType === 1 ) {+ name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();+ data = elem.getAttribute( name );++ if ( typeof data === "string" ) {+ try {+ data = data === "true" ? true :+ data === "false" ? false :+ data === "null" ? null :+ // Only convert to a number if it doesn't change the string+ +data + "" === data ? +data :+ rbrace.test( data ) ? jQuery.parseJSON( data ) :+ data;+ } catch( e ) {}++ // Make sure we set the data so it isn't changed later+ data_user.set( elem, key, data );+ } else {+ data = undefined;+ }+ }+ return data;+}++jQuery.extend({+ hasData: function( elem ) {+ return data_user.hasData( elem ) || data_priv.hasData( elem );+ },++ data: function( elem, name, data ) {+ return data_user.access( elem, name, data );+ },++ removeData: function( elem, name ) {+ data_user.remove( elem, name );+ },++ // TODO: Now that all calls to _data and _removeData have been replaced+ // with direct calls to data_priv methods, these can be deprecated.+ _data: function( elem, name, data ) {+ return data_priv.access( elem, name, data );+ },++ _removeData: function( elem, name ) {+ data_priv.remove( elem, name );+ }+});++jQuery.fn.extend({+ data: function( key, value ) {+ var i, name, data,+ elem = this[ 0 ],+ attrs = elem && elem.attributes;++ // Gets all values+ if ( key === undefined ) {+ if ( this.length ) {+ data = data_user.get( elem );++ if ( elem.nodeType === 1 && !data_priv.get( elem, "hasDataAttrs" ) ) {+ i = attrs.length;+ while ( i-- ) {+ name = attrs[ i ].name;++ if ( name.indexOf( "data-" ) === 0 ) {+ name = jQuery.camelCase( name.slice(5) );+ dataAttr( elem, name, data[ name ] );+ }+ }+ data_priv.set( elem, "hasDataAttrs", true );+ }+ }++ return data;+ }++ // Sets multiple values+ if ( typeof key === "object" ) {+ return this.each(function() {+ data_user.set( this, key );+ });+ }++ return access( this, function( value ) {+ var data,+ camelKey = jQuery.camelCase( key );++ // The calling jQuery object (element matches) is not empty+ // (and therefore has an element appears at this[ 0 ]) and the+ // `value` parameter was not undefined. An empty jQuery object+ // will result in `undefined` for elem = this[ 0 ] which will+ // throw an exception if an attempt to read a data cache is made.+ if ( elem && value === undefined ) {+ // Attempt to get data from the cache+ // with the key as-is+ data = data_user.get( elem, key );+ if ( data !== undefined ) {+ return data;+ }++ // Attempt to get data from the cache+ // with the key camelized+ data = data_user.get( elem, camelKey );+ if ( data !== undefined ) {+ return data;+ }++ // Attempt to "discover" the data in+ // HTML5 custom data-* attrs+ data = dataAttr( elem, camelKey, undefined );+ if ( data !== undefined ) {+ return data;+ }++ // We tried really hard, but the data doesn't exist.+ return;+ }++ // Set the data...+ this.each(function() {+ // First, attempt to store a copy or reference of any+ // data that might've been store with a camelCased key.+ var data = data_user.get( this, camelKey );++ // For HTML5 data-* attribute interop, we have to+ // store property names with dashes in a camelCase form.+ // This might not apply to all properties...*+ data_user.set( this, camelKey, value );++ // *... In the case of properties that might _actually_+ // have dashes, we need to also store a copy of that+ // unchanged property.+ if ( key.indexOf("-") !== -1 && data !== undefined ) {+ data_user.set( this, key, value );+ }+ });+ }, null, value, arguments.length > 1, null, true );+ },++ removeData: function( key ) {+ return this.each(function() {+ data_user.remove( this, key );+ });+ }+});+++jQuery.extend({+ queue: function( elem, type, data ) {+ var queue;++ if ( elem ) {+ type = ( type || "fx" ) + "queue";+ queue = data_priv.get( elem, type );++ // Speed up dequeue by getting out quickly if this is just a lookup+ if ( data ) {+ if ( !queue || jQuery.isArray( data ) ) {+ queue = data_priv.access( elem, type, jQuery.makeArray(data) );+ } else {+ queue.push( data );+ }+ }+ return queue || [];+ }+ },++ dequeue: function( elem, type ) {+ type = type || "fx";++ var queue = jQuery.queue( elem, type ),+ startLength = queue.length,+ fn = queue.shift(),+ hooks = jQuery._queueHooks( elem, type ),+ next = function() {+ jQuery.dequeue( elem, type );+ };++ // If the fx queue is dequeued, always remove the progress sentinel+ if ( fn === "inprogress" ) {+ fn = queue.shift();+ startLength--;+ }++ if ( fn ) {++ // Add a progress sentinel to prevent the fx queue from being+ // automatically dequeued+ if ( type === "fx" ) {+ queue.unshift( "inprogress" );+ }++ // clear up the last queue stop function+ delete hooks.stop;+ fn.call( elem, next, hooks );+ }++ if ( !startLength && hooks ) {+ hooks.empty.fire();+ }+ },++ // not intended for public consumption - generates a queueHooks object, or returns the current one+ _queueHooks: function( elem, type ) {+ var key = type + "queueHooks";+ return data_priv.get( elem, key ) || data_priv.access( elem, key, {+ empty: jQuery.Callbacks("once memory").add(function() {+ data_priv.remove( elem, [ type + "queue", key ] );+ })+ });+ }+});++jQuery.fn.extend({+ queue: function( type, data ) {+ var setter = 2;++ if ( typeof type !== "string" ) {+ data = type;+ type = "fx";+ setter--;+ }++ if ( arguments.length < setter ) {+ return jQuery.queue( this[0], type );+ }++ return data === undefined ?+ this :+ this.each(function() {+ var queue = jQuery.queue( this, type, data );++ // ensure a hooks for this queue+ jQuery._queueHooks( this, type );++ if ( type === "fx" && queue[0] !== "inprogress" ) {+ jQuery.dequeue( this, type );+ }+ });+ },+ dequeue: function( type ) {+ return this.each(function() {+ jQuery.dequeue( this, type );+ });+ },+ clearQueue: function( type ) {+ return this.queue( type || "fx", [] );+ },+ // Get a promise resolved when queues of a certain type+ // are emptied (fx is the type by default)+ promise: function( type, obj ) {+ var tmp,+ count = 1,+ defer = jQuery.Deferred(),+ elements = this,+ i = this.length,+ resolve = function() {+ if ( !( --count ) ) {+ defer.resolveWith( elements, [ elements ] );+ }+ };++ if ( typeof type !== "string" ) {+ obj = type;+ type = undefined;+ }+ type = type || "fx";++ while ( i-- ) {+ tmp = data_priv.get( elements[ i ], type + "queueHooks" );+ if ( tmp && tmp.empty ) {+ count++;+ tmp.empty.add( resolve );+ }+ }+ resolve();+ return defer.promise( obj );+ }+});+var pnum = (/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;++var cssExpand = [ "Top", "Right", "Bottom", "Left" ];++var isHidden = function( elem, el ) {+ // isHidden might be called from jQuery#filter function;+ // in that case, element will be second argument+ elem = el || elem;+ return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );+ };++var rcheckableType = (/^(?:checkbox|radio)$/i);++++(function() {+ var fragment = document.createDocumentFragment(),+ div = fragment.appendChild( document.createElement( "div" ) );++ // #11217 - WebKit loses check when the name is after the checked attribute+ div.innerHTML = "<input type='radio' checked='checked' name='t'/>";++ // Support: Safari 5.1, iOS 5.1, Android 4.x, Android 2.3+ // old WebKit doesn't clone checked state correctly in fragments+ support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;++ // Make sure textarea (and checkbox) defaultValue is properly cloned+ // Support: IE9-IE11++ div.innerHTML = "<textarea>x</textarea>";+ support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;+})();+var strundefined = typeof undefined;++++support.focusinBubbles = "onfocusin" in window;+++var+ rkeyEvent = /^key/,+ rmouseEvent = /^(?:mouse|contextmenu)|click/,+ rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,+ rtypenamespace = /^([^.]*)(?:\.(.+)|)$/;++function returnTrue() {+ return true;+}++function returnFalse() {+ return false;+}++function safeActiveElement() {+ try {+ return document.activeElement;+ } catch ( err ) { }+}++/*+ * Helper functions for managing events -- not part of the public interface.+ * Props to Dean Edwards' addEvent library for many of the ideas.+ */+jQuery.event = {++ global: {},++ add: function( elem, types, handler, data, selector ) {++ var handleObjIn, eventHandle, tmp,+ events, t, handleObj,+ special, handlers, type, namespaces, origType,+ elemData = data_priv.get( elem );++ // Don't attach events to noData or text/comment nodes (but allow plain objects)+ if ( !elemData ) {+ return;+ }++ // Caller can pass in an object of custom data in lieu of the handler+ if ( handler.handler ) {+ handleObjIn = handler;+ handler = handleObjIn.handler;+ selector = handleObjIn.selector;+ }++ // Make sure that the handler has a unique ID, used to find/remove it later+ if ( !handler.guid ) {+ handler.guid = jQuery.guid++;+ }++ // Init the element's event structure and main handler, if this is the first+ if ( !(events = elemData.events) ) {+ events = elemData.events = {};+ }+ if ( !(eventHandle = elemData.handle) ) {+ eventHandle = elemData.handle = function( e ) {+ // Discard the second event of a jQuery.event.trigger() and+ // when an event is called after a page has unloaded+ return typeof jQuery !== strundefined && jQuery.event.triggered !== e.type ?+ jQuery.event.dispatch.apply( elem, arguments ) : undefined;+ };+ }++ // Handle multiple events separated by a space+ types = ( types || "" ).match( rnotwhite ) || [ "" ];+ t = types.length;+ while ( t-- ) {+ tmp = rtypenamespace.exec( types[t] ) || [];+ type = origType = tmp[1];+ namespaces = ( tmp[2] || "" ).split( "." ).sort();++ // There *must* be a type, no attaching namespace-only handlers+ if ( !type ) {+ continue;+ }++ // If event changes its type, use the special event handlers for the changed type+ special = jQuery.event.special[ type ] || {};++ // If selector defined, determine special event api type, otherwise given type+ type = ( selector ? special.delegateType : special.bindType ) || type;++ // Update special based on newly reset type+ special = jQuery.event.special[ type ] || {};++ // handleObj is passed to all event handlers+ handleObj = jQuery.extend({+ type: type,+ origType: origType,+ data: data,+ handler: handler,+ guid: handler.guid,+ selector: selector,+ needsContext: selector && jQuery.expr.match.needsContext.test( selector ),+ namespace: namespaces.join(".")+ }, handleObjIn );++ // Init the event handler queue if we're the first+ if ( !(handlers = events[ type ]) ) {+ handlers = events[ type ] = [];+ handlers.delegateCount = 0;++ // Only use addEventListener if the special events handler returns false+ if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {+ if ( elem.addEventListener ) {+ elem.addEventListener( type, eventHandle, false );+ }+ }+ }++ if ( special.add ) {+ special.add.call( elem, handleObj );++ if ( !handleObj.handler.guid ) {+ handleObj.handler.guid = handler.guid;+ }+ }++ // Add to the element's handler list, delegates in front+ if ( selector ) {+ handlers.splice( handlers.delegateCount++, 0, handleObj );+ } else {+ handlers.push( handleObj );+ }++ // Keep track of which events have ever been used, for event optimization+ jQuery.event.global[ type ] = true;+ }++ },++ // Detach an event or set of events from an element+ remove: function( elem, types, handler, selector, mappedTypes ) {++ var j, origCount, tmp,+ events, t, handleObj,+ special, handlers, type, namespaces, origType,+ elemData = data_priv.hasData( elem ) && data_priv.get( elem );++ if ( !elemData || !(events = elemData.events) ) {+ return;+ }++ // Once for each type.namespace in types; type may be omitted+ types = ( types || "" ).match( rnotwhite ) || [ "" ];+ t = types.length;+ while ( t-- ) {+ tmp = rtypenamespace.exec( types[t] ) || [];+ type = origType = tmp[1];+ namespaces = ( tmp[2] || "" ).split( "." ).sort();++ // Unbind all events (on this namespace, if provided) for the element+ if ( !type ) {+ for ( type in events ) {+ jQuery.event.remove( elem, type + types[ t ], handler, selector, true );+ }+ continue;+ }++ special = jQuery.event.special[ type ] || {};+ type = ( selector ? special.delegateType : special.bindType ) || type;+ handlers = events[ type ] || [];+ tmp = tmp[2] && new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" );++ // Remove matching events+ origCount = j = handlers.length;+ while ( j-- ) {+ handleObj = handlers[ j ];++ if ( ( mappedTypes || origType === handleObj.origType ) &&+ ( !handler || handler.guid === handleObj.guid ) &&+ ( !tmp || tmp.test( handleObj.namespace ) ) &&+ ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {+ handlers.splice( j, 1 );++ if ( handleObj.selector ) {+ handlers.delegateCount--;+ }+ if ( special.remove ) {+ special.remove.call( elem, handleObj );+ }+ }+ }++ // Remove generic event handler if we removed something and no more handlers exist+ // (avoids potential for endless recursion during removal of special event handlers)+ if ( origCount && !handlers.length ) {+ if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {+ jQuery.removeEvent( elem, type, elemData.handle );+ }++ delete events[ type ];+ }+ }++ // Remove the expando if it's no longer used+ if ( jQuery.isEmptyObject( events ) ) {+ delete elemData.handle;+ data_priv.remove( elem, "events" );+ }+ },++ trigger: function( event, data, elem, onlyHandlers ) {++ var i, cur, tmp, bubbleType, ontype, handle, special,+ eventPath = [ elem || document ],+ type = hasOwn.call( event, "type" ) ? event.type : event,+ namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split(".") : [];++ cur = tmp = elem = elem || document;++ // Don't do events on text and comment nodes+ if ( elem.nodeType === 3 || elem.nodeType === 8 ) {+ return;+ }++ // focus/blur morphs to focusin/out; ensure we're not firing them right now+ if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {+ return;+ }++ if ( type.indexOf(".") >= 0 ) {+ // Namespaced trigger; create a regexp to match event type in handle()+ namespaces = type.split(".");+ type = namespaces.shift();+ namespaces.sort();+ }+ ontype = type.indexOf(":") < 0 && "on" + type;++ // Caller can pass in a jQuery.Event object, Object, or just an event type string+ event = event[ jQuery.expando ] ?+ event :+ new jQuery.Event( type, typeof event === "object" && event );++ // Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)+ event.isTrigger = onlyHandlers ? 2 : 3;+ event.namespace = namespaces.join(".");+ event.namespace_re = event.namespace ?+ new RegExp( "(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)" ) :+ null;++ // Clean up the event in case it is being reused+ event.result = undefined;+ if ( !event.target ) {+ event.target = elem;+ }++ // Clone any incoming data and prepend the event, creating the handler arg list+ data = data == null ?+ [ event ] :+ jQuery.makeArray( data, [ event ] );++ // Allow special events to draw outside the lines+ special = jQuery.event.special[ type ] || {};+ if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {+ return;+ }++ // Determine event propagation path in advance, per W3C events spec (#9951)+ // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)+ if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {++ bubbleType = special.delegateType || type;+ if ( !rfocusMorph.test( bubbleType + type ) ) {+ cur = cur.parentNode;+ }+ for ( ; cur; cur = cur.parentNode ) {+ eventPath.push( cur );+ tmp = cur;+ }++ // Only add window if we got to document (e.g., not plain obj or detached DOM)+ if ( tmp === (elem.ownerDocument || document) ) {+ eventPath.push( tmp.defaultView || tmp.parentWindow || window );+ }+ }++ // Fire handlers on the event path+ i = 0;+ while ( (cur = eventPath[i++]) && !event.isPropagationStopped() ) {++ event.type = i > 1 ?+ bubbleType :+ special.bindType || type;++ // jQuery handler+ handle = ( data_priv.get( cur, "events" ) || {} )[ event.type ] && data_priv.get( cur, "handle" );+ if ( handle ) {+ handle.apply( cur, data );+ }++ // Native handler+ handle = ontype && cur[ ontype ];+ if ( handle && handle.apply && jQuery.acceptData( cur ) ) {+ event.result = handle.apply( cur, data );+ if ( event.result === false ) {+ event.preventDefault();+ }+ }+ }+ event.type = type;++ // If nobody prevented the default action, do it now+ if ( !onlyHandlers && !event.isDefaultPrevented() ) {++ if ( (!special._default || special._default.apply( eventPath.pop(), data ) === false) &&+ jQuery.acceptData( elem ) ) {++ // Call a native DOM method on the target with the same name name as the event.+ // Don't do default actions on window, that's where global variables be (#6170)+ if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {++ // Don't re-trigger an onFOO event when we call its FOO() method+ tmp = elem[ ontype ];++ if ( tmp ) {+ elem[ ontype ] = null;+ }++ // Prevent re-triggering of the same event, since we already bubbled it above+ jQuery.event.triggered = type;+ elem[ type ]();+ jQuery.event.triggered = undefined;++ if ( tmp ) {+ elem[ ontype ] = tmp;+ }+ }+ }+ }++ return event.result;+ },++ dispatch: function( event ) {++ // Make a writable jQuery.Event from the native event object+ event = jQuery.event.fix( event );++ var i, j, ret, matched, handleObj,+ handlerQueue = [],+ args = slice.call( arguments ),+ handlers = ( data_priv.get( this, "events" ) || {} )[ event.type ] || [],+ special = jQuery.event.special[ event.type ] || {};++ // Use the fix-ed jQuery.Event rather than the (read-only) native event+ args[0] = event;+ event.delegateTarget = this;++ // Call the preDispatch hook for the mapped type, and let it bail if desired+ if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {+ return;+ }++ // Determine handlers+ handlerQueue = jQuery.event.handlers.call( this, event, handlers );++ // Run delegates first; they may want to stop propagation beneath us+ i = 0;+ while ( (matched = handlerQueue[ i++ ]) && !event.isPropagationStopped() ) {+ event.currentTarget = matched.elem;++ j = 0;+ while ( (handleObj = matched.handlers[ j++ ]) && !event.isImmediatePropagationStopped() ) {++ // Triggered event must either 1) have no namespace, or+ // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).+ if ( !event.namespace_re || event.namespace_re.test( handleObj.namespace ) ) {++ event.handleObj = handleObj;+ event.data = handleObj.data;++ ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )+ .apply( matched.elem, args );++ if ( ret !== undefined ) {+ if ( (event.result = ret) === false ) {+ event.preventDefault();+ event.stopPropagation();+ }+ }+ }+ }+ }++ // Call the postDispatch hook for the mapped type+ if ( special.postDispatch ) {+ special.postDispatch.call( this, event );+ }++ return event.result;+ },++ handlers: function( event, handlers ) {+ var i, matches, sel, handleObj,+ handlerQueue = [],+ delegateCount = handlers.delegateCount,+ cur = event.target;++ // Find delegate handlers+ // Black-hole SVG <use> instance trees (#13180)+ // Avoid non-left-click bubbling in Firefox (#3861)+ if ( delegateCount && cur.nodeType && (!event.button || event.type !== "click") ) {++ for ( ; cur !== this; cur = cur.parentNode || this ) {++ // Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)+ if ( cur.disabled !== true || event.type !== "click" ) {+ matches = [];+ for ( i = 0; i < delegateCount; i++ ) {+ handleObj = handlers[ i ];++ // Don't conflict with Object.prototype properties (#13203)+ sel = handleObj.selector + " ";++ if ( matches[ sel ] === undefined ) {+ matches[ sel ] = handleObj.needsContext ?+ jQuery( sel, this ).index( cur ) >= 0 :+ jQuery.find( sel, this, null, [ cur ] ).length;+ }+ if ( matches[ sel ] ) {+ matches.push( handleObj );+ }+ }+ if ( matches.length ) {+ handlerQueue.push({ elem: cur, handlers: matches });+ }+ }+ }+ }++ // Add the remaining (directly-bound) handlers+ if ( delegateCount < handlers.length ) {+ handlerQueue.push({ elem: this, handlers: handlers.slice( delegateCount ) });+ }++ return handlerQueue;+ },++ // Includes some event props shared by KeyEvent and MouseEvent+ props: "altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),++ fixHooks: {},++ keyHooks: {+ props: "char charCode key keyCode".split(" "),+ filter: function( event, original ) {++ // Add which for key events+ if ( event.which == null ) {+ event.which = original.charCode != null ? original.charCode : original.keyCode;+ }++ return event;+ }+ },++ mouseHooks: {+ props: "button buttons clientX clientY offsetX offsetY pageX pageY screenX screenY toElement".split(" "),+ filter: function( event, original ) {+ var eventDoc, doc, body,+ button = original.button;++ // Calculate pageX/Y if missing and clientX/Y available+ if ( event.pageX == null && original.clientX != null ) {+ eventDoc = event.target.ownerDocument || document;+ doc = eventDoc.documentElement;+ body = eventDoc.body;++ event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );+ event.pageY = original.clientY + ( doc && doc.scrollTop || body && body.scrollTop || 0 ) - ( doc && doc.clientTop || body && body.clientTop || 0 );+ }++ // Add which for click: 1 === left; 2 === middle; 3 === right+ // Note: button is not normalized, so don't use it+ if ( !event.which && button !== undefined ) {+ event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );+ }++ return event;+ }+ },++ fix: function( event ) {+ if ( event[ jQuery.expando ] ) {+ return event;+ }++ // Create a writable copy of the event object and normalize some properties+ var i, prop, copy,+ type = event.type,+ originalEvent = event,+ fixHook = this.fixHooks[ type ];++ if ( !fixHook ) {+ this.fixHooks[ type ] = fixHook =+ rmouseEvent.test( type ) ? this.mouseHooks :+ rkeyEvent.test( type ) ? this.keyHooks :+ {};+ }+ copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;++ event = new jQuery.Event( originalEvent );++ i = copy.length;+ while ( i-- ) {+ prop = copy[ i ];+ event[ prop ] = originalEvent[ prop ];+ }++ // Support: Cordova 2.5 (WebKit) (#13255)+ // All events should have a target; Cordova deviceready doesn't+ if ( !event.target ) {+ event.target = document;+ }++ // Support: Safari 6.0+, Chrome < 28+ // Target should not be a text node (#504, #13143)+ if ( event.target.nodeType === 3 ) {+ event.target = event.target.parentNode;+ }++ return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;+ },++ special: {+ load: {+ // Prevent triggered image.load events from bubbling to window.load+ noBubble: true+ },+ focus: {+ // Fire native event if possible so blur/focus sequence is correct+ trigger: function() {+ if ( this !== safeActiveElement() && this.focus ) {+ this.focus();+ return false;+ }+ },+ delegateType: "focusin"+ },+ blur: {+ trigger: function() {+ if ( this === safeActiveElement() && this.blur ) {+ this.blur();+ return false;+ }+ },+ delegateType: "focusout"+ },+ click: {+ // For checkbox, fire native event so checked state will be right+ trigger: function() {+ if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {+ this.click();+ return false;+ }+ },++ // For cross-browser consistency, don't fire native .click() on links+ _default: function( event ) {+ return jQuery.nodeName( event.target, "a" );+ }+ },++ beforeunload: {+ postDispatch: function( event ) {++ // Support: Firefox 20++ // Firefox doesn't alert if the returnValue field is not set.+ if ( event.result !== undefined ) {+ event.originalEvent.returnValue = event.result;+ }+ }+ }+ },++ simulate: function( type, elem, event, bubble ) {+ // Piggyback on a donor event to simulate a different one.+ // Fake originalEvent to avoid donor's stopPropagation, but if the+ // simulated event prevents default then we do the same on the donor.+ var e = jQuery.extend(+ new jQuery.Event(),+ event,+ {+ type: type,+ isSimulated: true,+ originalEvent: {}+ }+ );+ if ( bubble ) {+ jQuery.event.trigger( e, null, elem );+ } else {+ jQuery.event.dispatch.call( elem, e );+ }+ if ( e.isDefaultPrevented() ) {+ event.preventDefault();+ }+ }+};++jQuery.removeEvent = function( elem, type, handle ) {+ if ( elem.removeEventListener ) {+ elem.removeEventListener( type, handle, false );+ }+};++jQuery.Event = function( src, props ) {+ // Allow instantiation without the 'new' keyword+ if ( !(this instanceof jQuery.Event) ) {+ return new jQuery.Event( src, props );+ }++ // Event object+ if ( src && src.type ) {+ this.originalEvent = src;+ this.type = src.type;++ // Events bubbling up the document may have been marked as prevented+ // by a handler lower down the tree; reflect the correct value.+ this.isDefaultPrevented = src.defaultPrevented ||+ // Support: Android < 4.0+ src.defaultPrevented === undefined &&+ src.getPreventDefault && src.getPreventDefault() ?+ returnTrue :+ returnFalse;++ // Event type+ } else {+ this.type = src;+ }++ // Put explicitly provided properties onto the event object+ if ( props ) {+ jQuery.extend( this, props );+ }++ // Create a timestamp if incoming event doesn't have one+ this.timeStamp = src && src.timeStamp || jQuery.now();++ // Mark it as fixed+ this[ jQuery.expando ] = true;+};++// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html+jQuery.Event.prototype = {+ isDefaultPrevented: returnFalse,+ isPropagationStopped: returnFalse,+ isImmediatePropagationStopped: returnFalse,++ preventDefault: function() {+ var e = this.originalEvent;++ this.isDefaultPrevented = returnTrue;++ if ( e && e.preventDefault ) {+ e.preventDefault();+ }+ },+ stopPropagation: function() {+ var e = this.originalEvent;++ this.isPropagationStopped = returnTrue;++ if ( e && e.stopPropagation ) {+ e.stopPropagation();+ }+ },+ stopImmediatePropagation: function() {+ this.isImmediatePropagationStopped = returnTrue;+ this.stopPropagation();+ }+};++// Create mouseenter/leave events using mouseover/out and event-time checks+// Support: Chrome 15++jQuery.each({+ mouseenter: "mouseover",+ mouseleave: "mouseout"+}, function( orig, fix ) {+ jQuery.event.special[ orig ] = {+ delegateType: fix,+ bindType: fix,++ handle: function( event ) {+ var ret,+ target = this,+ related = event.relatedTarget,+ handleObj = event.handleObj;++ // For mousenter/leave call the handler if related is outside the target.+ // NB: No relatedTarget if the mouse left/entered the browser window+ if ( !related || (related !== target && !jQuery.contains( target, related )) ) {+ event.type = handleObj.origType;+ ret = handleObj.handler.apply( this, arguments );+ event.type = fix;+ }+ return ret;+ }+ };+});++// Create "bubbling" focus and blur events+// Support: Firefox, Chrome, Safari+if ( !support.focusinBubbles ) {+ jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {++ // Attach a single capturing handler on the document while someone wants focusin/focusout+ var handler = function( event ) {+ jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );+ };++ jQuery.event.special[ fix ] = {+ setup: function() {+ var doc = this.ownerDocument || this,+ attaches = data_priv.access( doc, fix );++ if ( !attaches ) {+ doc.addEventListener( orig, handler, true );+ }+ data_priv.access( doc, fix, ( attaches || 0 ) + 1 );+ },+ teardown: function() {+ var doc = this.ownerDocument || this,+ attaches = data_priv.access( doc, fix ) - 1;++ if ( !attaches ) {+ doc.removeEventListener( orig, handler, true );+ data_priv.remove( doc, fix );++ } else {+ data_priv.access( doc, fix, attaches );+ }+ }+ };+ });+}++jQuery.fn.extend({++ on: function( types, selector, data, fn, /*INTERNAL*/ one ) {+ var origFn, type;++ // Types can be a map of types/handlers+ if ( typeof types === "object" ) {+ // ( types-Object, selector, data )+ if ( typeof selector !== "string" ) {+ // ( types-Object, data )+ data = data || selector;+ selector = undefined;+ }+ for ( type in types ) {+ this.on( type, selector, data, types[ type ], one );+ }+ return this;+ }++ if ( data == null && fn == null ) {+ // ( types, fn )+ fn = selector;+ data = selector = undefined;+ } else if ( fn == null ) {+ if ( typeof selector === "string" ) {+ // ( types, selector, fn )+ fn = data;+ data = undefined;+ } else {+ // ( types, data, fn )+ fn = data;+ data = selector;+ selector = undefined;+ }+ }+ if ( fn === false ) {+ fn = returnFalse;+ } else if ( !fn ) {+ return this;+ }++ if ( one === 1 ) {+ origFn = fn;+ fn = function( event ) {+ // Can use an empty set, since event contains the info+ jQuery().off( event );+ return origFn.apply( this, arguments );+ };+ // Use same guid so caller can remove using origFn+ fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );+ }+ return this.each( function() {+ jQuery.event.add( this, types, fn, data, selector );+ });+ },+ one: function( types, selector, data, fn ) {+ return this.on( types, selector, data, fn, 1 );+ },+ off: function( types, selector, fn ) {+ var handleObj, type;+ if ( types && types.preventDefault && types.handleObj ) {+ // ( event ) dispatched jQuery.Event+ handleObj = types.handleObj;+ jQuery( types.delegateTarget ).off(+ handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,+ handleObj.selector,+ handleObj.handler+ );+ return this;+ }+ if ( typeof types === "object" ) {+ // ( types-object [, selector] )+ for ( type in types ) {+ this.off( type, selector, types[ type ] );+ }+ return this;+ }+ if ( selector === false || typeof selector === "function" ) {+ // ( types [, fn] )+ fn = selector;+ selector = undefined;+ }+ if ( fn === false ) {+ fn = returnFalse;+ }+ return this.each(function() {+ jQuery.event.remove( this, types, fn, selector );+ });+ },++ trigger: function( type, data ) {+ return this.each(function() {+ jQuery.event.trigger( type, data, this );+ });+ },+ triggerHandler: function( type, data ) {+ var elem = this[0];+ if ( elem ) {+ return jQuery.event.trigger( type, data, elem, true );+ }+ }+});+++var+ rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,+ rtagName = /<([\w:]+)/,+ rhtml = /<|&#?\w+;/,+ rnoInnerhtml = /<(?:script|style|link)/i,+ // checked="checked" or checked+ rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,+ rscriptType = /^$|\/(?:java|ecma)script/i,+ rscriptTypeMasked = /^true\/(.*)/,+ rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,++ // We have to close these tags to support XHTML (#13200)+ wrapMap = {++ // Support: IE 9+ option: [ 1, "<select multiple='multiple'>", "</select>" ],++ thead: [ 1, "<table>", "</table>" ],+ col: [ 2, "<table><colgroup>", "</colgroup></table>" ],+ tr: [ 2, "<table><tbody>", "</tbody></table>" ],+ td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],++ _default: [ 0, "", "" ]+ };++// Support: IE 9+wrapMap.optgroup = wrapMap.option;++wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;+wrapMap.th = wrapMap.td;++// Support: 1.x compatibility+// Manipulating tables requires a tbody+function manipulationTarget( elem, content ) {+ return jQuery.nodeName( elem, "table" ) &&+ jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?++ elem.getElementsByTagName("tbody")[0] ||+ elem.appendChild( elem.ownerDocument.createElement("tbody") ) :+ elem;+}++// Replace/restore the type attribute of script elements for safe DOM manipulation+function disableScript( elem ) {+ elem.type = (elem.getAttribute("type") !== null) + "/" + elem.type;+ return elem;+}+function restoreScript( elem ) {+ var match = rscriptTypeMasked.exec( elem.type );++ if ( match ) {+ elem.type = match[ 1 ];+ } else {+ elem.removeAttribute("type");+ }++ return elem;+}++// Mark scripts as having already been evaluated+function setGlobalEval( elems, refElements ) {+ var i = 0,+ l = elems.length;++ for ( ; i < l; i++ ) {+ data_priv.set(+ elems[ i ], "globalEval", !refElements || data_priv.get( refElements[ i ], "globalEval" )+ );+ }+}++function cloneCopyEvent( src, dest ) {+ var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;++ if ( dest.nodeType !== 1 ) {+ return;+ }++ // 1. Copy private data: events, handlers, etc.+ if ( data_priv.hasData( src ) ) {+ pdataOld = data_priv.access( src );+ pdataCur = data_priv.set( dest, pdataOld );+ events = pdataOld.events;++ if ( events ) {+ delete pdataCur.handle;+ pdataCur.events = {};++ for ( type in events ) {+ for ( i = 0, l = events[ type ].length; i < l; i++ ) {+ jQuery.event.add( dest, type, events[ type ][ i ] );+ }+ }+ }+ }++ // 2. Copy user data+ if ( data_user.hasData( src ) ) {+ udataOld = data_user.access( src );+ udataCur = jQuery.extend( {}, udataOld );++ data_user.set( dest, udataCur );+ }+}++function getAll( context, tag ) {+ var ret = context.getElementsByTagName ? context.getElementsByTagName( tag || "*" ) :+ context.querySelectorAll ? context.querySelectorAll( tag || "*" ) :+ [];++ return tag === undefined || tag && jQuery.nodeName( context, tag ) ?+ jQuery.merge( [ context ], ret ) :+ ret;+}++// Support: IE >= 9+function fixInput( src, dest ) {+ var nodeName = dest.nodeName.toLowerCase();++ // Fails to persist the checked state of a cloned checkbox or radio button.+ if ( nodeName === "input" && rcheckableType.test( src.type ) ) {+ dest.checked = src.checked;++ // Fails to return the selected option to the default selected state when cloning options+ } else if ( nodeName === "input" || nodeName === "textarea" ) {+ dest.defaultValue = src.defaultValue;+ }+}++jQuery.extend({+ clone: function( elem, dataAndEvents, deepDataAndEvents ) {+ var i, l, srcElements, destElements,+ clone = elem.cloneNode( true ),+ inPage = jQuery.contains( elem.ownerDocument, elem );++ // Support: IE >= 9+ // Fix Cloning issues+ if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&+ !jQuery.isXMLDoc( elem ) ) {++ // We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2+ destElements = getAll( clone );+ srcElements = getAll( elem );++ for ( i = 0, l = srcElements.length; i < l; i++ ) {+ fixInput( srcElements[ i ], destElements[ i ] );+ }+ }++ // Copy the events from the original to the clone+ if ( dataAndEvents ) {+ if ( deepDataAndEvents ) {+ srcElements = srcElements || getAll( elem );+ destElements = destElements || getAll( clone );++ for ( i = 0, l = srcElements.length; i < l; i++ ) {+ cloneCopyEvent( srcElements[ i ], destElements[ i ] );+ }+ } else {+ cloneCopyEvent( elem, clone );+ }+ }++ // Preserve script evaluation history+ destElements = getAll( clone, "script" );+ if ( destElements.length > 0 ) {+ setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );+ }++ // Return the cloned set+ return clone;+ },++ buildFragment: function( elems, context, scripts, selection ) {+ var elem, tmp, tag, wrap, contains, j,+ fragment = context.createDocumentFragment(),+ nodes = [],+ i = 0,+ l = elems.length;++ for ( ; i < l; i++ ) {+ elem = elems[ i ];++ if ( elem || elem === 0 ) {++ // Add nodes directly+ if ( jQuery.type( elem ) === "object" ) {+ // Support: QtWebKit+ // jQuery.merge because push.apply(_, arraylike) throws+ jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );++ // Convert non-html into a text node+ } else if ( !rhtml.test( elem ) ) {+ nodes.push( context.createTextNode( elem ) );++ // Convert html into DOM nodes+ } else {+ tmp = tmp || fragment.appendChild( context.createElement("div") );++ // Deserialize a standard representation+ tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();+ wrap = wrapMap[ tag ] || wrapMap._default;+ tmp.innerHTML = wrap[ 1 ] + elem.replace( rxhtmlTag, "<$1></$2>" ) + wrap[ 2 ];++ // Descend through wrappers to the right content+ j = wrap[ 0 ];+ while ( j-- ) {+ tmp = tmp.lastChild;+ }++ // Support: QtWebKit+ // jQuery.merge because push.apply(_, arraylike) throws+ jQuery.merge( nodes, tmp.childNodes );++ // Remember the top-level container+ tmp = fragment.firstChild;++ // Fixes #12346+ // Support: Webkit, IE+ tmp.textContent = "";+ }+ }+ }++ // Remove wrapper from fragment+ fragment.textContent = "";++ i = 0;+ while ( (elem = nodes[ i++ ]) ) {++ // #4087 - If origin and destination elements are the same, and this is+ // that element, do not do anything+ if ( selection && jQuery.inArray( elem, selection ) !== -1 ) {+ continue;+ }++ contains = jQuery.contains( elem.ownerDocument, elem );++ // Append to fragment+ tmp = getAll( fragment.appendChild( elem ), "script" );++ // Preserve script evaluation history+ if ( contains ) {+ setGlobalEval( tmp );+ }++ // Capture executables+ if ( scripts ) {+ j = 0;+ while ( (elem = tmp[ j++ ]) ) {+ if ( rscriptType.test( elem.type || "" ) ) {+ scripts.push( elem );+ }+ }+ }+ }++ return fragment;+ },++ cleanData: function( elems ) {+ var data, elem, events, type, key, j,+ special = jQuery.event.special,+ i = 0;++ for ( ; (elem = elems[ i ]) !== undefined; i++ ) {+ if ( jQuery.acceptData( elem ) ) {+ key = elem[ data_priv.expando ];++ if ( key && (data = data_priv.cache[ key ]) ) {+ events = Object.keys( data.events || {} );+ if ( events.length ) {+ for ( j = 0; (type = events[j]) !== undefined; j++ ) {+ if ( special[ type ] ) {+ jQuery.event.remove( elem, type );++ // This is a shortcut to avoid jQuery.event.remove's overhead+ } else {+ jQuery.removeEvent( elem, type, data.handle );+ }+ }+ }+ if ( data_priv.cache[ key ] ) {+ // Discard any remaining `private` data+ delete data_priv.cache[ key ];+ }+ }+ }+ // Discard any remaining `user` data+ delete data_user.cache[ elem[ data_user.expando ] ];+ }+ }+});++jQuery.fn.extend({+ text: function( value ) {+ return access( this, function( value ) {+ return value === undefined ?+ jQuery.text( this ) :+ this.empty().each(function() {+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {+ this.textContent = value;+ }+ });+ }, null, value, arguments.length );+ },++ append: function() {+ return this.domManip( arguments, function( elem ) {+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {+ var target = manipulationTarget( this, elem );+ target.appendChild( elem );+ }+ });+ },++ prepend: function() {+ return this.domManip( arguments, function( elem ) {+ if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {+ var target = manipulationTarget( this, elem );+ target.insertBefore( elem, target.firstChild );+ }+ });+ },++ before: function() {+ return this.domManip( arguments, function( elem ) {+ if ( this.parentNode ) {+ this.parentNode.insertBefore( elem, this );+ }+ });+ },++ after: function() {+ return this.domManip( arguments, function( elem ) {+ if ( this.parentNode ) {+ this.parentNode.insertBefore( elem, this.nextSibling );+ }+ });+ },++ remove: function( selector, keepData /* Internal Use Only */ ) {+ var elem,+ elems = selector ? jQuery.filter( selector, this ) : this,+ i = 0;++ for ( ; (elem = elems[i]) != null; i++ ) {+ if ( !keepData && elem.nodeType === 1 ) {+ jQuery.cleanData( getAll( elem ) );+ }++ if ( elem.parentNode ) {+ if ( keepData && jQuery.contains( elem.ownerDocument, elem ) ) {+ setGlobalEval( getAll( elem, "script" ) );+ }+ elem.parentNode.removeChild( elem );+ }+ }++ return this;+ },++ empty: function() {+ var elem,+ i = 0;++ for ( ; (elem = this[i]) != null; i++ ) {+ if ( elem.nodeType === 1 ) {++ // Prevent memory leaks+ jQuery.cleanData( getAll( elem, false ) );++ // Remove any remaining nodes+ elem.textContent = "";+ }+ }++ return this;+ },++ clone: function( dataAndEvents, deepDataAndEvents ) {+ dataAndEvents = dataAndEvents == null ? false : dataAndEvents;+ deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;++ return this.map(function() {+ return jQuery.clone( this, dataAndEvents, deepDataAndEvents );+ });+ },++ html: function( value ) {+ return access( this, function( value ) {+ var elem = this[ 0 ] || {},+ i = 0,+ l = this.length;++ if ( value === undefined && elem.nodeType === 1 ) {+ return elem.innerHTML;+ }++ // See if we can take a shortcut and just use innerHTML+ if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&+ !wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {++ value = value.replace( rxhtmlTag, "<$1></$2>" );++ try {+ for ( ; i < l; i++ ) {+ elem = this[ i ] || {};++ // Remove element nodes and prevent memory leaks+ if ( elem.nodeType === 1 ) {+ jQuery.cleanData( getAll( elem, false ) );+ elem.innerHTML = value;+ }+ }++ elem = 0;++ // If using innerHTML throws an exception, use the fallback method+ } catch( e ) {}+ }++ if ( elem ) {+ this.empty().append( value );+ }+ }, null, value, arguments.length );+ },++ replaceWith: function() {+ var arg = arguments[ 0 ];++ // Make the changes, replacing each context element with the new content+ this.domManip( arguments, function( elem ) {+ arg = this.parentNode;++ jQuery.cleanData( getAll( this ) );++ if ( arg ) {+ arg.replaceChild( elem, this );+ }+ });++ // Force removal if there was no new content (e.g., from empty arguments)+ return arg && (arg.length || arg.nodeType) ? this : this.remove();+ },++ detach: function( selector ) {+ return this.remove( selector, true );+ },++ domManip: function( args, callback ) {++ // Flatten any nested arrays+ args = concat.apply( [], args );++ var fragment, first, scripts, hasScripts, node, doc,+ i = 0,+ l = this.length,+ set = this,+ iNoClone = l - 1,+ value = args[ 0 ],+ isFunction = jQuery.isFunction( value );++ // We can't cloneNode fragments that contain checked, in WebKit+ if ( isFunction ||+ ( l > 1 && typeof value === "string" &&+ !support.checkClone && rchecked.test( value ) ) ) {+ return this.each(function( index ) {+ var self = set.eq( index );+ if ( isFunction ) {+ args[ 0 ] = value.call( this, index, self.html() );+ }+ self.domManip( args, callback );+ });+ }++ if ( l ) {+ fragment = jQuery.buildFragment( args, this[ 0 ].ownerDocument, false, this );+ first = fragment.firstChild;++ if ( fragment.childNodes.length === 1 ) {+ fragment = first;+ }++ if ( first ) {+ scripts = jQuery.map( getAll( fragment, "script" ), disableScript );+ hasScripts = scripts.length;++ // Use the original fragment for the last item instead of the first because it can end up+ // being emptied incorrectly in certain situations (#8070).+ for ( ; i < l; i++ ) {+ node = fragment;++ if ( i !== iNoClone ) {+ node = jQuery.clone( node, true, true );++ // Keep references to cloned scripts for later restoration+ if ( hasScripts ) {+ // Support: QtWebKit+ // jQuery.merge because push.apply(_, arraylike) throws+ jQuery.merge( scripts, getAll( node, "script" ) );+ }+ }++ callback.call( this[ i ], node, i );+ }++ if ( hasScripts ) {+ doc = scripts[ scripts.length - 1 ].ownerDocument;++ // Reenable scripts+ jQuery.map( scripts, restoreScript );++ // Evaluate executable scripts on first document insertion+ for ( i = 0; i < hasScripts; i++ ) {+ node = scripts[ i ];+ if ( rscriptType.test( node.type || "" ) &&+ !data_priv.access( node, "globalEval" ) && jQuery.contains( doc, node ) ) {++ if ( node.src ) {+ // Optional AJAX dependency, but won't run scripts if not present+ if ( jQuery._evalUrl ) {+ jQuery._evalUrl( node.src );+ }+ } else {+ jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );+ }+ }+ }+ }+ }+ }++ return this;+ }+});++jQuery.each({+ appendTo: "append",+ prependTo: "prepend",+ insertBefore: "before",+ insertAfter: "after",+ replaceAll: "replaceWith"+}, function( name, original ) {+ jQuery.fn[ name ] = function( selector ) {+ var elems,+ ret = [],+ insert = jQuery( selector ),+ last = insert.length - 1,+ i = 0;++ for ( ; i <= last; i++ ) {+ elems = i === last ? this : this.clone( true );+ jQuery( insert[ i ] )[ original ]( elems );++ // Support: QtWebKit+ // .get() because push.apply(_, arraylike) throws+ push.apply( ret, elems.get() );+ }++ return this.pushStack( ret );+ };+});+++var iframe,+ elemdisplay = {};++/**+ * Retrieve the actual display of a element+ * @param {String} name nodeName of the element+ * @param {Object} doc Document object+ */+// Called only from within defaultDisplay+function actualDisplay( name, doc ) {+ var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),++ // getDefaultComputedStyle might be reliably used only on attached element+ display = window.getDefaultComputedStyle ?++ // Use of this method is a temporary fix (more like optmization) until something better comes along,+ // since it was removed from specification and supported only in FF+ window.getDefaultComputedStyle( elem[ 0 ] ).display : jQuery.css( elem[ 0 ], "display" );++ // We don't have any data stored on the element,+ // so use "detach" method as fast way to get rid of the element+ elem.detach();++ return display;+}++/**+ * Try to determine the default display value of an element+ * @param {String} nodeName+ */+function defaultDisplay( nodeName ) {+ var doc = document,+ display = elemdisplay[ nodeName ];++ if ( !display ) {+ display = actualDisplay( nodeName, doc );++ // If the simple way fails, read from inside an iframe+ if ( display === "none" || !display ) {++ // Use the already-created iframe if possible+ iframe = (iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" )).appendTo( doc.documentElement );++ // Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse+ doc = iframe[ 0 ].contentDocument;++ // Support: IE+ doc.write();+ doc.close();++ display = actualDisplay( nodeName, doc );+ iframe.detach();+ }++ // Store the correct default display+ elemdisplay[ nodeName ] = display;+ }++ return display;+}+var rmargin = (/^margin/);++var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );++var getStyles = function( elem ) {+ return elem.ownerDocument.defaultView.getComputedStyle( elem, null );+ };++++function curCSS( elem, name, computed ) {+ var width, minWidth, maxWidth, ret,+ style = elem.style;++ computed = computed || getStyles( elem );++ // Support: IE9+ // getPropertyValue is only needed for .css('filter') in IE9, see #12537+ if ( computed ) {+ ret = computed.getPropertyValue( name ) || computed[ name ];+ }++ if ( computed ) {++ if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {+ ret = jQuery.style( elem, name );+ }++ // Support: iOS < 6+ // A tribute to the "awesome hack by Dean Edwards"+ // iOS < 6 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels+ // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values+ if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {++ // Remember the original values+ width = style.width;+ minWidth = style.minWidth;+ maxWidth = style.maxWidth;++ // Put in the new values to get a computed value out+ style.minWidth = style.maxWidth = style.width = ret;+ ret = computed.width;++ // Revert the changed values+ style.width = width;+ style.minWidth = minWidth;+ style.maxWidth = maxWidth;+ }+ }++ return ret !== undefined ?+ // Support: IE+ // IE returns zIndex value as an integer.+ ret + "" :+ ret;+}+++function addGetHookIf( conditionFn, hookFn ) {+ // Define the hook, we'll check on the first run if it's really needed.+ return {+ get: function() {+ if ( conditionFn() ) {+ // Hook not needed (or it's not possible to use it due to missing dependency),+ // remove it.+ // Since there are no other hooks for marginRight, remove the whole object.+ delete this.get;+ return;+ }++ // Hook needed; redefine it so that the support test is not executed again.++ return (this.get = hookFn).apply( this, arguments );+ }+ };+}+++(function() {+ var pixelPositionVal, boxSizingReliableVal,+ // Support: Firefox, Android 2.3 (Prefixed box-sizing versions).+ divReset = "padding:0;margin:0;border:0;display:block;-webkit-box-sizing:content-box;" ++ "-moz-box-sizing:content-box;box-sizing:content-box",+ docElem = document.documentElement,+ container = document.createElement( "div" ),+ div = document.createElement( "div" );++ div.style.backgroundClip = "content-box";+ div.cloneNode( true ).style.backgroundClip = "";+ support.clearCloneStyle = div.style.backgroundClip === "content-box";++ container.style.cssText = "border:0;width:0;height:0;position:absolute;top:0;left:-9999px;" ++ "margin-top:1px";+ container.appendChild( div );++ // Executing both pixelPosition & boxSizingReliable tests require only one layout+ // so they're executed at the same time to save the second computation.+ function computePixelPositionAndBoxSizingReliable() {+ // Support: Firefox, Android 2.3 (Prefixed box-sizing versions).+ div.style.cssText = "-webkit-box-sizing:border-box;-moz-box-sizing:border-box;" ++ "box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;" ++ "position:absolute;top:1%";+ docElem.appendChild( container );++ var divStyle = window.getComputedStyle( div, null );+ pixelPositionVal = divStyle.top !== "1%";+ boxSizingReliableVal = divStyle.width === "4px";++ docElem.removeChild( container );+ }++ // Use window.getComputedStyle because jsdom on node.js will break without it.+ if ( window.getComputedStyle ) {+ jQuery.extend(support, {+ pixelPosition: function() {+ // This test is executed only once but we still do memoizing+ // since we can use the boxSizingReliable pre-computing.+ // No need to check if the test was already performed, though.+ computePixelPositionAndBoxSizingReliable();+ return pixelPositionVal;+ },+ boxSizingReliable: function() {+ if ( boxSizingReliableVal == null ) {+ computePixelPositionAndBoxSizingReliable();+ }+ return boxSizingReliableVal;+ },+ reliableMarginRight: function() {+ // Support: Android 2.3+ // Check if div with explicit width and no margin-right incorrectly+ // gets computed margin-right based on width of container. (#3333)+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right+ // This support function is only executed once so no memoizing is needed.+ var ret,+ marginDiv = div.appendChild( document.createElement( "div" ) );+ marginDiv.style.cssText = div.style.cssText = divReset;+ marginDiv.style.marginRight = marginDiv.style.width = "0";+ div.style.width = "1px";+ docElem.appendChild( container );++ ret = !parseFloat( window.getComputedStyle( marginDiv, null ).marginRight );++ docElem.removeChild( container );++ // Clean up the div for other support tests.+ div.innerHTML = "";++ return ret;+ }+ });+ }+})();+++// A method for quickly swapping in/out CSS properties to get correct calculations.+jQuery.swap = function( elem, options, callback, args ) {+ var ret, name,+ old = {};++ // Remember the old values, and insert the new ones+ for ( name in options ) {+ old[ name ] = elem.style[ name ];+ elem.style[ name ] = options[ name ];+ }++ ret = callback.apply( elem, args || [] );++ // Revert the old values+ for ( name in options ) {+ elem.style[ name ] = old[ name ];+ }++ return ret;+};+++var+ // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"+ // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display+ rdisplayswap = /^(none|table(?!-c[ea]).+)/,+ rnumsplit = new RegExp( "^(" + pnum + ")(.*)$", "i" ),+ rrelNum = new RegExp( "^([+-])=(" + pnum + ")", "i" ),++ cssShow = { position: "absolute", visibility: "hidden", display: "block" },+ cssNormalTransform = {+ letterSpacing: 0,+ fontWeight: 400+ },++ cssPrefixes = [ "Webkit", "O", "Moz", "ms" ];++// return a css property mapped to a potentially vendor prefixed property+function vendorPropName( style, name ) {++ // shortcut for names that are not vendor prefixed+ if ( name in style ) {+ return name;+ }++ // check for vendor prefixed names+ var capName = name[0].toUpperCase() + name.slice(1),+ origName = name,+ i = cssPrefixes.length;++ while ( i-- ) {+ name = cssPrefixes[ i ] + capName;+ if ( name in style ) {+ return name;+ }+ }++ return origName;+}++function setPositiveNumber( elem, value, subtract ) {+ var matches = rnumsplit.exec( value );+ return matches ?+ // Guard against undefined "subtract", e.g., when used as in cssHooks+ Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :+ value;+}++function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {+ var i = extra === ( isBorderBox ? "border" : "content" ) ?+ // If we already have the right measurement, avoid augmentation+ 4 :+ // Otherwise initialize for horizontal or vertical properties+ name === "width" ? 1 : 0,++ val = 0;++ for ( ; i < 4; i += 2 ) {+ // both box models exclude margin, so add it if we want it+ if ( extra === "margin" ) {+ val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );+ }++ if ( isBorderBox ) {+ // border-box includes padding, so remove it if we want content+ if ( extra === "content" ) {+ val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );+ }++ // at this point, extra isn't border nor margin, so remove border+ if ( extra !== "margin" ) {+ val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );+ }+ } else {+ // at this point, extra isn't content, so add padding+ val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );++ // at this point, extra isn't content nor padding, so add border+ if ( extra !== "padding" ) {+ val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );+ }+ }+ }++ return val;+}++function getWidthOrHeight( elem, name, extra ) {++ // Start with offset property, which is equivalent to the border-box value+ var valueIsBorderBox = true,+ val = name === "width" ? elem.offsetWidth : elem.offsetHeight,+ styles = getStyles( elem ),+ isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";++ // some non-html elements return undefined for offsetWidth, so check for null/undefined+ // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285+ // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668+ if ( val <= 0 || val == null ) {+ // Fall back to computed then uncomputed css if necessary+ val = curCSS( elem, name, styles );+ if ( val < 0 || val == null ) {+ val = elem.style[ name ];+ }++ // Computed unit is not pixels. Stop here and return.+ if ( rnumnonpx.test(val) ) {+ return val;+ }++ // we need the check for style in case a browser which returns unreliable values+ // for getComputedStyle silently falls back to the reliable elem.style+ valueIsBorderBox = isBorderBox &&+ ( support.boxSizingReliable() || val === elem.style[ name ] );++ // Normalize "", auto, and prepare for extra+ val = parseFloat( val ) || 0;+ }++ // use the active box-sizing model to add/subtract irrelevant styles+ return ( val ++ augmentWidthOrHeight(+ elem,+ name,+ extra || ( isBorderBox ? "border" : "content" ),+ valueIsBorderBox,+ styles+ )+ ) + "px";+}++function showHide( elements, show ) {+ var display, elem, hidden,+ values = [],+ index = 0,+ length = elements.length;++ for ( ; index < length; index++ ) {+ elem = elements[ index ];+ if ( !elem.style ) {+ continue;+ }++ values[ index ] = data_priv.get( elem, "olddisplay" );+ display = elem.style.display;+ if ( show ) {+ // Reset the inline display of this element to learn if it is+ // being hidden by cascaded rules or not+ if ( !values[ index ] && display === "none" ) {+ elem.style.display = "";+ }++ // Set elements which have been overridden with display: none+ // in a stylesheet to whatever the default browser style is+ // for such an element+ if ( elem.style.display === "" && isHidden( elem ) ) {+ values[ index ] = data_priv.access( elem, "olddisplay", defaultDisplay(elem.nodeName) );+ }+ } else {++ if ( !values[ index ] ) {+ hidden = isHidden( elem );++ if ( display && display !== "none" || !hidden ) {+ data_priv.set( elem, "olddisplay", hidden ? display : jQuery.css(elem, "display") );+ }+ }+ }+ }++ // Set the display of most of the elements in a second loop+ // to avoid the constant reflow+ for ( index = 0; index < length; index++ ) {+ elem = elements[ index ];+ if ( !elem.style ) {+ continue;+ }+ if ( !show || elem.style.display === "none" || elem.style.display === "" ) {+ elem.style.display = show ? values[ index ] || "" : "none";+ }+ }++ return elements;+}++jQuery.extend({+ // Add in style property hooks for overriding the default+ // behavior of getting and setting a style property+ cssHooks: {+ opacity: {+ get: function( elem, computed ) {+ if ( computed ) {+ // We should always get a number back from opacity+ var ret = curCSS( elem, "opacity" );+ return ret === "" ? "1" : ret;+ }+ }+ }+ },++ // Don't automatically add "px" to these possibly-unitless properties+ cssNumber: {+ "columnCount": true,+ "fillOpacity": true,+ "fontWeight": true,+ "lineHeight": true,+ "opacity": true,+ "order": true,+ "orphans": true,+ "widows": true,+ "zIndex": true,+ "zoom": true+ },++ // Add in properties whose names you wish to fix before+ // setting or getting the value+ cssProps: {+ // normalize float css property+ "float": "cssFloat"+ },++ // Get and set the style property on a DOM Node+ style: function( elem, name, value, extra ) {+ // Don't set styles on text and comment nodes+ if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {+ return;+ }++ // Make sure that we're working with the right name+ var ret, type, hooks,+ origName = jQuery.camelCase( name ),+ style = elem.style;++ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );++ // gets hook for the prefixed version+ // followed by the unprefixed version+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];++ // Check if we're setting a value+ if ( value !== undefined ) {+ type = typeof value;++ // convert relative number strings (+= or -=) to relative numbers. #7345+ if ( type === "string" && (ret = rrelNum.exec( value )) ) {+ value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );+ // Fixes bug #9237+ type = "number";+ }++ // Make sure that null and NaN values aren't set. See: #7116+ if ( value == null || value !== value ) {+ return;+ }++ // If a number was passed in, add 'px' to the (except for certain CSS properties)+ if ( type === "number" && !jQuery.cssNumber[ origName ] ) {+ value += "px";+ }++ // Fixes #8908, it can be done more correctly by specifying setters in cssHooks,+ // but it would mean to define eight (for every problematic property) identical functions+ if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {+ style[ name ] = "inherit";+ }++ // If a hook was provided, use that value, otherwise just set the specified value+ if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {+ // Support: Chrome, Safari+ // Setting style to blank string required to delete "style: x !important;"+ style[ name ] = "";+ style[ name ] = value;+ }++ } else {+ // If a hook was provided get the non-computed value from there+ if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {+ return ret;+ }++ // Otherwise just get the value from the style object+ return style[ name ];+ }+ },++ css: function( elem, name, extra, styles ) {+ var val, num, hooks,+ origName = jQuery.camelCase( name );++ // Make sure that we're working with the right name+ name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );++ // gets hook for the prefixed version+ // followed by the unprefixed version+ hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];++ // If a hook was provided get the computed value from there+ if ( hooks && "get" in hooks ) {+ val = hooks.get( elem, true, extra );+ }++ // Otherwise, if a way to get the computed value exists, use that+ if ( val === undefined ) {+ val = curCSS( elem, name, styles );+ }++ //convert "normal" to computed value+ if ( val === "normal" && name in cssNormalTransform ) {+ val = cssNormalTransform[ name ];+ }++ // Return, converting to number if forced or a qualifier was provided and val looks numeric+ if ( extra === "" || extra ) {+ num = parseFloat( val );+ return extra === true || jQuery.isNumeric( num ) ? num || 0 : val;+ }+ return val;+ }+});++jQuery.each([ "height", "width" ], function( i, name ) {+ jQuery.cssHooks[ name ] = {+ get: function( elem, computed, extra ) {+ if ( computed ) {+ // certain elements can have dimension info if we invisibly show them+ // however, it must have a current display style that would benefit from this+ return elem.offsetWidth === 0 && rdisplayswap.test( jQuery.css( elem, "display" ) ) ?+ jQuery.swap( elem, cssShow, function() {+ return getWidthOrHeight( elem, name, extra );+ }) :+ getWidthOrHeight( elem, name, extra );+ }+ },++ set: function( elem, value, extra ) {+ var styles = extra && getStyles( elem );+ return setPositiveNumber( elem, value, extra ?+ augmentWidthOrHeight(+ elem,+ name,+ extra,+ jQuery.css( elem, "boxSizing", false, styles ) === "border-box",+ styles+ ) : 0+ );+ }+ };+});++// Support: Android 2.3+jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,+ function( elem, computed ) {+ if ( computed ) {+ // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right+ // Work around by temporarily setting element display to inline-block+ return jQuery.swap( elem, { "display": "inline-block" },+ curCSS, [ elem, "marginRight" ] );+ }+ }+);++// These hooks are used by animate to expand properties+jQuery.each({+ margin: "",+ padding: "",+ border: "Width"+}, function( prefix, suffix ) {+ jQuery.cssHooks[ prefix + suffix ] = {+ expand: function( value ) {+ var i = 0,+ expanded = {},++ // assumes a single number if not a string+ parts = typeof value === "string" ? value.split(" ") : [ value ];++ for ( ; i < 4; i++ ) {+ expanded[ prefix + cssExpand[ i ] + suffix ] =+ parts[ i ] || parts[ i - 2 ] || parts[ 0 ];+ }++ return expanded;+ }+ };++ if ( !rmargin.test( prefix ) ) {+ jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;+ }+});++jQuery.fn.extend({+ css: function( name, value ) {+ return access( this, function( elem, name, value ) {+ var styles, len,+ map = {},+ i = 0;++ if ( jQuery.isArray( name ) ) {+ styles = getStyles( elem );+ len = name.length;++ for ( ; i < len; i++ ) {+ map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );+ }++ return map;+ }++ return value !== undefined ?+ jQuery.style( elem, name, value ) :+ jQuery.css( elem, name );+ }, name, value, arguments.length > 1 );+ },+ show: function() {+ return showHide( this, true );+ },+ hide: function() {+ return showHide( this );+ },+ toggle: function( state ) {+ if ( typeof state === "boolean" ) {+ return state ? this.show() : this.hide();+ }++ return this.each(function() {+ if ( isHidden( this ) ) {+ jQuery( this ).show();+ } else {+ jQuery( this ).hide();+ }+ });+ }+});+++function Tween( elem, options, prop, end, easing ) {+ return new Tween.prototype.init( elem, options, prop, end, easing );+}+jQuery.Tween = Tween;++Tween.prototype = {+ constructor: Tween,+ init: function( elem, options, prop, end, easing, unit ) {+ this.elem = elem;+ this.prop = prop;+ this.easing = easing || "swing";+ this.options = options;+ this.start = this.now = this.cur();+ this.end = end;+ this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );+ },+ cur: function() {+ var hooks = Tween.propHooks[ this.prop ];++ return hooks && hooks.get ?+ hooks.get( this ) :+ Tween.propHooks._default.get( this );+ },+ run: function( percent ) {+ var eased,+ hooks = Tween.propHooks[ this.prop ];++ if ( this.options.duration ) {+ this.pos = eased = jQuery.easing[ this.easing ](+ percent, this.options.duration * percent, 0, 1, this.options.duration+ );+ } else {+ this.pos = eased = percent;+ }+ this.now = ( this.end - this.start ) * eased + this.start;++ if ( this.options.step ) {+ this.options.step.call( this.elem, this.now, this );+ }++ if ( hooks && hooks.set ) {+ hooks.set( this );+ } else {+ Tween.propHooks._default.set( this );+ }+ return this;+ }+};++Tween.prototype.init.prototype = Tween.prototype;++Tween.propHooks = {+ _default: {+ get: function( tween ) {+ var result;++ if ( tween.elem[ tween.prop ] != null &&+ (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {+ return tween.elem[ tween.prop ];+ }++ // passing an empty string as a 3rd parameter to .css will automatically+ // attempt a parseFloat and fallback to a string if the parse fails+ // so, simple values such as "10px" are parsed to Float.+ // complex values such as "rotate(1rad)" are returned as is.+ result = jQuery.css( tween.elem, tween.prop, "" );+ // Empty strings, null, undefined and "auto" are converted to 0.+ return !result || result === "auto" ? 0 : result;+ },+ set: function( tween ) {+ // use step hook for back compat - use cssHook if its there - use .style if its+ // available and use plain properties where available+ if ( jQuery.fx.step[ tween.prop ] ) {+ jQuery.fx.step[ tween.prop ]( tween );+ } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {+ jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );+ } else {+ tween.elem[ tween.prop ] = tween.now;+ }+ }+ }+};++// Support: IE9+// Panic based approach to setting things on disconnected nodes++Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {+ set: function( tween ) {+ if ( tween.elem.nodeType && tween.elem.parentNode ) {+ tween.elem[ tween.prop ] = tween.now;+ }+ }+};++jQuery.easing = {+ linear: function( p ) {+ return p;+ },+ swing: function( p ) {+ return 0.5 - Math.cos( p * Math.PI ) / 2;+ }+};++jQuery.fx = Tween.prototype.init;++// Back Compat <1.8 extension point+jQuery.fx.step = {};+++++var+ fxNow, timerId,+ rfxtypes = /^(?:toggle|show|hide)$/,+ rfxnum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" ),+ rrun = /queueHooks$/,+ animationPrefilters = [ defaultPrefilter ],+ tweeners = {+ "*": [ function( prop, value ) {+ var tween = this.createTween( prop, value ),+ target = tween.cur(),+ parts = rfxnum.exec( value ),+ unit = parts && parts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),++ // Starting value computation is required for potential unit mismatches+ start = ( jQuery.cssNumber[ prop ] || unit !== "px" && +target ) &&+ rfxnum.exec( jQuery.css( tween.elem, prop ) ),+ scale = 1,+ maxIterations = 20;++ if ( start && start[ 3 ] !== unit ) {+ // Trust units reported by jQuery.css+ unit = unit || start[ 3 ];++ // Make sure we update the tween properties later on+ parts = parts || [];++ // Iteratively approximate from a nonzero starting point+ start = +target || 1;++ do {+ // If previous iteration zeroed out, double until we get *something*+ // Use a string for doubling factor so we don't accidentally see scale as unchanged below+ scale = scale || ".5";++ // Adjust and apply+ start = start / scale;+ jQuery.style( tween.elem, prop, start + unit );++ // Update scale, tolerating zero or NaN from tween.cur()+ // And breaking the loop if scale is unchanged or perfect, or if we've just had enough+ } while ( scale !== (scale = tween.cur() / target) && scale !== 1 && --maxIterations );+ }++ // Update tween properties+ if ( parts ) {+ start = tween.start = +start || +target || 0;+ tween.unit = unit;+ // If a +=/-= token was provided, we're doing a relative animation+ tween.end = parts[ 1 ] ?+ start + ( parts[ 1 ] + 1 ) * parts[ 2 ] :+ +parts[ 2 ];+ }++ return tween;+ } ]+ };++// Animations created synchronously will run synchronously+function createFxNow() {+ setTimeout(function() {+ fxNow = undefined;+ });+ return ( fxNow = jQuery.now() );+}++// Generate parameters to create a standard animation+function genFx( type, includeWidth ) {+ var which,+ i = 0,+ attrs = { height: type };++ // if we include width, step value is 1 to do all cssExpand values,+ // if we don't include width, step value is 2 to skip over Left and Right+ includeWidth = includeWidth ? 1 : 0;+ for ( ; i < 4 ; i += 2 - includeWidth ) {+ which = cssExpand[ i ];+ attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;+ }++ if ( includeWidth ) {+ attrs.opacity = attrs.width = type;+ }++ return attrs;+}++function createTween( value, prop, animation ) {+ var tween,+ collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),+ index = 0,+ length = collection.length;+ for ( ; index < length; index++ ) {+ if ( (tween = collection[ index ].call( animation, prop, value )) ) {++ // we're done with this property+ return tween;+ }+ }+}++function defaultPrefilter( elem, props, opts ) {+ /* jshint validthis: true */+ var prop, value, toggle, tween, hooks, oldfire, display,+ anim = this,+ orig = {},+ style = elem.style,+ hidden = elem.nodeType && isHidden( elem ),+ dataShow = data_priv.get( elem, "fxshow" );++ // handle queue: false promises+ if ( !opts.queue ) {+ hooks = jQuery._queueHooks( elem, "fx" );+ if ( hooks.unqueued == null ) {+ hooks.unqueued = 0;+ oldfire = hooks.empty.fire;+ hooks.empty.fire = function() {+ if ( !hooks.unqueued ) {+ oldfire();+ }+ };+ }+ hooks.unqueued++;++ anim.always(function() {+ // doing this makes sure that the complete handler will be called+ // before this completes+ anim.always(function() {+ hooks.unqueued--;+ if ( !jQuery.queue( elem, "fx" ).length ) {+ hooks.empty.fire();+ }+ });+ });+ }++ // height/width overflow pass+ if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {+ // Make sure that nothing sneaks out+ // Record all 3 overflow attributes because IE9-10 do not+ // change the overflow attribute when overflowX and+ // overflowY are set to the same value+ opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];++ // Set display property to inline-block for height/width+ // animations on inline elements that are having width/height animated+ display = jQuery.css( elem, "display" );+ // Get default display if display is currently "none"+ if ( display === "none" ) {+ display = defaultDisplay( elem.nodeName );+ }+ if ( display === "inline" &&+ jQuery.css( elem, "float" ) === "none" ) {++ style.display = "inline-block";+ }+ }++ if ( opts.overflow ) {+ style.overflow = "hidden";+ anim.always(function() {+ style.overflow = opts.overflow[ 0 ];+ style.overflowX = opts.overflow[ 1 ];+ style.overflowY = opts.overflow[ 2 ];+ });+ }++ // show/hide pass+ for ( prop in props ) {+ value = props[ prop ];+ if ( rfxtypes.exec( value ) ) {+ delete props[ prop ];+ toggle = toggle || value === "toggle";+ if ( value === ( hidden ? "hide" : "show" ) ) {++ // If there is dataShow left over from a stopped hide or show and we are going to proceed with show, we should pretend to be hidden+ if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {+ hidden = true;+ } else {+ continue;+ }+ }+ orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );+ }+ }++ if ( !jQuery.isEmptyObject( orig ) ) {+ if ( dataShow ) {+ if ( "hidden" in dataShow ) {+ hidden = dataShow.hidden;+ }+ } else {+ dataShow = data_priv.access( elem, "fxshow", {} );+ }++ // store state if its toggle - enables .stop().toggle() to "reverse"+ if ( toggle ) {+ dataShow.hidden = !hidden;+ }+ if ( hidden ) {+ jQuery( elem ).show();+ } else {+ anim.done(function() {+ jQuery( elem ).hide();+ });+ }+ anim.done(function() {+ var prop;++ data_priv.remove( elem, "fxshow" );+ for ( prop in orig ) {+ jQuery.style( elem, prop, orig[ prop ] );+ }+ });+ for ( prop in orig ) {+ tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );++ if ( !( prop in dataShow ) ) {+ dataShow[ prop ] = tween.start;+ if ( hidden ) {+ tween.end = tween.start;+ tween.start = prop === "width" || prop === "height" ? 1 : 0;+ }+ }+ }+ }+}++function propFilter( props, specialEasing ) {+ var index, name, easing, value, hooks;++ // camelCase, specialEasing and expand cssHook pass+ for ( index in props ) {+ name = jQuery.camelCase( index );+ easing = specialEasing[ name ];+ value = props[ index ];+ if ( jQuery.isArray( value ) ) {+ easing = value[ 1 ];+ value = props[ index ] = value[ 0 ];+ }++ if ( index !== name ) {+ props[ name ] = value;+ delete props[ index ];+ }++ hooks = jQuery.cssHooks[ name ];+ if ( hooks && "expand" in hooks ) {+ value = hooks.expand( value );+ delete props[ name ];++ // not quite $.extend, this wont overwrite keys already present.+ // also - reusing 'index' from above because we have the correct "name"+ for ( index in value ) {+ if ( !( index in props ) ) {+ props[ index ] = value[ index ];+ specialEasing[ index ] = easing;+ }+ }+ } else {+ specialEasing[ name ] = easing;+ }+ }+}++function Animation( elem, properties, options ) {+ var result,+ stopped,+ index = 0,+ length = animationPrefilters.length,+ deferred = jQuery.Deferred().always( function() {+ // don't match elem in the :animated selector+ delete tick.elem;+ }),+ tick = function() {+ if ( stopped ) {+ return false;+ }+ var currentTime = fxNow || createFxNow(),+ remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),+ // archaic crash bug won't allow us to use 1 - ( 0.5 || 0 ) (#12497)+ temp = remaining / animation.duration || 0,+ percent = 1 - temp,+ index = 0,+ length = animation.tweens.length;++ for ( ; index < length ; index++ ) {+ animation.tweens[ index ].run( percent );+ }++ deferred.notifyWith( elem, [ animation, percent, remaining ]);++ if ( percent < 1 && length ) {+ return remaining;+ } else {+ deferred.resolveWith( elem, [ animation ] );+ return false;+ }+ },+ animation = deferred.promise({+ elem: elem,+ props: jQuery.extend( {}, properties ),+ opts: jQuery.extend( true, { specialEasing: {} }, options ),+ originalProperties: properties,+ originalOptions: options,+ startTime: fxNow || createFxNow(),+ duration: options.duration,+ tweens: [],+ createTween: function( prop, end ) {+ var tween = jQuery.Tween( elem, animation.opts, prop, end,+ animation.opts.specialEasing[ prop ] || animation.opts.easing );+ animation.tweens.push( tween );+ return tween;+ },+ stop: function( gotoEnd ) {+ var index = 0,+ // if we are going to the end, we want to run all the tweens+ // otherwise we skip this part+ length = gotoEnd ? animation.tweens.length : 0;+ if ( stopped ) {+ return this;+ }+ stopped = true;+ for ( ; index < length ; index++ ) {+ animation.tweens[ index ].run( 1 );+ }++ // resolve when we played the last frame+ // otherwise, reject+ if ( gotoEnd ) {+ deferred.resolveWith( elem, [ animation, gotoEnd ] );+ } else {+ deferred.rejectWith( elem, [ animation, gotoEnd ] );+ }+ return this;+ }+ }),+ props = animation.props;++ propFilter( props, animation.opts.specialEasing );++ for ( ; index < length ; index++ ) {+ result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );+ if ( result ) {+ return result;+ }+ }++ jQuery.map( props, createTween, animation );++ if ( jQuery.isFunction( animation.opts.start ) ) {+ animation.opts.start.call( elem, animation );+ }++ jQuery.fx.timer(+ jQuery.extend( tick, {+ elem: elem,+ anim: animation,+ queue: animation.opts.queue+ })+ );++ // attach callbacks from options+ return animation.progress( animation.opts.progress )+ .done( animation.opts.done, animation.opts.complete )+ .fail( animation.opts.fail )+ .always( animation.opts.always );+}++jQuery.Animation = jQuery.extend( Animation, {++ tweener: function( props, callback ) {+ if ( jQuery.isFunction( props ) ) {+ callback = props;+ props = [ "*" ];+ } else {+ props = props.split(" ");+ }++ var prop,+ index = 0,+ length = props.length;++ for ( ; index < length ; index++ ) {+ prop = props[ index ];+ tweeners[ prop ] = tweeners[ prop ] || [];+ tweeners[ prop ].unshift( callback );+ }+ },++ prefilter: function( callback, prepend ) {+ if ( prepend ) {+ animationPrefilters.unshift( callback );+ } else {+ animationPrefilters.push( callback );+ }+ }+});++jQuery.speed = function( speed, easing, fn ) {+ var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {+ complete: fn || !fn && easing ||+ jQuery.isFunction( speed ) && speed,+ duration: speed,+ easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing+ };++ opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :+ opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;++ // normalize opt.queue - true/undefined/null -> "fx"+ if ( opt.queue == null || opt.queue === true ) {+ opt.queue = "fx";+ }++ // Queueing+ opt.old = opt.complete;++ opt.complete = function() {+ if ( jQuery.isFunction( opt.old ) ) {+ opt.old.call( this );+ }++ if ( opt.queue ) {+ jQuery.dequeue( this, opt.queue );+ }+ };++ return opt;+};++jQuery.fn.extend({+ fadeTo: function( speed, to, easing, callback ) {++ // show any hidden elements after setting opacity to 0+ return this.filter( isHidden ).css( "opacity", 0 ).show()++ // animate to the value specified+ .end().animate({ opacity: to }, speed, easing, callback );+ },+ animate: function( prop, speed, easing, callback ) {+ var empty = jQuery.isEmptyObject( prop ),+ optall = jQuery.speed( speed, easing, callback ),+ doAnimation = function() {+ // Operate on a copy of prop so per-property easing won't be lost+ var anim = Animation( this, jQuery.extend( {}, prop ), optall );++ // Empty animations, or finishing resolves immediately+ if ( empty || data_priv.get( this, "finish" ) ) {+ anim.stop( true );+ }+ };+ doAnimation.finish = doAnimation;++ return empty || optall.queue === false ?+ this.each( doAnimation ) :+ this.queue( optall.queue, doAnimation );+ },+ stop: function( type, clearQueue, gotoEnd ) {+ var stopQueue = function( hooks ) {+ var stop = hooks.stop;+ delete hooks.stop;+ stop( gotoEnd );+ };++ if ( typeof type !== "string" ) {+ gotoEnd = clearQueue;+ clearQueue = type;+ type = undefined;+ }+ if ( clearQueue && type !== false ) {+ this.queue( type || "fx", [] );+ }++ return this.each(function() {+ var dequeue = true,+ index = type != null && type + "queueHooks",+ timers = jQuery.timers,+ data = data_priv.get( this );++ if ( index ) {+ if ( data[ index ] && data[ index ].stop ) {+ stopQueue( data[ index ] );+ }+ } else {+ for ( index in data ) {+ if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {+ stopQueue( data[ index ] );+ }+ }+ }++ for ( index = timers.length; index--; ) {+ if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {+ timers[ index ].anim.stop( gotoEnd );+ dequeue = false;+ timers.splice( index, 1 );+ }+ }++ // start the next in the queue if the last step wasn't forced+ // timers currently will call their complete callbacks, which will dequeue+ // but only if they were gotoEnd+ if ( dequeue || !gotoEnd ) {+ jQuery.dequeue( this, type );+ }+ });+ },+ finish: function( type ) {+ if ( type !== false ) {+ type = type || "fx";+ }+ return this.each(function() {+ var index,+ data = data_priv.get( this ),+ queue = data[ type + "queue" ],+ hooks = data[ type + "queueHooks" ],+ timers = jQuery.timers,+ length = queue ? queue.length : 0;++ // enable finishing flag on private data+ data.finish = true;++ // empty the queue first+ jQuery.queue( this, type, [] );++ if ( hooks && hooks.stop ) {+ hooks.stop.call( this, true );+ }++ // look for any active animations, and finish them+ for ( index = timers.length; index--; ) {+ if ( timers[ index ].elem === this && timers[ index ].queue === type ) {+ timers[ index ].anim.stop( true );+ timers.splice( index, 1 );+ }+ }++ // look for any animations in the old queue and finish them+ for ( index = 0; index < length; index++ ) {+ if ( queue[ index ] && queue[ index ].finish ) {+ queue[ index ].finish.call( this );+ }+ }++ // turn off finishing flag+ delete data.finish;+ });+ }+});++jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {+ var cssFn = jQuery.fn[ name ];+ jQuery.fn[ name ] = function( speed, easing, callback ) {+ return speed == null || typeof speed === "boolean" ?+ cssFn.apply( this, arguments ) :+ this.animate( genFx( name, true ), speed, easing, callback );+ };+});++// Generate shortcuts for custom animations+jQuery.each({+ slideDown: genFx("show"),+ slideUp: genFx("hide"),+ slideToggle: genFx("toggle"),+ fadeIn: { opacity: "show" },+ fadeOut: { opacity: "hide" },+ fadeToggle: { opacity: "toggle" }+}, function( name, props ) {+ jQuery.fn[ name ] = function( speed, easing, callback ) {+ return this.animate( props, speed, easing, callback );+ };+});++jQuery.timers = [];+jQuery.fx.tick = function() {+ var timer,+ i = 0,+ timers = jQuery.timers;++ fxNow = jQuery.now();++ for ( ; i < timers.length; i++ ) {+ timer = timers[ i ];+ // Checks the timer has not already been removed+ if ( !timer() && timers[ i ] === timer ) {+ timers.splice( i--, 1 );+ }+ }++ if ( !timers.length ) {+ jQuery.fx.stop();+ }+ fxNow = undefined;+};++jQuery.fx.timer = function( timer ) {+ jQuery.timers.push( timer );+ if ( timer() ) {+ jQuery.fx.start();+ } else {+ jQuery.timers.pop();+ }+};++jQuery.fx.interval = 13;++jQuery.fx.start = function() {+ if ( !timerId ) {+ timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );+ }+};++jQuery.fx.stop = function() {+ clearInterval( timerId );+ timerId = null;+};++jQuery.fx.speeds = {+ slow: 600,+ fast: 200,+ // Default speed+ _default: 400+};+++// Based off of the plugin by Clint Helfers, with permission.+// http://blindsignals.com/index.php/2009/07/jquery-delay/+jQuery.fn.delay = function( time, type ) {+ time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;+ type = type || "fx";++ return this.queue( type, function( next, hooks ) {+ var timeout = setTimeout( next, time );+ hooks.stop = function() {+ clearTimeout( timeout );+ };+ });+};+++(function() {+ var input = document.createElement( "input" ),+ select = document.createElement( "select" ),+ opt = select.appendChild( document.createElement( "option" ) );++ input.type = "checkbox";++ // Support: iOS 5.1, Android 4.x, Android 2.3+ // Check the default checkbox/radio value ("" on old WebKit; "on" elsewhere)+ support.checkOn = input.value !== "";++ // Must access the parent to make an option select properly+ // Support: IE9, IE10+ support.optSelected = opt.selected;++ // Make sure that the options inside disabled selects aren't marked as disabled+ // (WebKit marks them as disabled)+ select.disabled = true;+ support.optDisabled = !opt.disabled;++ // Check if an input maintains its value after becoming a radio+ // Support: IE9, IE10+ input = document.createElement( "input" );+ input.value = "t";+ input.type = "radio";+ support.radioValue = input.value === "t";+})();+++var nodeHook, boolHook,+ attrHandle = jQuery.expr.attrHandle;++jQuery.fn.extend({+ attr: function( name, value ) {+ return access( this, jQuery.attr, name, value, arguments.length > 1 );+ },++ removeAttr: function( name ) {+ return this.each(function() {+ jQuery.removeAttr( this, name );+ });+ }+});++jQuery.extend({+ attr: function( elem, name, value ) {+ var hooks, ret,+ nType = elem.nodeType;++ // don't get/set attributes on text, comment and attribute nodes+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {+ return;+ }++ // Fallback to prop when attributes are not supported+ if ( typeof elem.getAttribute === strundefined ) {+ return jQuery.prop( elem, name, value );+ }++ // All attributes are lowercase+ // Grab necessary hook if one is defined+ if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {+ name = name.toLowerCase();+ hooks = jQuery.attrHooks[ name ] ||+ ( jQuery.expr.match.bool.test( name ) ? boolHook : nodeHook );+ }++ if ( value !== undefined ) {++ if ( value === null ) {+ jQuery.removeAttr( elem, name );++ } else if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {+ return ret;++ } else {+ elem.setAttribute( name, value + "" );+ return value;+ }++ } else if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {+ return ret;++ } else {+ ret = jQuery.find.attr( elem, name );++ // Non-existent attributes return null, we normalize to undefined+ return ret == null ?+ undefined :+ ret;+ }+ },++ removeAttr: function( elem, value ) {+ var name, propName,+ i = 0,+ attrNames = value && value.match( rnotwhite );++ if ( attrNames && elem.nodeType === 1 ) {+ while ( (name = attrNames[i++]) ) {+ propName = jQuery.propFix[ name ] || name;++ // Boolean attributes get special treatment (#10870)+ if ( jQuery.expr.match.bool.test( name ) ) {+ // Set corresponding property to false+ elem[ propName ] = false;+ }++ elem.removeAttribute( name );+ }+ }+ },++ attrHooks: {+ type: {+ set: function( elem, value ) {+ if ( !support.radioValue && value === "radio" &&+ jQuery.nodeName( elem, "input" ) ) {+ // Setting the type on a radio button after the value resets the value in IE6-9+ // Reset value to default in case type is set after value during creation+ var val = elem.value;+ elem.setAttribute( "type", value );+ if ( val ) {+ elem.value = val;+ }+ return value;+ }+ }+ }+ }+});++// Hooks for boolean attributes+boolHook = {+ set: function( elem, value, name ) {+ if ( value === false ) {+ // Remove boolean attributes when set to false+ jQuery.removeAttr( elem, name );+ } else {+ elem.setAttribute( name, name );+ }+ return name;+ }+};+jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {+ var getter = attrHandle[ name ] || jQuery.find.attr;++ attrHandle[ name ] = function( elem, name, isXML ) {+ var ret, handle;+ if ( !isXML ) {+ // Avoid an infinite loop by temporarily removing this function from the getter+ handle = attrHandle[ name ];+ attrHandle[ name ] = ret;+ ret = getter( elem, name, isXML ) != null ?+ name.toLowerCase() :+ null;+ attrHandle[ name ] = handle;+ }+ return ret;+ };+});+++++var rfocusable = /^(?:input|select|textarea|button)$/i;++jQuery.fn.extend({+ prop: function( name, value ) {+ return access( this, jQuery.prop, name, value, arguments.length > 1 );+ },++ removeProp: function( name ) {+ return this.each(function() {+ delete this[ jQuery.propFix[ name ] || name ];+ });+ }+});++jQuery.extend({+ propFix: {+ "for": "htmlFor",+ "class": "className"+ },++ prop: function( elem, name, value ) {+ var ret, hooks, notxml,+ nType = elem.nodeType;++ // don't get/set properties on text, comment and attribute nodes+ if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {+ return;+ }++ notxml = nType !== 1 || !jQuery.isXMLDoc( elem );++ if ( notxml ) {+ // Fix name and attach hooks+ name = jQuery.propFix[ name ] || name;+ hooks = jQuery.propHooks[ name ];+ }++ if ( value !== undefined ) {+ return hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ?+ ret :+ ( elem[ name ] = value );++ } else {+ return hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ?+ ret :+ elem[ name ];+ }+ },++ propHooks: {+ tabIndex: {+ get: function( elem ) {+ return elem.hasAttribute( "tabindex" ) || rfocusable.test( elem.nodeName ) || elem.href ?+ elem.tabIndex :+ -1;+ }+ }+ }+});++// Support: IE9++// Selectedness for an option in an optgroup can be inaccurate+if ( !support.optSelected ) {+ jQuery.propHooks.selected = {+ get: function( elem ) {+ var parent = elem.parentNode;+ if ( parent && parent.parentNode ) {+ parent.parentNode.selectedIndex;+ }+ return null;+ }+ };+}++jQuery.each([+ "tabIndex",+ "readOnly",+ "maxLength",+ "cellSpacing",+ "cellPadding",+ "rowSpan",+ "colSpan",+ "useMap",+ "frameBorder",+ "contentEditable"+], function() {+ jQuery.propFix[ this.toLowerCase() ] = this;+});+++++var rclass = /[\t\r\n\f]/g;++jQuery.fn.extend({+ addClass: function( value ) {+ var classes, elem, cur, clazz, j, finalValue,+ proceed = typeof value === "string" && value,+ i = 0,+ len = this.length;++ if ( jQuery.isFunction( value ) ) {+ return this.each(function( j ) {+ jQuery( this ).addClass( value.call( this, j, this.className ) );+ });+ }++ if ( proceed ) {+ // The disjunction here is for better compressibility (see removeClass)+ classes = ( value || "" ).match( rnotwhite ) || [];++ for ( ; i < len; i++ ) {+ elem = this[ i ];+ cur = elem.nodeType === 1 && ( elem.className ?+ ( " " + elem.className + " " ).replace( rclass, " " ) :+ " "+ );++ if ( cur ) {+ j = 0;+ while ( (clazz = classes[j++]) ) {+ if ( cur.indexOf( " " + clazz + " " ) < 0 ) {+ cur += clazz + " ";+ }+ }++ // only assign if different to avoid unneeded rendering.+ finalValue = jQuery.trim( cur );+ if ( elem.className !== finalValue ) {+ elem.className = finalValue;+ }+ }+ }+ }++ return this;+ },++ removeClass: function( value ) {+ var classes, elem, cur, clazz, j, finalValue,+ proceed = arguments.length === 0 || typeof value === "string" && value,+ i = 0,+ len = this.length;++ if ( jQuery.isFunction( value ) ) {+ return this.each(function( j ) {+ jQuery( this ).removeClass( value.call( this, j, this.className ) );+ });+ }+ if ( proceed ) {+ classes = ( value || "" ).match( rnotwhite ) || [];++ for ( ; i < len; i++ ) {+ elem = this[ i ];+ // This expression is here for better compressibility (see addClass)+ cur = elem.nodeType === 1 && ( elem.className ?+ ( " " + elem.className + " " ).replace( rclass, " " ) :+ ""+ );++ if ( cur ) {+ j = 0;+ while ( (clazz = classes[j++]) ) {+ // Remove *all* instances+ while ( cur.indexOf( " " + clazz + " " ) >= 0 ) {+ cur = cur.replace( " " + clazz + " ", " " );+ }+ }++ // only assign if different to avoid unneeded rendering.+ finalValue = value ? jQuery.trim( cur ) : "";+ if ( elem.className !== finalValue ) {+ elem.className = finalValue;+ }+ }+ }+ }++ return this;+ },++ toggleClass: function( value, stateVal ) {+ var type = typeof value;++ if ( typeof stateVal === "boolean" && type === "string" ) {+ return stateVal ? this.addClass( value ) : this.removeClass( value );+ }++ if ( jQuery.isFunction( value ) ) {+ return this.each(function( i ) {+ jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );+ });+ }++ return this.each(function() {+ if ( type === "string" ) {+ // toggle individual class names+ var className,+ i = 0,+ self = jQuery( this ),+ classNames = value.match( rnotwhite ) || [];++ while ( (className = classNames[ i++ ]) ) {+ // check each className given, space separated list+ if ( self.hasClass( className ) ) {+ self.removeClass( className );+ } else {+ self.addClass( className );+ }+ }++ // Toggle whole class name+ } else if ( type === strundefined || type === "boolean" ) {+ if ( this.className ) {+ // store className if set+ data_priv.set( this, "__className__", this.className );+ }++ // If the element has a class name or if we're passed "false",+ // then remove the whole classname (if there was one, the above saved it).+ // Otherwise bring back whatever was previously saved (if anything),+ // falling back to the empty string if nothing was stored.+ this.className = this.className || value === false ? "" : data_priv.get( this, "__className__" ) || "";+ }+ });+ },++ hasClass: function( selector ) {+ var className = " " + selector + " ",+ i = 0,+ l = this.length;+ for ( ; i < l; i++ ) {+ if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) >= 0 ) {+ return true;+ }+ }++ return false;+ }+});+++++var rreturn = /\r/g;++jQuery.fn.extend({+ val: function( value ) {+ var hooks, ret, isFunction,+ elem = this[0];++ if ( !arguments.length ) {+ if ( elem ) {+ hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];++ if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {+ return ret;+ }++ ret = elem.value;++ return typeof ret === "string" ?+ // handle most common string cases+ ret.replace(rreturn, "") :+ // handle cases where value is null/undef or number+ ret == null ? "" : ret;+ }++ return;+ }++ isFunction = jQuery.isFunction( value );++ return this.each(function( i ) {+ var val;++ if ( this.nodeType !== 1 ) {+ return;+ }++ if ( isFunction ) {+ val = value.call( this, i, jQuery( this ).val() );+ } else {+ val = value;+ }++ // Treat null/undefined as ""; convert numbers to string+ if ( val == null ) {+ val = "";++ } else if ( typeof val === "number" ) {+ val += "";++ } else if ( jQuery.isArray( val ) ) {+ val = jQuery.map( val, function( value ) {+ return value == null ? "" : value + "";+ });+ }++ hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];++ // If set returns undefined, fall back to normal setting+ if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {+ this.value = val;+ }+ });+ }+});++jQuery.extend({+ valHooks: {+ select: {+ get: function( elem ) {+ var value, option,+ options = elem.options,+ index = elem.selectedIndex,+ one = elem.type === "select-one" || index < 0,+ values = one ? null : [],+ max = one ? index + 1 : options.length,+ i = index < 0 ?+ max :+ one ? index : 0;++ // Loop through all the selected options+ for ( ; i < max; i++ ) {+ option = options[ i ];++ // IE6-9 doesn't update selected after form reset (#2551)+ if ( ( option.selected || i === index ) &&+ // Don't return options that are disabled or in a disabled optgroup+ ( support.optDisabled ? !option.disabled : option.getAttribute( "disabled" ) === null ) &&+ ( !option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {++ // Get the specific value for the option+ value = jQuery( option ).val();++ // We don't need an array for one selects+ if ( one ) {+ return value;+ }++ // Multi-Selects return an array+ values.push( value );+ }+ }++ return values;+ },++ set: function( elem, value ) {+ var optionSet, option,+ options = elem.options,+ values = jQuery.makeArray( value ),+ i = options.length;++ while ( i-- ) {+ option = options[ i ];+ if ( (option.selected = jQuery.inArray( jQuery(option).val(), values ) >= 0) ) {+ optionSet = true;+ }+ }++ // force browsers to behave consistently when non-matching value is set+ if ( !optionSet ) {+ elem.selectedIndex = -1;+ }+ return values;+ }+ }+ }+});++// Radios and checkboxes getter/setter+jQuery.each([ "radio", "checkbox" ], function() {+ jQuery.valHooks[ this ] = {+ set: function( elem, value ) {+ if ( jQuery.isArray( value ) ) {+ return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );+ }+ }+ };+ if ( !support.checkOn ) {+ jQuery.valHooks[ this ].get = function( elem ) {+ // Support: Webkit+ // "" is returned instead of "on" if a value isn't specified+ return elem.getAttribute("value") === null ? "on" : elem.value;+ };+ }+});+++++// Return jQuery for attributes-only inclusion+++jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " ++ "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " ++ "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {++ // Handle event binding+ jQuery.fn[ name ] = function( data, fn ) {+ return arguments.length > 0 ?+ this.on( name, null, data, fn ) :+ this.trigger( name );+ };+});++jQuery.fn.extend({+ hover: function( fnOver, fnOut ) {+ return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );+ },++ bind: function( types, data, fn ) {+ return this.on( types, null, data, fn );+ },+ unbind: function( types, fn ) {+ return this.off( types, null, fn );+ },++ delegate: function( selector, types, data, fn ) {+ return this.on( types, selector, data, fn );+ },+ undelegate: function( selector, types, fn ) {+ // ( namespace ) or ( selector, types [, fn] )+ return arguments.length === 1 ? this.off( selector, "**" ) : this.off( types, selector || "**", fn );+ }+});+++var nonce = jQuery.now();++var rquery = (/\?/);++++// Support: Android 2.3+// Workaround failure to string-cast null input+jQuery.parseJSON = function( data ) {+ return JSON.parse( data + "" );+};+++// Cross-browser xml parsing+jQuery.parseXML = function( data ) {+ var xml, tmp;+ if ( !data || typeof data !== "string" ) {+ return null;+ }++ // Support: IE9+ try {+ tmp = new DOMParser();+ xml = tmp.parseFromString( data, "text/xml" );+ } catch ( e ) {+ xml = undefined;+ }++ if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {+ jQuery.error( "Invalid XML: " + data );+ }+ return xml;+};+++var+ // Document location+ ajaxLocParts,+ ajaxLocation,++ rhash = /#.*$/,+ rts = /([?&])_=[^&]*/,+ rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,+ // #7653, #8125, #8152: local protocol detection+ rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,+ rnoContent = /^(?:GET|HEAD)$/,+ rprotocol = /^\/\//,+ rurl = /^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,++ /* Prefilters+ * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)+ * 2) These are called:+ * - BEFORE asking for a transport+ * - AFTER param serialization (s.data is a string if s.processData is true)+ * 3) key is the dataType+ * 4) the catchall symbol "*" can be used+ * 5) execution will start with transport dataType and THEN continue down to "*" if needed+ */+ prefilters = {},++ /* Transports bindings+ * 1) key is the dataType+ * 2) the catchall symbol "*" can be used+ * 3) selection will start with transport dataType and THEN go to "*" if needed+ */+ transports = {},++ // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression+ allTypes = "*/".concat("*");++// #8138, IE may throw an exception when accessing+// a field from window.location if document.domain has been set+try {+ ajaxLocation = location.href;+} catch( e ) {+ // Use the href attribute of an A element+ // since IE will modify it given document.location+ ajaxLocation = document.createElement( "a" );+ ajaxLocation.href = "";+ ajaxLocation = ajaxLocation.href;+}++// Segment location into parts+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];++// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport+function addToPrefiltersOrTransports( structure ) {++ // dataTypeExpression is optional and defaults to "*"+ return function( dataTypeExpression, func ) {++ if ( typeof dataTypeExpression !== "string" ) {+ func = dataTypeExpression;+ dataTypeExpression = "*";+ }++ var dataType,+ i = 0,+ dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];++ if ( jQuery.isFunction( func ) ) {+ // For each dataType in the dataTypeExpression+ while ( (dataType = dataTypes[i++]) ) {+ // Prepend if requested+ if ( dataType[0] === "+" ) {+ dataType = dataType.slice( 1 ) || "*";+ (structure[ dataType ] = structure[ dataType ] || []).unshift( func );++ // Otherwise append+ } else {+ (structure[ dataType ] = structure[ dataType ] || []).push( func );+ }+ }+ }+ };+}++// Base inspection function for prefilters and transports+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {++ var inspected = {},+ seekingTransport = ( structure === transports );++ function inspect( dataType ) {+ var selected;+ inspected[ dataType ] = true;+ jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {+ var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );+ if ( typeof dataTypeOrTransport === "string" && !seekingTransport && !inspected[ dataTypeOrTransport ] ) {+ options.dataTypes.unshift( dataTypeOrTransport );+ inspect( dataTypeOrTransport );+ return false;+ } else if ( seekingTransport ) {+ return !( selected = dataTypeOrTransport );+ }+ });+ return selected;+ }++ return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );+}++// A special extend for ajax options+// that takes "flat" options (not to be deep extended)+// Fixes #9887+function ajaxExtend( target, src ) {+ var key, deep,+ flatOptions = jQuery.ajaxSettings.flatOptions || {};++ for ( key in src ) {+ if ( src[ key ] !== undefined ) {+ ( flatOptions[ key ] ? target : ( deep || (deep = {}) ) )[ key ] = src[ key ];+ }+ }+ if ( deep ) {+ jQuery.extend( true, target, deep );+ }++ return target;+}++/* Handles responses to an ajax request:+ * - finds the right dataType (mediates between content-type and expected dataType)+ * - returns the corresponding response+ */+function ajaxHandleResponses( s, jqXHR, responses ) {++ var ct, type, finalDataType, firstDataType,+ contents = s.contents,+ dataTypes = s.dataTypes;++ // Remove auto dataType and get content-type in the process+ while ( dataTypes[ 0 ] === "*" ) {+ dataTypes.shift();+ if ( ct === undefined ) {+ ct = s.mimeType || jqXHR.getResponseHeader("Content-Type");+ }+ }++ // Check if we're dealing with a known content-type+ if ( ct ) {+ for ( type in contents ) {+ if ( contents[ type ] && contents[ type ].test( ct ) ) {+ dataTypes.unshift( type );+ break;+ }+ }+ }++ // Check to see if we have a response for the expected dataType+ if ( dataTypes[ 0 ] in responses ) {+ finalDataType = dataTypes[ 0 ];+ } else {+ // Try convertible dataTypes+ for ( type in responses ) {+ if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {+ finalDataType = type;+ break;+ }+ if ( !firstDataType ) {+ firstDataType = type;+ }+ }+ // Or just use first one+ finalDataType = finalDataType || firstDataType;+ }++ // If we found a dataType+ // We add the dataType to the list if needed+ // and return the corresponding response+ if ( finalDataType ) {+ if ( finalDataType !== dataTypes[ 0 ] ) {+ dataTypes.unshift( finalDataType );+ }+ return responses[ finalDataType ];+ }+}++/* Chain conversions given the request and the original response+ * Also sets the responseXXX fields on the jqXHR instance+ */+function ajaxConvert( s, response, jqXHR, isSuccess ) {+ var conv2, current, conv, tmp, prev,+ converters = {},+ // Work with a copy of dataTypes in case we need to modify it for conversion+ dataTypes = s.dataTypes.slice();++ // Create converters map with lowercased keys+ if ( dataTypes[ 1 ] ) {+ for ( conv in s.converters ) {+ converters[ conv.toLowerCase() ] = s.converters[ conv ];+ }+ }++ current = dataTypes.shift();++ // Convert to each sequential dataType+ while ( current ) {++ if ( s.responseFields[ current ] ) {+ jqXHR[ s.responseFields[ current ] ] = response;+ }++ // Apply the dataFilter if provided+ if ( !prev && isSuccess && s.dataFilter ) {+ response = s.dataFilter( response, s.dataType );+ }++ prev = current;+ current = dataTypes.shift();++ if ( current ) {++ // There's only work to do if current dataType is non-auto+ if ( current === "*" ) {++ current = prev;++ // Convert response if prev dataType is non-auto and differs from current+ } else if ( prev !== "*" && prev !== current ) {++ // Seek a direct converter+ conv = converters[ prev + " " + current ] || converters[ "* " + current ];++ // If none found, seek a pair+ if ( !conv ) {+ for ( conv2 in converters ) {++ // If conv2 outputs current+ tmp = conv2.split( " " );+ if ( tmp[ 1 ] === current ) {++ // If prev can be converted to accepted input+ conv = converters[ prev + " " + tmp[ 0 ] ] ||+ converters[ "* " + tmp[ 0 ] ];+ if ( conv ) {+ // Condense equivalence converters+ if ( conv === true ) {+ conv = converters[ conv2 ];++ // Otherwise, insert the intermediate dataType+ } else if ( converters[ conv2 ] !== true ) {+ current = tmp[ 0 ];+ dataTypes.unshift( tmp[ 1 ] );+ }+ break;+ }+ }+ }+ }++ // Apply converter (if not an equivalence)+ if ( conv !== true ) {++ // Unless errors are allowed to bubble, catch and return them+ if ( conv && s[ "throws" ] ) {+ response = conv( response );+ } else {+ try {+ response = conv( response );+ } catch ( e ) {+ return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };+ }+ }+ }+ }+ }+ }++ return { state: "success", data: response };+}++jQuery.extend({++ // Counter for holding the number of active queries+ active: 0,++ // Last-Modified header cache for next request+ lastModified: {},+ etag: {},++ ajaxSettings: {+ url: ajaxLocation,+ type: "GET",+ isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),+ global: true,+ processData: true,+ async: true,+ contentType: "application/x-www-form-urlencoded; charset=UTF-8",+ /*+ timeout: 0,+ data: null,+ dataType: null,+ username: null,+ password: null,+ cache: null,+ throws: false,+ traditional: false,+ headers: {},+ */++ accepts: {+ "*": allTypes,+ text: "text/plain",+ html: "text/html",+ xml: "application/xml, text/xml",+ json: "application/json, text/javascript"+ },++ contents: {+ xml: /xml/,+ html: /html/,+ json: /json/+ },++ responseFields: {+ xml: "responseXML",+ text: "responseText",+ json: "responseJSON"+ },++ // Data converters+ // Keys separate source (or catchall "*") and destination types with a single space+ converters: {++ // Convert anything to text+ "* text": String,++ // Text to html (true = no transformation)+ "text html": true,++ // Evaluate text as a json expression+ "text json": jQuery.parseJSON,++ // Parse text as xml+ "text xml": jQuery.parseXML+ },++ // For options that shouldn't be deep extended:+ // you can add your own custom options here if+ // and when you create one that shouldn't be+ // deep extended (see ajaxExtend)+ flatOptions: {+ url: true,+ context: true+ }+ },++ // Creates a full fledged settings object into target+ // with both ajaxSettings and settings fields.+ // If target is omitted, writes into ajaxSettings.+ ajaxSetup: function( target, settings ) {+ return settings ?++ // Building a settings object+ ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :++ // Extending ajaxSettings+ ajaxExtend( jQuery.ajaxSettings, target );+ },++ ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),+ ajaxTransport: addToPrefiltersOrTransports( transports ),++ // Main method+ ajax: function( url, options ) {++ // If url is an object, simulate pre-1.5 signature+ if ( typeof url === "object" ) {+ options = url;+ url = undefined;+ }++ // Force options to be an object+ options = options || {};++ var transport,+ // URL without anti-cache param+ cacheURL,+ // Response headers+ responseHeadersString,+ responseHeaders,+ // timeout handle+ timeoutTimer,+ // Cross-domain detection vars+ parts,+ // To know if global events are to be dispatched+ fireGlobals,+ // Loop variable+ i,+ // Create the final options object+ s = jQuery.ajaxSetup( {}, options ),+ // Callbacks context+ callbackContext = s.context || s,+ // Context for global events is callbackContext if it is a DOM node or jQuery collection+ globalEventContext = s.context && ( callbackContext.nodeType || callbackContext.jquery ) ?+ jQuery( callbackContext ) :+ jQuery.event,+ // Deferreds+ deferred = jQuery.Deferred(),+ completeDeferred = jQuery.Callbacks("once memory"),+ // Status-dependent callbacks+ statusCode = s.statusCode || {},+ // Headers (they are sent all at once)+ requestHeaders = {},+ requestHeadersNames = {},+ // The jqXHR state+ state = 0,+ // Default abort message+ strAbort = "canceled",+ // Fake xhr+ jqXHR = {+ readyState: 0,++ // Builds headers hashtable if needed+ getResponseHeader: function( key ) {+ var match;+ if ( state === 2 ) {+ if ( !responseHeaders ) {+ responseHeaders = {};+ while ( (match = rheaders.exec( responseHeadersString )) ) {+ responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];+ }+ }+ match = responseHeaders[ key.toLowerCase() ];+ }+ return match == null ? null : match;+ },++ // Raw string+ getAllResponseHeaders: function() {+ return state === 2 ? responseHeadersString : null;+ },++ // Caches the header+ setRequestHeader: function( name, value ) {+ var lname = name.toLowerCase();+ if ( !state ) {+ name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;+ requestHeaders[ name ] = value;+ }+ return this;+ },++ // Overrides response content-type header+ overrideMimeType: function( type ) {+ if ( !state ) {+ s.mimeType = type;+ }+ return this;+ },++ // Status-dependent callbacks+ statusCode: function( map ) {+ var code;+ if ( map ) {+ if ( state < 2 ) {+ for ( code in map ) {+ // Lazy-add the new callback in a way that preserves old ones+ statusCode[ code ] = [ statusCode[ code ], map[ code ] ];+ }+ } else {+ // Execute the appropriate callbacks+ jqXHR.always( map[ jqXHR.status ] );+ }+ }+ return this;+ },++ // Cancel the request+ abort: function( statusText ) {+ var finalText = statusText || strAbort;+ if ( transport ) {+ transport.abort( finalText );+ }+ done( 0, finalText );+ return this;+ }+ };++ // Attach deferreds+ deferred.promise( jqXHR ).complete = completeDeferred.add;+ jqXHR.success = jqXHR.done;+ jqXHR.error = jqXHR.fail;++ // Remove hash character (#7531: and string promotion)+ // Add protocol if not provided (prefilters might expect it)+ // Handle falsy url in the settings object (#10093: consistency with old signature)+ // We also use the url parameter if available+ s.url = ( ( url || s.url || ajaxLocation ) + "" ).replace( rhash, "" )+ .replace( rprotocol, ajaxLocParts[ 1 ] + "//" );++ // Alias method option to type as per ticket #12004+ s.type = options.method || options.type || s.method || s.type;++ // Extract dataTypes list+ s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];++ // A cross-domain request is in order when we have a protocol:host:port mismatch+ if ( s.crossDomain == null ) {+ parts = rurl.exec( s.url.toLowerCase() );+ s.crossDomain = !!( parts &&+ ( parts[ 1 ] !== ajaxLocParts[ 1 ] || parts[ 2 ] !== ajaxLocParts[ 2 ] ||+ ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? "80" : "443" ) ) !==+ ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? "80" : "443" ) ) )+ );+ }++ // Convert data if not already a string+ if ( s.data && s.processData && typeof s.data !== "string" ) {+ s.data = jQuery.param( s.data, s.traditional );+ }++ // Apply prefilters+ inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );++ // If request was aborted inside a prefilter, stop there+ if ( state === 2 ) {+ return jqXHR;+ }++ // We can fire global events as of now if asked to+ fireGlobals = s.global;++ // Watch for a new set of requests+ if ( fireGlobals && jQuery.active++ === 0 ) {+ jQuery.event.trigger("ajaxStart");+ }++ // Uppercase the type+ s.type = s.type.toUpperCase();++ // Determine if request has content+ s.hasContent = !rnoContent.test( s.type );++ // Save the URL in case we're toying with the If-Modified-Since+ // and/or If-None-Match header later on+ cacheURL = s.url;++ // More options handling for requests with no content+ if ( !s.hasContent ) {++ // If data is available, append data to url+ if ( s.data ) {+ cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );+ // #9682: remove data so that it's not used in an eventual retry+ delete s.data;+ }++ // Add anti-cache in url if needed+ if ( s.cache === false ) {+ s.url = rts.test( cacheURL ) ?++ // If there is already a '_' parameter, set its value+ cacheURL.replace( rts, "$1_=" + nonce++ ) :++ // Otherwise add one to the end+ cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;+ }+ }++ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.+ if ( s.ifModified ) {+ if ( jQuery.lastModified[ cacheURL ] ) {+ jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );+ }+ if ( jQuery.etag[ cacheURL ] ) {+ jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );+ }+ }++ // Set the correct header, if data is being sent+ if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {+ jqXHR.setRequestHeader( "Content-Type", s.contentType );+ }++ // Set the Accepts header for the server, depending on the dataType+ jqXHR.setRequestHeader(+ "Accept",+ s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?+ s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :+ s.accepts[ "*" ]+ );++ // Check for headers option+ for ( i in s.headers ) {+ jqXHR.setRequestHeader( i, s.headers[ i ] );+ }++ // Allow custom headers/mimetypes and early abort+ if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {+ // Abort if not done already and return+ return jqXHR.abort();+ }++ // aborting is no longer a cancellation+ strAbort = "abort";++ // Install callbacks on deferreds+ for ( i in { success: 1, error: 1, complete: 1 } ) {+ jqXHR[ i ]( s[ i ] );+ }++ // Get transport+ transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );++ // If no transport, we auto-abort+ if ( !transport ) {+ done( -1, "No Transport" );+ } else {+ jqXHR.readyState = 1;++ // Send global event+ if ( fireGlobals ) {+ globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );+ }+ // Timeout+ if ( s.async && s.timeout > 0 ) {+ timeoutTimer = setTimeout(function() {+ jqXHR.abort("timeout");+ }, s.timeout );+ }++ try {+ state = 1;+ transport.send( requestHeaders, done );+ } catch ( e ) {+ // Propagate exception as error if not done+ if ( state < 2 ) {+ done( -1, e );+ // Simply rethrow otherwise+ } else {+ throw e;+ }+ }+ }++ // Callback for when everything is done+ function done( status, nativeStatusText, responses, headers ) {+ var isSuccess, success, error, response, modified,+ statusText = nativeStatusText;++ // Called once+ if ( state === 2 ) {+ return;+ }++ // State is "done" now+ state = 2;++ // Clear timeout if it exists+ if ( timeoutTimer ) {+ clearTimeout( timeoutTimer );+ }++ // Dereference transport for early garbage collection+ // (no matter how long the jqXHR object will be used)+ transport = undefined;++ // Cache response headers+ responseHeadersString = headers || "";++ // Set readyState+ jqXHR.readyState = status > 0 ? 4 : 0;++ // Determine if successful+ isSuccess = status >= 200 && status < 300 || status === 304;++ // Get response data+ if ( responses ) {+ response = ajaxHandleResponses( s, jqXHR, responses );+ }++ // Convert no matter what (that way responseXXX fields are always set)+ response = ajaxConvert( s, response, jqXHR, isSuccess );++ // If successful, handle type chaining+ if ( isSuccess ) {++ // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.+ if ( s.ifModified ) {+ modified = jqXHR.getResponseHeader("Last-Modified");+ if ( modified ) {+ jQuery.lastModified[ cacheURL ] = modified;+ }+ modified = jqXHR.getResponseHeader("etag");+ if ( modified ) {+ jQuery.etag[ cacheURL ] = modified;+ }+ }++ // if no content+ if ( status === 204 || s.type === "HEAD" ) {+ statusText = "nocontent";++ // if not modified+ } else if ( status === 304 ) {+ statusText = "notmodified";++ // If we have data, let's convert it+ } else {+ statusText = response.state;+ success = response.data;+ error = response.error;+ isSuccess = !error;+ }+ } else {+ // We extract error from statusText+ // then normalize statusText and status for non-aborts+ error = statusText;+ if ( status || !statusText ) {+ statusText = "error";+ if ( status < 0 ) {+ status = 0;+ }+ }+ }++ // Set data for the fake xhr object+ jqXHR.status = status;+ jqXHR.statusText = ( nativeStatusText || statusText ) + "";++ // Success/Error+ if ( isSuccess ) {+ deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );+ } else {+ deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );+ }++ // Status-dependent callbacks+ jqXHR.statusCode( statusCode );+ statusCode = undefined;++ if ( fireGlobals ) {+ globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",+ [ jqXHR, s, isSuccess ? success : error ] );+ }++ // Complete+ completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );++ if ( fireGlobals ) {+ globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );+ // Handle the global AJAX counter+ if ( !( --jQuery.active ) ) {+ jQuery.event.trigger("ajaxStop");+ }+ }+ }++ return jqXHR;+ },++ getJSON: function( url, data, callback ) {+ return jQuery.get( url, data, callback, "json" );+ },++ getScript: function( url, callback ) {+ return jQuery.get( url, undefined, callback, "script" );+ }+});++jQuery.each( [ "get", "post" ], function( i, method ) {+ jQuery[ method ] = function( url, data, callback, type ) {+ // shift arguments if data argument was omitted+ if ( jQuery.isFunction( data ) ) {+ type = type || callback;+ callback = data;+ data = undefined;+ }++ return jQuery.ajax({+ url: url,+ type: method,+ dataType: type,+ data: data,+ success: callback+ });+ };+});++// Attach a bunch of functions for handling common AJAX events+jQuery.each( [ "ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend" ], function( i, type ) {+ jQuery.fn[ type ] = function( fn ) {+ return this.on( type, fn );+ };+});+++jQuery._evalUrl = function( url ) {+ return jQuery.ajax({+ url: url,+ type: "GET",+ dataType: "script",+ async: false,+ global: false,+ "throws": true+ });+};+++jQuery.fn.extend({+ wrapAll: function( html ) {+ var wrap;++ if ( jQuery.isFunction( html ) ) {+ return this.each(function( i ) {+ jQuery( this ).wrapAll( html.call(this, i) );+ });+ }++ if ( this[ 0 ] ) {++ // The elements to wrap the target around+ wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );++ if ( this[ 0 ].parentNode ) {+ wrap.insertBefore( this[ 0 ] );+ }++ wrap.map(function() {+ var elem = this;++ while ( elem.firstElementChild ) {+ elem = elem.firstElementChild;+ }++ return elem;+ }).append( this );+ }++ return this;+ },++ wrapInner: function( html ) {+ if ( jQuery.isFunction( html ) ) {+ return this.each(function( i ) {+ jQuery( this ).wrapInner( html.call(this, i) );+ });+ }++ return this.each(function() {+ var self = jQuery( this ),+ contents = self.contents();++ if ( contents.length ) {+ contents.wrapAll( html );++ } else {+ self.append( html );+ }+ });+ },++ wrap: function( html ) {+ var isFunction = jQuery.isFunction( html );++ return this.each(function( i ) {+ jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );+ });+ },++ unwrap: function() {+ return this.parent().each(function() {+ if ( !jQuery.nodeName( this, "body" ) ) {+ jQuery( this ).replaceWith( this.childNodes );+ }+ }).end();+ }+});+++jQuery.expr.filters.hidden = function( elem ) {+ // Support: Opera <= 12.12+ // Opera reports offsetWidths and offsetHeights less than zero on some elements+ return elem.offsetWidth <= 0 && elem.offsetHeight <= 0;+};+jQuery.expr.filters.visible = function( elem ) {+ return !jQuery.expr.filters.hidden( elem );+};+++++var r20 = /%20/g,+ rbracket = /\[\]$/,+ rCRLF = /\r?\n/g,+ rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,+ rsubmittable = /^(?:input|select|textarea|keygen)/i;++function buildParams( prefix, obj, traditional, add ) {+ var name;++ if ( jQuery.isArray( obj ) ) {+ // Serialize array item.+ jQuery.each( obj, function( i, v ) {+ if ( traditional || rbracket.test( prefix ) ) {+ // Treat each array item as a scalar.+ add( prefix, v );++ } else {+ // Item is non-scalar (array or object), encode its numeric index.+ buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );+ }+ });++ } else if ( !traditional && jQuery.type( obj ) === "object" ) {+ // Serialize object item.+ for ( name in obj ) {+ buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );+ }++ } else {+ // Serialize scalar item.+ add( prefix, obj );+ }+}++// Serialize an array of form elements or a set of+// key/values into a query string+jQuery.param = function( a, traditional ) {+ var prefix,+ s = [],+ add = function( key, value ) {+ // If value is a function, invoke it and return its value+ value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );+ s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );+ };++ // Set traditional to true for jQuery <= 1.3.2 behavior.+ if ( traditional === undefined ) {+ traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;+ }++ // If an array was passed in, assume that it is an array of form elements.+ if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {+ // Serialize the form elements+ jQuery.each( a, function() {+ add( this.name, this.value );+ });++ } else {+ // If traditional, encode the "old" way (the way 1.3.2 or older+ // did it), otherwise encode params recursively.+ for ( prefix in a ) {+ buildParams( prefix, a[ prefix ], traditional, add );+ }+ }++ // Return the resulting serialization+ return s.join( "&" ).replace( r20, "+" );+};++jQuery.fn.extend({+ serialize: function() {+ return jQuery.param( this.serializeArray() );+ },+ serializeArray: function() {+ return this.map(function() {+ // Can add propHook for "elements" to filter or add form elements+ var elements = jQuery.prop( this, "elements" );+ return elements ? jQuery.makeArray( elements ) : this;+ })+ .filter(function() {+ var type = this.type;++ // Use .is( ":disabled" ) so that fieldset[disabled] works+ return this.name && !jQuery( this ).is( ":disabled" ) &&+ rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&+ ( this.checked || !rcheckableType.test( type ) );+ })+ .map(function( i, elem ) {+ var val = jQuery( this ).val();++ return val == null ?+ null :+ jQuery.isArray( val ) ?+ jQuery.map( val, function( val ) {+ return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };+ }) :+ { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };+ }).get();+ }+});+++jQuery.ajaxSettings.xhr = function() {+ try {+ return new XMLHttpRequest();+ } catch( e ) {}+};++var xhrId = 0,+ xhrCallbacks = {},+ xhrSuccessStatus = {+ // file protocol always yields status code 0, assume 200+ 0: 200,+ // Support: IE9+ // #1450: sometimes IE returns 1223 when it should be 204+ 1223: 204+ },+ xhrSupported = jQuery.ajaxSettings.xhr();++// Support: IE9+// Open requests must be manually aborted on unload (#5280)+if ( window.ActiveXObject ) {+ jQuery( window ).on( "unload", function() {+ for ( var key in xhrCallbacks ) {+ xhrCallbacks[ key ]();+ }+ });+}++support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );+support.ajax = xhrSupported = !!xhrSupported;++jQuery.ajaxTransport(function( options ) {+ var callback;++ // Cross domain only allowed if supported through XMLHttpRequest+ if ( support.cors || xhrSupported && !options.crossDomain ) {+ return {+ send: function( headers, complete ) {+ var i,+ xhr = options.xhr(),+ id = ++xhrId;++ xhr.open( options.type, options.url, options.async, options.username, options.password );++ // Apply custom fields if provided+ if ( options.xhrFields ) {+ for ( i in options.xhrFields ) {+ xhr[ i ] = options.xhrFields[ i ];+ }+ }++ // Override mime type if needed+ if ( options.mimeType && xhr.overrideMimeType ) {+ xhr.overrideMimeType( options.mimeType );+ }++ // X-Requested-With header+ // For cross-domain requests, seeing as conditions for a preflight are+ // akin to a jigsaw puzzle, we simply never set it to be sure.+ // (it can always be set on a per-request basis or even using ajaxSetup)+ // For same-domain requests, won't change header if already provided.+ if ( !options.crossDomain && !headers["X-Requested-With"] ) {+ headers["X-Requested-With"] = "XMLHttpRequest";+ }++ // Set headers+ for ( i in headers ) {+ xhr.setRequestHeader( i, headers[ i ] );+ }++ // Callback+ callback = function( type ) {+ return function() {+ if ( callback ) {+ delete xhrCallbacks[ id ];+ callback = xhr.onload = xhr.onerror = null;++ if ( type === "abort" ) {+ xhr.abort();+ } else if ( type === "error" ) {+ complete(+ // file: protocol always yields status 0; see #8605, #14207+ xhr.status,+ xhr.statusText+ );+ } else {+ complete(+ xhrSuccessStatus[ xhr.status ] || xhr.status,+ xhr.statusText,+ // Support: IE9+ // Accessing binary-data responseText throws an exception+ // (#11426)+ typeof xhr.responseText === "string" ? {+ text: xhr.responseText+ } : undefined,+ xhr.getAllResponseHeaders()+ );+ }+ }+ };+ };++ // Listen to events+ xhr.onload = callback();+ xhr.onerror = callback("error");++ // Create the abort callback+ callback = xhrCallbacks[ id ] = callback("abort");++ // Do send the request+ // This may raise an exception which is actually+ // handled in jQuery.ajax (so no try/catch here)+ xhr.send( options.hasContent && options.data || null );+ },++ abort: function() {+ if ( callback ) {+ callback();+ }+ }+ };+ }+});+++++// Install script dataType+jQuery.ajaxSetup({+ accepts: {+ script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"+ },+ contents: {+ script: /(?:java|ecma)script/+ },+ converters: {+ "text script": function( text ) {+ jQuery.globalEval( text );+ return text;+ }+ }+});++// Handle cache's special case and crossDomain+jQuery.ajaxPrefilter( "script", function( s ) {+ if ( s.cache === undefined ) {+ s.cache = false;+ }+ if ( s.crossDomain ) {+ s.type = "GET";+ }+});++// Bind script tag hack transport+jQuery.ajaxTransport( "script", function( s ) {+ // This transport only deals with cross domain requests+ if ( s.crossDomain ) {+ var script, callback;+ return {+ send: function( _, complete ) {+ script = jQuery("<script>").prop({+ async: true,+ charset: s.scriptCharset,+ src: s.url+ }).on(+ "load error",+ callback = function( evt ) {+ script.remove();+ callback = null;+ if ( evt ) {+ complete( evt.type === "error" ? 404 : 200, evt.type );+ }+ }+ );+ document.head.appendChild( script[ 0 ] );+ },+ abort: function() {+ if ( callback ) {+ callback();+ }+ }+ };+ }+});+++++var oldCallbacks = [],+ rjsonp = /(=)\?(?=&|$)|\?\?/;++// Default jsonp settings+jQuery.ajaxSetup({+ jsonp: "callback",+ jsonpCallback: function() {+ var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );+ this[ callback ] = true;+ return callback;+ }+});++// Detect, normalize options and install callbacks for jsonp requests+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {++ var callbackName, overwritten, responseContainer,+ jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?+ "url" :+ typeof s.data === "string" && !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") && rjsonp.test( s.data ) && "data"+ );++ // Handle iff the expected data type is "jsonp" or we have a parameter to set+ if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {++ // Get callback name, remembering preexisting value associated with it+ callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?+ s.jsonpCallback() :+ s.jsonpCallback;++ // Insert callback into url or form data+ if ( jsonProp ) {+ s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );+ } else if ( s.jsonp !== false ) {+ s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;+ }++ // Use data converter to retrieve json after script execution+ s.converters["script json"] = function() {+ if ( !responseContainer ) {+ jQuery.error( callbackName + " was not called" );+ }+ return responseContainer[ 0 ];+ };++ // force json dataType+ s.dataTypes[ 0 ] = "json";++ // Install callback+ overwritten = window[ callbackName ];+ window[ callbackName ] = function() {+ responseContainer = arguments;+ };++ // Clean-up function (fires after converters)+ jqXHR.always(function() {+ // Restore preexisting value+ window[ callbackName ] = overwritten;++ // Save back as free+ if ( s[ callbackName ] ) {+ // make sure that re-using the options doesn't screw things around+ s.jsonpCallback = originalSettings.jsonpCallback;++ // save the callback name for future use+ oldCallbacks.push( callbackName );+ }++ // Call if it was a function and we have a response+ if ( responseContainer && jQuery.isFunction( overwritten ) ) {+ overwritten( responseContainer[ 0 ] );+ }++ responseContainer = overwritten = undefined;+ });++ // Delegate to script+ return "script";+ }+});+++++// data: string of html+// context (optional): If specified, the fragment will be created in this context, defaults to document+// keepScripts (optional): If true, will include scripts passed in the html string+jQuery.parseHTML = function( data, context, keepScripts ) {+ if ( !data || typeof data !== "string" ) {+ return null;+ }+ if ( typeof context === "boolean" ) {+ keepScripts = context;+ context = false;+ }+ context = context || document;++ var parsed = rsingleTag.exec( data ),+ scripts = !keepScripts && [];++ // Single tag+ if ( parsed ) {+ return [ context.createElement( parsed[1] ) ];+ }++ parsed = jQuery.buildFragment( [ data ], context, scripts );++ if ( scripts && scripts.length ) {+ jQuery( scripts ).remove();+ }++ return jQuery.merge( [], parsed.childNodes );+};+++// Keep a copy of the old load method+var _load = jQuery.fn.load;++/**+ * Load a url into a page+ */+jQuery.fn.load = function( url, params, callback ) {+ if ( typeof url !== "string" && _load ) {+ return _load.apply( this, arguments );+ }++ var selector, type, response,+ self = this,+ off = url.indexOf(" ");++ if ( off >= 0 ) {+ selector = url.slice( off );+ url = url.slice( 0, off );+ }++ // If it's a function+ if ( jQuery.isFunction( params ) ) {++ // We assume that it's the callback+ callback = params;+ params = undefined;++ // Otherwise, build a param string+ } else if ( params && typeof params === "object" ) {+ type = "POST";+ }++ // If we have elements to modify, make the request+ if ( self.length > 0 ) {+ jQuery.ajax({+ url: url,++ // if "type" variable is undefined, then "GET" method will be used+ type: type,+ dataType: "html",+ data: params+ }).done(function( responseText ) {++ // Save response for use in complete callback+ response = arguments;++ self.html( selector ?++ // If a selector was specified, locate the right elements in a dummy div+ // Exclude scripts to avoid IE 'Permission Denied' errors+ jQuery("<div>").append( jQuery.parseHTML( responseText ) ).find( selector ) :++ // Otherwise use the full result+ responseText );++ }).complete( callback && function( jqXHR, status ) {+ self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );+ });+ }++ return this;+};+++++jQuery.expr.filters.animated = function( elem ) {+ return jQuery.grep(jQuery.timers, function( fn ) {+ return elem === fn.elem;+ }).length;+};+++++var docElem = window.document.documentElement;++/**+ * Gets a window from an element+ */+function getWindow( elem ) {+ return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;+}++jQuery.offset = {+ setOffset: function( elem, options, i ) {+ var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,+ position = jQuery.css( elem, "position" ),+ curElem = jQuery( elem ),+ props = {};++ // Set position first, in-case top/left are set even on static elem+ if ( position === "static" ) {+ elem.style.position = "relative";+ }++ curOffset = curElem.offset();+ curCSSTop = jQuery.css( elem, "top" );+ curCSSLeft = jQuery.css( elem, "left" );+ calculatePosition = ( position === "absolute" || position === "fixed" ) &&+ ( curCSSTop + curCSSLeft ).indexOf("auto") > -1;++ // Need to be able to calculate position if either top or left is auto and position is either absolute or fixed+ if ( calculatePosition ) {+ curPosition = curElem.position();+ curTop = curPosition.top;+ curLeft = curPosition.left;++ } else {+ curTop = parseFloat( curCSSTop ) || 0;+ curLeft = parseFloat( curCSSLeft ) || 0;+ }++ if ( jQuery.isFunction( options ) ) {+ options = options.call( elem, i, curOffset );+ }++ if ( options.top != null ) {+ props.top = ( options.top - curOffset.top ) + curTop;+ }+ if ( options.left != null ) {+ props.left = ( options.left - curOffset.left ) + curLeft;+ }++ if ( "using" in options ) {+ options.using.call( elem, props );++ } else {+ curElem.css( props );+ }+ }+};++jQuery.fn.extend({+ offset: function( options ) {+ if ( arguments.length ) {+ return options === undefined ?+ this :+ this.each(function( i ) {+ jQuery.offset.setOffset( this, options, i );+ });+ }++ var docElem, win,+ elem = this[ 0 ],+ box = { top: 0, left: 0 },+ doc = elem && elem.ownerDocument;++ if ( !doc ) {+ return;+ }++ docElem = doc.documentElement;++ // Make sure it's not a disconnected DOM node+ if ( !jQuery.contains( docElem, elem ) ) {+ return box;+ }++ // If we don't have gBCR, just use 0,0 rather than error+ // BlackBerry 5, iOS 3 (original iPhone)+ if ( typeof elem.getBoundingClientRect !== strundefined ) {+ box = elem.getBoundingClientRect();+ }+ win = getWindow( doc );+ return {+ top: box.top + win.pageYOffset - docElem.clientTop,+ left: box.left + win.pageXOffset - docElem.clientLeft+ };+ },++ position: function() {+ if ( !this[ 0 ] ) {+ return;+ }++ var offsetParent, offset,+ elem = this[ 0 ],+ parentOffset = { top: 0, left: 0 };++ // Fixed elements are offset from window (parentOffset = {top:0, left: 0}, because it is its only offset parent+ if ( jQuery.css( elem, "position" ) === "fixed" ) {+ // We assume that getBoundingClientRect is available when computed position is fixed+ offset = elem.getBoundingClientRect();++ } else {+ // Get *real* offsetParent+ offsetParent = this.offsetParent();++ // Get correct offsets+ offset = this.offset();+ if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {+ parentOffset = offsetParent.offset();+ }++ // Add offsetParent borders+ parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );+ parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );+ }++ // Subtract parent offsets and element margins+ return {+ top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),+ left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )+ };+ },++ offsetParent: function() {+ return this.map(function() {+ var offsetParent = this.offsetParent || docElem;++ while ( offsetParent && ( !jQuery.nodeName( offsetParent, "html" ) && jQuery.css( offsetParent, "position" ) === "static" ) ) {+ offsetParent = offsetParent.offsetParent;+ }++ return offsetParent || docElem;+ });+ }+});++// Create scrollLeft and scrollTop methods+jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {+ var top = "pageYOffset" === prop;++ jQuery.fn[ method ] = function( val ) {+ return access( this, function( elem, method, val ) {+ var win = getWindow( elem );++ if ( val === undefined ) {+ return win ? win[ prop ] : elem[ method ];+ }++ if ( win ) {+ win.scrollTo(+ !top ? val : window.pageXOffset,+ top ? val : window.pageYOffset+ );++ } else {+ elem[ method ] = val;+ }+ }, method, val, arguments.length, null );+ };+});++// Add the top/left cssHooks using jQuery.fn.position+// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084+// getComputedStyle returns percent when specified for top/left/bottom/right+// rather than make the css module depend on the offset module, we just check for it here+jQuery.each( [ "top", "left" ], function( i, prop ) {+ jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,+ function( elem, computed ) {+ if ( computed ) {+ computed = curCSS( elem, prop );+ // if curCSS returns percentage, fallback to offset+ return rnumnonpx.test( computed ) ?+ jQuery( elem ).position()[ prop ] + "px" :+ computed;+ }+ }+ );+});+++// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {+ jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {+ // margin is only for outerHeight, outerWidth+ jQuery.fn[ funcName ] = function( margin, value ) {+ var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),+ extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );++ return access( this, function( elem, type, value ) {+ var doc;++ if ( jQuery.isWindow( elem ) ) {+ // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there+ // isn't a whole lot we can do. See pull request at this URL for discussion:+ // https://github.com/jquery/jquery/pull/764+ return elem.document.documentElement[ "client" + name ];+ }++ // Get document width or height+ if ( elem.nodeType === 9 ) {+ doc = elem.documentElement;++ // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],+ // whichever is greatest+ return Math.max(+ elem.body[ "scroll" + name ], doc[ "scroll" + name ],+ elem.body[ "offset" + name ], doc[ "offset" + name ],+ doc[ "client" + name ]+ );+ }++ return value === undefined ?+ // Get width or height on the element, requesting but not forcing parseFloat+ jQuery.css( elem, type, extra ) :++ // Set width or height on the element+ jQuery.style( elem, type, value, extra );+ }, type, chainable ? margin : undefined, chainable, null );+ };+ });+});+++// The number of elements contained in the matched element set+jQuery.fn.size = function() {+ return this.length;+};++jQuery.fn.andSelf = jQuery.fn.addBack;+++++// Register as a named AMD module, since jQuery can be concatenated with other+// files that may use define, but not via a proper concatenation script that+// understands anonymous AMD modules. A named AMD is safest and most robust+// way to register. Lowercase jquery is used because AMD module names are+// derived from file names, and jQuery is normally delivered in a lowercase+// file name. Do this after creating the global so that if an AMD module wants+// to call noConflict to hide this version of jQuery, it will work.+if ( typeof define === "function" && define.amd ) {+ define( "jquery", [], function() {+ return jQuery;+ });+}+++++var+ // Map over jQuery in case of overwrite+ _jQuery = window.jQuery,++ // Map over the $ in case of overwrite+ _$ = window.$;++jQuery.noConflict = function( deep ) {+ if ( window.$ === jQuery ) {+ window.$ = _$;+ }++ if ( deep && window.jQuery === jQuery ) {+ window.jQuery = _jQuery;+ }++ return jQuery;+};++// Expose jQuery and $ identifiers, even in+// AMD (#7102#comment:10, https://github.com/jquery/jquery/pull/557)+// and CommonJS for browser emulators (#13566)+if ( typeof noGlobal === strundefined ) {+ window.jQuery = window.$ = jQuery;+}+++++return jQuery;++}));
+ static/js/jquery.ui.core.js view
@@ -0,0 +1,320 @@+/*!+ * jQuery UI Core 1.10.4+ * http://jqueryui.com+ *+ * Copyright 2014 jQuery Foundation and other contributors+ * Released under the MIT license.+ * http://jquery.org/license+ *+ * http://api.jqueryui.com/category/ui-core/+ */+(function( $, undefined ) {++var uuid = 0,+ runiqueId = /^ui-id-\d+$/;++// $.ui might exist from components with no dependencies, e.g., $.ui.position+$.ui = $.ui || {};++$.extend( $.ui, {+ version: "1.10.4",++ keyCode: {+ BACKSPACE: 8,+ COMMA: 188,+ DELETE: 46,+ DOWN: 40,+ END: 35,+ ENTER: 13,+ ESCAPE: 27,+ HOME: 36,+ LEFT: 37,+ NUMPAD_ADD: 107,+ NUMPAD_DECIMAL: 110,+ NUMPAD_DIVIDE: 111,+ NUMPAD_ENTER: 108,+ NUMPAD_MULTIPLY: 106,+ NUMPAD_SUBTRACT: 109,+ PAGE_DOWN: 34,+ PAGE_UP: 33,+ PERIOD: 190,+ RIGHT: 39,+ SPACE: 32,+ TAB: 9,+ UP: 38+ }+});++// plugins+$.fn.extend({+ focus: (function( orig ) {+ return function( delay, fn ) {+ return typeof delay === "number" ?+ this.each(function() {+ var elem = this;+ setTimeout(function() {+ $( elem ).focus();+ if ( fn ) {+ fn.call( elem );+ }+ }, delay );+ }) :+ orig.apply( this, arguments );+ };+ })( $.fn.focus ),++ scrollParent: function() {+ var scrollParent;+ if (($.ui.ie && (/(static|relative)/).test(this.css("position"))) || (/absolute/).test(this.css("position"))) {+ scrollParent = this.parents().filter(function() {+ return (/(relative|absolute|fixed)/).test($.css(this,"position")) && (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));+ }).eq(0);+ } else {+ scrollParent = this.parents().filter(function() {+ return (/(auto|scroll)/).test($.css(this,"overflow")+$.css(this,"overflow-y")+$.css(this,"overflow-x"));+ }).eq(0);+ }++ return (/fixed/).test(this.css("position")) || !scrollParent.length ? $(document) : scrollParent;+ },++ zIndex: function( zIndex ) {+ if ( zIndex !== undefined ) {+ return this.css( "zIndex", zIndex );+ }++ if ( this.length ) {+ var elem = $( this[ 0 ] ), position, value;+ while ( elem.length && elem[ 0 ] !== document ) {+ // Ignore z-index if position is set to a value where z-index is ignored by the browser+ // This makes behavior of this function consistent across browsers+ // WebKit always returns auto if the element is positioned+ position = elem.css( "position" );+ if ( position === "absolute" || position === "relative" || position === "fixed" ) {+ // IE returns 0 when zIndex is not specified+ // other browsers return a string+ // we ignore the case of nested elements with an explicit value of 0+ // <div style="z-index: -10;"><div style="z-index: 0;"></div></div>+ value = parseInt( elem.css( "zIndex" ), 10 );+ if ( !isNaN( value ) && value !== 0 ) {+ return value;+ }+ }+ elem = elem.parent();+ }+ }++ return 0;+ },++ uniqueId: function() {+ return this.each(function() {+ if ( !this.id ) {+ this.id = "ui-id-" + (++uuid);+ }+ });+ },++ removeUniqueId: function() {+ return this.each(function() {+ if ( runiqueId.test( this.id ) ) {+ $( this ).removeAttr( "id" );+ }+ });+ }+});++// selectors+function focusable( element, isTabIndexNotNaN ) {+ var map, mapName, img,+ nodeName = element.nodeName.toLowerCase();+ if ( "area" === nodeName ) {+ map = element.parentNode;+ mapName = map.name;+ if ( !element.href || !mapName || map.nodeName.toLowerCase() !== "map" ) {+ return false;+ }+ img = $( "img[usemap=#" + mapName + "]" )[0];+ return !!img && visible( img );+ }+ return ( /input|select|textarea|button|object/.test( nodeName ) ?+ !element.disabled :+ "a" === nodeName ?+ element.href || isTabIndexNotNaN :+ isTabIndexNotNaN) &&+ // the element and all of its ancestors must be visible+ visible( element );+}++function visible( element ) {+ return $.expr.filters.visible( element ) &&+ !$( element ).parents().addBack().filter(function() {+ return $.css( this, "visibility" ) === "hidden";+ }).length;+}++$.extend( $.expr[ ":" ], {+ data: $.expr.createPseudo ?+ $.expr.createPseudo(function( dataName ) {+ return function( elem ) {+ return !!$.data( elem, dataName );+ };+ }) :+ // support: jQuery <1.8+ function( elem, i, match ) {+ return !!$.data( elem, match[ 3 ] );+ },++ focusable: function( element ) {+ return focusable( element, !isNaN( $.attr( element, "tabindex" ) ) );+ },++ tabbable: function( element ) {+ var tabIndex = $.attr( element, "tabindex" ),+ isTabIndexNaN = isNaN( tabIndex );+ return ( isTabIndexNaN || tabIndex >= 0 ) && focusable( element, !isTabIndexNaN );+ }+});++// support: jQuery <1.8+if ( !$( "<a>" ).outerWidth( 1 ).jquery ) {+ $.each( [ "Width", "Height" ], function( i, name ) {+ var side = name === "Width" ? [ "Left", "Right" ] : [ "Top", "Bottom" ],+ type = name.toLowerCase(),+ orig = {+ innerWidth: $.fn.innerWidth,+ innerHeight: $.fn.innerHeight,+ outerWidth: $.fn.outerWidth,+ outerHeight: $.fn.outerHeight+ };++ function reduce( elem, size, border, margin ) {+ $.each( side, function() {+ size -= parseFloat( $.css( elem, "padding" + this ) ) || 0;+ if ( border ) {+ size -= parseFloat( $.css( elem, "border" + this + "Width" ) ) || 0;+ }+ if ( margin ) {+ size -= parseFloat( $.css( elem, "margin" + this ) ) || 0;+ }+ });+ return size;+ }++ $.fn[ "inner" + name ] = function( size ) {+ if ( size === undefined ) {+ return orig[ "inner" + name ].call( this );+ }++ return this.each(function() {+ $( this ).css( type, reduce( this, size ) + "px" );+ });+ };++ $.fn[ "outer" + name] = function( size, margin ) {+ if ( typeof size !== "number" ) {+ return orig[ "outer" + name ].call( this, size );+ }++ return this.each(function() {+ $( this).css( type, reduce( this, size, true, margin ) + "px" );+ });+ };+ });+}++// support: jQuery <1.8+if ( !$.fn.addBack ) {+ $.fn.addBack = function( selector ) {+ return this.add( selector == null ?+ this.prevObject : this.prevObject.filter( selector )+ );+ };+}++// support: jQuery 1.6.1, 1.6.2 (http://bugs.jquery.com/ticket/9413)+if ( $( "<a>" ).data( "a-b", "a" ).removeData( "a-b" ).data( "a-b" ) ) {+ $.fn.removeData = (function( removeData ) {+ return function( key ) {+ if ( arguments.length ) {+ return removeData.call( this, $.camelCase( key ) );+ } else {+ return removeData.call( this );+ }+ };+ })( $.fn.removeData );+}++++++// deprecated+$.ui.ie = !!/msie [\w.]+/.exec( navigator.userAgent.toLowerCase() );++$.support.selectstart = "onselectstart" in document.createElement( "div" );+$.fn.extend({+ disableSelection: function() {+ return this.bind( ( $.support.selectstart ? "selectstart" : "mousedown" ) ++ ".ui-disableSelection", function( event ) {+ event.preventDefault();+ });+ },++ enableSelection: function() {+ return this.unbind( ".ui-disableSelection" );+ }+});++$.extend( $.ui, {+ // $.ui.plugin is deprecated. Use $.widget() extensions instead.+ plugin: {+ add: function( module, option, set ) {+ var i,+ proto = $.ui[ module ].prototype;+ for ( i in set ) {+ proto.plugins[ i ] = proto.plugins[ i ] || [];+ proto.plugins[ i ].push( [ option, set[ i ] ] );+ }+ },+ call: function( instance, name, args ) {+ var i,+ set = instance.plugins[ name ];+ if ( !set || !instance.element[ 0 ].parentNode || instance.element[ 0 ].parentNode.nodeType === 11 ) {+ return;+ }++ for ( i = 0; i < set.length; i++ ) {+ if ( instance.options[ set[ i ][ 0 ] ] ) {+ set[ i ][ 1 ].apply( instance.element, args );+ }+ }+ }+ },++ // only used by resizable+ hasScroll: function( el, a ) {++ //If overflow is hidden, the element might have extra content, but the user wants to hide it+ if ( $( el ).css( "overflow" ) === "hidden") {+ return false;+ }++ var scroll = ( a && a === "left" ) ? "scrollLeft" : "scrollTop",+ has = false;++ if ( el[ scroll ] > 0 ) {+ return true;+ }++ // TODO: determine which cases actually cause this to happen+ // if the element doesn't have the scroll set, see if it's possible to+ // set the scroll+ el[ scroll ] = 1;+ has = ( el[ scroll ] > 0 );+ el[ scroll ] = 0;+ return has;+ }+});++})( jQuery );
+ static/js/jquery.ui.mouse.js view
@@ -0,0 +1,169 @@+/*!+ * jQuery UI Mouse 1.10.4+ * http://jqueryui.com+ *+ * Copyright 2014 jQuery Foundation and other contributors+ * Released under the MIT license.+ * http://jquery.org/license+ *+ * http://api.jqueryui.com/mouse/+ *+ * Depends:+ * jquery.ui.widget.js+ */+(function( $, undefined ) {++var mouseHandled = false;+$( document ).mouseup( function() {+ mouseHandled = false;+});++$.widget("ui.mouse", {+ version: "1.10.4",+ options: {+ cancel: "input,textarea,button,select,option",+ distance: 1,+ delay: 0+ },+ _mouseInit: function() {+ var that = this;++ this.element+ .bind("mousedown."+this.widgetName, function(event) {+ return that._mouseDown(event);+ })+ .bind("click."+this.widgetName, function(event) {+ if (true === $.data(event.target, that.widgetName + ".preventClickEvent")) {+ $.removeData(event.target, that.widgetName + ".preventClickEvent");+ event.stopImmediatePropagation();+ return false;+ }+ });++ this.started = false;+ },++ // TODO: make sure destroying one instance of mouse doesn't mess with+ // other instances of mouse+ _mouseDestroy: function() {+ this.element.unbind("."+this.widgetName);+ if ( this._mouseMoveDelegate ) {+ $(document)+ .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)+ .unbind("mouseup."+this.widgetName, this._mouseUpDelegate);+ }+ },++ _mouseDown: function(event) {+ // don't let more than one widget handle mouseStart+ if( mouseHandled ) { return; }++ // we may have missed mouseup (out of window)+ (this._mouseStarted && this._mouseUp(event));++ this._mouseDownEvent = event;++ var that = this,+ btnIsLeft = (event.which === 1),+ // event.target.nodeName works around a bug in IE 8 with+ // disabled inputs (#7620)+ elIsCancel = (typeof this.options.cancel === "string" && event.target.nodeName ? $(event.target).closest(this.options.cancel).length : false);+ if (!btnIsLeft || elIsCancel || !this._mouseCapture(event)) {+ return true;+ }++ this.mouseDelayMet = !this.options.delay;+ if (!this.mouseDelayMet) {+ this._mouseDelayTimer = setTimeout(function() {+ that.mouseDelayMet = true;+ }, this.options.delay);+ }++ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {+ this._mouseStarted = (this._mouseStart(event) !== false);+ if (!this._mouseStarted) {+ event.preventDefault();+ return true;+ }+ }++ // Click event may never have fired (Gecko & Opera)+ if (true === $.data(event.target, this.widgetName + ".preventClickEvent")) {+ $.removeData(event.target, this.widgetName + ".preventClickEvent");+ }++ // these delegates are required to keep context+ this._mouseMoveDelegate = function(event) {+ return that._mouseMove(event);+ };+ this._mouseUpDelegate = function(event) {+ return that._mouseUp(event);+ };+ $(document)+ .bind("mousemove."+this.widgetName, this._mouseMoveDelegate)+ .bind("mouseup."+this.widgetName, this._mouseUpDelegate);++ event.preventDefault();++ mouseHandled = true;+ return true;+ },++ _mouseMove: function(event) {+ // IE mouseup check - mouseup happened when mouse was out of window+ if ($.ui.ie && ( !document.documentMode || document.documentMode < 9 ) && !event.button) {+ return this._mouseUp(event);+ }++ if (this._mouseStarted) {+ this._mouseDrag(event);+ return event.preventDefault();+ }++ if (this._mouseDistanceMet(event) && this._mouseDelayMet(event)) {+ this._mouseStarted =+ (this._mouseStart(this._mouseDownEvent, event) !== false);+ (this._mouseStarted ? this._mouseDrag(event) : this._mouseUp(event));+ }++ return !this._mouseStarted;+ },++ _mouseUp: function(event) {+ $(document)+ .unbind("mousemove."+this.widgetName, this._mouseMoveDelegate)+ .unbind("mouseup."+this.widgetName, this._mouseUpDelegate);++ if (this._mouseStarted) {+ this._mouseStarted = false;++ if (event.target === this._mouseDownEvent.target) {+ $.data(event.target, this.widgetName + ".preventClickEvent", true);+ }++ this._mouseStop(event);+ }++ return false;+ },++ _mouseDistanceMet: function(event) {+ return (Math.max(+ Math.abs(this._mouseDownEvent.pageX - event.pageX),+ Math.abs(this._mouseDownEvent.pageY - event.pageY)+ ) >= this.options.distance+ );+ },++ _mouseDelayMet: function(/* event */) {+ return this.mouseDelayMet;+ },++ // These are placeholder methods, to be overriden by extending plugin+ _mouseStart: function(/* event */) {},+ _mouseDrag: function(/* event */) {},+ _mouseStop: function(/* event */) {},+ _mouseCapture: function(/* event */) { return true; }+});++})(jQuery);
+ static/js/jquery.ui.sortable.js view
@@ -0,0 +1,1289 @@+/*!+ * jQuery UI Sortable 1.10.4+ * http://jqueryui.com+ *+ * Copyright 2014 jQuery Foundation and other contributors+ * Released under the MIT license.+ * http://jquery.org/license+ *+ * http://api.jqueryui.com/sortable/+ *+ * Depends:+ * jquery.ui.core.js+ * jquery.ui.mouse.js+ * jquery.ui.widget.js+ */+(function( $, undefined ) {++function isOverAxis( x, reference, size ) {+ return ( x > reference ) && ( x < ( reference + size ) );+}++function isFloating(item) {+ return (/left|right/).test(item.css("float")) || (/inline|table-cell/).test(item.css("display"));+}++$.widget("ui.sortable", $.ui.mouse, {+ version: "1.10.4",+ widgetEventPrefix: "sort",+ ready: false,+ options: {+ appendTo: "parent",+ axis: false,+ connectWith: false,+ containment: false,+ cursor: "auto",+ cursorAt: false,+ dropOnEmpty: true,+ forcePlaceholderSize: false,+ forceHelperSize: false,+ grid: false,+ handle: false,+ helper: "original",+ items: "> *",+ opacity: false,+ placeholder: false,+ revert: false,+ scroll: true,+ scrollSensitivity: 20,+ scrollSpeed: 20,+ scope: "default",+ tolerance: "intersect",+ zIndex: 1000,++ // callbacks+ activate: null,+ beforeStop: null,+ change: null,+ deactivate: null,+ out: null,+ over: null,+ receive: null,+ remove: null,+ sort: null,+ start: null,+ stop: null,+ update: null+ },+ _create: function() {++ var o = this.options;+ this.containerCache = {};+ this.element.addClass("ui-sortable");++ //Get the items+ this.refresh();++ //Let's determine if the items are being displayed horizontally+ this.floating = this.items.length ? o.axis === "x" || isFloating(this.items[0].item) : false;++ //Let's determine the parent's offset+ this.offset = this.element.offset();++ //Initialize mouse events for interaction+ this._mouseInit();++ //We're ready to go+ this.ready = true;++ },++ _destroy: function() {+ this.element+ .removeClass("ui-sortable ui-sortable-disabled");+ this._mouseDestroy();++ for ( var i = this.items.length - 1; i >= 0; i-- ) {+ this.items[i].item.removeData(this.widgetName + "-item");+ }++ return this;+ },++ _setOption: function(key, value){+ if ( key === "disabled" ) {+ this.options[ key ] = value;++ this.widget().toggleClass( "ui-sortable-disabled", !!value );+ } else {+ // Don't call widget base _setOption for disable as it adds ui-state-disabled class+ $.Widget.prototype._setOption.apply(this, arguments);+ }+ },++ _mouseCapture: function(event, overrideHandle) {+ var currentItem = null,+ validHandle = false,+ that = this;++ if (this.reverting) {+ return false;+ }++ if(this.options.disabled || this.options.type === "static") {+ return false;+ }++ //We have to refresh the items data once first+ this._refreshItems(event);++ //Find out if the clicked node (or one of its parents) is a actual item in this.items+ $(event.target).parents().each(function() {+ if($.data(this, that.widgetName + "-item") === that) {+ currentItem = $(this);+ return false;+ }+ });+ if($.data(event.target, that.widgetName + "-item") === that) {+ currentItem = $(event.target);+ }++ if(!currentItem) {+ return false;+ }+ if(this.options.handle && !overrideHandle) {+ $(this.options.handle, currentItem).find("*").addBack().each(function() {+ if(this === event.target) {+ validHandle = true;+ }+ });+ if(!validHandle) {+ return false;+ }+ }++ this.currentItem = currentItem;+ this._removeCurrentsFromItems();+ return true;++ },++ _mouseStart: function(event, overrideHandle, noActivation) {++ var i, body,+ o = this.options;++ this.currentContainer = this;++ //We only need to call refreshPositions, because the refreshItems call has been moved to mouseCapture+ this.refreshPositions();++ //Create and append the visible helper+ this.helper = this._createHelper(event);++ //Cache the helper size+ this._cacheHelperProportions();++ /*+ * - Position generation -+ * This block generates everything position related - it's the core of draggables.+ */++ //Cache the margins of the original element+ this._cacheMargins();++ //Get the next scrolling parent+ this.scrollParent = this.helper.scrollParent();++ //The element's absolute position on the page minus margins+ this.offset = this.currentItem.offset();+ this.offset = {+ top: this.offset.top - this.margins.top,+ left: this.offset.left - this.margins.left+ };++ $.extend(this.offset, {+ click: { //Where the click happened, relative to the element+ left: event.pageX - this.offset.left,+ top: event.pageY - this.offset.top+ },+ parent: this._getParentOffset(),+ relative: this._getRelativeOffset() //This is a relative to absolute position minus the actual position calculation - only used for relative positioned helper+ });++ // Only after we got the offset, we can change the helper's position to absolute+ // TODO: Still need to figure out a way to make relative sorting possible+ this.helper.css("position", "absolute");+ this.cssPosition = this.helper.css("position");++ //Generate the original position+ this.originalPosition = this._generatePosition(event);+ this.originalPageX = event.pageX;+ this.originalPageY = event.pageY;++ //Adjust the mouse offset relative to the helper if "cursorAt" is supplied+ (o.cursorAt && this._adjustOffsetFromHelper(o.cursorAt));++ //Cache the former DOM position+ this.domPosition = { prev: this.currentItem.prev()[0], parent: this.currentItem.parent()[0] };++ //If the helper is not the original, hide the original so it's not playing any role during the drag, won't cause anything bad this way+ if(this.helper[0] !== this.currentItem[0]) {+ this.currentItem.hide();+ }++ //Create the placeholder+ this._createPlaceholder();++ //Set a containment if given in the options+ if(o.containment) {+ this._setContainment();+ }++ if( o.cursor && o.cursor !== "auto" ) { // cursor option+ body = this.document.find( "body" );++ // support: IE+ this.storedCursor = body.css( "cursor" );+ body.css( "cursor", o.cursor );++ this.storedStylesheet = $( "<style>*{ cursor: "+o.cursor+" !important; }</style>" ).appendTo( body );+ }++ if(o.opacity) { // opacity option+ if (this.helper.css("opacity")) {+ this._storedOpacity = this.helper.css("opacity");+ }+ this.helper.css("opacity", o.opacity);+ }++ if(o.zIndex) { // zIndex option+ if (this.helper.css("zIndex")) {+ this._storedZIndex = this.helper.css("zIndex");+ }+ this.helper.css("zIndex", o.zIndex);+ }++ //Prepare scrolling+ if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {+ this.overflowOffset = this.scrollParent.offset();+ }++ //Call callbacks+ this._trigger("start", event, this._uiHash());++ //Recache the helper size+ if(!this._preserveHelperProportions) {+ this._cacheHelperProportions();+ }+++ //Post "activate" events to possible containers+ if( !noActivation ) {+ for ( i = this.containers.length - 1; i >= 0; i-- ) {+ this.containers[ i ]._trigger( "activate", event, this._uiHash( this ) );+ }+ }++ //Prepare possible droppables+ if($.ui.ddmanager) {+ $.ui.ddmanager.current = this;+ }++ if ($.ui.ddmanager && !o.dropBehaviour) {+ $.ui.ddmanager.prepareOffsets(this, event);+ }++ this.dragging = true;++ this.helper.addClass("ui-sortable-helper");+ this._mouseDrag(event); //Execute the drag once - this causes the helper not to be visible before getting its correct position+ return true;++ },++ _mouseDrag: function(event) {+ var i, item, itemElement, intersection,+ o = this.options,+ scrolled = false;++ //Compute the helpers position+ this.position = this._generatePosition(event);+ this.positionAbs = this._convertPositionTo("absolute");++ if (!this.lastPositionAbs) {+ this.lastPositionAbs = this.positionAbs;+ }++ //Do scrolling+ if(this.options.scroll) {+ if(this.scrollParent[0] !== document && this.scrollParent[0].tagName !== "HTML") {++ if((this.overflowOffset.top + this.scrollParent[0].offsetHeight) - event.pageY < o.scrollSensitivity) {+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop + o.scrollSpeed;+ } else if(event.pageY - this.overflowOffset.top < o.scrollSensitivity) {+ this.scrollParent[0].scrollTop = scrolled = this.scrollParent[0].scrollTop - o.scrollSpeed;+ }++ if((this.overflowOffset.left + this.scrollParent[0].offsetWidth) - event.pageX < o.scrollSensitivity) {+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft + o.scrollSpeed;+ } else if(event.pageX - this.overflowOffset.left < o.scrollSensitivity) {+ this.scrollParent[0].scrollLeft = scrolled = this.scrollParent[0].scrollLeft - o.scrollSpeed;+ }++ } else {++ if(event.pageY - $(document).scrollTop() < o.scrollSensitivity) {+ scrolled = $(document).scrollTop($(document).scrollTop() - o.scrollSpeed);+ } else if($(window).height() - (event.pageY - $(document).scrollTop()) < o.scrollSensitivity) {+ scrolled = $(document).scrollTop($(document).scrollTop() + o.scrollSpeed);+ }++ if(event.pageX - $(document).scrollLeft() < o.scrollSensitivity) {+ scrolled = $(document).scrollLeft($(document).scrollLeft() - o.scrollSpeed);+ } else if($(window).width() - (event.pageX - $(document).scrollLeft()) < o.scrollSensitivity) {+ scrolled = $(document).scrollLeft($(document).scrollLeft() + o.scrollSpeed);+ }++ }++ if(scrolled !== false && $.ui.ddmanager && !o.dropBehaviour) {+ $.ui.ddmanager.prepareOffsets(this, event);+ }+ }++ //Regenerate the absolute position used for position checks+ this.positionAbs = this._convertPositionTo("absolute");++ //Set the helper position+ if(!this.options.axis || this.options.axis !== "y") {+ this.helper[0].style.left = this.position.left+"px";+ }+ if(!this.options.axis || this.options.axis !== "x") {+ this.helper[0].style.top = this.position.top+"px";+ }++ //Rearrange+ for (i = this.items.length - 1; i >= 0; i--) {++ //Cache variables and intersection, continue if no intersection+ item = this.items[i];+ itemElement = item.item[0];+ intersection = this._intersectsWithPointer(item);+ if (!intersection) {+ continue;+ }++ // Only put the placeholder inside the current Container, skip all+ // items from other containers. This works because when moving+ // an item from one container to another the+ // currentContainer is switched before the placeholder is moved.+ //+ // Without this, moving items in "sub-sortables" can cause+ // the placeholder to jitter beetween the outer and inner container.+ if (item.instance !== this.currentContainer) {+ continue;+ }++ // cannot intersect with itself+ // no useless actions that have been done before+ // no action if the item moved is the parent of the item checked+ if (itemElement !== this.currentItem[0] &&+ this.placeholder[intersection === 1 ? "next" : "prev"]()[0] !== itemElement &&+ !$.contains(this.placeholder[0], itemElement) &&+ (this.options.type === "semi-dynamic" ? !$.contains(this.element[0], itemElement) : true)+ ) {++ this.direction = intersection === 1 ? "down" : "up";++ if (this.options.tolerance === "pointer" || this._intersectsWithSides(item)) {+ this._rearrange(event, item);+ } else {+ break;+ }++ this._trigger("change", event, this._uiHash());+ break;+ }+ }++ //Post events to containers+ this._contactContainers(event);++ //Interconnect with droppables+ if($.ui.ddmanager) {+ $.ui.ddmanager.drag(this, event);+ }++ //Call callbacks+ this._trigger("sort", event, this._uiHash());++ this.lastPositionAbs = this.positionAbs;+ return false;++ },++ _mouseStop: function(event, noPropagation) {++ if(!event) {+ return;+ }++ //If we are using droppables, inform the manager about the drop+ if ($.ui.ddmanager && !this.options.dropBehaviour) {+ $.ui.ddmanager.drop(this, event);+ }++ if(this.options.revert) {+ var that = this,+ cur = this.placeholder.offset(),+ axis = this.options.axis,+ animation = {};++ if ( !axis || axis === "x" ) {+ animation.left = cur.left - this.offset.parent.left - this.margins.left + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollLeft);+ }+ if ( !axis || axis === "y" ) {+ animation.top = cur.top - this.offset.parent.top - this.margins.top + (this.offsetParent[0] === document.body ? 0 : this.offsetParent[0].scrollTop);+ }+ this.reverting = true;+ $(this.helper).animate( animation, parseInt(this.options.revert, 10) || 500, function() {+ that._clear(event);+ });+ } else {+ this._clear(event, noPropagation);+ }++ return false;++ },++ cancel: function() {++ if(this.dragging) {++ this._mouseUp({ target: null });++ if(this.options.helper === "original") {+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");+ } else {+ this.currentItem.show();+ }++ //Post deactivating events to containers+ for (var i = this.containers.length - 1; i >= 0; i--){+ this.containers[i]._trigger("deactivate", null, this._uiHash(this));+ if(this.containers[i].containerCache.over) {+ this.containers[i]._trigger("out", null, this._uiHash(this));+ this.containers[i].containerCache.over = 0;+ }+ }++ }++ if (this.placeholder) {+ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!+ if(this.placeholder[0].parentNode) {+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);+ }+ if(this.options.helper !== "original" && this.helper && this.helper[0].parentNode) {+ this.helper.remove();+ }++ $.extend(this, {+ helper: null,+ dragging: false,+ reverting: false,+ _noFinalSort: null+ });++ if(this.domPosition.prev) {+ $(this.domPosition.prev).after(this.currentItem);+ } else {+ $(this.domPosition.parent).prepend(this.currentItem);+ }+ }++ return this;++ },++ serialize: function(o) {++ var items = this._getItemsAsjQuery(o && o.connected),+ str = [];+ o = o || {};++ $(items).each(function() {+ var res = ($(o.item || this).attr(o.attribute || "id") || "").match(o.expression || (/(.+)[\-=_](.+)/));+ if (res) {+ str.push((o.key || res[1]+"[]")+"="+(o.key && o.expression ? res[1] : res[2]));+ }+ });++ if(!str.length && o.key) {+ str.push(o.key + "=");+ }++ return str.join("&");++ },++ toArray: function(o) {++ var items = this._getItemsAsjQuery(o && o.connected),+ ret = [];++ o = o || {};++ items.each(function() { ret.push($(o.item || this).attr(o.attribute || "id") || ""); });+ return ret;++ },++ /* Be careful with the following core functions */+ _intersectsWith: function(item) {++ var x1 = this.positionAbs.left,+ x2 = x1 + this.helperProportions.width,+ y1 = this.positionAbs.top,+ y2 = y1 + this.helperProportions.height,+ l = item.left,+ r = l + item.width,+ t = item.top,+ b = t + item.height,+ dyClick = this.offset.click.top,+ dxClick = this.offset.click.left,+ isOverElementHeight = ( this.options.axis === "x" ) || ( ( y1 + dyClick ) > t && ( y1 + dyClick ) < b ),+ isOverElementWidth = ( this.options.axis === "y" ) || ( ( x1 + dxClick ) > l && ( x1 + dxClick ) < r ),+ isOverElement = isOverElementHeight && isOverElementWidth;++ if ( this.options.tolerance === "pointer" ||+ this.options.forcePointerForContainers ||+ (this.options.tolerance !== "pointer" && this.helperProportions[this.floating ? "width" : "height"] > item[this.floating ? "width" : "height"])+ ) {+ return isOverElement;+ } else {++ return (l < x1 + (this.helperProportions.width / 2) && // Right Half+ x2 - (this.helperProportions.width / 2) < r && // Left Half+ t < y1 + (this.helperProportions.height / 2) && // Bottom Half+ y2 - (this.helperProportions.height / 2) < b ); // Top Half++ }+ },++ _intersectsWithPointer: function(item) {++ var isOverElementHeight = (this.options.axis === "x") || isOverAxis(this.positionAbs.top + this.offset.click.top, item.top, item.height),+ isOverElementWidth = (this.options.axis === "y") || isOverAxis(this.positionAbs.left + this.offset.click.left, item.left, item.width),+ isOverElement = isOverElementHeight && isOverElementWidth,+ verticalDirection = this._getDragVerticalDirection(),+ horizontalDirection = this._getDragHorizontalDirection();++ if (!isOverElement) {+ return false;+ }++ return this.floating ?+ ( ((horizontalDirection && horizontalDirection === "right") || verticalDirection === "down") ? 2 : 1 )+ : ( verticalDirection && (verticalDirection === "down" ? 2 : 1) );++ },++ _intersectsWithSides: function(item) {++ var isOverBottomHalf = isOverAxis(this.positionAbs.top + this.offset.click.top, item.top + (item.height/2), item.height),+ isOverRightHalf = isOverAxis(this.positionAbs.left + this.offset.click.left, item.left + (item.width/2), item.width),+ verticalDirection = this._getDragVerticalDirection(),+ horizontalDirection = this._getDragHorizontalDirection();++ if (this.floating && horizontalDirection) {+ return ((horizontalDirection === "right" && isOverRightHalf) || (horizontalDirection === "left" && !isOverRightHalf));+ } else {+ return verticalDirection && ((verticalDirection === "down" && isOverBottomHalf) || (verticalDirection === "up" && !isOverBottomHalf));+ }++ },++ _getDragVerticalDirection: function() {+ var delta = this.positionAbs.top - this.lastPositionAbs.top;+ return delta !== 0 && (delta > 0 ? "down" : "up");+ },++ _getDragHorizontalDirection: function() {+ var delta = this.positionAbs.left - this.lastPositionAbs.left;+ return delta !== 0 && (delta > 0 ? "right" : "left");+ },++ refresh: function(event) {+ this._refreshItems(event);+ this.refreshPositions();+ return this;+ },++ _connectWith: function() {+ var options = this.options;+ return options.connectWith.constructor === String ? [options.connectWith] : options.connectWith;+ },++ _getItemsAsjQuery: function(connected) {++ var i, j, cur, inst,+ items = [],+ queries = [],+ connectWith = this._connectWith();++ if(connectWith && connected) {+ for (i = connectWith.length - 1; i >= 0; i--){+ cur = $(connectWith[i]);+ for ( j = cur.length - 1; j >= 0; j--){+ inst = $.data(cur[j], this.widgetFullName);+ if(inst && inst !== this && !inst.options.disabled) {+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element) : $(inst.options.items, inst.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), inst]);+ }+ }+ }+ }++ queries.push([$.isFunction(this.options.items) ? this.options.items.call(this.element, null, { options: this.options, item: this.currentItem }) : $(this.options.items, this.element).not(".ui-sortable-helper").not(".ui-sortable-placeholder"), this]);++ function addItems() {+ items.push( this );+ }+ for (i = queries.length - 1; i >= 0; i--){+ queries[i][0].each( addItems );+ }++ return $(items);++ },++ _removeCurrentsFromItems: function() {++ var list = this.currentItem.find(":data(" + this.widgetName + "-item)");++ this.items = $.grep(this.items, function (item) {+ for (var j=0; j < list.length; j++) {+ if(list[j] === item.item[0]) {+ return false;+ }+ }+ return true;+ });++ },++ _refreshItems: function(event) {++ this.items = [];+ this.containers = [this];++ var i, j, cur, inst, targetData, _queries, item, queriesLength,+ items = this.items,+ queries = [[$.isFunction(this.options.items) ? this.options.items.call(this.element[0], event, { item: this.currentItem }) : $(this.options.items, this.element), this]],+ connectWith = this._connectWith();++ if(connectWith && this.ready) { //Shouldn't be run the first time through due to massive slow-down+ for (i = connectWith.length - 1; i >= 0; i--){+ cur = $(connectWith[i]);+ for (j = cur.length - 1; j >= 0; j--){+ inst = $.data(cur[j], this.widgetFullName);+ if(inst && inst !== this && !inst.options.disabled) {+ queries.push([$.isFunction(inst.options.items) ? inst.options.items.call(inst.element[0], event, { item: this.currentItem }) : $(inst.options.items, inst.element), inst]);+ this.containers.push(inst);+ }+ }+ }+ }++ for (i = queries.length - 1; i >= 0; i--) {+ targetData = queries[i][1];+ _queries = queries[i][0];++ for (j=0, queriesLength = _queries.length; j < queriesLength; j++) {+ item = $(_queries[j]);++ item.data(this.widgetName + "-item", targetData); // Data for target checking (mouse manager)++ items.push({+ item: item,+ instance: targetData,+ width: 0, height: 0,+ left: 0, top: 0+ });+ }+ }++ },++ refreshPositions: function(fast) {++ //This has to be redone because due to the item being moved out/into the offsetParent, the offsetParent's position will change+ if(this.offsetParent && this.helper) {+ this.offset.parent = this._getParentOffset();+ }++ var i, item, t, p;++ for (i = this.items.length - 1; i >= 0; i--){+ item = this.items[i];++ //We ignore calculating positions of all connected containers when we're not over them+ if(item.instance !== this.currentContainer && this.currentContainer && item.item[0] !== this.currentItem[0]) {+ continue;+ }++ t = this.options.toleranceElement ? $(this.options.toleranceElement, item.item) : item.item;++ if (!fast) {+ item.width = t.outerWidth();+ item.height = t.outerHeight();+ }++ p = t.offset();+ item.left = p.left;+ item.top = p.top;+ }++ if(this.options.custom && this.options.custom.refreshContainers) {+ this.options.custom.refreshContainers.call(this);+ } else {+ for (i = this.containers.length - 1; i >= 0; i--){+ p = this.containers[i].element.offset();+ this.containers[i].containerCache.left = p.left;+ this.containers[i].containerCache.top = p.top;+ this.containers[i].containerCache.width = this.containers[i].element.outerWidth();+ this.containers[i].containerCache.height = this.containers[i].element.outerHeight();+ }+ }++ return this;+ },++ _createPlaceholder: function(that) {+ that = that || this;+ var className,+ o = that.options;++ if(!o.placeholder || o.placeholder.constructor === String) {+ className = o.placeholder;+ o.placeholder = {+ element: function() {++ var nodeName = that.currentItem[0].nodeName.toLowerCase(),+ element = $( "<" + nodeName + ">", that.document[0] )+ .addClass(className || that.currentItem[0].className+" ui-sortable-placeholder")+ .removeClass("ui-sortable-helper");++ if ( nodeName === "tr" ) {+ that.currentItem.children().each(function() {+ $( "<td> </td>", that.document[0] )+ .attr( "colspan", $( this ).attr( "colspan" ) || 1 )+ .appendTo( element );+ });+ } else if ( nodeName === "img" ) {+ element.attr( "src", that.currentItem.attr( "src" ) );+ }++ if ( !className ) {+ element.css( "visibility", "hidden" );+ }++ return element;+ },+ update: function(container, p) {++ // 1. If a className is set as 'placeholder option, we don't force sizes - the class is responsible for that+ // 2. The option 'forcePlaceholderSize can be enabled to force it even if a class name is specified+ if(className && !o.forcePlaceholderSize) {+ return;+ }++ //If the element doesn't have a actual height by itself (without styles coming from a stylesheet), it receives the inline height from the dragged item+ if(!p.height()) { p.height(that.currentItem.innerHeight() - parseInt(that.currentItem.css("paddingTop")||0, 10) - parseInt(that.currentItem.css("paddingBottom")||0, 10)); }+ if(!p.width()) { p.width(that.currentItem.innerWidth() - parseInt(that.currentItem.css("paddingLeft")||0, 10) - parseInt(that.currentItem.css("paddingRight")||0, 10)); }+ }+ };+ }++ //Create the placeholder+ that.placeholder = $(o.placeholder.element.call(that.element, that.currentItem));++ //Append it after the actual current item+ that.currentItem.after(that.placeholder);++ //Update the size of the placeholder (TODO: Logic to fuzzy, see line 316/317)+ o.placeholder.update(that, that.placeholder);++ },++ _contactContainers: function(event) {+ var i, j, dist, itemWithLeastDistance, posProperty, sizeProperty, base, cur, nearBottom, floating,+ innermostContainer = null,+ innermostIndex = null;++ // get innermost container that intersects with item+ for (i = this.containers.length - 1; i >= 0; i--) {++ // never consider a container that's located within the item itself+ if($.contains(this.currentItem[0], this.containers[i].element[0])) {+ continue;+ }++ if(this._intersectsWith(this.containers[i].containerCache)) {++ // if we've already found a container and it's more "inner" than this, then continue+ if(innermostContainer && $.contains(this.containers[i].element[0], innermostContainer.element[0])) {+ continue;+ }++ innermostContainer = this.containers[i];+ innermostIndex = i;++ } else {+ // container doesn't intersect. trigger "out" event if necessary+ if(this.containers[i].containerCache.over) {+ this.containers[i]._trigger("out", event, this._uiHash(this));+ this.containers[i].containerCache.over = 0;+ }+ }++ }++ // if no intersecting containers found, return+ if(!innermostContainer) {+ return;+ }++ // move the item into the container if it's not there already+ if(this.containers.length === 1) {+ if (!this.containers[innermostIndex].containerCache.over) {+ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));+ this.containers[innermostIndex].containerCache.over = 1;+ }+ } else {++ //When entering a new container, we will find the item with the least distance and append our item near it+ dist = 10000;+ itemWithLeastDistance = null;+ floating = innermostContainer.floating || isFloating(this.currentItem);+ posProperty = floating ? "left" : "top";+ sizeProperty = floating ? "width" : "height";+ base = this.positionAbs[posProperty] + this.offset.click[posProperty];+ for (j = this.items.length - 1; j >= 0; j--) {+ if(!$.contains(this.containers[innermostIndex].element[0], this.items[j].item[0])) {+ continue;+ }+ if(this.items[j].item[0] === this.currentItem[0]) {+ continue;+ }+ if (floating && !isOverAxis(this.positionAbs.top + this.offset.click.top, this.items[j].top, this.items[j].height)) {+ continue;+ }+ cur = this.items[j].item.offset()[posProperty];+ nearBottom = false;+ if(Math.abs(cur - base) > Math.abs(cur + this.items[j][sizeProperty] - base)){+ nearBottom = true;+ cur += this.items[j][sizeProperty];+ }++ if(Math.abs(cur - base) < dist) {+ dist = Math.abs(cur - base); itemWithLeastDistance = this.items[j];+ this.direction = nearBottom ? "up": "down";+ }+ }++ //Check if dropOnEmpty is enabled+ if(!itemWithLeastDistance && !this.options.dropOnEmpty) {+ return;+ }++ if(this.currentContainer === this.containers[innermostIndex]) {+ return;+ }++ itemWithLeastDistance ? this._rearrange(event, itemWithLeastDistance, null, true) : this._rearrange(event, null, this.containers[innermostIndex].element, true);+ this._trigger("change", event, this._uiHash());+ this.containers[innermostIndex]._trigger("change", event, this._uiHash(this));+ this.currentContainer = this.containers[innermostIndex];++ //Update the placeholder+ this.options.placeholder.update(this.currentContainer, this.placeholder);++ this.containers[innermostIndex]._trigger("over", event, this._uiHash(this));+ this.containers[innermostIndex].containerCache.over = 1;+ }+++ },++ _createHelper: function(event) {++ var o = this.options,+ helper = $.isFunction(o.helper) ? $(o.helper.apply(this.element[0], [event, this.currentItem])) : (o.helper === "clone" ? this.currentItem.clone() : this.currentItem);++ //Add the helper to the DOM if that didn't happen already+ if(!helper.parents("body").length) {+ $(o.appendTo !== "parent" ? o.appendTo : this.currentItem[0].parentNode)[0].appendChild(helper[0]);+ }++ if(helper[0] === this.currentItem[0]) {+ this._storedCSS = { width: this.currentItem[0].style.width, height: this.currentItem[0].style.height, position: this.currentItem.css("position"), top: this.currentItem.css("top"), left: this.currentItem.css("left") };+ }++ if(!helper[0].style.width || o.forceHelperSize) {+ helper.width(this.currentItem.width());+ }+ if(!helper[0].style.height || o.forceHelperSize) {+ helper.height(this.currentItem.height());+ }++ return helper;++ },++ _adjustOffsetFromHelper: function(obj) {+ if (typeof obj === "string") {+ obj = obj.split(" ");+ }+ if ($.isArray(obj)) {+ obj = {left: +obj[0], top: +obj[1] || 0};+ }+ if ("left" in obj) {+ this.offset.click.left = obj.left + this.margins.left;+ }+ if ("right" in obj) {+ this.offset.click.left = this.helperProportions.width - obj.right + this.margins.left;+ }+ if ("top" in obj) {+ this.offset.click.top = obj.top + this.margins.top;+ }+ if ("bottom" in obj) {+ this.offset.click.top = this.helperProportions.height - obj.bottom + this.margins.top;+ }+ },++ _getParentOffset: function() {+++ //Get the offsetParent and cache its position+ this.offsetParent = this.helper.offsetParent();+ var po = this.offsetParent.offset();++ // This is a special case where we need to modify a offset calculated on start, since the following happened:+ // 1. The position of the helper is absolute, so it's position is calculated based on the next positioned parent+ // 2. The actual offset parent is a child of the scroll parent, and the scroll parent isn't the document, which means that+ // the scroll is included in the initial calculation of the offset of the parent, and never recalculated upon drag+ if(this.cssPosition === "absolute" && this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) {+ po.left += this.scrollParent.scrollLeft();+ po.top += this.scrollParent.scrollTop();+ }++ // This needs to be actually done for all browsers, since pageX/pageY includes this information+ // with an ugly IE fix+ if( this.offsetParent[0] === document.body || (this.offsetParent[0].tagName && this.offsetParent[0].tagName.toLowerCase() === "html" && $.ui.ie)) {+ po = { top: 0, left: 0 };+ }++ return {+ top: po.top + (parseInt(this.offsetParent.css("borderTopWidth"),10) || 0),+ left: po.left + (parseInt(this.offsetParent.css("borderLeftWidth"),10) || 0)+ };++ },++ _getRelativeOffset: function() {++ if(this.cssPosition === "relative") {+ var p = this.currentItem.position();+ return {+ top: p.top - (parseInt(this.helper.css("top"),10) || 0) + this.scrollParent.scrollTop(),+ left: p.left - (parseInt(this.helper.css("left"),10) || 0) + this.scrollParent.scrollLeft()+ };+ } else {+ return { top: 0, left: 0 };+ }++ },++ _cacheMargins: function() {+ this.margins = {+ left: (parseInt(this.currentItem.css("marginLeft"),10) || 0),+ top: (parseInt(this.currentItem.css("marginTop"),10) || 0)+ };+ },++ _cacheHelperProportions: function() {+ this.helperProportions = {+ width: this.helper.outerWidth(),+ height: this.helper.outerHeight()+ };+ },++ _setContainment: function() {++ var ce, co, over,+ o = this.options;+ if(o.containment === "parent") {+ o.containment = this.helper[0].parentNode;+ }+ if(o.containment === "document" || o.containment === "window") {+ this.containment = [+ 0 - this.offset.relative.left - this.offset.parent.left,+ 0 - this.offset.relative.top - this.offset.parent.top,+ $(o.containment === "document" ? document : window).width() - this.helperProportions.width - this.margins.left,+ ($(o.containment === "document" ? document : window).height() || document.body.parentNode.scrollHeight) - this.helperProportions.height - this.margins.top+ ];+ }++ if(!(/^(document|window|parent)$/).test(o.containment)) {+ ce = $(o.containment)[0];+ co = $(o.containment).offset();+ over = ($(ce).css("overflow") !== "hidden");++ this.containment = [+ co.left + (parseInt($(ce).css("borderLeftWidth"),10) || 0) + (parseInt($(ce).css("paddingLeft"),10) || 0) - this.margins.left,+ co.top + (parseInt($(ce).css("borderTopWidth"),10) || 0) + (parseInt($(ce).css("paddingTop"),10) || 0) - this.margins.top,+ co.left+(over ? Math.max(ce.scrollWidth,ce.offsetWidth) : ce.offsetWidth) - (parseInt($(ce).css("borderLeftWidth"),10) || 0) - (parseInt($(ce).css("paddingRight"),10) || 0) - this.helperProportions.width - this.margins.left,+ co.top+(over ? Math.max(ce.scrollHeight,ce.offsetHeight) : ce.offsetHeight) - (parseInt($(ce).css("borderTopWidth"),10) || 0) - (parseInt($(ce).css("paddingBottom"),10) || 0) - this.helperProportions.height - this.margins.top+ ];+ }++ },++ _convertPositionTo: function(d, pos) {++ if(!pos) {+ pos = this.position;+ }+ var mod = d === "absolute" ? 1 : -1,+ scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent,+ scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);++ return {+ top: (+ pos.top + // The absolute mouse position+ this.offset.relative.top * mod + // Only for relative positioned nodes: Relative offset from element to offset parent+ this.offset.parent.top * mod - // The offsetParent's offset without borders (offset + border)+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ) * mod)+ ),+ left: (+ pos.left + // The absolute mouse position+ this.offset.relative.left * mod + // Only for relative positioned nodes: Relative offset from element to offset parent+ this.offset.parent.left * mod - // The offsetParent's offset without borders (offset + border)+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ) * mod)+ )+ };++ },++ _generatePosition: function(event) {++ var top, left,+ o = this.options,+ pageX = event.pageX,+ pageY = event.pageY,+ scroll = this.cssPosition === "absolute" && !(this.scrollParent[0] !== document && $.contains(this.scrollParent[0], this.offsetParent[0])) ? this.offsetParent : this.scrollParent, scrollIsRootNode = (/(html|body)/i).test(scroll[0].tagName);++ // This is another very weird special case that only happens for relative elements:+ // 1. If the css position is relative+ // 2. and the scroll parent is the document or similar to the offset parent+ // we have to refresh the relative offset during the scroll so there are no jumps+ if(this.cssPosition === "relative" && !(this.scrollParent[0] !== document && this.scrollParent[0] !== this.offsetParent[0])) {+ this.offset.relative = this._getRelativeOffset();+ }++ /*+ * - Position constraining -+ * Constrain the position to a mix of grid, containment.+ */++ if(this.originalPosition) { //If we are not dragging yet, we won't check for options++ if(this.containment) {+ if(event.pageX - this.offset.click.left < this.containment[0]) {+ pageX = this.containment[0] + this.offset.click.left;+ }+ if(event.pageY - this.offset.click.top < this.containment[1]) {+ pageY = this.containment[1] + this.offset.click.top;+ }+ if(event.pageX - this.offset.click.left > this.containment[2]) {+ pageX = this.containment[2] + this.offset.click.left;+ }+ if(event.pageY - this.offset.click.top > this.containment[3]) {+ pageY = this.containment[3] + this.offset.click.top;+ }+ }++ if(o.grid) {+ top = this.originalPageY + Math.round((pageY - this.originalPageY) / o.grid[1]) * o.grid[1];+ pageY = this.containment ? ( (top - this.offset.click.top >= this.containment[1] && top - this.offset.click.top <= this.containment[3]) ? top : ((top - this.offset.click.top >= this.containment[1]) ? top - o.grid[1] : top + o.grid[1])) : top;++ left = this.originalPageX + Math.round((pageX - this.originalPageX) / o.grid[0]) * o.grid[0];+ pageX = this.containment ? ( (left - this.offset.click.left >= this.containment[0] && left - this.offset.click.left <= this.containment[2]) ? left : ((left - this.offset.click.left >= this.containment[0]) ? left - o.grid[0] : left + o.grid[0])) : left;+ }++ }++ return {+ top: (+ pageY - // The absolute mouse position+ this.offset.click.top - // Click offset (relative to the element)+ this.offset.relative.top - // Only for relative positioned nodes: Relative offset from element to offset parent+ this.offset.parent.top + // The offsetParent's offset without borders (offset + border)+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollTop() : ( scrollIsRootNode ? 0 : scroll.scrollTop() ) ))+ ),+ left: (+ pageX - // The absolute mouse position+ this.offset.click.left - // Click offset (relative to the element)+ this.offset.relative.left - // Only for relative positioned nodes: Relative offset from element to offset parent+ this.offset.parent.left + // The offsetParent's offset without borders (offset + border)+ ( ( this.cssPosition === "fixed" ? -this.scrollParent.scrollLeft() : scrollIsRootNode ? 0 : scroll.scrollLeft() ))+ )+ };++ },++ _rearrange: function(event, i, a, hardRefresh) {++ a ? a[0].appendChild(this.placeholder[0]) : i.item[0].parentNode.insertBefore(this.placeholder[0], (this.direction === "down" ? i.item[0] : i.item[0].nextSibling));++ //Various things done here to improve the performance:+ // 1. we create a setTimeout, that calls refreshPositions+ // 2. on the instance, we have a counter variable, that get's higher after every append+ // 3. on the local scope, we copy the counter variable, and check in the timeout, if it's still the same+ // 4. this lets only the last addition to the timeout stack through+ this.counter = this.counter ? ++this.counter : 1;+ var counter = this.counter;++ this._delay(function() {+ if(counter === this.counter) {+ this.refreshPositions(!hardRefresh); //Precompute after each DOM insertion, NOT on mousemove+ }+ });++ },++ _clear: function(event, noPropagation) {++ this.reverting = false;+ // We delay all events that have to be triggered to after the point where the placeholder has been removed and+ // everything else normalized again+ var i,+ delayedTriggers = [];++ // We first have to update the dom position of the actual currentItem+ // Note: don't do it if the current item is already removed (by a user), or it gets reappended (see #4088)+ if(!this._noFinalSort && this.currentItem.parent().length) {+ this.placeholder.before(this.currentItem);+ }+ this._noFinalSort = null;++ if(this.helper[0] === this.currentItem[0]) {+ for(i in this._storedCSS) {+ if(this._storedCSS[i] === "auto" || this._storedCSS[i] === "static") {+ this._storedCSS[i] = "";+ }+ }+ this.currentItem.css(this._storedCSS).removeClass("ui-sortable-helper");+ } else {+ this.currentItem.show();+ }++ if(this.fromOutside && !noPropagation) {+ delayedTriggers.push(function(event) { this._trigger("receive", event, this._uiHash(this.fromOutside)); });+ }+ if((this.fromOutside || this.domPosition.prev !== this.currentItem.prev().not(".ui-sortable-helper")[0] || this.domPosition.parent !== this.currentItem.parent()[0]) && !noPropagation) {+ delayedTriggers.push(function(event) { this._trigger("update", event, this._uiHash()); }); //Trigger update callback if the DOM position has changed+ }++ // Check if the items Container has Changed and trigger appropriate+ // events.+ if (this !== this.currentContainer) {+ if(!noPropagation) {+ delayedTriggers.push(function(event) { this._trigger("remove", event, this._uiHash()); });+ delayedTriggers.push((function(c) { return function(event) { c._trigger("receive", event, this._uiHash(this)); }; }).call(this, this.currentContainer));+ delayedTriggers.push((function(c) { return function(event) { c._trigger("update", event, this._uiHash(this)); }; }).call(this, this.currentContainer));+ }+ }+++ //Post events to containers+ function delayEvent( type, instance, container ) {+ return function( event ) {+ container._trigger( type, event, instance._uiHash( instance ) );+ };+ }+ for (i = this.containers.length - 1; i >= 0; i--){+ if (!noPropagation) {+ delayedTriggers.push( delayEvent( "deactivate", this, this.containers[ i ] ) );+ }+ if(this.containers[i].containerCache.over) {+ delayedTriggers.push( delayEvent( "out", this, this.containers[ i ] ) );+ this.containers[i].containerCache.over = 0;+ }+ }++ //Do what was originally in plugins+ if ( this.storedCursor ) {+ this.document.find( "body" ).css( "cursor", this.storedCursor );+ this.storedStylesheet.remove();+ }+ if(this._storedOpacity) {+ this.helper.css("opacity", this._storedOpacity);+ }+ if(this._storedZIndex) {+ this.helper.css("zIndex", this._storedZIndex === "auto" ? "" : this._storedZIndex);+ }++ this.dragging = false;+ if(this.cancelHelperRemoval) {+ if(!noPropagation) {+ this._trigger("beforeStop", event, this._uiHash());+ for (i=0; i < delayedTriggers.length; i++) {+ delayedTriggers[i].call(this, event);+ } //Trigger all delayed events+ this._trigger("stop", event, this._uiHash());+ }++ this.fromOutside = false;+ return false;+ }++ if(!noPropagation) {+ this._trigger("beforeStop", event, this._uiHash());+ }++ //$(this.placeholder[0]).remove(); would have been the jQuery way - unfortunately, it unbinds ALL events from the original node!+ this.placeholder[0].parentNode.removeChild(this.placeholder[0]);++ if(this.helper[0] !== this.currentItem[0]) {+ this.helper.remove();+ }+ this.helper = null;++ if(!noPropagation) {+ for (i=0; i < delayedTriggers.length; i++) {+ delayedTriggers[i].call(this, event);+ } //Trigger all delayed events+ this._trigger("stop", event, this._uiHash());+ }++ this.fromOutside = false;+ return true;++ },++ _trigger: function() {+ if ($.Widget.prototype._trigger.apply(this, arguments) === false) {+ this.cancel();+ }+ },++ _uiHash: function(_inst) {+ var inst = _inst || this;+ return {+ helper: inst.helper,+ placeholder: inst.placeholder || $([]),+ position: inst.position,+ originalPosition: inst.originalPosition,+ offset: inst.positionAbs,+ item: inst.currentItem,+ sender: _inst ? _inst.element : null+ };+ }++});++})(jQuery);
+ static/js/jquery.ui.widget.js view
@@ -0,0 +1,521 @@+/*!+ * jQuery UI Widget 1.10.4+ * http://jqueryui.com+ *+ * Copyright 2014 jQuery Foundation and other contributors+ * Released under the MIT license.+ * http://jquery.org/license+ *+ * http://api.jqueryui.com/jQuery.widget/+ */+(function( $, undefined ) {++var uuid = 0,+ slice = Array.prototype.slice,+ _cleanData = $.cleanData;+$.cleanData = function( elems ) {+ for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {+ try {+ $( elem ).triggerHandler( "remove" );+ // http://bugs.jquery.com/ticket/8235+ } catch( e ) {}+ }+ _cleanData( elems );+};++$.widget = function( name, base, prototype ) {+ var fullName, existingConstructor, constructor, basePrototype,+ // proxiedPrototype allows the provided prototype to remain unmodified+ // so that it can be used as a mixin for multiple widgets (#8876)+ proxiedPrototype = {},+ namespace = name.split( "." )[ 0 ];++ name = name.split( "." )[ 1 ];+ fullName = namespace + "-" + name;++ if ( !prototype ) {+ prototype = base;+ base = $.Widget;+ }++ // create selector for plugin+ $.expr[ ":" ][ fullName.toLowerCase() ] = function( elem ) {+ return !!$.data( elem, fullName );+ };++ $[ namespace ] = $[ namespace ] || {};+ existingConstructor = $[ namespace ][ name ];+ constructor = $[ namespace ][ name ] = function( options, element ) {+ // allow instantiation without "new" keyword+ if ( !this._createWidget ) {+ return new constructor( options, element );+ }++ // allow instantiation without initializing for simple inheritance+ // must use "new" keyword (the code above always passes args)+ if ( arguments.length ) {+ this._createWidget( options, element );+ }+ };+ // extend with the existing constructor to carry over any static properties+ $.extend( constructor, existingConstructor, {+ version: prototype.version,+ // copy the object used to create the prototype in case we need to+ // redefine the widget later+ _proto: $.extend( {}, prototype ),+ // track widgets that inherit from this widget in case this widget is+ // redefined after a widget inherits from it+ _childConstructors: []+ });++ basePrototype = new base();+ // we need to make the options hash a property directly on the new instance+ // otherwise we'll modify the options hash on the prototype that we're+ // inheriting from+ basePrototype.options = $.widget.extend( {}, basePrototype.options );+ $.each( prototype, function( prop, value ) {+ if ( !$.isFunction( value ) ) {+ proxiedPrototype[ prop ] = value;+ return;+ }+ proxiedPrototype[ prop ] = (function() {+ var _super = function() {+ return base.prototype[ prop ].apply( this, arguments );+ },+ _superApply = function( args ) {+ return base.prototype[ prop ].apply( this, args );+ };+ return function() {+ var __super = this._super,+ __superApply = this._superApply,+ returnValue;++ this._super = _super;+ this._superApply = _superApply;++ returnValue = value.apply( this, arguments );++ this._super = __super;+ this._superApply = __superApply;++ return returnValue;+ };+ })();+ });+ constructor.prototype = $.widget.extend( basePrototype, {+ // TODO: remove support for widgetEventPrefix+ // always use the name + a colon as the prefix, e.g., draggable:start+ // don't prefix for widgets that aren't DOM-based+ widgetEventPrefix: existingConstructor ? (basePrototype.widgetEventPrefix || name) : name+ }, proxiedPrototype, {+ constructor: constructor,+ namespace: namespace,+ widgetName: name,+ widgetFullName: fullName+ });++ // If this widget is being redefined then we need to find all widgets that+ // are inheriting from it and redefine all of them so that they inherit from+ // the new version of this widget. We're essentially trying to replace one+ // level in the prototype chain.+ if ( existingConstructor ) {+ $.each( existingConstructor._childConstructors, function( i, child ) {+ var childPrototype = child.prototype;++ // redefine the child widget using the same prototype that was+ // originally used, but inherit from the new version of the base+ $.widget( childPrototype.namespace + "." + childPrototype.widgetName, constructor, child._proto );+ });+ // remove the list of existing child constructors from the old constructor+ // so the old child constructors can be garbage collected+ delete existingConstructor._childConstructors;+ } else {+ base._childConstructors.push( constructor );+ }++ $.widget.bridge( name, constructor );+};++$.widget.extend = function( target ) {+ var input = slice.call( arguments, 1 ),+ inputIndex = 0,+ inputLength = input.length,+ key,+ value;+ for ( ; inputIndex < inputLength; inputIndex++ ) {+ for ( key in input[ inputIndex ] ) {+ value = input[ inputIndex ][ key ];+ if ( input[ inputIndex ].hasOwnProperty( key ) && value !== undefined ) {+ // Clone objects+ if ( $.isPlainObject( value ) ) {+ target[ key ] = $.isPlainObject( target[ key ] ) ?+ $.widget.extend( {}, target[ key ], value ) :+ // Don't extend strings, arrays, etc. with objects+ $.widget.extend( {}, value );+ // Copy everything else by reference+ } else {+ target[ key ] = value;+ }+ }+ }+ }+ return target;+};++$.widget.bridge = function( name, object ) {+ var fullName = object.prototype.widgetFullName || name;+ $.fn[ name ] = function( options ) {+ var isMethodCall = typeof options === "string",+ args = slice.call( arguments, 1 ),+ returnValue = this;++ // allow multiple hashes to be passed on init+ options = !isMethodCall && args.length ?+ $.widget.extend.apply( null, [ options ].concat(args) ) :+ options;++ if ( isMethodCall ) {+ this.each(function() {+ var methodValue,+ instance = $.data( this, fullName );+ if ( !instance ) {+ return $.error( "cannot call methods on " + name + " prior to initialization; " ++ "attempted to call method '" + options + "'" );+ }+ if ( !$.isFunction( instance[options] ) || options.charAt( 0 ) === "_" ) {+ return $.error( "no such method '" + options + "' for " + name + " widget instance" );+ }+ methodValue = instance[ options ].apply( instance, args );+ if ( methodValue !== instance && methodValue !== undefined ) {+ returnValue = methodValue && methodValue.jquery ?+ returnValue.pushStack( methodValue.get() ) :+ methodValue;+ return false;+ }+ });+ } else {+ this.each(function() {+ var instance = $.data( this, fullName );+ if ( instance ) {+ instance.option( options || {} )._init();+ } else {+ $.data( this, fullName, new object( options, this ) );+ }+ });+ }++ return returnValue;+ };+};++$.Widget = function( /* options, element */ ) {};+$.Widget._childConstructors = [];++$.Widget.prototype = {+ widgetName: "widget",+ widgetEventPrefix: "",+ defaultElement: "<div>",+ options: {+ disabled: false,++ // callbacks+ create: null+ },+ _createWidget: function( options, element ) {+ element = $( element || this.defaultElement || this )[ 0 ];+ this.element = $( element );+ this.uuid = uuid++;+ this.eventNamespace = "." + this.widgetName + this.uuid;+ this.options = $.widget.extend( {},+ this.options,+ this._getCreateOptions(),+ options );++ this.bindings = $();+ this.hoverable = $();+ this.focusable = $();++ if ( element !== this ) {+ $.data( element, this.widgetFullName, this );+ this._on( true, this.element, {+ remove: function( event ) {+ if ( event.target === element ) {+ this.destroy();+ }+ }+ });+ this.document = $( element.style ?+ // element within the document+ element.ownerDocument :+ // element is window or document+ element.document || element );+ this.window = $( this.document[0].defaultView || this.document[0].parentWindow );+ }++ this._create();+ this._trigger( "create", null, this._getCreateEventData() );+ this._init();+ },+ _getCreateOptions: $.noop,+ _getCreateEventData: $.noop,+ _create: $.noop,+ _init: $.noop,++ destroy: function() {+ this._destroy();+ // we can probably remove the unbind calls in 2.0+ // all event bindings should go through this._on()+ this.element+ .unbind( this.eventNamespace )+ // 1.9 BC for #7810+ // TODO remove dual storage+ .removeData( this.widgetName )+ .removeData( this.widgetFullName )+ // support: jquery <1.6.3+ // http://bugs.jquery.com/ticket/9413+ .removeData( $.camelCase( this.widgetFullName ) );+ this.widget()+ .unbind( this.eventNamespace )+ .removeAttr( "aria-disabled" )+ .removeClass(+ this.widgetFullName + "-disabled " ++ "ui-state-disabled" );++ // clean up events and states+ this.bindings.unbind( this.eventNamespace );+ this.hoverable.removeClass( "ui-state-hover" );+ this.focusable.removeClass( "ui-state-focus" );+ },+ _destroy: $.noop,++ widget: function() {+ return this.element;+ },++ option: function( key, value ) {+ var options = key,+ parts,+ curOption,+ i;++ if ( arguments.length === 0 ) {+ // don't return a reference to the internal hash+ return $.widget.extend( {}, this.options );+ }++ if ( typeof key === "string" ) {+ // handle nested keys, e.g., "foo.bar" => { foo: { bar: ___ } }+ options = {};+ parts = key.split( "." );+ key = parts.shift();+ if ( parts.length ) {+ curOption = options[ key ] = $.widget.extend( {}, this.options[ key ] );+ for ( i = 0; i < parts.length - 1; i++ ) {+ curOption[ parts[ i ] ] = curOption[ parts[ i ] ] || {};+ curOption = curOption[ parts[ i ] ];+ }+ key = parts.pop();+ if ( arguments.length === 1 ) {+ return curOption[ key ] === undefined ? null : curOption[ key ];+ }+ curOption[ key ] = value;+ } else {+ if ( arguments.length === 1 ) {+ return this.options[ key ] === undefined ? null : this.options[ key ];+ }+ options[ key ] = value;+ }+ }++ this._setOptions( options );++ return this;+ },+ _setOptions: function( options ) {+ var key;++ for ( key in options ) {+ this._setOption( key, options[ key ] );+ }++ return this;+ },+ _setOption: function( key, value ) {+ this.options[ key ] = value;++ if ( key === "disabled" ) {+ this.widget()+ .toggleClass( this.widgetFullName + "-disabled ui-state-disabled", !!value )+ .attr( "aria-disabled", value );+ this.hoverable.removeClass( "ui-state-hover" );+ this.focusable.removeClass( "ui-state-focus" );+ }++ return this;+ },++ enable: function() {+ return this._setOption( "disabled", false );+ },+ disable: function() {+ return this._setOption( "disabled", true );+ },++ _on: function( suppressDisabledCheck, element, handlers ) {+ var delegateElement,+ instance = this;++ // no suppressDisabledCheck flag, shuffle arguments+ if ( typeof suppressDisabledCheck !== "boolean" ) {+ handlers = element;+ element = suppressDisabledCheck;+ suppressDisabledCheck = false;+ }++ // no element argument, shuffle and use this.element+ if ( !handlers ) {+ handlers = element;+ element = this.element;+ delegateElement = this.widget();+ } else {+ // accept selectors, DOM elements+ element = delegateElement = $( element );+ this.bindings = this.bindings.add( element );+ }++ $.each( handlers, function( event, handler ) {+ function handlerProxy() {+ // allow widgets to customize the disabled handling+ // - disabled as an array instead of boolean+ // - disabled class as method for disabling individual parts+ if ( !suppressDisabledCheck &&+ ( instance.options.disabled === true ||+ $( this ).hasClass( "ui-state-disabled" ) ) ) {+ return;+ }+ return ( typeof handler === "string" ? instance[ handler ] : handler )+ .apply( instance, arguments );+ }++ // copy the guid so direct unbinding works+ if ( typeof handler !== "string" ) {+ handlerProxy.guid = handler.guid =+ handler.guid || handlerProxy.guid || $.guid++;+ }++ var match = event.match( /^(\w+)\s*(.*)$/ ),+ eventName = match[1] + instance.eventNamespace,+ selector = match[2];+ if ( selector ) {+ delegateElement.delegate( selector, eventName, handlerProxy );+ } else {+ element.bind( eventName, handlerProxy );+ }+ });+ },++ _off: function( element, eventName ) {+ eventName = (eventName || "").split( " " ).join( this.eventNamespace + " " ) + this.eventNamespace;+ element.unbind( eventName ).undelegate( eventName );+ },++ _delay: function( handler, delay ) {+ function handlerProxy() {+ return ( typeof handler === "string" ? instance[ handler ] : handler )+ .apply( instance, arguments );+ }+ var instance = this;+ return setTimeout( handlerProxy, delay || 0 );+ },++ _hoverable: function( element ) {+ this.hoverable = this.hoverable.add( element );+ this._on( element, {+ mouseenter: function( event ) {+ $( event.currentTarget ).addClass( "ui-state-hover" );+ },+ mouseleave: function( event ) {+ $( event.currentTarget ).removeClass( "ui-state-hover" );+ }+ });+ },++ _focusable: function( element ) {+ this.focusable = this.focusable.add( element );+ this._on( element, {+ focusin: function( event ) {+ $( event.currentTarget ).addClass( "ui-state-focus" );+ },+ focusout: function( event ) {+ $( event.currentTarget ).removeClass( "ui-state-focus" );+ }+ });+ },++ _trigger: function( type, event, data ) {+ var prop, orig,+ callback = this.options[ type ];++ data = data || {};+ event = $.Event( event );+ event.type = ( type === this.widgetEventPrefix ?+ type :+ this.widgetEventPrefix + type ).toLowerCase();+ // the original event may come from any element+ // so we need to reset the target on the new event+ event.target = this.element[ 0 ];++ // copy original event properties over to the new event+ orig = event.originalEvent;+ if ( orig ) {+ for ( prop in orig ) {+ if ( !( prop in event ) ) {+ event[ prop ] = orig[ prop ];+ }+ }+ }++ this.element.trigger( event, data );+ return !( $.isFunction( callback ) &&+ callback.apply( this.element[0], [ event ].concat( data ) ) === false ||+ event.isDefaultPrevented() );+ }+};++$.each( { show: "fadeIn", hide: "fadeOut" }, function( method, defaultEffect ) {+ $.Widget.prototype[ "_" + method ] = function( element, options, callback ) {+ if ( typeof options === "string" ) {+ options = { effect: options };+ }+ var hasOptions,+ effectName = !options ?+ method :+ options === true || typeof options === "number" ?+ defaultEffect :+ options.effect || defaultEffect;+ options = options || {};+ if ( typeof options === "number" ) {+ options = { duration: options };+ }+ hasOptions = !$.isEmptyObject( options );+ options.complete = callback;+ if ( options.delay ) {+ element.delay( options.delay );+ }+ if ( hasOptions && $.effects && $.effects.effect[ effectName ] ) {+ element[ method ]( options );+ } else if ( effectName !== method && element[ effectName ] ) {+ element[ effectName ]( options.duration, options.easing, callback );+ } else {+ element.queue(function( next ) {+ $( this )[ method ]();+ if ( callback ) {+ callback.call( element[ 0 ] );+ }+ next();+ });+ }+ };+});++})( jQuery );
+ static/js/longpolling.js view
@@ -0,0 +1,46 @@+connfails=0;++longpollcallbacks = $.Callbacks();++// Updates a div with a specified id, by polling an url,+// which should return a new div, with the same id.+function longpoll_div(url, divid, cont, fail) {+ $.ajax({+ 'url': url,+ 'dataType': 'html',+ 'success': function(data, status, jqxhr) {+ $('#' + divid).replaceWith(data);+ longpollcallbacks.fire();+ connfails=0;+ cont();+ },+ 'error': function(jqxhr, msg, e) {+ connfails=connfails+1;+ // It's normal to get 1 failure per longpolling+ // element when navigating away from a page.+ // So 12 allows up to 4 longpolling elements per+ // page.+ if (connfails > 12) {+ fail();+ }+ else {+ cont();+ }+ }+ });+}++function longpoll_data(url, cont) {+ $.ajax({+ 'url': url,+ 'dataType': 'text',+ 'success': function(data, status, jqxhr) {+ connfails=0;+ cont(1, data);+ },+ 'error': function(jqxhr, msg, e) {+ connfails=connfails+1;+ cont(0);+ }+ });+}
− static/longpolling.js
@@ -1,46 +0,0 @@-connfails=0;--longpollcallbacks = $.Callbacks();--// Updates a div with a specified id, by polling an url,-// which should return a new div, with the same id.-function longpoll_div(url, divid, cont, fail) {- $.ajax({- 'url': url,- 'dataType': 'html',- 'success': function(data, status, jqxhr) {- $('#' + divid).replaceWith(data);- longpollcallbacks.fire();- connfails=0;- cont();- },- 'error': function(jqxhr, msg, e) {- connfails=connfails+1;- // It's normal to get 1 failure per longpolling- // element when navigating away from a page.- // So 12 allows up to 4 longpolling elements per- // page.- if (connfails > 12) {- fail();- }- else {- cont();- }- }- });-}--function longpoll_data(url, cont) {- $.ajax({- 'url': url,- 'dataType': 'text',- 'success': function(data, status, jqxhr) {- connfails=0;- cont(1, data);- },- 'error': function(jqxhr, msg, e) {- connfails=connfails+1;- cont(0);- }- });-}
templates/actionbutton.hamlet view
@@ -1,2 +1,3 @@ <a title="#{fromMaybe "" tooltip}" class="#{buttonclass}" href="@{route}" onclick="(function( $ ) { $.post('@{route}'); })( jQuery ); return false;">- <i class="#{iconclass}"></i> #{fromMaybe "" label}+ <span class="glyphicon #{iconclass}"> #+ \ #{fromMaybe "" label}
templates/configurators/addbox.com.hamlet view
@@ -1,24 +1,28 @@-<div .span9 .hero-unit>- <h2>- Adding a Box.com repository- <p>- <a href="http://box.com">Box.com</a> offers a small quantity of storage #- for free, and larger quantities for a fee.- <p>- Even a small amount of free storage is useful, as a transfer point #- between your repositories.- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <div .form-actions>- <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">- Add repository-<div .modal .fade #workingmodal>- <div .modal-header>- <h3>- Making repository ...- <div .modal-body>+<div .col-sm-9>+ <div .content-box>+ <h2>+ Adding a Box.com repository <p>- Setting up your Box.com repository. This could take a minute.+ <a href="http://box.com">Box.com</a> offers a small quantity of storage #+ for free, and larger quantities for a fee.+ <p>+ Even a small amount of free storage is useful, as a transfer point #+ between your repositories.+ <p>+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">+ Add repository+<div .modal .fade #workingmodal>+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Making repository ...+ <div .modal-body>+ <p>+ Setting up your Box.com repository. This could take a minute.
templates/configurators/adddrive.hamlet view
@@ -1,31 +1,36 @@-<div .span9 .hero-unit>- <h2>- Adding a removable drive- <p>- Clone this repository to a USB drive, memory stick, or other #- removable media. Whenever the removable drive is plugged in, its #- content will be synced with the content of this repository.- <p>- $if (null writabledrives)- <div .span6 .alert .alert-error .alert-block>- $if (null removabledrives)- <h4 .alert-heading>- No removable drives found- Please make sure you have a removable drive plugged in and mounted.- $else- <h4 .alert-heading>- No usable removable drives found- Seems you cannot write to any of the removable drives that are #- currently mounted. Try plugging in a removable drive that you can #- write to, or correcting the write permissions.- <p>- <a .btn .btn-primary href="@{AddDriveR}">- Rescan for removable drives- $else- <form method="post" enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <button .btn .btn-primary type=submit>Use this drive</button> #- <a .btn href="@{AddDriveR}">- Rescan for removable drives+<div .col-sm-9>+ <div .content-box>+ <h2>+ Adding a removable drive+ <p>+ Clone this repository to a USB drive, memory stick, or other #+ removable media. Whenever the removable drive is plugged in, its #+ content will be synced with the content of this repository.+ <p>+ $if (null writabledrives)+ <div .row>+ <div .col-sm-6 .col-sm-offset-2 .alert .alert-danger .alert-block>+ $if (null removabledrives)+ <h4 .alert-heading>+ No removable drives found+ Please make sure you have a removable drive plugged in and mounted.+ $else+ <h4 .alert-heading>+ No usable removable drives found+ Seems you cannot write to any of the removable drives that are #+ currently mounted. Try plugging in a removable drive that you can #+ write to, or correcting the write permissions.+ <p>+ <a .btn .btn-primary href="@{AddDriveR}">+ Rescan for removable drives+ $else+ <form method="post" enctype=#{enctype} .form-horizontal>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit>Use this drive</button> #+ <a .btn .btn-default href="@{AddDriveR}">+ Rescan for removable drives+
templates/configurators/adddrive/combine.hamlet view
@@ -1,19 +1,22 @@-<div .span9 .hero-unit>- <h2>- Combine repositories?- <p>- The removable drive at <tt>#{mountPoint drive}</tt> already- has files in its repository <tt>#{driveRepoPath drive}</tt>- <p>- Do you want to combine these files into your repository?- <p>- <a .btn onclick="$('#setupmodal').modal('show');" href="@{FinishAddDriveR drive NoRepoKey}">- <i .icon-resize-small></i> Combine the repositories #- The combined repositories will sync and share their files.- <p>- <p>- <a .btn href="@{AddDriveR}">- <i .icon-resize-full></i> Go back #- Use a different directory than <tt>#{driveRepoPath drive}</tt> to #- avoid combining the repositories.+<div .col-sm-9>+ <div .content-box>+ <h2>+ Combine repositories?+ <p>+ The removable drive at <tt>#{mountPoint drive}</tt> already+ has files in its repository <tt>#{driveRepoPath drive}</tt>+ <p>+ Do you want to combine these files into your repository?+ <p>+ <a .btn .btn-default onclick="$('#setupmodal').modal('show');" href="@{FinishAddDriveR drive NoRepoKey}">+ <span .glyphicon .glyphicon-resize-small>+ \ Combine the repositories #+ The combined repositories will sync and share their files.+ <p>+ <p>+ <a .btn .btn-default href="@{AddDriveR}">+ <span .glyphicon .glyphicon-resize-full>+ \ Go back #+ Use a different directory than <tt>#{driveRepoPath drive}</tt> to #+ avoid combining the repositories. ^{setupDriveModal}
templates/configurators/adddrive/encrypt.hamlet view
@@ -1,25 +1,29 @@-<div .span9 .hero-unit>- <h2>- Encrypt this drive?- <p>- Encrypting the repository stored on the removable drive at #- <tt>#{mountPoint drive}</tt> #- will prevent the data stored in it from being exposed if the drive #- falls into the wrong hands. However, encryption #- will also prevent you from sharing the repository with friends, or #- easily accessing its contents on another computer.- <p>- <a .btn onclick="$('#setupmodal').modal('show');" href="@{FinishAddDriveR drive NoRepoKey}">- <i .icon-minus-sign></i> Do not encrypt repository #- Anyone who has the drive can see the files stored on it.- $forall (keyid, name) <- secretkeys- <p>- <a .btn onclick="$('#setupmodal').modal('show');" href="@{FinishAddDriveR drive (RepoKey keyid)}">- <i .icon-ok-sign></i> Encrypt repository #- to ^{gpgKeyDisplay keyid (Just name)}- <p>- <a .btn onclick="$('#genkeymodal').modal('show');" href="@{GenKeyForDriveR drive}">- <i .icon-plus-sign></i> Encrypt repository #- with a new encryption key+<div .col-sm-9>+ <div .content-box>+ <h2>+ Encrypt this drive?+ <p>+ Encrypting the repository stored on the removable drive at #+ <tt>#{mountPoint drive}</tt> #+ will prevent the data stored in it from being exposed if the drive #+ falls into the wrong hands. However, encryption #+ will also prevent you from sharing the repository with friends, or #+ easily accessing its contents on another computer.+ <p>+ <a .btn .btn-default onclick="$('#setupmodal').modal('show');" href="@{FinishAddDriveR drive NoRepoKey}">+ <span .glyphicon .glyphicon-minus-sign>+ \ Do not encrypt repository #+ Anyone who has the drive can see the files stored on it.+ $forall (keyid, name) <- secretkeys+ <p>+ <a .btn .btn-default onclick="$('#setupmodal').modal('show');" href="@{FinishAddDriveR drive (RepoKey keyid)}">+ <span .glyphicon .glyphicon-ok-sign>+ \ Encrypt repository #+ to ^{gpgKeyDisplay keyid (Just name)}+ <p>+ <a .btn .btn-default onclick="$('#genkeymodal').modal('show');" href="@{GenKeyForDriveR drive}">+ <span .glyphicon .glyphicon-plus-sign>+ \ Encrypt repository #+ with a new encryption key ^{setupDriveModal} ^{genKeyModal}
templates/configurators/adddrive/setupmodal.hamlet view
@@ -1,7 +1,9 @@ <div .modal .fade #setupmodal>- <div .modal-header>- <h3>- Setting up repository on removable drive.- <div .modal-body>- <p>- This may take a few minutes; do not remove the drive.+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Setting up repository on removable drive.+ <div .modal-body>+ <p>+ This may take a few minutes; do not remove the drive.
templates/configurators/addglacier.hamlet view
@@ -1,32 +1,38 @@-<div .span9 .hero-unit>- <h2>- Adding an Amazon Glacier repository- <p>- <a href="http://aws.amazon.com/glacier/">Amazon Glacier</a> is an #- offline cloud storage provider. It takes several hours for requested #- files to be retrieved from Glacier, making it mostly suitable for #- backups and long-term data archival. #- <p>- <i .icon-warning-sign></i> By default, only files you place in #- "archive" directories will be archived in Amazon Glacier.- <p>- <i .icon-warning-sign></i> You will be charged by Amazon for data #- uploaded to Glacier, as well as data downloaded from Glacier, and a #- monthly fee for data storage. #- <a href="http://aws.amazon.com/glacier/pricing/">- Pricing details- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <div .form-actions>- <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">- Add Glacier repository-<div .modal .fade #workingmodal>- <div .modal-header>- <h3>- Making repository ...- <div .modal-body>+<div .col-sm-9>+ <div .content-box>+ <h2>+ Adding an Amazon Glacier repository <p>- Setting up your Amazon Glacier repository. This could take a minute.+ <a href="http://aws.amazon.com/glacier/">Amazon Glacier</a> is an #+ offline cloud storage provider. It takes several hours for requested #+ files to be retrieved from Glacier, making it mostly suitable for #+ backups and long-term data archival. #+ <p>+ <span .glyphicon .glyphicon-warning-sign>+ \ By default, only files you place in #+ "archive" directories will be archived in Amazon Glacier.+ <p>+ <span .glyphicon .glyphicon-warning-sign>+ \ You will be charged by Amazon for data #+ uploaded to Glacier, as well as data downloaded from Glacier, and a #+ monthly fee for data storage. #+ <a href="http://aws.amazon.com/glacier/pricing/">+ Pricing details+ <p>+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">+ Add Glacier repository+<div .modal .fade #workingmodal>+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Making repository ...+ <div .modal-body>+ <p>+ Setting up your Amazon Glacier repository. This could take a minute.
templates/configurators/addia.hamlet view
@@ -1,32 +1,36 @@-<div .span9 .hero-unit>- <h2>- Adding an Internet Archive item- <p>- <a href="http://archive.org/">The Internet Archive</a> allows anyone #- to publically archive their information, for free. All you need to #- get started is to #- <a href="http://archive.org/account/login.createaccount.php">- Create an account- <p>- The Internet Archive stores "items". An item can be a single file, or #- a related group of files. You can make as many different items as you #- like.- <p>- By default, only files that you place in a special directory #- will be uploaded to your Internet Archive item. Any other files #- in your repository will remain private.- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <div .form-actions>- <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">- Add Internet Archive item-<div .modal .fade #workingmodal>- <div .modal-header>- <h3>- Making item ...- <div .modal-body>+<div .col-sm-9>+ <div .content-box>+ <h2>+ Adding an Internet Archive item <p>- Setting up your Internet Archive item. This could take a minute.+ <a href="http://archive.org/">The Internet Archive</a> allows anyone #+ to publically archive their information, for free. All you need to #+ get started is to #+ <a href="http://archive.org/account/login.createaccount.php">+ Create an account+ <p>+ The Internet Archive stores "items". An item can be a single file, or #+ a related group of files. You can make as many different items as you #+ like.+ <p>+ By default, only files that you place in a special directory #+ will be uploaded to your Internet Archive item. Any other files #+ in your repository will remain private.+ <p>+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">+ Add Internet Archive item+<div .modal .fade #workingmodal>+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Making item ...+ <div .modal-body>+ <p>+ Setting up your Internet Archive item. This could take a minute.
templates/configurators/addrepository.hamlet view
@@ -1,13 +1,13 @@-<div .span9>+<div .col-sm-9> ^{repolist}- <div .row-fluid>- <div .span6>+ <div .row>+ <div .col-sm-6> <h2> Add more repositories ^{makeMiscRepositories} - <div .span6>+ <div .col-sm-6> <h2> Store your data in the cloud
templates/configurators/addrepository/archive.hamlet view
@@ -1,11 +1,13 @@ <h3> <a href="@{AddGlacierR}">- <i .icon-plus-sign></i> Amazon Glacier+ <span .glyphicon .glyphicon-plus-sign>+ \ Amazon Glacier <p> Low cost offline data archival. <h3> <a href="@{AddIAR}">- <i .icon-plus-sign></i> Internet Archive+ <span .glyphicon .glyphicon-plus-sign>+ \ Internet Archive <p> Free archival of public data.
templates/configurators/addrepository/cloud.hamlet view
@@ -1,12 +1,14 @@ <h3> <a href="@{AddBoxComR}">- <i .icon-plus-sign></i> Box.com+ <span .glyphicon .glyphicon-plus-sign>+ \ Box.com <p> Provides free cloud storage for small amounts of data. <h3> <a href="@{AddRsyncNetR}">- <i .icon-plus-sign></i> Rsync.net+ <span .glyphicon .glyphicon-plus-sign>+ \ Rsync.net <p> Works very well with git-annex. <br>@@ -14,7 +16,8 @@ <h3> <a href="@{AddS3R}">- <i .icon-plus-sign></i> Amazon S3+ <span .glyphicon .glyphicon-plus-sign>+ \ Amazon S3 <p> Good choice for professional quality storage.
templates/configurators/addrepository/misc.hamlet view
@@ -1,6 +1,7 @@ <h3> <a href="@{AddDriveR}">- <i .icon-plus-sign></i> Removable drive+ <span .glyphicon .glyphicon-plus-sign>+ \ Removable drive <p> Add a USB drive, memory stick, or other removable media. # For offline archiving, backups, or to #@@ -11,14 +12,16 @@ <h3> <a href="@{StartLocalPairR}">- <i .icon-plus-sign></i> Local computer+ <span .glyphicon .glyphicon-plus-sign>+ \ Local computer <p> Pair with a computer to keep files in sync quickly, # over your local network. <h3> <a href="@{NewRepositoryR}">- <i .icon-plus-sign></i> Add another repository+ <span .glyphicon .glyphicon-plus-sign>+ \ Add another repository <p> Make another repository on your computer.
templates/configurators/addrepository/ssh.hamlet view
@@ -1,6 +1,7 @@ <h3> <a href="@{AddSshR}">- <i .icon-plus-sign></i> Remote server+ <span .glyphicon .glyphicon-plus-sign>+ \ Remote server <p> Set up a repository on a remote server using # <tt>ssh</tt>.
templates/configurators/addrepository/xmppconnection.hamlet view
@@ -1,11 +1,13 @@ <h3> <a href="@{StartXMPPPairSelfR}">- <i .icon-plus-sign></i> Share with your other devices+ <span .glyphicon .glyphicon-plus-sign>+ \ Share with your other devices <p> Keep files in sync between your devices running git-annex. <h3> <a href="@{StartXMPPPairFriendR}">- <i .icon-plus-sign></i> Share with a friend+ <span .glyphicon .glyphicon-plus-sign>+ \ Share with a friend <p> Combine your repository with a friend's repository, and share your files.
templates/configurators/adds3.hamlet view
@@ -1,28 +1,33 @@-<div .span9 .hero-unit>- <h2>- Adding an Amazon S3 repository- <p>- <a href="http://aws.amazon.com/s3/">Amazon S3</a> is a cloud storage #- provider. If you need a professional level of storage for your data, #- this is a good choice.- <p>- <i .icon-warning-sign></i> You will be charged by Amazon for data #- uploaded to S3, as well as data downloaded from S3, and a monthly fee #- for data storage. #- <a href="http://aws.amazon.com/s3/pricing/">- Pricing details, including one year Free Usage Tier promotion- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <div .form-actions>- <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">- Add S3 repository-<div .modal .fade #workingmodal>- <div .modal-header>- <h3>- Making repository ...- <div .modal-body>+<div .col-sm-9>+ <div .content-box>+ <h2>+ Adding an Amazon S3 repository <p>- Setting up your Amazon S3 repository. This could take a minute.+ <a href="http://aws.amazon.com/s3/">Amazon S3</a> is a cloud storage #+ provider. If you need a professional level of storage for your data, #+ this is a good choice.+ <p>+ <span .glyphicon .glyphicon-warning-sign>+ \ You will be charged by Amazon for data #+ uploaded to S3, as well as data downloaded from S3, and a monthly fee #+ for data storage. #+ <a href="http://aws.amazon.com/s3/pricing/">+ Pricing details, including one year Free Usage Tier promotion+ <p>+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">+ Add S3 repository+<div .modal .fade #workingmodal>+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Making repository ...+ <div .modal-body>+ <p>+ Setting up your Amazon S3 repository. This could take a minute.
templates/configurators/delete/currentrepository.hamlet view
@@ -1,34 +1,36 @@-<div .span9 .hero-unit>- <h2>- Deleting #{reldir}- <p>- Deleting this repository will remove <tt>#{reldir}</tt> and all its #- ^{actionButton FileBrowserR (Just "files") (Just "Click to open a file browser") "" "icon-folder-open"}.- $if havegitremotes- $if havedataremotes- <div .alert>- Since this repository is currently configured to sync to other #- repositories, you may be able to remove this repository without #- losing any data, if all files have been synced to them. #- No guarantees -- It's up to you to make sure before you continue.+<div .col-sm-9>+ <div .content-box>+ <h2>+ Deleting #{reldir}+ <p>+ Deleting this repository will remove <tt>#{reldir}</tt> and all its #+ ^{actionButton FileBrowserR (Just "files") (Just "Click to open a file browser") "" "glyphicon-folder-open"}.+ $if havegitremotes+ $if havedataremotes+ <div .alert>+ Since this repository is currently configured to sync to other #+ repositories, you may be able to remove this repository without #+ losing any data, if all files have been synced to them. #+ No guarantees -- It's up to you to make sure before you continue.+ $else+ <div .alert .alert-danger>+ This repository is not uploading its files to other repositories,+ so you will lose data if you delete it! $else- <div .alert .alert-error>- This repository is not uploading its files to other repositories,+ <div .alert .alert-danger>+ This repository is not syncing to other git repositories, # so you will lose data if you delete it!- $else- <div .alert .alert-error>- This repository is not syncing to other git repositories, #- so you will lose data if you delete it!- <p>- If you choose to delete this repository, and potentially lose #- data, enter "#{magicphrase}" into the box.- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <div .form-actions>- <button .btn .btn-danger type=submit>- <i .icon-warning-sign></i> Delete this repository #- <a .btn href="@{DashboardR}">- Cancel+ <p>+ If you choose to delete this repository, and potentially lose #+ data, enter "#{magicphrase}" into the box.+ <p>+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .col-md-2>+ <button .btn .btn-danger type=submit>+ <span .glyphicon .glyphicon-warning-sign>+ \ Delete this repository #+ <a .btn .btn-default href="@{DashboardR}">+ Cancel
templates/configurators/delete/finished.hamlet view
@@ -1,14 +1,15 @@-<div .span9 .hero-unit>- <h2>- Repository deleted- <p>- As much data as possible has been removed from the repository- "#{reponame}", and it has been removed from the list of repositories.- <p>- $if gitrepo- <div .alert>- Since "#{reponame}" is a git repository, it still contains- some data. To completely remove it, you should go delete that git- repository.- $else- Now you can safely go delete the underlying storage of the repository.+<div .col-sm-9>+ <div .content-box>+ <h2>+ Repository deleted+ <p>+ As much data as possible has been removed from the repository+ "#{reponame}", and it has been removed from the list of repositories.+ <p>+ $if gitrepo+ <div .alert>+ Since "#{reponame}" is a git repository, it still contains+ some data. To completely remove it, you should go delete that git+ repository.+ $else+ Now you can safely go delete the underlying storage of the repository.
templates/configurators/delete/start.hamlet view
@@ -1,11 +1,13 @@-<div .span9 .hero-unit>- <h2>- Delete repository #- <small>- #{reponame}- <p>- Before this repository can be deleted, all data must be moved #- off it, to other repositories.- <p>- <a .btn .btn-primary href="@{StartDeleteRepositoryR uuid}">- <i .icon-minus></i> Start deletion process+<div .col-sm-9>+ <div .content-box>+ <h2>+ Delete repository #+ <small>+ #{reponame}+ <p>+ Before this repository can be deleted, all data must be moved #+ off it, to other repositories.+ <p>+ <a .btn .btn-primary href="@{StartDeleteRepositoryR uuid}">+ <span .glyphicon .glyphicon-minus>+ \ Start deletion process
templates/configurators/delete/xmpp.hamlet view
@@ -1,10 +1,12 @@-<div .span9 .hero-unit>- <h2>- Disconnecting from Jabber- <p>- This won't delete the repository or repositories at the other end- of the Jabber connection, but it will disconnect from them, and stop- using Jabber.- <p>- <a .btn .btn-primary href="@{DisconnectXMPPR}">- <i .icon-minus></i> Disconnect+<div .col-sm-9>+ <div .content-box>+ <h2>+ Disconnecting from Jabber+ <p>+ This won't delete the repository or repositories at the other end+ of the Jabber connection, but it will disconnect from them, and stop+ using Jabber.+ <p>+ <a .btn .btn-primary href="@{DisconnectXMPPR}">+ <span .glyphicon .glyphicon-minus>+ \ Disconnect
templates/configurators/edit/nonannexremote.hamlet view
@@ -1,18 +1,19 @@-<div .span9 .hero-unit>- <h2>- Just a git repository- <p>- This repository is not currently set up as a git annex; #- only git metadata is synced with this repository.- $if sshrepo+<div .col-sm-9>+ <div .content-box>+ <h2>+ Just a git repository <p>- If this repository's ssh server has git-annex installed, you can #- upgrade this repository to a full git annex, which will store the- contents of your files, not only their metadata.+ This repository is not currently set up as a git annex; #+ only git metadata is synced with this repository.+ $if sshrepo+ <p>+ If this repository's ssh server has git-annex installed, you can #+ upgrade this repository to a full git annex, which will store the+ contents of your files, not only their metadata.+ <p>+ <a .btn .btn-default href="@{UpgradeRepositoryR r}">+ Upgrade Repository+ <h2>+ Repository information <p>- <a .btn href="@{UpgradeRepositoryR r}">- Upgrade Repository- <h2>- Repository information- <p>- ^{repoInfo}+ ^{repoInfo}
templates/configurators/edit/repository.hamlet view
@@ -1,37 +1,40 @@-<div .span9 .hero-unit>- <h2>+<div .col-sm-9>+ <div .content-box>+ <h2>+ $if new+ Setup complete+ $else+ Editing repository $if new- Setup complete- $else- Editing repository- $if new+ <p>+ This repository is set up and ready to go!+ <p>+ Now you can do a little more configuring of it, if you like. #+ Perhaps enter a better name than the automatically generated one.+ $if istransfer+ <div .alert .alert-info>+ This repository is currently in the transfer group. That's the #+ right choice if you'll use it to shuttle data back and forth #+ between other repositories. Otherwise, pick one of the other groups. <p>- This repository is set up and ready to go!+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit>+ Save Changes+ \ + <a .btn .btn-default href="@{DashboardR}">+ Cancel #+ $if new+ <p>+ In a hurry? Feel free to skip this step! You can always come back #+ and configure this repository later.+ <h3>+ Repository information <p>- Now you can do a little more configuring of it, if you like. #- Perhaps enter a better name than the automatically generated one.- $if istransfer- <div .alert .alert-info>- This repository is currently in the transfer group. That's the #- right choice if you'll use it to shuttle data back and forth #- between other repositories. Otherwise, pick one of the other groups.- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <div .form-actions>- <button .btn .btn-primary type=submit>- Save Changes #- <a .btn href="@{DashboardR}">- Cancel #- $if new+ ^{repoInfo} <p>- In a hurry? Feel free to skip this step! You can always come back #- and configure this repository later.- <h3>- Repository information- <p>- ^{repoInfo}- <p>- ^{repoEncryption}+ ^{repoEncryption}
templates/configurators/enableaws.hamlet view
@@ -1,30 +1,34 @@-<div .span9 .hero-unit>- <h2>- Enabling #{description}- <p>- To use this Amazon repository, you need an Access Key ID, and a #- Secret Access Key. These access keys will be stored in a file that #- only you can access.- <p>- If this repository uses your Amazon account, you can #- <a href="https://portal.aws.amazon.com/gp/aws/securityCredentials#id_block">- look up your access keys. #- If this repository uses someone else's Amazon account, they #- can generate access keys for you, using their #- <a href="https://console.aws.amazon.com/iam/home">- IAM Management Console.- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <div .form-actions>- <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">- Enable Amazon repository-<div .modal .fade #workingmodal>- <div .modal-header>- <h3>- Enabling repository ...- <div .modal-body>+<div .col-sm-9>+ <div .content-box>+ <h2>+ Enabling #{description} <p>- Enabling this Amazon repository. This could take a minute.+ To use this Amazon repository, you need an Access Key ID, and a #+ Secret Access Key. These access keys will be stored in a file that #+ only you can access.+ <p>+ If this repository uses your Amazon account, you can #+ <a href="https://portal.aws.amazon.com/gp/aws/securityCredentials#id_block">+ look up your access keys. #+ If this repository uses someone else's Amazon account, they #+ can generate access keys for you, using their #+ <a href="https://console.aws.amazon.com/iam/home">+ IAM Management Console.+ <p>+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">+ Enable Amazon repository+<div .modal .fade #workingmodal>+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Enabling repository ...+ <div .modal-body>+ <p>+ Enabling this Amazon repository. This could take a minute.
templates/configurators/enabledirectory.hamlet view
@@ -1,10 +1,11 @@-<div .span9 .hero-unit>- <h2>- Enabling #{description}- <p>- Where is this repository located?- <p>- <a .btn href="@{AddDriveR}">- On a removable drive- <a .btn href="@{DashboardR}">- Cancel+<div .col-sm-9>+ <div .content-box>+ <h2>+ Enabling #{description}+ <p>+ Where is this repository located?+ <p>+ <a .btn .btn-default href="@{AddDriveR}">+ On a removable drive+ <a .btn href="@{DashboardR}">+ Cancel
templates/configurators/enableia.hamlet view
@@ -1,22 +1,26 @@-<div .span9 .hero-unit>- <h2>- Enabling #{description}- <p>- To use this Internet Archive repository, you need an Access Key ID, and a #- Secret Access Key. These access keys will be stored in a file that #- only you can access.- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <div .form-actions>- <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">- Enable Internet Archive repository-<div .modal .fade #workingmodal>- <div .modal-header>- <h3>- Enabling repository ...- <div .modal-body>+<div .col-sm-9>+ <div .content-box>+ <h2>+ Enabling #{description} <p>- Enabling this Internet Archive repository. This could take a minute.+ To use this Internet Archive repository, you need an Access Key ID, and a #+ Secret Access Key. These access keys will be stored in a file that #+ only you can access.+ <p>+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">+ Enable Internet Archive repository+<div .modal .fade #workingmodal>+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Enabling repository ...+ <div .modal-body>+ <p>+ Enabling this Internet Archive repository. This could take a minute.
templates/configurators/enablewebdav.hamlet view
@@ -1,22 +1,26 @@-<div .span9 .hero-unit>- <h2>- Enabling #{description}- <p>- This is a WebDAV repository located at #- <a href="#{url}">- #{url}- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <div .form-actions>- <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">- Enable repository-<div .modal .fade #workingmodal>- <div .modal-header>- <h3>- Enabling repository ...- <div .modal-body>+<div .col-sm-9>+ <div .content-box>+ <h2>+ Enabling #{description} <p>- Enabling this WebDAV repository. This could take a minute.+ This is a WebDAV repository located at #+ <a href="#{url}">+ #{url}+ <p>+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">+ Enable repository+<div .modal .fade #workingmodal>+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Enabling repository ...+ <div .modal-body>+ <p>+ Enabling this WebDAV repository. This could take a minute.
templates/configurators/fsck.cassius view
@@ -1,4 +1,4 @@-input[type=number]+.form-inline input[type=number] width: 5em select width: 10em
templates/configurators/fsck.hamlet view
@@ -1,31 +1,32 @@-<div .span9 .hero-unit>- <h2>- Consistency checks- <p>- Checking the contents of a repository periodically will ensure that #- your data is in good shape. Any problems that are detected will #- be automatically fixed.- <p>- Running the consistency check involves reading all the files in the #- repository, which can take a long time if it's large. Running just a #- little at a time will eventually check the whole repository.- $if (not (null scheduledchecks))+<div .col-sm-9>+ <div .content-box>+ <h2>+ Consistency checks <p>- Currently scheduled checks:- $forall c <- scheduledchecks- ^{showFsckForm False c}- <div style="margin-left: 5em">- ^{showFsckStatus c}- <p>- $if null (recommendedchecks)- Add a check:- ^{showFsckForm True (defaultFsck Nothing)}- $else- <i .icon-warning-sign></i> #- Some repositories are not yet checked. #- Please consider adding these checks:- $forall c <- recommendedchecks- ^{showFsckForm True c}- <h3>- Configuration- ^{showFsckPreferencesForm}+ Checking the contents of a repository periodically will ensure that #+ your data is in good shape. Any problems that are detected will #+ be automatically fixed.+ <p>+ Running the consistency check involves reading all the files in the #+ repository, which can take a long time if it's large. Running just a #+ little at a time will eventually check the whole repository.+ $if (not (null scheduledchecks))+ <p>+ Currently scheduled checks:+ $forall c <- scheduledchecks+ ^{showFsckForm False c}+ <div style="margin-left: 5em">+ ^{showFsckStatus c}+ <p>+ $if null (recommendedchecks)+ Add a check:+ ^{showFsckForm True (defaultFsck Nothing)}+ $else+ <span .glyphicon .glyphicon-warning-sign>+ \ Some repositories are not yet checked. #+ Please consider adding these checks:+ $forall c <- recommendedchecks+ ^{showFsckForm True c}+ <h3>+ Configuration+ ^{showFsckPreferencesForm}
templates/configurators/fsck/formcontent.hamlet view
@@ -1,15 +1,21 @@ #{msg} <p>- <div .input-prepend .input-append>+ <div .form-group> Check ^{fvInput reposView} for #+ <div .form-group>+ \ ^{fvInput durationView} minutes #+ <div .form-group>+ \ ^{fvInput recurranceView} #- starting at ^{fvInput timeView} #- $if new- <button type=submit .btn .btn-primary>- Add- $else- <button type=submit .btn>- Save- <a .btn href="@{RemoveActivityR u activity}">- Remove+ \ + starting at ^{fvInput timeView} #+ $if new+ <button type=submit .btn .btn-primary>+ Add+ $else+ <button type=submit .btn .btn-default>+ Save+ \ + <a .btn .btn-default href="@{RemoveActivityR u activity}">+ Remove
templates/configurators/fsck/preferencesform.hamlet view
@@ -1,6 +1,7 @@ <div .well> <form method="post" .form-horizontal action=@{ConfigFsckPreferencesR} enctype=#{enctype}> ^{form}- <div .form-actions>- <button .btn .btn-primary type=submit>- Save+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit>+ Save
templates/configurators/genkeymodal.hamlet view
@@ -1,12 +1,14 @@ <div .modal .fade #genkeymodal> <div .modal-header>- <h3>- <img src="@{StaticR activityicon_gif}" alt=""> #- Generating a #{maxRecommendedKeySize} bit GnuPg key.- <div .modal-body>- <p>- Generating a GnuPg key can take a long time. To speed up the process, #- it actually helps to use your computer for other things, which helps #- generate random numbers that keep the GnuPg key secure.- <p>- So if this is taking too long, go play a game or something!+ <div .modal-dialog>+ <div .modal-content>+ <h3>+ <img src="@{StaticR activityicon_gif}" alt=""> #+ Generating a #{maxRecommendedKeySize} bit GnuPg key.+ <div .modal-body>+ <p>+ Generating a GnuPg key can take a long time. To speed up the process, #+ it actually helps to use your computer for other things, which helps #+ generate random numbers that keep the GnuPg key secure.+ <p>+ So if this is taking too long, go play a game or something!
templates/configurators/main.hamlet view
@@ -1,34 +1,34 @@-<div .span9>- <div .row-fluid>- <div .span4>+<div .col-sm-9>+ <div .row>+ <div .col-sm-4> <h3> <a href="@{AddRepositoryR}"> Repositories <p> Configure the repositories that git-annex syncs with.- <div .span4>+ <div .col-sm-4> <h3> <a href="@{PreferencesR}"> Preferences <p> Tune the behavior of git-annex, including how many copies # to retain of each file, and how much disk space it can use.- <div .row-fluid>- <div .span4>+ <div .row>+ <div .col-sm-4> <h3> <a href="@{ConfigFsckR}"> Consistency checks <p> Set up periodic checks of your data to detect and recover from # disk problems.- <div .span4>+ <div .col-sm-4> <h3> <a href="@{ConfigUnusedR}"> Unused files <p> Configure what to do with old and deleted files.- <div .row-fluid>- <div .span4>+ <div .row>+ <div .col-sm-4> <h3> <a href="@{XMPPConfigR}"> Jabber account
templates/configurators/needconnection.hamlet view
@@ -1,12 +1,14 @@-<div .span9 .hero-unit>- <h2>- <i .icon-signal></i> Connection needed- <p>- In order to quickly sync with other repositories, #- a direct connection is needed to another git-annex. #- <p>- You don't currently seem to have such a connection configured -- #- or if you do, it's not currently connected!- <h2>- Add a connection- ^{makeConnectionRepositories}+<div .col-sm-9>+ <div .content-box>+ <h2>+ <span .glyphicon .glyphicon-signal>+ \ Connection needed+ <p>+ In order to quickly sync with other repositories, #+ a direct connection is needed to another git-annex. #+ <p>+ You don't currently seem to have such a connection configured -- #+ or if you do, it's not currently connected!+ <h2>+ Add a connection+ ^{makeConnectionRepositories}
templates/configurators/needgcrypt.hamlet view
@@ -1,10 +1,11 @@-<div .span9 .hero-unit>- <h2>- Need git-remote-gcrypt- <p>- To encrypt git repositories, you need to install #- <a href="https://github.com/joeyh/git-remote-gcrypt">- git-remote-gcrypt- <p>- <a .btn .btn-primary .btn-large href="">- Retry+<div .col-sm-9>+ <div .content-box>+ <h2>+ Need git-remote-gcrypt+ <p>+ To encrypt git repositories, you need to install #+ <a href="https://github.com/joeyh/git-remote-gcrypt">+ git-remote-gcrypt+ <p>+ <a .btn .btn-primary .btn-lg href="">+ Retry
templates/configurators/needglaciercli.hamlet view
@@ -1,10 +1,11 @@-<div .span9 .hero-unit>- <h2>- Need glacier-cli- <p>- To use Amazon Glacier, you need to install #- <a href="https://github.com/basak/glacier-cli">- glacier-cli- <p>- <a .btn .btn-primary .btn-large href="">- Retry+<div .col-sm-9>+ <div .content-box>+ <h2>+ Need glacier-cli+ <p>+ To use Amazon Glacier, you need to install #+ <a href="https://github.com/basak/glacier-cli">+ glacier-cli+ <p>+ <a .btn .btn-primary .btn-lg href="">+ Retry
templates/configurators/newrepository.hamlet view
@@ -1,12 +1,14 @@-<div .span9 .hero-unit>- <h2>- Add another local repository- <p>- <i .icon-asterisk></i> Do you want to back your repository up to a #- removable drive?- <a .btn .btn-primary href="@{AddDriveR}">- Make a repository on a Removable Drive- <p>- Repository location:- <form method="post" .form-inline enctype=#{enctype}>- ^{form}+<div .col-sm-9>+ <div .content-box>+ <h2>+ Add another local repository+ <p>+ <span .glyphicon .glyphicon-asterisk>+ \ Do you want to back your repository up to a #+ removable drive?+ <a .btn .btn-primary href="@{AddDriveR}">+ Make a repository on a Removable Drive+ <p>+ Repository location:+ <form method="post" .form-inline enctype=#{enctype}>+ ^{form}
templates/configurators/newrepository/combine.hamlet view
@@ -1,17 +1,20 @@-<div .span9 .hero-unit>- <h2>- Combine repositories?- <p>- The repository at #{newrepo} is set up.- <br>- Do you want to combine it with your existing repository at #{mainrepo}?- <p>- <a .btn href="@{CombineRepositoryR newrepopath newrepouuid}">- <i .icon-resize-small></i> Combine the repositories #- The combined repositories will sync and share their files.- <p>- -or-- <p>- <a .btn href="@{SwitchToRepositoryR newrepopath}">- <i .icon-resize-full></i> Keep the repositories separate #- Files placed in one will not be synced to the other.+<div .col-sm-9>+ <div .content-box>+ <h2>+ Combine repositories?+ <p>+ The repository at #{newrepo} is set up.+ <br>+ Do you want to combine it with your existing repository at #{mainrepo}?+ <p>+ <a .btn .btn-default href="@{CombineRepositoryR newrepopath newrepouuid}">+ <span .glyphicon .glyphicon-resize-small>+ \ Combine the repositories #+ The combined repositories will sync and share their files.+ <p>+ -or-+ <p>+ <a .btn .btn-default href="@{SwitchToRepositoryR newrepopath}">+ <span .glyphicon .glyphicon-resize-full>+ \ Keep the repositories separate #+ Files placed in one will not be synced to the other.
templates/configurators/newrepository/first.hamlet view
@@ -1,19 +1,21 @@-<div .span9 .hero-unit>- <h2>- Welcome to git-annex!- <p>- To get started, let's create a git-annex repository.- $if androidspecial- <p>- Do you only want to share photos and videos you take?+<div .col-sm-9>+ <div .content-box>+ <h2>+ Welcome to git-annex! <p>- <a .btn .btn-primary .btn-large href="@{AndroidCameraRepositoryR}">- <i .icon-camera></i> Make Camera Repository- <p>+ To get started, let's create a git-annex repository. $if androidspecial- Want to share more files? #- Files in this repository will be kept in sync with your #- repositories on other devices.- <p>- <form method="post" .form-inline enctype=#{enctype}>- ^{form}+ <p>+ Do you only want to share photos and videos you take?+ <p>+ <a .btn .btn-primary .btn-lg href="@{AndroidCameraRepositoryR}">+ <span .glyphicon .glyphicon-camera>+ \ Make Camera Repository+ <p>+ $if androidspecial+ Want to share more files? #+ Files in this repository will be kept in sync with your #+ repositories on other devices.+ <p>+ <form method="post" .form-inline enctype=#{enctype}>+ ^{form}
templates/configurators/newrepository/form.hamlet view
@@ -1,11 +1,13 @@ #{msg} <p>- <div .input-prepend .input-append>- <span .add-on>- <i .icon-folder-open></i>- ^{fvInput pathView}- <button type=submit .btn .btn-primary>- Make Repository+ <div .form-group>+ <div .input-group>+ <span .input-group-addon>+ <span .glyphicon .glyphicon-folder-open>+ ^{fvInput pathView}+ <span .input-group-btn>+ <button type=submit .btn .btn-primary>+ Make Repository $if err- <div .alert .alert-error>+ <div .alert .alert-danger> #{errmsg}
templates/configurators/pairing/disabled.hamlet view
@@ -1,5 +1,6 @@-<div .span9 .hero-unit>- <h2>- not supported- <p>- This build of git-annex does not support #{pairingtype} pairing. Sorry!+<div .col-sm-9>+ <div .content-box>+ <h2>+ not supported+ <p>+ This build of git-annex does not support #{pairingtype} pairing. Sorry!
templates/configurators/pairing/local/inprogress.hamlet view
@@ -1,18 +1,19 @@-<div .span9 .hero-unit>- <h2>- Pairing in progress ..- $if T.null secret- <p>- You do not need to leave this page open; pairing will finish #- automatically.- $else- <p>- Now you should either go tell the owner of the computer you want to pair #- with the secret phrase you selected ("#{secret}"), or go enter it into #- the computer you want to pair with.- <p>- You do not need to leave this page open; pairing will finish automatically #- as soon as the secret phrase is entered into the other computer.- <p>- If you're not seeing a pair request on the other computer, try moving #- it to the same switch or wireless network as this one.+<div .col-sm-9>+ <div .content-box>+ <h2>+ Pairing in progress ..+ $if T.null secret+ <p>+ You do not need to leave this page open; pairing will finish #+ automatically.+ $else+ <p>+ Now you should either go tell the owner of the computer you want to pair #+ with the secret phrase you selected ("#{secret}"), or go enter it into #+ the computer you want to pair with.+ <p>+ You do not need to leave this page open; pairing will finish automatically #+ as soon as the secret phrase is entered into the other computer.+ <p>+ If you're not seeing a pair request on the other computer, try moving #+ it to the same switch or wireless network as this one.
templates/configurators/pairing/local/prompt.hamlet view
@@ -1,50 +1,53 @@-<div .span9 .hero-unit>- <h2>- Pairing with a local computer- <p>- $if start- Pair with a computer on your local network (or VPN), and the #- two git annex repositories will be combined into one, with changes #- kept in sync between them.- $else- Pairing with #{username}@#{hostname} will combine your two git annex #- repositories into one, allowing you to share files.- <p>- $if start- For security, enter a secret phrase. To verify that you're pairing #- with the right computer, its git-annex webapp will then prompt for the #- same secret phrase. That's all this secret phrase will be used for.- $else- $if sameusername- For security, you need to enter the same secret phrase that was #- entered on #{hostname} when the pairing was started.+<div .col-sm-9>+ <div .content-box>+ <h2>+ Pairing with a local computer+ <p>+ $if start+ Pair with a computer on your local network (or VPN), and the #+ two git annex repositories will be combined into one, with changes #+ kept in sync between them. $else- For security, a secret phrase has been selected, which you need #- to enter here to finish the pairing. If you don't know the #- phrase, go ask #{username} ...- $if badphrase- <div .alert .alert-error>- <i .icon-warning-sign></i> #{problem}- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <div .form-actions>- <button .btn .btn-primary type=submit>- $if start- Start pairing- $else- Finish pairing- <div .alert .alert-info>+ Pairing with #{username}@#{hostname} will combine your two git annex #+ repositories into one, allowing you to share files.+ <p> $if start- <p>- A good secret phrase is reasonably long. You'll only #- type it a few times. Only letters and numbers matter; #- punctuation and white space is ignored.- <p>- A quotation is one good choice, something like: #- "#{sampleQuote}"+ For security, enter a secret phrase. To verify that you're pairing #+ with the right computer, its git-annex webapp will then prompt for the #+ same secret phrase. That's all this secret phrase will be used for. $else- Only letters and numbers matter; punctuation and spaces are #- ignored.+ $if sameusername+ For security, you need to enter the same secret phrase that was #+ entered on #{hostname} when the pairing was started.+ $else+ For security, a secret phrase has been selected, which you need #+ to enter here to finish the pairing. If you don't know the #+ phrase, go ask #{username} ...+ $if badphrase+ <div .alert .alert-danger>+ <span .glyphicon .glyphicon-warning-sign>+ \ #{problem}+ <p>+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit>+ $if start+ Start pairing+ $else+ Finish pairing+ <div .alert .alert-info>+ $if start+ <p>+ A good secret phrase is reasonably long. You'll only #+ type it a few times. Only letters and numbers matter; #+ punctuation and white space is ignored.+ <p>+ A quotation is one good choice, something like: #+ "#{sampleQuote}"+ $else+ Only letters and numbers matter; punctuation and spaces are #+ ignored.
templates/configurators/pairing/xmpp/end.hamlet view
@@ -1,32 +1,33 @@-<div .span9 .hero-unit>- $if inprogress+<div .col-sm-9>+ <div .content-box>+ $if inprogress+ <h2>+ Pair request sent ...+ <p>+ $maybe name <- friend+ A pair request has been sent to #{name}. Now it's up to them #+ to accept it and finish pairing.+ $nothing+ A pair request has been sent to all other devices that #+ have been configured to use your jabber account. #+ It will be answered automatically by any devices that see it.+ $else+ Pair request accepted. <h2>- Pair request sent ...- <p>- $maybe name <- friend- A pair request has been sent to #{name}. Now it's up to them #- to accept it and finish pairing.- $nothing- A pair request has been sent to all other devices that #- have been configured to use your jabber account. #- It will be answered automatically by any devices that see it.- $else- Pair request accepted.- <h2>- Configure a shared cloud repository- $maybe name <- friend- <p>- ☂ To share files with #{name}, you'll need a repository in #- the cloud, that you both can access.- $nothing- <p>- ☂ To share files with your other devices, when they're not #- nearby, you'll need a repository in the cloud.- <p>- Make sure that your other devices are configured to access a #- cloud repository, and that the same repository is enabled here #- too.- ^{cloudRepoList}- <h2>- Add a cloud repository- ^{makeCloudRepositories}+ Configure a shared cloud repository+ $maybe name <- friend+ <p>+ ☂ To share files with #{name}, you'll need a repository in #+ the cloud, that you both can access.+ $nothing+ <p>+ ☂ To share files with your other devices, when they're not #+ nearby, you'll need a repository in the cloud.+ <p>+ Make sure that your other devices are configured to access a #+ cloud repository, and that the same repository is enabled here #+ too.+ ^{cloudRepoList}+ <h2>+ Add a cloud repository+ ^{makeCloudRepositories}
templates/configurators/pairing/xmpp/friend/confirm.hamlet view
@@ -1,11 +1,12 @@-<div .span9 .hero-unit>- <h2>- Pair request received from #{name}- <p>- Pairing with #{name} will combine your two git annex #- repositories into one, allowing you to share files.- <p>- <a .btn .btn-primary .btn-large href="@{FinishXMPPPairFriendR pairkey}">- Accept pair request- <a .btn .btn-large href="@{DashboardR}">- No thanks+<div .col-sm-9>+ <div .content-box>+ <h2>+ Pair request received from #{name}+ <p>+ Pairing with #{name} will combine your two git annex #+ repositories into one, allowing you to share files.+ <p>+ <a .btn .btn-primary .btn-lg href="@{FinishXMPPPairFriendR pairkey}">+ Accept pair request+ <a .btn .btn-default .btn-lg href="@{DashboardR}">+ No thanks
templates/configurators/pairing/xmpp/friend/prompt.hamlet view
@@ -1,12 +1,13 @@-<div .span9 .hero-unit>- <h2>- Share with a friend- <p>- You can combine your repository with a friend's repository #- to share your files. Your repositories will automatically be kept in #- sync. Only do this if you want your friend to see all the files #- in this repository!- <p>- Here are the friends currently available via your Jabber account.+<div .col-sm-9>+ <div .content-box>+ <h2>+ Share with a friend <p>- ^{buddyListDisplay}+ You can combine your repository with a friend's repository #+ to share your files. Your repositories will automatically be kept in #+ sync. Only do this if you want your friend to see all the files #+ in this repository!+ <p>+ Here are the friends currently available via your Jabber account.+ <p>+ ^{buddyListDisplay}
templates/configurators/pairing/xmpp/self/prompt.hamlet view
@@ -1,20 +1,21 @@-<div .span9 .hero-unit>- <h2>- Sharing with your other devices- <p>- If you have multiple devices, all running git-annex, and using #- your Jabber account #{account}, you can configure them to share #- your files between themselves.- <p>- For example, you can have a computer at home, one at work, and a #- laptop, and their repositories will automatically be kept in sync.- <p>- Make sure your other devices are online and configured to use #- your Jabber account before continuing. Note that <b>all</b> #- repositories configured to use the same Jabber account will be #- combined together when you do this.- <p>- <a .btn .btn-primary .btn-large href="@{RunningXMPPPairSelfR}">- Start sharing with my other devices #- <a .btn .btn-large href="@{DashboardR}">- Cancel+<div .col-sm-9>+ <div .content-box>+ <h2>+ Sharing with your other devices+ <p>+ If you have multiple devices, all running git-annex, and using #+ your Jabber account #{account}, you can configure them to share #+ your files between themselves.+ <p>+ For example, you can have a computer at home, one at work, and a #+ laptop, and their repositories will automatically be kept in sync.+ <p>+ Make sure your other devices are online and configured to use #+ your Jabber account before continuing. Note that <b>all</b> #+ repositories configured to use the same Jabber account will be #+ combined together when you do this.+ <p>+ <a .btn .btn-primary .btn-lg href="@{RunningXMPPPairSelfR}">+ Start sharing with my other devices #+ <a .btn .btn-default .btn-lg href="@{DashboardR}">+ Cancel
templates/configurators/pairing/xmpp/self/retry.hamlet view
@@ -1,11 +1,12 @@-<div .span9 .hero-unit>- <h2>- Unable to get in touch with any other devices.- <p>- Make sure your other devices are online and configured to use #- your Jabber account before continuing.- <p>- <a .btn .btn-primary .btn-large href="@{RunningXMPPPairSelfR}">- Start sharing with my other devices #- <a .btn .btn-large href="@{DashboardR}">- Cancel+<div .col-sm-9>+ <div .content-box>+ <h2>+ Unable to get in touch with any other devices.+ <p>+ Make sure your other devices are online and configured to use #+ your Jabber account before continuing.+ <p>+ <a .btn .btn-primary .btn-lg href="@{RunningXMPPPairSelfR}">+ Start sharing with my other devices #+ <a .btn .btn-default .btn-lg href="@{DashboardR}">+ Cancel
templates/configurators/preferences.hamlet view
@@ -1,13 +1,16 @@-<div .span9 .hero-unit>- <h2>- Preferences- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <div .form-actions>- <button .btn .btn-primary type=submit>- Save Preferences- <a .btn href="@{ConfigurationR}">- Cancel+<div .col-sm-9>+ <div .content-box>+ <h2>+ Preferences+ <p>+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit>+ Save Preferences+ \ + <a .btn .btn-default href="@{ConfigurationR}">+ Cancel
templates/configurators/rsync.net/add.hamlet view
@@ -1,40 +1,43 @@-<div .span9 .hero-unit>- <h2>- Adding a Rsync.net repository- <p>- <a href="http://rsync.net/">- Rsync.net #- is a well-respected cloud storage provider. Its rsync repositories are #- supported very well by git-annex. #-- <p>- They have committed to support git-annex and offer a special- discounted rate for git-annex users.-- <a href="http://www.rsync.net/products/git-annex-pricing.html">- pricing details- <p>- $case status- $of UnusableServer msg- <div .alert .alert-error>- <i .icon-warning-sign></i> #{msg}- $of _- <div>- Your data will be encrypted before it is sent to Rsync.net.- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <div .form-actions>- <button .btn .btn-primary type=submit onclick="$('#setupmodal').modal('show');">- Use this rsync.net repository-<div .modal .fade #setupmodal>- <div .modal-header>- <h3>- Checking access to rsync.net ...- <div .modal-body>+<div .col-sm-9>+ <div .content-box>+ <h2>+ Adding a Rsync.net repository <p>- This could take a minute.+ <a href="http://rsync.net/">+ Rsync.net #+ is a well-respected cloud storage provider. Its rsync repositories are #+ supported very well by git-annex. #+ <p>- You may be prompted for your rsync.net ssh password.+ They have committed to support git-annex and offer a special+ discounted rate for git-annex users.+ + <a href="http://www.rsync.net/products/git-annex-pricing.html">+ pricing details+ <p>+ $case status+ $of UnusableServer msg+ <div .alert .alert-danger>+ <span .glyphicon .glyphicon-warning-sign>+ \ #{msg}+ $of _+ <div>+ Your data will be encrypted before it is sent to Rsync.net.+ <p>+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit onclick="$('#setupmodal').modal('show');">+ Use this rsync.net repository+ <div .modal .fade #setupmodal>+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Checking access to rsync.net ...+ <div .modal-body>+ <p>+ This could take a minute.
templates/configurators/rsync.net/encrypt.hamlet view
@@ -1,43 +1,49 @@-<div .span9 .hero-unit>- <h2>- Ready to use rsync.net- <p>- All data will be encrypted before it is sent to rsync.net. #- There are two options for how to encrypt your data.- <h3>- Simple shared encryption- <p>- This allows everyone who has a clone of this repository to decrypt the #- files stored on rsync.net. That makes it good for sharing. #- And it's easy to set up and use.- <p>- <a .btn href="@{MakeRsyncNetSharedR sshdata}" onclick="$('#setupmodal').modal('show');">- <i .icon-lock></i> Use shared encryption- <p style="text-align: center">- -or-- <h3>- Encrypt with GnuPG key- <p>- This stores an encrypted clone of your repository on rsync.net, #- unlike shared encryption which only stores file contents on rsync.net. #- So it's good for backups. But the encryption will prevent you from #- sharing the rsync.net repository with friends, or easily accessing #- its contents on another computer.- <p>- $forall (keyid, name) <- secretkeys- <p>- <a .btn href="@{MakeRsyncNetGCryptR sshdata (RepoKey keyid)}" onclick="$('#setupmodal').modal('show');">- <i .icon-lock></i> Encrypt repository #- to ^{gpgKeyDisplay keyid (Just name)}- <p>- <a .btn href="@{MakeRsyncNetGCryptR sshdata NoRepoKey}" onclick="$('#genkeymodal').modal('show');">- <i .icon-plus-sign></i> Encrypt repository #- with a new encryption key-^{genKeyModal}-<div .modal .fade #setupmodal>- <div .modal-header>+<div .col-sm-9>+ <div .content-box>+ <h2>+ Ready to use rsync.net+ <p>+ All data will be encrypted before it is sent to rsync.net. #+ There are two options for how to encrypt your data. <h3>- Making repository ...- <div .modal-body>+ Simple shared encryption <p>- Setting up your rsync.net repository. This could take a minute.+ This allows everyone who has a clone of this repository to decrypt the #+ files stored on rsync.net. That makes it good for sharing. #+ And it's easy to set up and use.+ <p>+ <a .btn .btn-default href="@{MakeRsyncNetSharedR sshdata}" onclick="$('#setupmodal').modal('show');">+ <span .glyphicon .glyphicon-lock>+ \ Use shared encryption+ <p style="text-align: center">+ -or-+ <h3>+ Encrypt with GnuPG key+ <p>+ This stores an encrypted clone of your repository on rsync.net, #+ unlike shared encryption which only stores file contents on rsync.net. #+ So it's good for backups. But the encryption will prevent you from #+ sharing the rsync.net repository with friends, or easily accessing #+ its contents on another computer.+ <p>+ $forall (keyid, name) <- secretkeys+ <p>+ <a .btn .btn-default href="@{MakeRsyncNetGCryptR sshdata (RepoKey keyid)}" onclick="$('#setupmodal').modal('show');">+ <span .glyphicon .glyphicon-lock>+ \ Encrypt repository #+ to ^{gpgKeyDisplay keyid (Just name)}+ <p>+ <a .btn .btn-default href="@{MakeRsyncNetGCryptR sshdata NoRepoKey}" onclick="$('#genkeymodal').modal('show');">+ <span .glyphicon .glyphicon-plus-sign>+ \ Encrypt repository #+ with a new encryption key+^{genKeyModal}+<div .modal .fade #setupmodal>+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Making repository ...+ <div .modal-body>+ <p>+ Setting up your rsync.net repository. This could take a minute.
templates/configurators/ssh/add.hamlet view
@@ -1,23 +1,26 @@-<div .span9 .hero-unit>- <h2>- Adding a remote server using ssh- <p>- You can use nearly any server that has ssh and rsync. For example, you #- could use a <a href="http://linode.com/">Linode</a> or #- <a href="http://vix.su/personalcolo/">another VPS</a>, or #- an account on a friend's server.- <p>- $case status- $of UnusableServer msg- <div .alert .alert-error>- <i .icon-warning-sign></i> #{msg}- $of _- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <div .form-actions>- <button .btn .btn-primary type=submit onclick="$('#testmodal').modal('show');">- Check this server+<div .col-sm-9>+ <div .content-box>+ <h2>+ Adding a remote server using ssh+ <p>+ You can use nearly any server that has ssh and rsync. For example, you #+ could use a <a href="http://linode.com/">Linode</a> or #+ <a href="http://vix.su/personalcolo/">another VPS</a>, or #+ an account on a friend's server.+ <p>+ $case status+ $of UnusableServer msg+ <div .alert .alert-danger>+ <span .glyphicon .glyphicon-warning-sign>+ \ #{msg}+ $of _+ <p>+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit onclick="$('#testmodal').modal('show');">+ Check this server ^{sshTestModal}
templates/configurators/ssh/combine.hamlet view
@@ -1,19 +1,22 @@-<div .span9 .hero-unit>- <h2>- Combine repositories?- <p>- A repository already exists on #{sshHostName sshdata} in the #- <tt>#{sshDirectory sshdata}</tt> directory.- <p>- Do you want to merge this repository's contents into your repository?- <p>- <a .btn onclick="$('#setupmodal').modal('show');" href="@{CombineSshR sshdata}">- <i .icon-resize-small></i> Combine the repositories #- The combined repositories will sync and share their files.- <p>- <p>- <a .btn href="@{AddSshR}">- <i .icon-resize-full></i> Go back #- Use a different directory than <tt>#{sshDirectory sshdata}</tt> to #- avoid combining the repositories.+<div .col-sm-9>+ <div .content-box>+ <h2>+ Combine repositories?+ <p>+ A repository already exists on #{sshHostName sshdata} in the #+ <tt>#{sshDirectory sshdata}</tt> directory.+ <p>+ Do you want to merge this repository's contents into your repository?+ <p>+ <a .btn .btn-default onclick="$('#setupmodal').modal('show');" href="@{CombineSshR sshdata}">+ <span .glyphicon .glyphicon-resize-small>+ \ Combine the repositories #+ The combined repositories will sync and share their files.+ <p>+ <p>+ <a .btn .btn-default href="@{AddSshR}">+ <span .glyphicon .glyphicon-resize-full>+ \ Go back #+ Use a different directory than <tt>#{sshDirectory sshdata}</tt> to #+ avoid combining the repositories. ^{sshSetupModal sshdata}
templates/configurators/ssh/confirm.hamlet view
@@ -1,69 +1,73 @@-<div .span9 .hero-unit>- <h2>- Ready to add remote server- <div .row-fluid>- <div .span9>- $if not (hasCapability sshdata GitAnnexShellCapable)- <p>- <i .icon-warning-sign></i> #- The server #{sshHostName sshdata} can be used as is, but #- installing #- $if not (hasCapability sshdata GitCapable)- git and git-annex #- $else- git-annex #- on it would make it work better, and provide more options below. #- <p>- If you're able to install software on the server, do so and click- <a .btn href="@{RetrySshR sshdata}" onclick="$('#testmodal').modal('show');">- Retry- $else- <p>- The server #{sshHostName sshdata} has been verified to be usable. #- Depending on whether you trust this server, you can choose between #- storing your data on it encrypted, or unencrypted.- <h3>- Unencrypted repository- <p>- All your data will be uploaded to the server, including a clone of #- the git repository. This is a good choice if you want to set up #- other devices to use the same server, or share the repository with #- others.- <p>- <a .btn href="@{MakeSshGitR sshdata}" onclick="$('#setupmodal').modal('show');">- Make an unencrypted git repository on the server- <p style="text-align: center">- -or-- <h3>- Simple shared encryption- <p>- This allows everyone who has a clone of this repository to #- decrypt the files stored on #{sshHostName sshdata}. That makes #- it good for sharing. And it's easy to set up and use.- <p>- <a .btn href="@{MakeSshRsyncR sshdata}" onclick="$('#setupmodal').modal('show');">- <i .icon-lock></i> Use shared encryption- $if hasCapability sshdata GitCapable- <p style="text-align: center">- -or-+<div .col-sm-9>+ <div .content-box>+ <h2>+ Ready to add remote server+ <div .row>+ <div .col-sm-9>+ $if not (hasCapability sshdata GitAnnexShellCapable)+ <p>+ <span .glyphicon .glyphicon-warning-sign>+ \ The server #{sshHostName sshdata} can be used as is, but #+ installing #+ $if not (hasCapability sshdata GitCapable)+ git and git-annex #+ $else+ git-annex #+ on it would make it work better, and provide more options below. #+ <p>+ If you're able to install software on the server, do so and click+ <a .btn .btn-default href="@{RetrySshR sshdata}" onclick="$('#testmodal').modal('show');">+ Retry+ $else+ <p>+ The server #{sshHostName sshdata} has been verified to be usable. #+ Depending on whether you trust this server, you can choose between #+ storing your data on it encrypted, or unencrypted.+ <h3>+ Unencrypted repository+ <p>+ All your data will be uploaded to the server, including a clone of #+ the git repository. This is a good choice if you want to set up #+ other devices to use the same server, or share the repository with #+ others.+ <p>+ <a .btn .btn-default href="@{MakeSshGitR sshdata}" onclick="$('#setupmodal').modal('show');">+ Make an unencrypted git repository on the server+ <p style="text-align: center">+ -or- <h3>- Encrypt with GnuPG key- <p>- This stores an encrypted clone of your repository on #- #{sshHostName sshdata}, unlike shared encryption which only #- stores file contents there. So it's good for backups. But the #- encryption will prevent you from sharing the repository with #- friends, or easily accessing its contents on another computer.+ Simple shared encryption <p>- $forall (keyid, name) <- secretkeys- <p>- <a .btn href="@{MakeSshGCryptR sshdata (RepoKey keyid)}" onclick="$('#setupmodal').modal('show');" >- <i .icon-lock></i> Encrypt repository #- to ^{gpgKeyDisplay keyid (Just name)}+ This allows everyone who has a clone of this repository to #+ decrypt the files stored on #{sshHostName sshdata}. That makes #+ it good for sharing. And it's easy to set up and use. <p>- <a .btn href="@{MakeSshGCryptR sshdata NoRepoKey}" onclick="$('#genkeymodal').modal('show');">- <i .icon-plus-sign></i> Encrypt repository #- with a new encryption key+ <a .btn .btn-default href="@{MakeSshRsyncR sshdata}" onclick="$('#setupmodal').modal('show');">+ <span .glyphicon .glyphicon-lock>+ \ Use shared encryption+ $if hasCapability sshdata GitCapable+ <p style="text-align: center">+ -or-+ <h3>+ Encrypt with GnuPG key+ <p>+ This stores an encrypted clone of your repository on #+ #{sshHostName sshdata}, unlike shared encryption which only #+ stores file contents there. So it's good for backups. But the #+ encryption will prevent you from sharing the repository with #+ friends, or easily accessing its contents on another computer.+ <p>+ $forall (keyid, name) <- secretkeys+ <p>+ <a .btn .btn-default href="@{MakeSshGCryptR sshdata (RepoKey keyid)}" onclick="$('#setupmodal').modal('show');" >+ <span .glyphicon .glyphicon-lock>+ \ Encrypt repository #+ to ^{gpgKeyDisplay keyid (Just name)}+ <p>+ <a .btn .btn-default href="@{MakeSshGCryptR sshdata NoRepoKey}" onclick="$('#genkeymodal').modal('show');">+ <span .glyphicon .glyphicon-plus-sign>+ \ Encrypt repository #+ with a new encryption key ^{sshTestModal} ^{sshSetupModal sshdata} ^{genKeyModal}
templates/configurators/ssh/enable.hamlet view
@@ -1,29 +1,28 @@-<div .span9 .hero-unit>- <h2>- Enabling #{description}- <p>- To enable this repository, you first need to check that its ssh server #- is usable from here.- <p>- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- <div .form-actions>- <button .btn .btn-primary type=submit onclick="$('#testmodal').modal('show');">- Check this server- $case status- $of UnusableServer msg- <div .alert .alert-error>- <i .icon-warning-sign></i> #{msg}- $of _- ^{form}- ^{webAppFormAuthToken}-<div .modal .fade #testmodal>- <div .modal-header>- <h3>- Testing server ...- <div .modal-body>- <p>- Checking ssh connection to the server. This could take a minute.+<div .col-sm-9>+ <div .content-box>+ <h2>+ Enabling #{description} <p>- You may be prompted for your password to log into the server.+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ $case status+ $of UnusableServer msg+ <div .alert .alert-danger>+ <span .glyphicon .glyphicon-warning-sign>+ \ #{msg}+ $of _+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit onclick="$('#testmodal').modal('show');">+ Check this server+<div .modal .fade #testmodal>+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Testing server ...+ <div .modal-body>+ <p>+ Checking ssh connection to the server. This could take a minute.
templates/configurators/ssh/error.hamlet view
@@ -1,11 +1,13 @@-<div .span9 .hero-unit>- <h2>- <i .icon-warning-sign></i> Failed to make repository- <p>- Something went wrong setting up the repository on the remote server.- <p>- Transcript:- <pre>- #{msg}- <p>- To retry setting up the repository, reload this page.+<div .col-sm-9>+ <div .content-box>+ <h2>+ <span .glyphicon .glyphicon-warning-sign>+ \ Failed to make repository+ <p>+ Something went wrong setting up the repository on the remote server.+ <p>+ Transcript:+ <pre>+ #{msg}+ <p>+ To retry setting up the repository, reload this page.
+ templates/configurators/ssh/expiredpassword.hamlet view
@@ -0,0 +1,12 @@+<div .col-sm-9>+ <div .content-box>+ <h2>+ <span .glyphicon .glyphicon-warning-sign>+ \ Failed to make repository+ <p>+ The password you entered has expired. Suggest you go back, #+ re-enter the password, and try again.+ <p>+ Transcript:+ <pre>+ #{msg}
templates/configurators/ssh/setupmodal.hamlet view
@@ -1,12 +1,13 @@ <div .modal .fade #setupmodal>- <div .modal-header>- <h3>- Setting up repository ...- <div .modal-body>- <p>- Setting up repository on the remote server. This could take a minute.- $if needsPubKey sshdata- <p>- You will be prompted once more for your ssh password. A ssh key #- is being installed on the server, allowing git-annex to access it #- securely without a password.+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Setting up repository ...+ <div .modal-body>+ <p>+ Setting up repository on the remote server. This could take a minute.+ $if needsPubKey sshdata+ <p>+ A ssh key is being installed on the server, allowing git-annex #+ to access it securely without a password.
templates/configurators/ssh/testmodal.hamlet view
@@ -1,9 +1,9 @@ <div .modal .fade #testmodal>- <div .modal-header>- <h3>- Testing server ...- <div .modal-body>- <p>- Checking ssh connection to the server. This could take a minute.- <p>- You may be prompted for your password to log into the server.+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Testing server ...+ <div .modal-body>+ <p>+ Checking ssh connection to the server. This could take a minute.
templates/configurators/unused.hamlet view
@@ -1,38 +1,42 @@-<div .span9 .hero-unit>- <h2>- Managing unused files- <p>- $maybe desc <- munuseddesc- Some old versions of files and deleted files have been preserved #- inside this repository.- <div .alert .alert-info>- <i .icon-info-sign></i> #{renderTense Past desc} #- $maybe lastchecked <- mlastchecked- (last checked #{fromDuration lastchecked} ago)- $nothing- Old versions of files and deleted files can be preserved inside #- this repository.- <p>- This might be useful, if you ever need to access those old or deleted #- files. But they'll also use up disk space. There are three ways to deal #- with this.- <ol>- <li>- <p>- Set up a backup or archive repository, on a removable drive #- or in the cloud, and the unused files will be moved to it, freeing #- up space.- <br>- <a .btn href="@{AddRepositoryR}">- <i .icon-plus></i> Add a new repository- <li>- <p>- Or, you can let unused files expire after a period of time.- <form method="post" .form-inline enctype=#{enctype}>- ^{form}- <li>- <p>- Finally, you can clean up all unused files manually at any time.- <br>- <a .btn href="@{CleanupUnusedR}">- <i .icon-trash></i> Clean up unused files now+<div .col-sm-9>+ <div .content-box>+ <h2>+ Managing unused files+ <p>+ $maybe desc <- munuseddesc+ Some old versions of files and deleted files have been preserved #+ inside this repository.+ <div .alert .alert-info>+ <span .glyphicon .glyphicon-info-sign>+ \ #{renderTense Past desc} #+ $maybe lastchecked <- mlastchecked+ (last checked #{fromDuration lastchecked} ago)+ $nothing+ Old versions of files and deleted files can be preserved inside #+ this repository.+ <p>+ This might be useful, if you ever need to access those old or deleted #+ files. But they'll also use up disk space. There are three ways to deal #+ with this.+ <ol>+ <li>+ <p>+ Set up a backup or archive repository, on a removable drive #+ or in the cloud, and the unused files will be moved to it, freeing #+ up space.+ <br>+ <a .btn .btn-default href="@{AddRepositoryR}">+ <span .glyphicon .glyphicon-plus>+ \ Add a new repository+ <li>+ <p>+ Or, you can let unused files expire after a period of time.+ <form method="post" .form-inline enctype=#{enctype}>+ ^{form}+ <li>+ <p>+ Finally, you can clean up all unused files manually at any time.+ <br>+ <a .btn .btn-default href="@{CleanupUnusedR}">+ <span .glyphicon .glyphicon-trash>+ \ Clean up unused files now
templates/configurators/unused/form.hamlet view
@@ -1,6 +1,6 @@ #{msg} <p>- <div .input-prepend .input-append>+ <div .form-group> ^{fvInput enableView} after ^{fvInput whenView} days. - <button type=submit .btn>+ <button type=submit .btn .btn-default > Save Changes
templates/configurators/upgrade/android.hamlet view
@@ -1,9 +1,10 @@-<div .span9 .hero-unit>- <h2>- Upgrading git-annex- <p>- To start the upgrade #- <a .btn .btn-primary href="#{url}">- Download #{takeFileName url}- <p>- Once the download is complete, open the file to upgrade git-annex.+<div .col-sm-9>+ <div .content-box>+ <h2>+ Upgrading git-annex+ <p>+ To start the upgrade #+ <a .btn .btn-primary href="#{url}">+ Download #{takeFileName url}+ <p>+ Once the download is complete, open the file to upgrade git-annex.
templates/configurators/xmpp.hamlet view
@@ -1,36 +1,43 @@-<div .span9 .hero-unit>- <h2>- Configuring jabber account- <p>- A jabber account is used to communicate between #- devices that are not in direct contact. #- It can also be used to pair up with a friend's repository, if desired.- <p>- It's fine to reuse an existing jabber account; git-annex won't #- post any messages to it.- <p>- $maybe msg <- problem- <i .icon-warning-sign></i> Unable to connect to the Jabber server. #- Maybe you entered the wrong password? (Error message: #{msg})- $nothing- <i .icon-user></I> If you have a Gmail account, you can use #- Google Talk. Just enter your full Gmail address #- <small>(<tt>you@gmail.com</tt>)</small> #- and password below.- <p>- <form method="post" .form-horizontal enctype=#{enctype}>- <fieldset>- ^{form}- ^{webAppFormAuthToken}- <div .form-actions>- <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">- Use this account- <a .btn href="@{DisconnectXMPPR}">- Stop using this account-<div .modal .fade #workingmodal>- <div .modal-header>- <h3>- Testing account ...- <div .modal-body>+<div .col-sm-9>+ <div .content-box>+ <h2>+ Configuring jabber account <p>- Testing jabber account. This could take a minute.+ A jabber account is used to communicate between #+ devices that are not in direct contact. #+ It can also be used to pair up with a friend's repository, if desired.+ <p>+ It's fine to reuse an existing jabber account; git-annex won't #+ post any messages to it.+ <p>+ $maybe msg <- problem+ <span .glyphicon .glyphicon-warning-sign>+ \ Unable to connect to the Jabber server. #+ Maybe you entered the wrong password? (Error message: #{msg})+ $nothing+ <span .glyphicon .glyphicon-user>+ \ If you have a Gmail account, you can use #+ Google Talk. Just enter your full Gmail address #+ <small>(<tt>you@gmail.com</tt>)</small> #+ and password below.+ <p>+ <form method="post" .form-horizontal enctype=#{enctype}>+ <fieldset>+ ^{form}+ ^{webAppFormAuthToken}+ <div .form-group>+ <div .col-sm-10 .col-sm-offset-2>+ <button .btn .btn-primary type=submit onclick="$('#workingmodal').modal('show');">+ Use this account+ \ + <a .btn .btn-default href="@{DisconnectXMPPR}">+ Stop using this account+<div .modal .fade #workingmodal>+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Testing account ...+ <div .modal-body>+ <p>+ Testing jabber account. This could take a minute.
templates/configurators/xmpp/buddylist.hamlet view
@@ -1,4 +1,4 @@-<div .span9 ##{ident}>+<div .col-sm-9 ##{ident}> <table .table> <tbody> $if null buddies@@ -13,16 +13,16 @@ <tr> <td> $if isself buddyid- <i .icon-star></i> #- <span :away:.muted>+ <span .glyphicon .glyphicon-star> #+ <span :away:.text-muted> your other devices $else- <i .icon-user></i> #- <span :away:.muted>+ <span .glyphicon .glyphicon-user> #+ <span :away:.text-muted> #{name} <td> $if away- <span .muted>+ <span .text-muted> away $else $if paired@@ -31,10 +31,10 @@ $else $if canpair $if isself buddyid- <a .btn .btn-primary .btn-small href="@{RunningXMPPPairSelfR}">+ <a .btn .btn-primary .btn-sm href="@{RunningXMPPPairSelfR}"> Start pairing $else- <a .btn .btn-primary .btn-small href="@{RunningXMPPPairFriendR buddyid}">+ <a .btn .btn-primary .btn-sm href="@{RunningXMPPPairFriendR buddyid}"> Start pairing $else not using git-annex
templates/configurators/xmpp/disabled.hamlet view
@@ -1,5 +1,6 @@-<div .span9 .hero-unit>- <h2>- Jabber not supported- <p>- This build of git-annex does not support Jabber. Sorry!+<div .col-sm-9>+ <div .content-box>+ <h2>+ Jabber not supported+ <p>+ This build of git-annex does not support Jabber. Sorry!
templates/configurators/xmpp/needcloudrepo.hamlet view
@@ -1,17 +1,18 @@-<div .span9 .hero-unit>- <h2>- ☂ Configure a shared cloud repository- $maybe name <- buddyname- <p>- You and #{name} have combined your repositores. But you can't open #- each other's files yet. To start sharing files with #{name}, #- you need a repository in the cloud, that you both can access.- $nothing- <p>- You've combined the repositories on two or more of your devices. #- But files are not flowing yet. To start sharing files #- between your devices, you should set up a repository in the cloud.- ^{cloudRepoList}- <h2>- Add a cloud repository- ^{makeCloudRepositories}+<div .col-sm-9>+ <div .content-box>+ <h2>+ ☂ Configure a shared cloud repository+ $maybe name <- buddyname+ <p>+ You and #{name} have combined your repositores. But you can't open #+ each other's files yet. To start sharing files with #{name}, #+ you need a repository in the cloud, that you both can access.+ $nothing+ <p>+ You've combined the repositories on two or more of your devices. #+ But files are not flowing yet. To start sharing files #+ between your devices, you should set up a repository in the cloud.+ ^{cloudRepoList}+ <h2>+ Add a cloud repository+ ^{makeCloudRepositories}
templates/control/log.hamlet view
@@ -1,6 +1,7 @@-<div .span9 .hero-unit>- <p>- Here's everything that has been logged by the git-annex assistant, #- as well as by programs it has run.- <pre>- #{logcontent}+<div .col-sm-9>+ <div .content-box>+ <p>+ Here's everything that has been logged by the git-annex assistant, #+ as well as by programs it has run.+ <pre>+ #{logcontent}
templates/control/notrunning.hamlet view
@@ -1,10 +1,13 @@-<div .span9 .hero-unit>- <p>- Bye bye!-<div .modal .fade #shutdownmodal>- <div .modal-header>- <h3>- git-annex has shut down- <div .modal-body>+<div .col-sm-9>+ <div .content-box> <p>- You can now close this browser window.+ Bye bye!+<div .modal .fade #shutdownmodal>+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ git-annex has shut down+ <div .modal-body>+ <p>+ You can now close this browser window.
templates/control/repairrepository.hamlet view
@@ -1,26 +1,29 @@-<div .span9 .hero-unit>- <p>- A #- <a href="@{ConfigFsckR}">- consistency check #- found corrupt data in the git repository #{repodesc}.- <p>- While this is not good, this problem can be automatically repaired,- often without data loss.- $if repairingmainrepo+<div .col-sm-9>+ <div .content-box> <p>- When possible, the corrupt data will be recovered from other #- repositories. You should make sure any other repositories that might #- have this data are available before continuing. So, plug in any #- removable drive that contains a repository, or make sure your network #- connection to other repositories is active.- <p>- <a .btn .btn-primary href="@{RepairRepositoryRunR u}" onclick="$('#workingmodal').modal('show');">- Start Repair Process-<div .modal .fade #workingmodal>- <div .modal-header>- <h3>- Repairing #{repodesc} ...- <div .modal-body>+ A #+ <a href="@{ConfigFsckR}">+ consistency check #+ found corrupt data in the git repository #{repodesc}. <p>- This may take some time.+ While this is not good, this problem can be automatically repaired,+ often without data loss.+ $if repairingmainrepo+ <p>+ When possible, the corrupt data will be recovered from other #+ repositories. You should make sure any other repositories that might #+ have this data are available before continuing. So, plug in any #+ removable drive that contains a repository, or make sure your network #+ connection to other repositories is active.+ <p>+ <a .btn .btn-primary href="@{RepairRepositoryRunR u}" onclick="$('#workingmodal').modal('show');">+ Start Repair Process+<div .modal .fade #workingmodal>+ <div .modal-dialog>+ <div .modal-content>+ <div .modal-header>+ <h3>+ Repairing #{repodesc} ...+ <div .modal-body>+ <p>+ This may take some time.
templates/control/repairrepository/done.hamlet view
@@ -1,13 +1,14 @@-<div .span9 .hero-unit>- <p>- Good news: Your repository has successfully been repaired!- <p>- This problem could have had a variety of causes. If your computer #- lost power, or the drive containing this repository #- was disconnected, it would explain this type of problem.- <p>- On the other hand, it's possible that you have a hardware problem.- <p>- Remember: Lots of copies keep stuff safe! The more repositories you #- have, the less likely you are to lose data no matter what goes wrong.- ^{repolist}+<div .col-sm-9>+ <div .content-box>+ <p>+ Good news: Your repository has successfully been repaired!+ <p>+ This problem could have had a variety of causes. If your computer #+ lost power, or the drive containing this repository #+ was disconnected, it would explain this type of problem.+ <p>+ On the other hand, it's possible that you have a hardware problem.+ <p>+ Remember: Lots of copies keep stuff safe! The more repositories you #+ have, the less likely you are to lose data no matter what goes wrong.+ ^{repolist}
templates/control/repositoryswitcher.hamlet view
@@ -1,14 +1,15 @@-<div .span9 .hero-unit>- <h2>- Switch repository- <p>- $if null repolist- There are no other local repositories. Want to #- <a href="@{NewRepositoryR}">add one</a>?- $else- You can switch to any of these other local repositories:- <ul>- $forall (name, path) <- repolist- <li>- <a href="@{SwitchToRepositoryR path}">- #{name}+<div .col-sm-9>+ <div .content-box>+ <h2>+ Switch repository+ <p>+ $if null repolist+ There are no other local repositories. Want to #+ <a href="@{NewRepositoryR}">add one</a>?+ $else+ You can switch to any of these other local repositories:+ <ul>+ $forall (name, path) <- repolist+ <li>+ <a href="@{SwitchToRepositoryR path}">+ #{name}
templates/control/shutdown.hamlet view
@@ -1,8 +1,10 @@-<div .span9 .hero-unit>- <h2>- Shutdown daemon?- <p>- <a .btn .btn-danger href="@{ShutdownConfirmedR}">- <i .icon-off></i> Confirm shutdown- <a .btn href="@{DashboardR}">- Keep running+<div .col-sm-9>+ <div .content-box>+ <h2>+ Shutdown daemon?+ <p>+ <a .btn .btn-danger href="@{ShutdownConfirmedR}">+ <span .glyphicon .glyphicon-off>+ \ Confirm shutdown+ <a .btn .btn-default href="@{DashboardR}">+ Keep running
@@ -1,16 +1,21 @@ <ul .dropdown-menu> <li> <a href="@{NewRepositoryR}">- <i .icon-plus-sign></i> Add another local repository+ <span .glyphicon .glyphicon-plus-sign>+ \ Add another local repository <li> <a href="@{RepositorySwitcherR}">- <i .icon-folder-close></i> Switch repository+ <span .glyphicon .glyphicon-folder-close>+ \ Switch repository <li> <a href="@{RestartR}">- <i .icon-repeat></i> Restart daemon+ <span .glyphicon .glyphicon-repeat>+ \ Restart daemon <li> <a href="@{ShutdownR}">- <i .icon-off></i> Shutdown daemon+ <span .glyphicon .glyphicon-off>+ \ Shutdown daemon <li> <a href="@{LogR}">- <i .icon-list></i> View log+ <span .glyphicon .glyphicon-list>+ \ View log
templates/dashboard/main.hamlet view
@@ -1,12 +1,11 @@-<div .span9>+<div .col-sm-9> ^{repolist} ^{transferlist} $if warnNoScript <noscript>- <div .navbar .navbar-fixed-bottom>- <div .navbar-inner>- <div .container>- Javascript is disabled; cannot update in real-time.- <div .btn-group>- <a .btn .btn-primary href="@{NoScriptAutoR}">Auto-refresh every 3 seconds #- <a .btn .btn-primary href="@{NoScriptR}">Manually refresh+ <div .navbar .navbar-inverse .navbar-fixed-bottom>+ <div .container>+ Javascript is disabled; cannot update in real-time.+ <div .btn-group>+ <a .btn .btn-primary href="@{NoScriptAutoR}">Auto-refresh every 3 seconds #+ <a .btn .btn-primary href="@{NoScriptR}">Manually refresh
templates/dashboard/transfers.cassius view
@@ -1,2 +1,8 @@ .forcewrap word-wrap: break-word+.small-margin-bottom+ margin-bottom: 10px+.small-margin-top+ margin-top: 10px+.tiny-margin-bottom+ margin-bottom: 4px
templates/dashboard/transfers.hamlet view
@@ -3,39 +3,37 @@ $if transfersrunning $forall (transfer, info) <- transfers $with percent <- maybe "unknown" (showPercentage 0) $ percentComplete transfer info- <div .row-fluid>- <div .span10>- <div .row-fluid>- <h3 .forcewrap>- $maybe file <- associatedFile info- #{file}- $nothing- #{key2file $ transferKey transfer}- $case transferDirection transfer- $of Upload- →- $of Download- ←- <small>- <a href="@{EditRepositoryR $ RepoUUID $ transferUUID transfer}">- #{maybe "unknown" Remote.name $ transferRemote info}- $with size <- maybe "unknown" (roughSize dataUnits True) $ keySize $ transferKey transfer- $if isJust $ startedTime info- $if isrunning info- <small .pull-right><b>#{percent} of #{size}</b></small>- $else- <small .pull-right>paused at #{percent} of #{size}</small>+ <div .row>+ <div .col-sm-10>+ <h3 .forcewrap .small-margin-top .tiny-margin-bottom>+ $maybe file <- associatedFile info+ #{file}+ $nothing+ #{key2file $ transferKey transfer}+ $case transferDirection transfer+ $of Upload+ →+ $of Download+ ←+ <small>+ <a href="@{EditRepositoryR $ RepoUUID $ transferUUID transfer}">+ #{maybe "unknown" Remote.name $ transferRemote info}+ $with size <- maybe "unknown" (roughSize dataUnits True) $ keySize $ transferKey transfer+ $if isJust $ startedTime info+ $if isrunning info+ <span .pull-right><b>#{percent} of #{size}</b> $else- <small .pull-right>queued (#{size})</small>- <div .row-fluid>- <div .progress .progress-striped>- <div .bar style="width: #{percent};">- <div .btn-group .span2>+ <span .pull-right>paused at #{percent} of #{size}+ $else+ <span .pull-right>queued (#{size})+ <div .progress .progress-striped .small-margin-bottom>+ <div .progress-bar style="width: #{percent};">+ <div .btn-group .col-sm-2 .small-margin-top> $if isrunning info- ^{actionButton (PauseTransferR transfer) Nothing (Just "pause") "btn" "icon-pause"}+ ^{actionButton (PauseTransferR transfer) Nothing (Just "pause") "btn btn-default btn-sm" "glyphicon-pause"} $else- ^{actionButton (StartTransferR transfer) Nothing (Just "continue") "btn" "icon-play"}- ^{actionButton (CancelTransferR transfer) Nothing (Just "cancel") "btn" "icon-remove"}+ ^{actionButton (StartTransferR transfer) Nothing (Just "continue") "btn btn-default btn-sm" "glyphicon-play"}+ ^{actionButton (CancelTransferR transfer) Nothing (Just "cancel") "btn btn-default btn-sm" "glyphicon-remove"} $if scanrunning <img src="@{StaticR activityicon_gif}" alt=""> # Scanning for files to transfer
templates/documentation/about.hamlet view
@@ -1,33 +1,34 @@-<div .span9 .hero-unit>- <h2>- git-annex watches over your files- <p>- It will automatically notice changes, and keep files in sync between #- here and repositories elsewhere.- <p>- For full details, see #- <a href="http://git-annex.branchable.com/">the git-annex website</a>.- <hr>- git-annex is © 2010-2013 Joey Hess. It is free software, licensed #- under the terms of the GNU General Public License, version 3 or above. #- This webapp is licensed under the terms of the GNU Affero General #- Public License, version 3 or above. #- For full license information, see #- $if builtinlicense- <a href="@{LicenseR}">- this page.- $else- <a href="http://git-annex.branchable.com/license">- this page.- <p>- The source code for git-annex can be downloaded #- <a href="http://source.git-annex.branchable.com/">here</a>.+<div .col-sm-9>+ <div .content-box>+ <h2>+ git-annex watches over your files <p>- Development of git-annex is made possible by #- <a href="http://git-annex.branchable.com/assistant/thanks/">- many excellent people- . ♥+ It will automatically notice changes, and keep files in sync between #+ here and repositories elsewhere. <p>- Version: #{packageversion}- <br>- Build flags: #{unwords buildFlags}+ For full details, see #+ <a href="http://git-annex.branchable.com/">the git-annex website</a>.+ <hr>+ git-annex is © 2010-2013 Joey Hess. It is free software, licensed #+ under the terms of the GNU General Public License, version 3 or above. #+ This webapp is licensed under the terms of the GNU Affero General #+ Public License, version 3 or above. #+ For full license information, see #+ $if builtinlicense+ <a href="@{LicenseR}">+ this page.+ $else+ <a href="http://git-annex.branchable.com/license">+ this page.+ <p>+ The source code for git-annex can be downloaded #+ <a href="http://source.git-annex.branchable.com/">here</a>.+ <p>+ Development of git-annex is made possible by #+ <a href="http://git-annex.branchable.com/assistant/thanks/">+ many excellent people+ . ♥+ <p>+ Version: #{packageversion}+ <br>+ Build flags: #{unwords buildFlags}
templates/documentation/repogroup.hamlet view
@@ -1,60 +1,61 @@-<div .span9 .hero-unit>- <h2>- Repository groups- <p>- Each repository you configure git-annex to use is a member of a #- repository group. Each group of repositories has a different #- purpose.- <p>- Let's start with the <b>client repositories</b>. These are the #- repositories that contain files that you can directly use. Generally #- you'll have one client repository per computer. The whole point of #- the git-annex assistant is to keep these repositories in sync as you #- change files, add files, delete files, etc.- <p>- The next most important repository group is the #- <b>transfer repositories</b>. #- These are used to transfer files between clients, when the clients #- cannot directly talk to one-another. Transfer repositories only #- hold the files that need to be synced to other repositories, so they #- are relatively small.- <p>- You can get along without any <b>full backup repositories</b>, but #- they're a useful safeguard. These repositories accumulate every file- they can get ahold of. A large removable drive makes a good full backup #- repository.- <p>- Similarly, the <b>incremental backup repositories</b> try to back up #- every file, but these only accumulate files that are not already #- present in a full or incremental backup.- <p>- Next we come to the <b>archive repositories</b>.- The archive repositories coordinate together, so that each file is #- archived in only one place. When you move files into a folder named #- "archive", the content of the files will be removed from all your #- client repositories (either immediately or as soon as an archive #- repository gets a copy of the file). This is handy if you have old files #- you don't need anymore, but want to keep archived for later. #- When you copy or move a file out of an "archive" folder, it'll be #- retrieved from the archive repository.- <p>- The <b>small archive repositories</b> are like other archive #- repositories, but smaller. While archive repositories normally accumulate #- every file they can, small archive repositories only accumulate files #- after you've put them in an "archive" directory. They otherwise behave #- the same- <p>- Sometimes useful for devices like cameras are the #- <b>source repositories</b>. Repositories in this group only retain #- files until they can be moved to some other repository, like a client #- or transfer repository.- <p>- If you configure a repository that can be viewed by the public, #- but you don't want all your files to show up there, you can #- configure it to be a <b>public repository</b>. Then only files #- located in a directory you choose will be sent to it.- <p>- Finally, repositories can be configured to be in <b>manual mode</b>. This #- prevents content being automatically synced to the repository, but #- you can use command-line tools like `git annex get` and `git annex drop` #- to control what content is present.+<div .col-sm-9>+ <div .content-box>+ <h2>+ Repository groups+ <p>+ Each repository you configure git-annex to use is a member of a #+ repository group. Each group of repositories has a different #+ purpose.+ <p>+ Let's start with the <b>client repositories</b>. These are the #+ repositories that contain files that you can directly use. Generally #+ you'll have one client repository per computer. The whole point of #+ the git-annex assistant is to keep these repositories in sync as you #+ change files, add files, delete files, etc.+ <p>+ The next most important repository group is the #+ <b>transfer repositories</b>. #+ These are used to transfer files between clients, when the clients #+ cannot directly talk to one-another. Transfer repositories only #+ hold the files that need to be synced to other repositories, so they #+ are relatively small.+ <p>+ You can get along without any <b>full backup repositories</b>, but #+ they're a useful safeguard. These repositories accumulate every file+ they can get ahold of. A large removable drive makes a good full backup #+ repository.+ <p>+ Similarly, the <b>incremental backup repositories</b> try to back up #+ every file, but these only accumulate files that are not already #+ present in a full or incremental backup.+ <p>+ Next we come to the <b>archive repositories</b>.+ The archive repositories coordinate together, so that each file is #+ archived in only one place. When you move files into a folder named #+ "archive", the content of the files will be removed from all your #+ client repositories (either immediately or as soon as an archive #+ repository gets a copy of the file). This is handy if you have old files #+ you don't need anymore, but want to keep archived for later. #+ When you copy or move a file out of an "archive" folder, it'll be #+ retrieved from the archive repository.+ <p>+ The <b>small archive repositories</b> are like other archive #+ repositories, but smaller. While archive repositories normally accumulate #+ every file they can, small archive repositories only accumulate files #+ after you've put them in an "archive" directory. They otherwise behave #+ the same+ <p>+ Sometimes useful for devices like cameras are the #+ <b>source repositories</b>. Repositories in this group only retain #+ files until they can be moved to some other repository, like a client #+ or transfer repository.+ <p>+ If you configure a repository that can be viewed by the public, #+ but you don't want all your files to show up there, you can #+ configure it to be a <b>public repository</b>. Then only files #+ located in a directory you choose will be sent to it.+ <p>+ Finally, repositories can be configured to be in <b>manual mode</b>. This #+ prevents content being automatically synced to the repository, but #+ you can use command-line tools like `git annex get` and `git annex drop` #+ to control what content is present.
templates/error.hamlet view
@@ -1,9 +1,15 @@-<div .navbar .navbar-fixed-top>- <div .navbar-inner>- <div .container>- <a .brand>+<div .navbar .navbar-inverse .navbar-fixed-top>+ <div .container>+ <div .navbar-header>+ <button type="button" .navbar-toggle data-toggle="collapse" data-target=".navbar-collapse">+ <span .sr-only>Toggle navigation+ <span .icon-bar>+ <span .icon-bar>+ <span .icon-bar>+ <a .navbar-brand> git-annex- <ul .nav>+ <div .navbar-collapse .collapse>+ <ul .nav .navbar-nav> <li .active> <a href=""> Error@@ -17,10 +23,9 @@ <a href="http://git-annex.branchable.com/bugs/"> File a Bug <div .container-fluid>- <div .row-fluid>- <div .span3>- <div .span6>- <div .alert .alert-error .alert-block>+ <div .row>+ <div .col-sm-6 .col-sm-offset-3>+ <div .alert .alert-danger .alert-block> ^{content} <hr> git-annex version #{packageversion}
templates/page.cassius view
@@ -3,3 +3,32 @@ padding-bottom: 40px .sidebar-nav padding: 9px 0+.icon-white+ color: #FFF+.navbar-inverse .navbar-brand:hover, .navbar-inverse .navbar-brand:focus+ color: #999+.form-horizontal .form-control+ max-width: 300px+ display: inline+.form-horizontal input.form-control+span+ width: 100%+.content-box+ padding: 30px+ padding-top: 10px+ margin-bottom: 30px+ color: inherit+ background-color: #eee+ border-radius: 6px+ +h1+ font-size: 30px+h2+ font-size: 24px+h3+ font-size: 18px+h4+ font-size: 14px+h5+ font-size: 12px+h6+ font-size: 11px
templates/page.hamlet view
@@ -1,24 +1,30 @@-<div .navbar .navbar-fixed-top>- <div .navbar-inner>- <div .container>- <a .brand>+<div .navbar .navbar-inverse .navbar-fixed-top role="navigation">+ <div .container>+ <div .navbar-header>+ <button type="button" .navbar-toggle data-toggle="collapse" data-target=".navbar-collapse">+ <span .sr-only>Toggle navigation+ <span .icon-bar>+ <span .icon-bar>+ <span .icon-bar>+ <a .navbar-brand> git-annex- <ul .nav>+ <div .navbar-collapse .collapse>+ <ul .nav .navbar-nav> $forall (name, route, isactive) <- navbar <li :isactive:.active> <a href="@{route}"> #{name} $maybe reldir <- relDir webapp- <ul .nav .pull-right>+ <ul .nav .navbar-nav .navbar-right> $if hasFileBrowser <li>- ^{actionButton FileBrowserR (Just "Files") (Just "Click to open a file browser") "" "icon-folder-open icon-white"}+ ^{actionButton FileBrowserR (Just "Files") (Just "Click to open a file browser") "" "glyphicon-folder-open icon-white"} <li .dropdown #menu1> <a .dropdown-toggle data-toggle="dropdown" href="#menu1"> Repository: #{reldir}- <b .caret></b>+ <b .caret> ^{controlMenu} $nothing <div .container-fluid>- <div .row-fluid>+ <div .row> ^{content}
templates/repolist.hamlet view
@@ -14,29 +14,31 @@ $forall (name, repoid, currentlyconnected, actions) <- repolist <tr .repoline ##{show repoid}> <td .handle>- <a .btn .btn-mini .disabled>- <i .icon-resize-vertical></i>+ <a .btn .btn-default .btn-xs .disabled>+ <span .glyphicon .glyphicon-resize-vertical> #{name} <td .draghide> $if needsEnabled actions <a href="@{setupRepoLink actions}">- <i .icon-warning-sign></i> not enabled+ <span .glyphicon .glyphicon-warning-sign>+ \ not enabled $else $if notWanted actions- <i .icon-trash></i> cleaning out..+ <span .glyphicon .glyphicon-trash>+ \ cleaning out.. $else <a href="@{syncToggleLink actions}"> $if currentlyconnected- <i .icon-signal></i> #+ <span title="connected; change notification enabled" .glyphicon .glyphicon-signal> $else $if notSyncing actions- <i .icon-ban-circle></i> #+ <span .glyphicon .glyphicon-ban-circle> $else- <i .icon-refresh></i> #+ <span .glyphicon .glyphicon-refresh> $if notSyncing actions- syncing disabled+ \ syncing disabled $else- syncing enabled #+ \ syncing enabled # $if lacksUUID repoid (metadata only) <td .draghide>@@ -44,30 +46,37 @@ <a href="@{setupRepoLink actions}"> enable $else- <span .dropdown #menu-#{show repoid}>- <a .dropdown-toggle data-toggle="dropdown" href="#menu-#{show repoid}">- <i .icon-cog></i> actions- <b .caret></b>+ <div .dropdown #menu-#{show repoid}>+ <a data-toggle="dropdown" data-target="#" href="#menu-#{show repoid}">+ <span .glyphicon .glyphicon-cog>+ \ actions #+ <span .caret> <ul .dropdown-menu> <li> <a href="@{setupRepoLink actions}">- <i .icon-pencil></i> Edit+ <span .glyphicon .glyphicon-pencil>+ \ Edit $if not (lacksUUID repoid) <a href="@{SyncNowRepositoryR $ asUUID repoid}">- <i .icon-refresh></i> Sync now+ <span .glyphicon .glyphicon-refresh>+ \ Sync now <a href="@{DisableRepositoryR $ asUUID repoid}">- <i .icon-minus></i> Disable+ <span .glyphicon .glyphicon-minus>+ \ Disable <a href="@{DeleteRepositoryR $ asUUID repoid}">- <i .icon-trash></i> Delete+ <span .glyphicon .glyphicon-trash>+ \ Delete $if addmore <tr> <td colspan="3"> $if nootherrepos- <a .btn .btn-primary .btn-large href="@{AddRepositoryR}">- <i .icon-plus-sign></i> Add another repository+ <a .btn .btn-primary .btn-lg href="@{AddRepositoryR}">+ <span .glyphicon .glyphicon-plus-sign>+ \ Add another repository $else- <a .btn .btn-small href="@{AddRepositoryR}">- <i .icon-plus-sign></i> Add another repository+ <a .btn .btn-default .btn-sm href="@{AddRepositoryR}">+ <span .glyphicon .glyphicon-plus-sign>+ \ Add another repository <span> Sync your files with another device, or # share with a friend.
templates/sidebar/alert.hamlet view
@@ -10,7 +10,8 @@ $else $maybe i <- alertIcon alert ^{htmlIcon i} #- <strong>#{h}</strong> #+ <strong>#{h}+ \ $nothing $maybe i <- alertIcon alert ^{htmlIcon i} #
templates/sidebar/main.hamlet view
@@ -1,3 +1,3 @@-<div .span3 ##{ident}>+<div .col-sm-3 ##{ident}> <div .sidebar-nav> ^{content}