├── resources ├── sound │ └── alert.mp3 ├── img │ └── icons │ │ ├── 16x16.png │ │ ├── 19x19.png │ │ ├── 38x38.png │ │ ├── 48x48.png │ │ ├── help.png │ │ ├── icon.png │ │ ├── icon.psd │ │ └── 128x128.png ├── css │ ├── snellman.css │ └── style.css └── js │ ├── tmtools │ ├── analytics.js │ ├── background.js │ ├── main.js │ └── content.js │ └── jquery │ └── jquery-1.9.1.min.js ├── screenshots ├── 2_mainPage.png ├── 1_browseButton.png ├── 3_replayFeature.png ├── 4_filterByPlayer.png ├── 7_filterBySiteGame.png ├── 8_filterBySiteGameAll.png ├── 1_browseButton_1280x800.png ├── 6_filterBySiteFinished.png ├── 5_filterByPlayerAllSameLine.png └── 8_filterBySiteGameAll_1280_800.png ├── .gitattributes ├── .gitignore ├── manifest.json ├── README.md ├── main.html └── privacy_policy.md /resources/sound/alert.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/resources/sound/alert.mp3 -------------------------------------------------------------------------------- /screenshots/2_mainPage.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/screenshots/2_mainPage.png -------------------------------------------------------------------------------- /resources/img/icons/16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/resources/img/icons/16x16.png -------------------------------------------------------------------------------- /resources/img/icons/19x19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/resources/img/icons/19x19.png -------------------------------------------------------------------------------- /resources/img/icons/38x38.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/resources/img/icons/38x38.png -------------------------------------------------------------------------------- /resources/img/icons/48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/resources/img/icons/48x48.png -------------------------------------------------------------------------------- /resources/img/icons/help.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/resources/img/icons/help.png -------------------------------------------------------------------------------- /resources/img/icons/icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/resources/img/icons/icon.png -------------------------------------------------------------------------------- /resources/img/icons/icon.psd: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/resources/img/icons/icon.psd -------------------------------------------------------------------------------- /screenshots/1_browseButton.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/screenshots/1_browseButton.png -------------------------------------------------------------------------------- /resources/img/icons/128x128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/resources/img/icons/128x128.png -------------------------------------------------------------------------------- /screenshots/3_replayFeature.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/screenshots/3_replayFeature.png -------------------------------------------------------------------------------- /screenshots/4_filterByPlayer.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/screenshots/4_filterByPlayer.png -------------------------------------------------------------------------------- /screenshots/7_filterBySiteGame.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/screenshots/7_filterBySiteGame.png -------------------------------------------------------------------------------- /screenshots/8_filterBySiteGameAll.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/screenshots/8_filterBySiteGameAll.png -------------------------------------------------------------------------------- /screenshots/1_browseButton_1280x800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/screenshots/1_browseButton_1280x800.png -------------------------------------------------------------------------------- /screenshots/6_filterBySiteFinished.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/screenshots/6_filterBySiteFinished.png -------------------------------------------------------------------------------- /screenshots/5_filterByPlayerAllSameLine.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/screenshots/5_filterByPlayerAllSameLine.png -------------------------------------------------------------------------------- /screenshots/8_filterBySiteGameAll_1280_800.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rafalimaz/TMTools/HEAD/screenshots/8_filterBySiteGameAll_1280_800.png -------------------------------------------------------------------------------- /resources/css/snellman.css: -------------------------------------------------------------------------------- 1 | table.ledger { 2 | border-spacing: 0px; 3 | padding-bottom: 40px; 4 | white-space: nowrap; 5 | } 6 | 7 | table.ledger tr td { 8 | margin: 0px; 9 | font: 14px Verdana; 10 | } 11 | 12 | table.ledger tr td.ledger-delta { 13 | padding-left: 1ex; 14 | padding-right: 0.5ex; 15 | } 16 | 17 | table.ledger tr td.ledger-value { 18 | padding-right: 1ex; 19 | padding-left: 0.5ex; 20 | color: #888; 21 | } -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Windows image file caches 2 | Thumbs.db 3 | ehthumbs.db 4 | 5 | # Folder config file 6 | Desktop.ini 7 | 8 | # Recycle Bin used on file shares 9 | $RECYCLE.BIN/ 10 | 11 | # Windows Installer files 12 | *.cab 13 | *.msi 14 | *.msm 15 | *.msp 16 | 17 | # Windows shortcuts 18 | *.lnk 19 | 20 | # ========================= 21 | # Operating System Files 22 | # ========================= 23 | 24 | # OSX 25 | # ========================= 26 | 27 | .DS_Store 28 | .AppleDouble 29 | .LSOverride 30 | 31 | # Thumbnails 32 | ._* 33 | 34 | # Files that might appear on external disk 35 | .Spotlight-V100 36 | .Trashes 37 | 38 | # Directories potentially created on remote AFP share 39 | .AppleDB 40 | .AppleDesktop 41 | Network Trash Folder 42 | Temporary Items 43 | .apdisk 44 | -------------------------------------------------------------------------------- /manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "TM Tools", 3 | "short_name": "TM Tools", 4 | "version": "1.0.6", 5 | "manifest_version": 2, 6 | "description" : "Some tools to help people who like Terra Mystica enjoy more from the Snellman's platform.", 7 | "icons": { "16": "resources/img/icons/16x16.png", "38": "resources/img/icons/38x38.png", "48": "resources/img/icons/48x48.png", "128": "resources/img/icons/128x128.png" }, 8 | 9 | "browser_action": { 10 | "default_icon": "resources/img/icons/icon.png", 11 | "default_title": "TM Tools", 12 | "default_popup": "main.html" 13 | }, 14 | 15 | "background": { 16 | "scripts": ["resources/js/jquery/jquery-1.9.1.min.js", "resources/js/tmtools/background.js"] 17 | }, 18 | 19 | "content_security_policy": "script-src 'self' https://ssl.google-analytics.com; object-src 'self'", 20 | 21 | "permissions": [ 22 | "storage" 23 | ], 24 | 25 | "content_scripts": [ 26 | { 27 | "matches": ["https://terra.snellman.net/*"], 28 | "js": ["resources/js/jquery/jquery-1.9.1.min.js", "resources/js/tmtools/content.js", "resources/js/canvasjs/canvasjs.min.js"], 29 | "css": ["resources/css/snellman.css"] 30 | } 31 | ] 32 | } -------------------------------------------------------------------------------- /resources/js/tmtools/analytics.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 | // Use of this source code is governed by a BSD-style license that can be 3 | // found in the LICENSE file. 4 | /** 5 | * Add your Analytics tracking ID here. 6 | */ 7 | //var _AnalyticsCode = 'UA-86751916-1'; //For Web Store tracking 8 | var _AnalyticsCode = 'UA-86751916-2'; //For Dev Mode tracking 9 | 10 | /** 11 | * Below is a modified version of the Google Analytics asynchronous tracking 12 | * code snippet. It has been modified to pull the HTTPS version of ga.js 13 | * instead of the default HTTP version. It is recommended that you use this 14 | * snippet instead of the standard tracking snippet provided when setting up 15 | * a Google Analytics account. 16 | */ 17 | var _gaq = _gaq || []; 18 | _gaq.push(['_setAccount', _AnalyticsCode]); 19 | _gaq.push(['_trackPageview']); 20 | 21 | function trackClick(e) { 22 | _gaq.push(['_trackEvent', e.target.id, 'clicked']); 23 | }; 24 | 25 | function trackHover(e) { 26 | _gaq.push(['_trackEvent', e.target.id, 'hover']); 27 | }; 28 | 29 | (function() { 30 | var ga = document.createElement('script'); 31 | ga.type = 'text/javascript'; 32 | ga.async = true; 33 | ga.src = 'https://ssl.google-analytics.com/ga.js'; 34 | var s = document.getElementsByTagName('script')[0]; 35 | s.parentNode.insertBefore(ga, s); 36 | 37 | document.getElementById('playLink').addEventListener('click', trackClick); 38 | 39 | document.getElementById('helpOptions').addEventListener('mouseover', trackHover); 40 | document.getElementById('helpFilterBySite').addEventListener('mouseover', trackHover); 41 | document.getElementById('helpFilterByPlayer').addEventListener('mouseover', trackHover); 42 | 43 | document.getElementById('donateLink').addEventListener('click', trackClick); 44 | document.getElementById('donateLink').addEventListener('mouseover', trackHover); 45 | })(); -------------------------------------------------------------------------------- /resources/css/style.css: -------------------------------------------------------------------------------- 1 | body { 2 | overflow: hidden; 3 | margin: 0px; 4 | padding: 0px; 5 | background: white; 6 | width: 800px; 7 | } 8 | 9 | .options { 10 | width: 640px; 11 | float: left; 12 | height: 40px; 13 | } 14 | 15 | .label-sound-update { 16 | margin: 2px; 17 | } 18 | 19 | .label-sound-update input { 20 | width:29px; 21 | } 22 | 23 | .label-sound-update span{ 24 | margin-left:2px; 25 | } 26 | 27 | .filter { 28 | height: 30px; 29 | } 30 | 31 | #playerName { 32 | width: 80px; 33 | } 34 | 35 | .play { 36 | width: 108px; 37 | height: 40px; 38 | float: left; 39 | } 40 | 41 | .play a { 42 | margin-left: 28px; 43 | } 44 | 45 | .factions { 46 | float: right; 47 | display: inline-block; 48 | } 49 | 50 | .factions div { 51 | cursor: pointer; 52 | text-align: center; 53 | padding: 1px 3px; 54 | font-family: sans-serif; 55 | font-size: 1em; 56 | width: 100px; 57 | margin-top: 1px; 58 | border: 1px solid black; 59 | } 60 | 61 | .factions div:first-child { 62 | margin-top: 0px; 63 | } 64 | 65 | .factions div:hover { 66 | text-decoration: underline; 67 | } 68 | 69 | .factions label { 70 | margin: 10px; 71 | } 72 | 73 | .statistics { 74 | width: 640px; 75 | height: 432px; 76 | float: left; 77 | } 78 | 79 | .statistics #chartContainer { 80 | height: 340px; 81 | width: 100%; 82 | } 83 | 84 | .statistics span{ 85 | display: block; 86 | visibility: hidden; 87 | } 88 | 89 | .red { 90 | color: rgb(0, 0, 0); background-color: rgb(240, 128, 128); 91 | } 92 | 93 | .black { 94 | color: rgb(192, 192, 192); background-color: rgb(64, 64, 64); 95 | } 96 | 97 | .green { 98 | color: rgb(0, 0, 0); background-color: rgb(128, 240, 128); 99 | } 100 | 101 | .yellow { 102 | color: rgb(0, 0, 0); background-color: rgb(240, 240, 128); 103 | } 104 | 105 | .brown { 106 | color: rgb(0, 0, 0); background-color: rgb(176, 128, 64); 107 | } 108 | 109 | .gray { 110 | color: rgb(0, 0, 0); background-color: rgb(192, 192, 192); 111 | } 112 | 113 | .blue { 114 | color: rgb(0, 0, 0); background-color: rgb(96, 192, 240); 115 | } 116 | 117 | .orange{ 118 | color: rgb(0, 0, 0); background-color: rgb(240, 192, 96); 119 | } 120 | 121 | .white{ 122 | color: rgb(0, 0, 0); background-color: rgb(224, 240, 255); 123 | } 124 | 125 | .neutral{ 126 | color: rgb(0, 0, 0); background-color: rgb(255, 235, 205); 127 | } 128 | 129 | .transparent { 130 | color: inherit; 131 | } 132 | 133 | input[type=checkbox]{ 134 | position:relative; 135 | top:2px 136 | } 137 | 138 | .footer a { 139 | font-size: 10px; 140 | } -------------------------------------------------------------------------------- /resources/js/tmtools/background.js: -------------------------------------------------------------------------------- 1 | function loadCounter(){ 2 | chrome.storage.local.get('token', function (result) { 3 | if (result.token) { 4 | getCounter(result.token); 5 | } else { 6 | chrome.tabs.query({"active": true}, function(tabs) { 7 | var tabId = tabs[0].id; 8 | chrome.tabs.sendMessage(tabId, {type: 'csrf-token'}, getCounter); 9 | }); 10 | } 11 | }); 12 | } 13 | 14 | var audio; 15 | function getCounter(token) 16 | { 17 | if(token){ 18 | chrome.storage.local.set({'token': token}); 19 | } else { 20 | return; 21 | } 22 | 23 | $.ajax({ 24 | type: 'GET', 25 | url: "https://terra.snellman.net/app/list-games?mode=user&status=running&csrf-token=" + token, 26 | success: function(jsonObj) 27 | { 28 | var count = 0; 29 | var link = "https://terra.snellman.net"; 30 | var games = jsonObj.games; 31 | chrome.storage.local.get('alert', function (result) { 32 | for (var i = 0; i < games.length; i++){ 33 | if(games[i].action_required == 1 || games[i].unread_chat_messages > 0){ 34 | count += 1; 35 | if(count == 1){ 36 | link += games[i].link; 37 | if(!audio) { 38 | audio = new Audio("resources/sound/alert.mp3"); 39 | } 40 | if(result.alert == undefined || result.alert){ 41 | audio.play(); 42 | } 43 | } 44 | } 45 | } 46 | 47 | if(audio && count == 0){ 48 | audio.pause(); 49 | } 50 | chrome.storage.local.set({'playLink': link }); 51 | chrome.browserAction.setBadgeText({text: count.toString()}); 52 | }); 53 | }, 54 | error: function(data) { 55 | console.log("Error getting games. " + data); 56 | chrome.browserAction.setBadgeText({text: 'Error'}); 57 | chrome.storage.local.remove("token"); 58 | } 59 | }); 60 | } 61 | 62 | var alertInterval; 63 | function updateSound(){ 64 | if(alertInterval) { 65 | clearInterval(alertInterval); 66 | } 67 | chrome.storage.local.get('soundUpdate', function (result) { 68 | var soundUpdate = (result.soundUpdate == undefined ? 30 : result.soundUpdate); 69 | alertInterval = setInterval(function(){ loadCounter(); }, parseInt(soundUpdate) * 1000); 70 | }); 71 | } 72 | 73 | chrome.extension.onMessage.addListener( 74 | function(request, sender, sendResponse) { 75 | switch (request.directive) { 76 | case "popup-click": 77 | if(audio && request.stopSound){ 78 | audio.pause(); 79 | } 80 | sendResponse({}); 81 | break; 82 | case "update-sound": 83 | updateSound(); 84 | sendResponse({}); 85 | break; 86 | default: 87 | alert("Unmatched request of '" + request + "' from script to background.js from " + sender); 88 | } 89 | } 90 | ); 91 | 92 | $(document).ready(function() { 93 | chrome.browserAction.setBadgeText({text: "..."}); 94 | updateSound(); 95 | }); -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # TMTools 2 | 3 | **TMTools** is a helpfull chrome extension for Snellman's Terra Mystica moderator [website](http://terra.snellman.net). Its is designed to provide some features which are still not implemented on original website like more sound alerts and more flexible filters. Also provides some graphs and statistics to help newcomers evaluate their overall improvement on the game. If you have suggestions, doubts or other stuff just contact [me](https://github.com/rafalimaz) 4 | 5 | ### Motivation 6 | 7 | The main motivation for building this extension was the need to improve my gameplay. I started to see games from best players of the site and one day I saw a very interesting game from the known great player [Xevoc](http://terra.snellman.net/player/Xevoc), the [Petri20](http://terra.snellman.net/game/Petri20). In this game he crossed the 200VP barrier and for me that was the best that I could reach. As my objective was study only his moves I created a simple script (javascript) to filter the log. So that helped me a lot to improve my overall gameplay with [Engineers](http://www.terra-mystica-spiel.de/en/voelker.php?show=8) (I went from an average of 110VP to a respectable 174VP on a 3 player [game](http://terra.snellman.net/game/TheInvestors)) 8 | 9 | ### Installation 10 | 11 | ##### Chrome Web Store 12 | 13 | In order to use TMTools just install the extension from [Chrome Web Store](https://chrome.google.com/webstore/detail/tm-tools/jandhnpfekgdcklcgfcljmijgbgnchni) 14 | 15 | ##### Development Mode 16 | 17 | It is possible to use TMTools without install the extension through Chrome Web Store. It is only need to download TMTools zip [Last Release] (https://api.github.com/repos/rafalimaz/tmtools/zipball) and do the steps as follows: 18 | 19 | 1. Extract the contents somewhere 20 | 2. In Chrome, open [extensions](chrome://extensions/) `chrome://extensions/` 21 | 3. Click + Developer mode 22 | 4. Click Load unpacked extension… 23 | 5. Navigate to the extracted folder and click OK `..\TMTools-{version}\TMTools-{version}` 24 | 6. Log into Terra Mystica [website](http://terra.snellman.net) `http://terra.snellman.net/` 25 | 7. An active games counter should appear on browser 26 | 27 | ### Main features 28 | 29 | #### Main page 30 | * The main page of the extension has all features and links. It was designed that way to make easily find features and settings. It can be seen on the following picture: 31 | 32 | ![ScreenShot](https://github.com/rafalimaz/TMTools/blob/master/screenshots/2_mainPage.png) 33 | 34 | #### Filter games and graphics 35 | * **By player**: User should open the extension, provide a player name and click on some faction. It will show match data on a graph. 36 | 37 | ![ScreenShot](https://github.com/rafalimaz/TMTools/blob/master/screenshots/4_filterByPlayer.png) 38 | 39 | * **By site** (finished games): User should open a finished games page of some player that shows a list with all games played. After this, the user should open the extension. By clicking on a faction it will filter that list showing only games for this specific faction. Also a graph is showed with these games. 40 | 41 | ![ScreenShot](https://github.com/rafalimaz/TMTools/blob/master/screenshots/6_filterBySiteFinished.png) 42 | 43 | * **By site** (game log): User should open a game (active or finished). After this, the user should open the extension. By clicking on a faction that is current in play it will filter the log showing only moves from that faction. Also a graph is showed with these moves and score history for that faction. 44 | 45 | ![ScreenShot](https://github.com/rafalimaz/TMTools/blob/master/screenshots/7_filterBySiteGame.png) 46 | 47 | #### Browser Notification 48 | * A **counter** of the games which it is the player's turn appears on the extension browser button. Also there is a **go to site** link that opens the first opened game for the player. 49 | 50 | ![ScreenShot](https://github.com/rafalimaz/TMTools/blob/master/screenshots/1_browseButton.png) 51 | 52 | #### Sound Alert 53 | * If enabled, a **sound alert** will play every time there are some games which is the player's turn according to the update rate set (default is 30 seconds). 54 | 55 | ### Known Issues 56 | * If user removes (unpacked) source files after installing the plugin, Chrome disables the plugin because the manifest file becomes unavailable. Users should keep source files. Thanks [Konush](http://terra.snellman.net/player/konush) 57 | 58 | ### Changelog 59 | 60 | ##### 1.0.6 Last Moves (2017-09-15) 61 | * Added last moves to game page 62 | * Some fixes on graphs (max and min value) 63 | * Added help icons and improved tooltips 64 | 65 | ##### 1.0.5 Filter games by opponent (2016-11-09) 66 | * Fixed a bug on replay feature 67 | 68 | ##### 1.0.4 Filter games by opponent (2016-11-09) 69 | * Added markers representing rounds and win/lose on graphs 70 | * Added opponent' filter on profile user page 71 | * Added first and last links to replay area 72 | * Improvements on replay feature 73 | 74 | ##### 1.0.3 Filter by faction on replay (2016-11-02) 75 | * Added replay filter by faction 76 | * Added paypal donate button 77 | * Added analytics tracking code for developer mode 78 | * Added analytics support 79 | * Added TMTools to Chrome Web Store 80 | 81 | ##### 1.0.2 Replay Improvement (2016-11-01) 82 | * Added more info on replay area as suggested by ttchong 83 | * Fixed a bug on counter caused by chrome API update 84 | 85 | ##### 1.0.1 Fix on counter (2015-12-31) 86 | * Fixed bug on counter reported by CTKShadow 87 | 88 | ##### 1.0 Replay function (2015-01-22) 89 | * Added replay feature with prev/next buttons 90 | 91 | ##### 0.9 Initial version (2015-01-19) 92 | * Added main features like counter, filters, graphs and sound alert 93 | 94 | ### Useful Links 95 | * [BGG Discussion](http://boardgamegeek.com/thread/1305425/tmtools-chrome-extension-snellman-site) 96 | * [Snellman's website](http://terra.snellman.net) 97 | * [TM AI](http://lodev.org/tmai/) 98 | * [Terra Mystica Strategy Guide](http://boardgamegeek.com/filepage/104541/terra-mystica-strategy-reference-guide) 99 | 100 | 101 | ### Credits 102 | Terra Mystica is a trademark of [Feuerland Spiele](http://www.feuerland-spiele.de/en/). Terra Mystica website was created by [Juho Snellman](https://www.snellman.net/). TMTools extension was created by [Rafael de Lima](https://github.com/rafalimaz) 103 | 104 | 105 | 106 | 107 | 108 | 109 | -------------------------------------------------------------------------------- /main.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | TM Tools 5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | Enable Options 13 | 17 | 18 | 21 | 25 | 29 | 33 |
34 |
35 | Play 36 | Go to site 37 |
38 |
39 | Factions 40 |
Acolytes
41 |
Alchemists
42 |
Auren
43 |
Chaos Magicians
44 |
Cultists
45 |
Darklings
46 |
Dragonlords
47 |
Dwarves
48 |
Engineers
49 |
Fakirs
50 |
Giants
51 |
Halflings
52 |
Ice Maidens
53 |
Mermaids
54 |
Nomads
55 |
Shapeshifters
56 |
Swarmlings
57 |
Witches
58 |
Riverwalkers
59 |
Yetis
60 |
All
61 | 62 |
63 |
64 | Statistics 65 |
66 | 71 | 72 | 77 | 78 | 79 |
80 |
81 |
82 | One Leech: 83 | Multiple Leech: 84 | 93 |
94 |
98 | 99 | 100 | 101 | 102 |
103 |
104 |
105 | 106 | 107 | 108 | -------------------------------------------------------------------------------- /resources/js/tmtools/main.js: -------------------------------------------------------------------------------- 1 | var blue = "rgb(96, 192, 240)"; 2 | var red = "rgb(240, 128, 128)"; 3 | var green = "rgb(128, 240, 128)"; 4 | var yellow = "rgb(240, 240, 128)"; 5 | var black = "rgb(64, 64, 64)"; 6 | var brown = "rgb(176, 128, 64)"; 7 | var gray = "rgb(192, 192, 192)"; 8 | var white = "rgb(224, 240, 255)"; 9 | var orange = "rgb(240, 192, 96)"; 10 | var transparent = "rgb(255, 235, 205)"; 11 | 12 | var fontDark = "rgb(192, 192, 192)"; 13 | var fontLight = "rgb(0, 0, 0)"; 14 | 15 | 16 | function Faction(name, color) { 17 | this.name = name; 18 | this.color = color; 19 | this.font = color === black ? fontDark : fontLight; 20 | } 21 | 22 | var factions = { 23 | alchemists: new Faction("Alchemists", black), 24 | auren: new Faction("Auren", green), 25 | chaosmagicians: new Faction("Chaos Magicians", red), 26 | cultists: new Faction("Cultists", brown), 27 | darklings: new Faction("Darklings", black), 28 | dwarves: new Faction("Dwarves", gray), 29 | engineers: new Faction("Engineers", gray), 30 | fakirs: new Faction("Fakirs", yellow), 31 | giants: new Faction("Giants", red), 32 | halflings: new Faction("Halflings", brown), 33 | mermaids: new Faction("Mermaids", blue), 34 | nomads: new Faction("Nomads", yellow), 35 | swarmlings: new Faction("Swarmlings", blue), 36 | witches: new Faction("Witches", green), 37 | acolytes: new Faction("Acolytes", orange), 38 | dragonlords: new Faction("Dragonlords", orange), 39 | icemaidens: new Faction("Ice Maidens", white), 40 | yetis: new Faction("Yetis", white), 41 | riverwalkers: new Faction("Riverwalkers", transparent), 42 | shapeshifters: new Faction("Shapeshifters", transparent), 43 | all: new Faction("All", blue), 44 | } 45 | 46 | document.addEventListener('DOMContentLoaded', function () { 47 | }); 48 | 49 | function soundAlertClick(e){ 50 | var checked = document.querySelector('#soundAlert').checked; 51 | chrome.storage.local.set({'alert': checked}); 52 | chrome.extension.sendMessage({directive: "popup-click" , stopSound: !checked }, function(response) { }); 53 | $('#soundUpdate').prop("disabled", !checked); 54 | } 55 | 56 | function replayEnabledClick(e){ 57 | var checked = document.querySelector('#replayEnabled').checked; 58 | chrome.storage.local.set({'replay': checked}); 59 | } 60 | 61 | function opponentsFilterClick(e){ 62 | var checked = document.querySelector('#cbxOpponentsFilter').checked; 63 | chrome.storage.local.set({'opponentsFilter': checked}); 64 | } 65 | 66 | function lastMovesClick(e){ 67 | var checked = document.querySelector('#cbxLastMoves').checked; 68 | chrome.storage.local.set({'lastMoves': checked}); 69 | } 70 | 71 | function playLinkClick(e) { 72 | chrome.extension.sendMessage({directive: "popup-click", stopSound: true}, function(response) { }); 73 | } 74 | 75 | function playerNameFocusOut(e) { 76 | var playerName = document.querySelector('#playerName').value; 77 | chrome.storage.local.set({'playerName': playerName}); 78 | } 79 | 80 | function soundUpdateFocusOut(e) { 81 | var soundUpdate = document.querySelector('#soundUpdate').value; 82 | if (validateSoundUpdate(soundUpdate)) { 83 | chrome.storage.local.set({'soundUpdate': soundUpdate}); 84 | chrome.extension.sendMessage({directive: "update-sound", stopSound: false}, function(response) { }); 85 | } else { 86 | chrome.storage.local.get('soundUpdate', function (result) { 87 | document.querySelector('#soundUpdate').value = (result.soundUpdate == undefined ? 30 : result.soundUpdate); 88 | }); 89 | } 90 | } 91 | 92 | function validateSoundUpdate(soundUpdate) { 93 | if (isNaN(parseInt(soundUpdate))) { 94 | alert("Update rate must be an integer."); 95 | return false; 96 | } 97 | 98 | if (parseInt(soundUpdate) < 30) { 99 | alert("Update rate must be at least 30s."); 100 | return false; 101 | } 102 | 103 | return true; 104 | } 105 | 106 | function factionClick(e) { 107 | chrome.tabs.getSelected(null, function(tab){ 108 | var type = document.querySelector('#byPlayer').checked ? "player" : "popup"; 109 | var player = document.querySelector('#playerName').value; 110 | chrome.tabs.sendMessage(tab.id,{type: type, faction: e.target.id, sameLine: document.querySelector('#sameLine').checked, player: player}, loadChart); 111 | chrome.browserAction.setBadgeText({text: e.target.id == "All" ? "All" : e.target.id.charAt(0).toUpperCase()}); 112 | }); 113 | } 114 | 115 | var round; 116 | function loadChart(chartData) { 117 | var factionData = chartData.data; 118 | var isLedger = chartData.ledger; 119 | var data = []; 120 | var all = false; 121 | 122 | if(chartData.oneLeech){ 123 | document.querySelector("#oneLeech").innerHTML = chartData.oneLeech; 124 | document.querySelector("#oneLeechSpan").style.visibility = "visible"; 125 | } else { 126 | document.querySelector("#oneLeechSpan").style.visibility = "hidden"; 127 | } 128 | 129 | if(chartData.multLeech){ 130 | document.querySelector("#multLeech").innerHTML = chartData.multLeech; 131 | document.querySelector("#multLeechSpan").style.visibility = "visible" ; 132 | } else { 133 | document.querySelector("#multLeechSpan").style.visibility = "hidden"; 134 | } 135 | 136 | var maxScore = 0; 137 | var minScore = 9999; 138 | for (var key in factionData) { 139 | if (factionData.hasOwnProperty(key)) { 140 | var dataPoints = []; 141 | var score; 142 | for(var i = 0; i < factionData[key].length; i++){ 143 | score = parseInt(factionData[key][i].score); 144 | maxScore = score > maxScore ? score : maxScore; 145 | minScore = score < minScore ? score : minScore; 146 | var marker = isLedger ? getRoundMarker(factionData[key][i].game, factions[key].color) : getPositionMarker(factionData[key][i].position, factions[key].color); 147 | dataPoints.push({ 148 | x: i+1, 149 | y: score, 150 | indexLabel: isLedger ? marker.label : factionData[key][i].position, 151 | color: factions[key].color, 152 | toolTipContent: "Game: " + factionData[key][i].game + "
VP: {y}
" + 153 | (isLedger ? factionData[key][i].action : "Position: {indexLabel}") + "
Faction: " + factions[key].name, 154 | markerType: marker.type, 155 | markerColor: marker.color, 156 | markerSize: marker.size 157 | }); 158 | } 159 | round = null; 160 | data.push({ 161 | type: "spline", 162 | showInLegend: true, 163 | name: factions[key].name, 164 | color: factions[key].color, 165 | dataPoints: dataPoints, 166 | indexLabelFontSize: 13 167 | }); 168 | if(key == "all"){ 169 | all = true; 170 | } 171 | } 172 | } 173 | var maximum = Math.ceil((maxScore+1)/20)*20; 174 | var minimum = Math.ceil(minScore/20)*20; 175 | chart = new CanvasJS.Chart("chartContainer", { 176 | animationEnabled: true, 177 | creditHref: "", 178 | creditText: "", 179 | exportEnabled: true, 180 | title:{ 181 | text: "Score History", 182 | fontFamily: "sans-serif", 183 | fontSize: 16, 184 | fontWeight: "normal" 185 | }, 186 | axisX:{ 187 | interval: isLedger ? 10 : (all ? 20 : 1) 188 | }, 189 | axisY:{ 190 | interval: 20, 191 | maximum: maximum, 192 | minimum: isLedger ? 0 : (minScore > 0 ? minimum - 20 : 0) 193 | }, 194 | data: data 195 | }); 196 | chart.render(); 197 | } 198 | 199 | function getRoundMarker(nextRound, color) { 200 | if (nextRound != round) { 201 | round = nextRound; 202 | return { type: "circle", color: color, size: 10, label: nextRound}; 203 | } 204 | return { type: "", color: "", size: "", label: ""}; 205 | } 206 | 207 | function getPositionMarker(position, color) { 208 | if (position == 1) { 209 | return { type: "triangle", color: "green", size: 10, label: position}; 210 | } 211 | return { type: "cross", color: "red", size: "8", label: position}; 212 | } 213 | 214 | $(document).ready(function(){ 215 | chrome.storage.local.get('playLink', function (result) { 216 | $('#playLink').attr("href", result.playLink == undefined ? "" : result.playLink); 217 | }); 218 | 219 | chrome.storage.local.get('playerName', function (result) { 220 | $('#playerName').val(result.playerName == undefined ? "" : result.playerName); 221 | }); 222 | 223 | chrome.storage.local.get('soundUpdate', function (result) { 224 | $('#soundUpdate').val(result.soundUpdate == undefined ? 30 : result.soundUpdate); 225 | }); 226 | 227 | chrome.storage.local.get('filter', function (result) { 228 | var value = (result.filter == undefined ? "bySite" : result.filter); 229 | $('input:radio[name=filter]').filter('[value=' + value + ']').prop('checked', true); 230 | $('#playerName').prop("disabled", value == "bySite"); 231 | }); 232 | 233 | chrome.storage.local.get('alert', function (result) { 234 | var alert = (result.alert == undefined ? true : result.alert); 235 | $('#soundAlert').prop('checked', alert); 236 | $('#soundUpdate').prop("disabled", !alert); 237 | }); 238 | 239 | chrome.storage.local.get('replay', function (result) { 240 | $('#replayEnabled').prop('checked', result.replay == undefined ? true : result.replay); 241 | }); 242 | 243 | chrome.storage.local.get('opponentsFilter', function (result) { 244 | $('#cbxOpponentsFilter').prop('checked', result.opponentsFilter == undefined ? true : result.opponentsFilter); 245 | }); 246 | 247 | chrome.storage.local.get('lastMoves', function (result) { 248 | $('#cbxLastMoves').prop('checked', result.lastMoves == undefined ? true : result.lastMoves); 249 | }); 250 | 251 | $("#byPlayer").change(function(){ 252 | $('#playerName').prop("disabled", false); 253 | chrome.storage.local.set({'filter': "byPlayer" }); 254 | }); 255 | 256 | $("#bySite").change(function(){ 257 | $('#playerName').prop("disabled", true); 258 | chrome.storage.local.set({'filter': "bySite" }); 259 | }); 260 | 261 | var divs = document.querySelectorAll('.factions div'); 262 | for (var i = 0; i < divs.length; i++) { 263 | divs[i].addEventListener('click', factionClick); 264 | } 265 | 266 | document.getElementById('playLink').addEventListener('click', playLinkClick); 267 | document.getElementById('playerName').addEventListener('focusout', playerNameFocusOut); 268 | document.getElementById('soundAlert').addEventListener('click', soundAlertClick); 269 | document.getElementById('soundUpdate').addEventListener('focusout', soundUpdateFocusOut); 270 | document.getElementById('replayEnabled').addEventListener('click', replayEnabledClick); 271 | document.getElementById('cbxOpponentsFilter').addEventListener('click', opponentsFilterClick); 272 | document.getElementById('cbxLastMoves').addEventListener('click', lastMovesClick); 273 | }); -------------------------------------------------------------------------------- /privacy_policy.md: -------------------------------------------------------------------------------- 1 | 2 |

Privacy Policy

3 |

Last updated: April 12, 2022

4 |

This Privacy Policy describes Our policies and procedures on the collection, use and disclosure of Your information when You use the Service and tells You about Your privacy rights and how the law protects You.

5 |

We use Your Personal data to provide and improve the Service. By using the Service, You agree to the collection and use of information in accordance with this Privacy Policy. This Privacy Policy has been created with the help of the Privacy Policy Template.

6 |

Interpretation and Definitions

7 |

Interpretation

8 |

The words of which the initial letter is capitalized have meanings defined under the following conditions. The following definitions shall have the same meaning regardless of whether they appear in singular or in plural.

9 |

Definitions

10 |

For the purposes of this Privacy Policy:

11 | 46 |

Collecting and Using Your Personal Data

47 |

Types of Data Collected

48 |

Personal Data

49 |

While using Our Service, We may ask You to provide Us with certain personally identifiable information that can be used to contact or identify You. Personally identifiable information may include, but is not limited to:

50 | 53 |

Usage Data

54 |

Usage Data is collected automatically when using the Service.

55 |

Usage Data may include information such as Your Device's Internet Protocol address (e.g. IP address), browser type, browser version, the pages of our Service that You visit, the time and date of Your visit, the time spent on those pages, unique device identifiers and other diagnostic data.

56 |

When You access the Service by or through a mobile device, We may collect certain information automatically, including, but not limited to, the type of mobile device You use, Your mobile device unique ID, the IP address of Your mobile device, Your mobile operating system, the type of mobile Internet browser You use, unique device identifiers and other diagnostic data.

57 |

We may also collect information that Your browser sends whenever You visit our Service or when You access the Service by or through a mobile device.

58 |

Tracking Technologies and Cookies

59 |

We use Cookies and similar tracking technologies to track the activity on Our Service and store certain information. Tracking technologies used are beacons, tags, and scripts to collect and track information and to improve and analyze Our Service. The technologies We use may include:

60 | 65 |

Cookies can be "Persistent" or "Session" Cookies. Persistent Cookies remain on Your personal computer or mobile device when You go offline, while Session Cookies are deleted as soon as You close Your web browser. Learn more about cookies: Cookies by PrivacyPolicies Generator.

66 |

We use both Session and Persistent Cookies for the purposes set out below:

67 | 87 |

For more information about the cookies we use and your choices regarding cookies, please visit our Cookies Policy or the Cookies section of our Privacy Policy.

88 |

Use of Your Personal Data

89 |

The Company may use Personal Data for the following purposes:

90 | 116 |

We may share Your personal information in the following situations:

117 | 125 |

Retention of Your Personal Data

126 |

The Company will retain Your Personal Data only for as long as is necessary for the purposes set out in this Privacy Policy. We will retain and use Your Personal Data to the extent necessary to comply with our legal obligations (for example, if we are required to retain your data to comply with applicable laws), resolve disputes, and enforce our legal agreements and policies.

127 |

The Company will also retain Usage Data for internal analysis purposes. Usage Data is generally retained for a shorter period of time, except when this data is used to strengthen the security or to improve the functionality of Our Service, or We are legally obligated to retain this data for longer time periods.

128 |

Transfer of Your Personal Data

129 |

Your information, including Personal Data, is processed at the Company's operating offices and in any other places where the parties involved in the processing are located. It means that this information may be transferred to — and maintained on — computers located outside of Your state, province, country or other governmental jurisdiction where the data protection laws may differ than those from Your jurisdiction.

130 |

Your consent to this Privacy Policy followed by Your submission of such information represents Your agreement to that transfer.

131 |

The Company will take all steps reasonably necessary to ensure that Your data is treated securely and in accordance with this Privacy Policy and no transfer of Your Personal Data will take place to an organization or a country unless there are adequate controls in place including the security of Your data and other personal information.

132 |

Disclosure of Your Personal Data

133 |

Business Transactions

134 |

If the Company is involved in a merger, acquisition or asset sale, Your Personal Data may be transferred. We will provide notice before Your Personal Data is transferred and becomes subject to a different Privacy Policy.

135 |

Law enforcement

136 |

Under certain circumstances, the Company may be required to disclose Your Personal Data if required to do so by law or in response to valid requests by public authorities (e.g. a court or a government agency).

137 |

Other legal requirements

138 |

The Company may disclose Your Personal Data in the good faith belief that such action is necessary to:

139 | 146 |

Security of Your Personal Data

147 |

The security of Your Personal Data is important to Us, but remember that no method of transmission over the Internet, or method of electronic storage is 100% secure. While We strive to use commercially acceptable means to protect Your Personal Data, We cannot guarantee its absolute security.

148 |

Children's Privacy

149 |

Our Service does not address anyone under the age of 13. We do not knowingly collect personally identifiable information from anyone under the age of 13. If You are a parent or guardian and You are aware that Your child has provided Us with Personal Data, please contact Us. If We become aware that We have collected Personal Data from anyone under the age of 13 without verification of parental consent, We take steps to remove that information from Our servers.

150 |

If We need to rely on consent as a legal basis for processing Your information and Your country requires consent from a parent, We may require Your parent's consent before We collect and use that information.

151 |

Links to Other Websites

152 |

Our Service may contain links to other websites that are not operated by Us. If You click on a third party link, You will be directed to that third party's site. We strongly advise You to review the Privacy Policy of every site You visit.

153 |

We have no control over and assume no responsibility for the content, privacy policies or practices of any third party sites or services.

154 |

Changes to this Privacy Policy

155 |

We may update Our Privacy Policy from time to time. We will notify You of any changes by posting the new Privacy Policy on this page.

156 |

We will let You know via email and/or a prominent notice on Our Service, prior to the change becoming effective and update the "Last updated" date at the top of this Privacy Policy.

157 |

You are advised to review this Privacy Policy periodically for any changes. Changes to this Privacy Policy are effective when they are posted on this page.

158 |

Contact Us

159 |

If you have any questions about this Privacy Policy, You can contact us:

160 | 163 | 164 | -------------------------------------------------------------------------------- /resources/js/tmtools/content.js: -------------------------------------------------------------------------------- 1 | chrome.runtime.onMessage.addListener(function(message, sender, sendResponse) { 2 | switch(message.type) { 3 | case "popup": 4 | var gameData = getGameData(message); 5 | sendResponse(gameData); 6 | break; 7 | case "csrf-token": 8 | sendResponse(getCSRFToken()); 9 | break; 10 | case "player": 11 | getGamesInfo(message, sendResponse); 12 | break; 13 | } 14 | return true; 15 | }); 16 | 17 | function listGames(player, callback) { 18 | loadData('token', function (result) { 19 | var token; 20 | if(!result.token){ 21 | token = getCSRFToken(); 22 | if(!token) { 23 | alert("Error getting games. Token invalid"); 24 | return; 25 | } 26 | } 27 | 28 | $.ajax({ 29 | type: 'POST', 30 | url: "https://terra.snellman.net/app/list-games", 31 | data: { 32 | "mode": "other-user", 33 | "status": "finished", 34 | "args": player, 35 | "csrf-token": token 36 | }, 37 | success: function(jsonObj) 38 | { 39 | if (callback) { 40 | callback(jsonObj); 41 | } 42 | } 43 | }); 44 | }); 45 | } 46 | 47 | function getGamesInfo(message, sendResponse){ 48 | var callback = function(jsonObj) { 49 | var factionData = {}; 50 | var ledger; 51 | var oneLeech = 0; 52 | var multLeech = 0; 53 | var games = jsonObj.games; 54 | var sameLine = message.faction == "all" ? message.sameLine : false; 55 | for (var i = 0; i < games.length; i++) { 56 | var match = games[i].role == message.faction || message.faction == "all"; 57 | if (match && games[i].role.indexOf("player") == -1){ 58 | var faction = sameLine ? "all" : games[i].role; 59 | if(!factionData[faction]){ 60 | factionData[faction] = []; 61 | } 62 | if(games[i].aborted == 0){ 63 | factionData[faction].push({score: games[i].vp.toString(), position: games[i].rank.toString(), game: games[i].id, gameLink: 'https://terra.snellman.net' + games[i].link, dropped: games[i].dropped != 0}); 64 | } 65 | } 66 | } 67 | 68 | for (var key in factionData) { 69 | if (factionData.hasOwnProperty(key)) { 70 | factionData[key].reverse(); 71 | } 72 | } 73 | sendResponse({data: factionData, ledger: ledger != undefined, oneLeech: oneLeech, multLeech: multLeech}); 74 | } 75 | 76 | listGames(message.player, callback); 77 | } 78 | 79 | function getCSRFToken() { 80 | var match = document.cookie.match(/csrf-token=([^ ;]+)/); 81 | if (match) { 82 | return match[1]; 83 | } else { 84 | return undefined; 85 | } 86 | } 87 | 88 | function getGameData(message){ 89 | var lines = []; 90 | var ledger = document.querySelector('#ledger'); 91 | var your_finished = document.querySelector('#yourgames-finished'); 92 | var player_finished = document.querySelector('#games-finished'); 93 | var sameLine = message.faction == "all" ? message.sameLine : false; 94 | if(ledger){ 95 | var button = document.querySelectorAll('#ledger button')[0]; 96 | if(button){ 97 | button.click(); 98 | } 99 | lines = document.querySelectorAll('#ledger tr'); 100 | } else if(your_finished){ 101 | lines = document.querySelectorAll('#yourgames-finished tr'); 102 | } else if(player_finished){ 103 | lines = document.querySelectorAll('#games-finished tr'); 104 | } 105 | 106 | var factionData = {}; 107 | if(lines.length < 2) { 108 | alert("There are no games to be filtered. Please open a game or load finished games of some player."); 109 | } else { 110 | lines[0].scrollIntoView(); 111 | var lastRoundLine = lines[0]; 112 | var maxMoves = 0; 113 | var oneLeech = 0; 114 | var multLeech = 0; 115 | for(var i=0; i minRow; i--) { 275 | if (ledger[i].faction == chosen) { 276 | prevRow = i; 277 | faction = chosen; 278 | break; 279 | } 280 | } 281 | 282 | nextRow = maxRow; 283 | for (var i = row + 1; i < maxRow; i++) { 284 | if (ledger[i].faction == chosen) { 285 | nextRow = i; 286 | faction = chosen; 287 | break; 288 | } 289 | } 290 | } 291 | 292 | var urlParts = url.split("="); 293 | if (url.indexOf("max-row") != -1) { 294 | row = parseInt(urlParts[1]); 295 | hrefFirst = urlParts[0] + "=" + minRow; 296 | hrefPrev = urlParts[0] + "=" + (prevRow ? prevRow : Math.max((row - 1), minRow)); 297 | hrefNext = urlParts[0] + "=" + (nextRow ? nextRow : Math.min((row + 1), maxRow)); 298 | hrefLast = urlParts[0] + "=" + maxRow; 299 | } else { 300 | hrefFirst = url + "/max-row=" + minRow; 301 | hrefPrev = url + "/max-row=" + Math.max((maxRow - 1), minRow); 302 | hrefNext = hrefLast = url + "/max-row=" + maxRow; 303 | } 304 | 305 | var jsInitChecktimer = setInterval(checkForJS_Finish, 500); 306 | function checkForJS_Finish () { 307 | var lastLogTD; 308 | if (("#ledger") != undefined) { 309 | if (faction != null) { 310 | if (lastRowIndex == null) { 311 | lastLogTD = $("#ledger td:first-child:contains('" + faction + "')").last().parent().html(); 312 | } else { 313 | lastLogTD = $("#ledger tr:lt('" + lastRowIndex + "') td:first-child:contains('" + faction + "')").last().parent().html(); 314 | } 315 | if (lastLogTD == undefined) { 316 | lastLogTD = "Log history not found, please go next"; 317 | } 318 | } else { 319 | if (lastRowIndex == null) { 320 | lastLogTD = $($("#ledger tr").last()[0]).html(); 321 | } else { 322 | lastLogTD = $($("#ledger tr")[lastRowIndex - 1]).html(); 323 | } 324 | } 325 | 326 | if (lastLogTD == undefined) { 327 | $("#ledger button").click(); 328 | } 329 | } 330 | 331 | if (lastLogTD != undefined) { 332 | clearInterval (jsInitChecktimer); 333 | setHeaderReplay(hrefPrev, hrefNext, hrefFirst, hrefLast, lastLogTD) 334 | } 335 | } 336 | } 337 | 338 | function getMinRow(ledger) { 339 | for (var i = 0; i < ledger.length; i++) { 340 | if (ledger[i].commands != undefined) { 341 | return i + 2; 342 | } 343 | } 344 | return ledger.length; 345 | } 346 | function getMaxRow(ledger, row) { 347 | if (ledger[ledger.length-1].commands != "score_resources") { 348 | lastRowIndex = null; 349 | return ledger.length; 350 | } 351 | 352 | for (var i = ledger.length - 1; i > -1; i--) { 353 | if (ledger[i].comment == "Scoring FIRE cult") { 354 | lastRowIndex = row ? Math.min(row - 1, i - 1) : i - 1; 355 | return i + 1; 356 | } 357 | } 358 | return ledger.length; 359 | } 360 | 361 | function isFaction(faction) { 362 | var factions = ["alchemists", "auren", "chaosmagicians", "cultists", "darklings", "dwarves","engineers","fakirs","giants","halflings","mermaids","nomads", 363 | "swarmlings", "witches","acolytes","dragonlords","icemaidens","yetis","riverwalkers","shapeshifters"]; 364 | return factions.indexOf(faction) >= 0; 365 | } 366 | 367 | function setHeaderReplay(hrefPrev, hrefNext, hrefFirst, hrefLast, lastLogTD) { 368 | var description = '' + lastLogTD + "
Replay [First|||Last]
"; 369 | var replayCss = "margin-bottom: 5px;background-color: #eee;padding: 5px;border-style: solid;border-width: 1px;max-width: 1045px;"; 370 | $('#header').after($('
' + description + '
')); 371 | } 372 | 373 | function setupReplayLinks(){ 374 | var url = window.location.href; 375 | var parts = url.split("/"); 376 | if(parts[3] == "faction" || parts[3] == "game") { 377 | loadGame(parts[4]); 378 | } 379 | } 380 | 381 | function loadReplayInfo() { 382 | loadData('replay', function(result) { 383 | var replay = (result.replay == undefined ? true : result.replay); 384 | if (replay) { 385 | setupReplayLinks(); 386 | saveData('replay', replay); 387 | } 388 | }); 389 | } 390 | 391 | var allOpponentGames = {}; 392 | var allGamesHTML; 393 | function filterGames(player, opponent, isAll) { 394 | $("#games-finished tbody").html(""); 395 | if (isAll) { 396 | $("#games-finished tbody").append(allGamesHTML); 397 | return; 398 | } 399 | 400 | if (!allOpponentGames.hasOwnProperty(opponent)) { 401 | loadOpponentGames(player, opponent); 402 | return; 403 | } 404 | 405 | var opponentGames = allOpponentGames[opponent]; 406 | var index = 0; 407 | var filteredGames = []; 408 | allGamesHTML.each(function() { 409 | var game = $(this).children('td').eq(0).html(); 410 | for (var i = index; i < opponentGames.length; i++) { 411 | if (game == opponentGames[i]) { 412 | filteredGames.push($(this)); 413 | index++; 414 | return true; 415 | } 416 | } 417 | }); 418 | $("#games-finished tbody").append(filteredGames); 419 | } 420 | 421 | var listGamesObj; 422 | function loadOpponentGames(player, opponent) { 423 | var callback = function(jsonObj) { 424 | listGamesObj = jsonObj; 425 | var myGames = jsonObj.games; 426 | 427 | var callback2 = function(jsonObj2) { 428 | var opponentGames = jsonObj2.games; 429 | var filteredGames = []; 430 | var k = 0; 431 | for (var i = 0; i < myGames.length; i++) { 432 | for (var j = k; j < opponentGames.length; j++) { 433 | if (myGames[i].id == opponentGames[j].id) { 434 | filteredGames.push(myGames[i].id); 435 | k++; 436 | break; 437 | } 438 | } 439 | } 440 | allOpponentGames[opponent] = filteredGames; 441 | 442 | filterGames(player, opponent, false); 443 | } 444 | 445 | listGames(opponent, callback2); 446 | } 447 | 448 | if (listGamesObj != null) { 449 | callback(listGamesObj); 450 | } else { 451 | listGames(player, callback); 452 | } 453 | } 454 | 455 | function setupOpponentsFilter(player) { 456 | var jsInitChecktimer = setInterval(checkForJS_Finish, 300); 457 | 458 | function checkForJS_Finish () { 459 | var opponentsTable = $("#opponents-table tr"); 460 | if (opponentsTable != undefined && opponentsTable.length > 1) { 461 | clearInterval (jsInitChecktimer); 462 | setupOpponentsGamesLinks(player); 463 | } 464 | } 465 | } 466 | 467 | function setupOpponentsGamesLinks(url) { 468 | $("#opponents-table tr").each(function() { 469 | var opponent = $(this).children('td').eq(0).children('a').html(); 470 | var tdGames = $(this).children('td').eq(1); 471 | if (tdGames.html() == "Games") { 472 | $(tdGames).html(""); 473 | $(tdGames).append($("Games")); 474 | return true; 475 | } 476 | 477 | var games = $(tdGames).html(); 478 | $(tdGames).html(""); 479 | $(tdGames).append($("" + games + "")); 480 | }); 481 | 482 | $("a.link-opponent-games").click(function() { 483 | var player = url.split("/")[4].split("#")[0]; 484 | var opponent = $(this).attr("data-opponent"); 485 | var isAll = $(this).html() == "Games"; 486 | 487 | if (allGamesHTML == null) { 488 | var jsInitChecktimer = setInterval(checkForJS_Finish, 300); 489 | 490 | function checkForJS_Finish () { 491 | allGamesHTML = $("#games-finished tr"); 492 | if (allGamesHTML != null && allGamesHTML.length > 0) { 493 | clearInterval (jsInitChecktimer); 494 | filterGames(player, opponent, isAll); 495 | } 496 | } 497 | } else { 498 | filterGames(player, opponent, isAll); 499 | } 500 | }); 501 | } 502 | 503 | function loadOpponentsFilter() { 504 | loadData('opponentsFilter', function(result) { 505 | var opponentsFilter = (result.opponentsFilter == undefined ? true : result.opponentsFilter); 506 | if (opponentsFilter) { 507 | var url = window.location.href; 508 | if (url.indexOf("terra.snellman.net/player") > 0) { 509 | var player = url.split("/")[4].split("#")[0]; 510 | if (url.indexOf("#opponents") > 0) { 511 | setupOpponentsFilter(url); 512 | } 513 | 514 | $("#opponents-button").click(function() { 515 | setupOpponentsFilter(url); 516 | }); 517 | } 518 | saveData('opponentsFilter', opponentsFilter); 519 | } 520 | }); 521 | } 522 | 523 | function loadLastMoves() { 524 | loadData('lastMoves', function(result) { 525 | var lastMoves = (result.lastMoves == undefined ? true : result.lastMoves); 526 | if (!lastMoves) { 527 | return; 528 | } 529 | 530 | var jsInitChecktimer = setInterval(checkForJSLedger_Finish, 300); 531 | function checkForJSLedger_Finish () { 532 | var nextFaction = getActionRequiredFaction(); 533 | if (nextFaction == undefined) { 534 | return; 535 | } 536 | 537 | var lines = document.querySelectorAll('#ledger tr'); 538 | if (lines == undefined || lines.length == 0) { 539 | return; 540 | } 541 | 542 | clearInterval(jsInitChecktimer); 543 | var linesToAppend = []; 544 | for (var i = lines.length - 1; i > -1; i--) { 545 | linesToAppend.push($(lines[i]).clone()); 546 | var faction = lines[i].children[0].innerHTML; 547 | if (faction.toLowerCase() === nextFaction && i != lines.length - 1) { 548 | break; 549 | } 550 | } 551 | if (linesToAppend.length > 0) { 552 | var lastMovesStyle = "background-color:#eee;margin-top:10px;margin-bottom:10px;padding:5px;border-style:solid;border-width:1px;max-width:1045px;"; 553 | var div = $("
"); 554 | var table = $("
").append(linesToAppend.reverse()); 555 | div.append(table); 556 | $(div).insertBefore("#action_required"); 557 | } 558 | } 559 | saveData('lastMoves', lastMoves); 560 | }); 561 | } 562 | 563 | function getActionRequiredFaction() { 564 | var faction = $($('#action_required span').filter(function () { return $(this).text() === "should take an action"; }).prev().prev().find('span')[0]).find('span').text().trim(); 565 | return faction.replace(/\s/g, '').toLowerCase(); 566 | } 567 | 568 | function saveData(key, value) { 569 | var obj = {}; 570 | obj[key] = value; 571 | chrome.storage.local.set(obj); 572 | } 573 | 574 | function loadData(key, callback) { 575 | chrome.storage.local.get(key, callback); 576 | } 577 | 578 | $(function() { 579 | loadReplayInfo(); 580 | loadOpponentsFilter(); 581 | loadLastMoves(); 582 | }); -------------------------------------------------------------------------------- /resources/js/jquery/jquery-1.9.1.min.js: -------------------------------------------------------------------------------- 1 | /*! jQuery v1.9.1 | (c) 2005, 2012 jQuery Foundation, Inc. | jquery.org/license 2 | //@ sourceMappingURL=jquery.min.map 3 | */(function(e,t){var n,r,i=typeof t,o=e.document,a=e.location,s=e.jQuery,u=e.$,l={},c=[],p="1.9.1",f=c.concat,d=c.push,h=c.slice,g=c.indexOf,m=l.toString,y=l.hasOwnProperty,v=p.trim,b=function(e,t){return new b.fn.init(e,t,r)},x=/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source,w=/\S+/g,T=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,N=/^(?:(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,k=/^[\],:{}\s]*$/,E=/(?:^|:|,)(?:\s*\[)+/g,S=/\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,A=/"[^"\\\r\n]*"|true|false|null|-?(?:\d+\.|)\d+(?:[eE][+-]?\d+|)/g,j=/^-ms-/,D=/-([\da-z])/gi,L=function(e,t){return t.toUpperCase()},H=function(e){(o.addEventListener||"load"===e.type||"complete"===o.readyState)&&(q(),b.ready())},q=function(){o.addEventListener?(o.removeEventListener("DOMContentLoaded",H,!1),e.removeEventListener("load",H,!1)):(o.detachEvent("onreadystatechange",H),e.detachEvent("onload",H))};b.fn=b.prototype={jquery:p,constructor:b,init:function(e,n,r){var i,a;if(!e)return this;if("string"==typeof e){if(i="<"===e.charAt(0)&&">"===e.charAt(e.length-1)&&e.length>=3?[null,e,null]:N.exec(e),!i||!i[1]&&n)return!n||n.jquery?(n||r).find(e):this.constructor(n).find(e);if(i[1]){if(n=n instanceof b?n[0]:n,b.merge(this,b.parseHTML(i[1],n&&n.nodeType?n.ownerDocument||n:o,!0)),C.test(i[1])&&b.isPlainObject(n))for(i in n)b.isFunction(this[i])?this[i](n[i]):this.attr(i,n[i]);return this}if(a=o.getElementById(i[2]),a&&a.parentNode){if(a.id!==i[2])return r.find(e);this.length=1,this[0]=a}return this.context=o,this.selector=e,this}return e.nodeType?(this.context=this[0]=e,this.length=1,this):b.isFunction(e)?r.ready(e):(e.selector!==t&&(this.selector=e.selector,this.context=e.context),b.makeArray(e,this))},selector:"",length:0,size:function(){return this.length},toArray:function(){return h.call(this)},get:function(e){return null==e?this.toArray():0>e?this[this.length+e]:this[e]},pushStack:function(e){var t=b.merge(this.constructor(),e);return t.prevObject=this,t.context=this.context,t},each:function(e,t){return b.each(this,e,t)},ready:function(e){return b.ready.promise().done(e),this},slice:function(){return this.pushStack(h.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(e){var t=this.length,n=+e+(0>e?t:0);return this.pushStack(n>=0&&t>n?[this[n]]:[])},map:function(e){return this.pushStack(b.map(this,function(t,n){return e.call(t,n,t)}))},end:function(){return this.prevObject||this.constructor(null)},push:d,sort:[].sort,splice:[].splice},b.fn.init.prototype=b.fn,b.extend=b.fn.extend=function(){var e,n,r,i,o,a,s=arguments[0]||{},u=1,l=arguments.length,c=!1;for("boolean"==typeof s&&(c=s,s=arguments[1]||{},u=2),"object"==typeof s||b.isFunction(s)||(s={}),l===u&&(s=this,--u);l>u;u++)if(null!=(o=arguments[u]))for(i in o)e=s[i],r=o[i],s!==r&&(c&&r&&(b.isPlainObject(r)||(n=b.isArray(r)))?(n?(n=!1,a=e&&b.isArray(e)?e:[]):a=e&&b.isPlainObject(e)?e:{},s[i]=b.extend(c,a,r)):r!==t&&(s[i]=r));return s},b.extend({noConflict:function(t){return e.$===b&&(e.$=u),t&&e.jQuery===b&&(e.jQuery=s),b},isReady:!1,readyWait:1,holdReady:function(e){e?b.readyWait++:b.ready(!0)},ready:function(e){if(e===!0?!--b.readyWait:!b.isReady){if(!o.body)return setTimeout(b.ready);b.isReady=!0,e!==!0&&--b.readyWait>0||(n.resolveWith(o,[b]),b.fn.trigger&&b(o).trigger("ready").off("ready"))}},isFunction:function(e){return"function"===b.type(e)},isArray:Array.isArray||function(e){return"array"===b.type(e)},isWindow:function(e){return null!=e&&e==e.window},isNumeric:function(e){return!isNaN(parseFloat(e))&&isFinite(e)},type:function(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?l[m.call(e)]||"object":typeof e},isPlainObject:function(e){if(!e||"object"!==b.type(e)||e.nodeType||b.isWindow(e))return!1;try{if(e.constructor&&!y.call(e,"constructor")&&!y.call(e.constructor.prototype,"isPrototypeOf"))return!1}catch(n){return!1}var r;for(r in e);return r===t||y.call(e,r)},isEmptyObject:function(e){var t;for(t in e)return!1;return!0},error:function(e){throw Error(e)},parseHTML:function(e,t,n){if(!e||"string"!=typeof e)return null;"boolean"==typeof t&&(n=t,t=!1),t=t||o;var r=C.exec(e),i=!n&&[];return r?[t.createElement(r[1])]:(r=b.buildFragment([e],t,i),i&&b(i).remove(),b.merge([],r.childNodes))},parseJSON:function(n){return e.JSON&&e.JSON.parse?e.JSON.parse(n):null===n?n:"string"==typeof n&&(n=b.trim(n),n&&k.test(n.replace(S,"@").replace(A,"]").replace(E,"")))?Function("return "+n)():(b.error("Invalid JSON: "+n),t)},parseXML:function(n){var r,i;if(!n||"string"!=typeof n)return null;try{e.DOMParser?(i=new DOMParser,r=i.parseFromString(n,"text/xml")):(r=new ActiveXObject("Microsoft.XMLDOM"),r.async="false",r.loadXML(n))}catch(o){r=t}return r&&r.documentElement&&!r.getElementsByTagName("parsererror").length||b.error("Invalid XML: "+n),r},noop:function(){},globalEval:function(t){t&&b.trim(t)&&(e.execScript||function(t){e.eval.call(e,t)})(t)},camelCase:function(e){return e.replace(j,"ms-").replace(D,L)},nodeName:function(e,t){return e.nodeName&&e.nodeName.toLowerCase()===t.toLowerCase()},each:function(e,t,n){var r,i=0,o=e.length,a=M(e);if(n){if(a){for(;o>i;i++)if(r=t.apply(e[i],n),r===!1)break}else for(i in e)if(r=t.apply(e[i],n),r===!1)break}else if(a){for(;o>i;i++)if(r=t.call(e[i],i,e[i]),r===!1)break}else for(i in e)if(r=t.call(e[i],i,e[i]),r===!1)break;return e},trim:v&&!v.call("\ufeff\u00a0")?function(e){return null==e?"":v.call(e)}:function(e){return null==e?"":(e+"").replace(T,"")},makeArray:function(e,t){var n=t||[];return null!=e&&(M(Object(e))?b.merge(n,"string"==typeof e?[e]:e):d.call(n,e)),n},inArray:function(e,t,n){var r;if(t){if(g)return g.call(t,e,n);for(r=t.length,n=n?0>n?Math.max(0,r+n):n:0;r>n;n++)if(n in t&&t[n]===e)return n}return-1},merge:function(e,n){var r=n.length,i=e.length,o=0;if("number"==typeof r)for(;r>o;o++)e[i++]=n[o];else while(n[o]!==t)e[i++]=n[o++];return e.length=i,e},grep:function(e,t,n){var r,i=[],o=0,a=e.length;for(n=!!n;a>o;o++)r=!!t(e[o],o),n!==r&&i.push(e[o]);return i},map:function(e,t,n){var r,i=0,o=e.length,a=M(e),s=[];if(a)for(;o>i;i++)r=t(e[i],i,n),null!=r&&(s[s.length]=r);else for(i in e)r=t(e[i],i,n),null!=r&&(s[s.length]=r);return f.apply([],s)},guid:1,proxy:function(e,n){var r,i,o;return"string"==typeof n&&(o=e[n],n=e,e=o),b.isFunction(e)?(r=h.call(arguments,2),i=function(){return e.apply(n||this,r.concat(h.call(arguments)))},i.guid=e.guid=e.guid||b.guid++,i):t},access:function(e,n,r,i,o,a,s){var u=0,l=e.length,c=null==r;if("object"===b.type(r)){o=!0;for(u in r)b.access(e,n,u,r[u],!0,a,s)}else if(i!==t&&(o=!0,b.isFunction(i)||(s=!0),c&&(s?(n.call(e,i),n=null):(c=n,n=function(e,t,n){return c.call(b(e),n)})),n))for(;l>u;u++)n(e[u],r,s?i:i.call(e[u],u,n(e[u],r)));return o?e:c?n.call(e):l?n(e[0],r):a},now:function(){return(new Date).getTime()}}),b.ready.promise=function(t){if(!n)if(n=b.Deferred(),"complete"===o.readyState)setTimeout(b.ready);else if(o.addEventListener)o.addEventListener("DOMContentLoaded",H,!1),e.addEventListener("load",H,!1);else{o.attachEvent("onreadystatechange",H),e.attachEvent("onload",H);var r=!1;try{r=null==e.frameElement&&o.documentElement}catch(i){}r&&r.doScroll&&function a(){if(!b.isReady){try{r.doScroll("left")}catch(e){return setTimeout(a,50)}q(),b.ready()}}()}return n.promise(t)},b.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(e,t){l["[object "+t+"]"]=t.toLowerCase()});function M(e){var t=e.length,n=b.type(e);return b.isWindow(e)?!1:1===e.nodeType&&t?!0:"array"===n||"function"!==n&&(0===t||"number"==typeof t&&t>0&&t-1 in e)}r=b(o);var _={};function F(e){var t=_[e]={};return b.each(e.match(w)||[],function(e,n){t[n]=!0}),t}b.Callbacks=function(e){e="string"==typeof e?_[e]||F(e):b.extend({},e);var n,r,i,o,a,s,u=[],l=!e.once&&[],c=function(t){for(r=e.memory&&t,i=!0,a=s||0,s=0,o=u.length,n=!0;u&&o>a;a++)if(u[a].apply(t[0],t[1])===!1&&e.stopOnFalse){r=!1;break}n=!1,u&&(l?l.length&&c(l.shift()):r?u=[]:p.disable())},p={add:function(){if(u){var t=u.length;(function i(t){b.each(t,function(t,n){var r=b.type(n);"function"===r?e.unique&&p.has(n)||u.push(n):n&&n.length&&"string"!==r&&i(n)})})(arguments),n?o=u.length:r&&(s=t,c(r))}return this},remove:function(){return u&&b.each(arguments,function(e,t){var r;while((r=b.inArray(t,u,r))>-1)u.splice(r,1),n&&(o>=r&&o--,a>=r&&a--)}),this},has:function(e){return e?b.inArray(e,u)>-1:!(!u||!u.length)},empty:function(){return u=[],this},disable:function(){return u=l=r=t,this},disabled:function(){return!u},lock:function(){return l=t,r||p.disable(),this},locked:function(){return!l},fireWith:function(e,t){return t=t||[],t=[e,t.slice?t.slice():t],!u||i&&!l||(n?l.push(t):c(t)),this},fire:function(){return p.fireWith(this,arguments),this},fired:function(){return!!i}};return p},b.extend({Deferred:function(e){var t=[["resolve","done",b.Callbacks("once memory"),"resolved"],["reject","fail",b.Callbacks("once memory"),"rejected"],["notify","progress",b.Callbacks("memory")]],n="pending",r={state:function(){return n},always:function(){return i.done(arguments).fail(arguments),this},then:function(){var e=arguments;return b.Deferred(function(n){b.each(t,function(t,o){var a=o[0],s=b.isFunction(e[t])&&e[t];i[o[1]](function(){var e=s&&s.apply(this,arguments);e&&b.isFunction(e.promise)?e.promise().done(n.resolve).fail(n.reject).progress(n.notify):n[a+"With"](this===r?n.promise():this,s?[e]:arguments)})}),e=null}).promise()},promise:function(e){return null!=e?b.extend(e,r):r}},i={};return r.pipe=r.then,b.each(t,function(e,o){var a=o[2],s=o[3];r[o[1]]=a.add,s&&a.add(function(){n=s},t[1^e][2].disable,t[2][2].lock),i[o[0]]=function(){return i[o[0]+"With"](this===i?r:this,arguments),this},i[o[0]+"With"]=a.fireWith}),r.promise(i),e&&e.call(i,i),i},when:function(e){var t=0,n=h.call(arguments),r=n.length,i=1!==r||e&&b.isFunction(e.promise)?r:0,o=1===i?e:b.Deferred(),a=function(e,t,n){return function(r){t[e]=this,n[e]=arguments.length>1?h.call(arguments):r,n===s?o.notifyWith(t,n):--i||o.resolveWith(t,n)}},s,u,l;if(r>1)for(s=Array(r),u=Array(r),l=Array(r);r>t;t++)n[t]&&b.isFunction(n[t].promise)?n[t].promise().done(a(t,l,n)).fail(o.reject).progress(a(t,u,s)):--i;return i||o.resolveWith(l,n),o.promise()}}),b.support=function(){var t,n,r,a,s,u,l,c,p,f,d=o.createElement("div");if(d.setAttribute("className","t"),d.innerHTML="
a",n=d.getElementsByTagName("*"),r=d.getElementsByTagName("a")[0],!n||!r||!n.length)return{};s=o.createElement("select"),l=s.appendChild(o.createElement("option")),a=d.getElementsByTagName("input")[0],r.style.cssText="top:1px;float:left;opacity:.5",t={getSetAttribute:"t"!==d.className,leadingWhitespace:3===d.firstChild.nodeType,tbody:!d.getElementsByTagName("tbody").length,htmlSerialize:!!d.getElementsByTagName("link").length,style:/top/.test(r.getAttribute("style")),hrefNormalized:"/a"===r.getAttribute("href"),opacity:/^0.5/.test(r.style.opacity),cssFloat:!!r.style.cssFloat,checkOn:!!a.value,optSelected:l.selected,enctype:!!o.createElement("form").enctype,html5Clone:"<:nav>"!==o.createElement("nav").cloneNode(!0).outerHTML,boxModel:"CSS1Compat"===o.compatMode,deleteExpando:!0,noCloneEvent:!0,inlineBlockNeedsLayout:!1,shrinkWrapBlocks:!1,reliableMarginRight:!0,boxSizingReliable:!0,pixelPosition:!1},a.checked=!0,t.noCloneChecked=a.cloneNode(!0).checked,s.disabled=!0,t.optDisabled=!l.disabled;try{delete d.test}catch(h){t.deleteExpando=!1}a=o.createElement("input"),a.setAttribute("value",""),t.input=""===a.getAttribute("value"),a.value="t",a.setAttribute("type","radio"),t.radioValue="t"===a.value,a.setAttribute("checked","t"),a.setAttribute("name","t"),u=o.createDocumentFragment(),u.appendChild(a),t.appendChecked=a.checked,t.checkClone=u.cloneNode(!0).cloneNode(!0).lastChild.checked,d.attachEvent&&(d.attachEvent("onclick",function(){t.noCloneEvent=!1}),d.cloneNode(!0).click());for(f in{submit:!0,change:!0,focusin:!0})d.setAttribute(c="on"+f,"t"),t[f+"Bubbles"]=c in e||d.attributes[c].expando===!1;return d.style.backgroundClip="content-box",d.cloneNode(!0).style.backgroundClip="",t.clearCloneStyle="content-box"===d.style.backgroundClip,b(function(){var n,r,a,s="padding:0;margin:0;border:0;display:block;box-sizing:content-box;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;",u=o.getElementsByTagName("body")[0];u&&(n=o.createElement("div"),n.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",u.appendChild(n).appendChild(d),d.innerHTML="
t
",a=d.getElementsByTagName("td"),a[0].style.cssText="padding:0;margin:0;border:0;display:none",p=0===a[0].offsetHeight,a[0].style.display="",a[1].style.display="none",t.reliableHiddenOffsets=p&&0===a[0].offsetHeight,d.innerHTML="",d.style.cssText="box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;",t.boxSizing=4===d.offsetWidth,t.doesNotIncludeMarginInBodyOffset=1!==u.offsetTop,e.getComputedStyle&&(t.pixelPosition="1%"!==(e.getComputedStyle(d,null)||{}).top,t.boxSizingReliable="4px"===(e.getComputedStyle(d,null)||{width:"4px"}).width,r=d.appendChild(o.createElement("div")),r.style.cssText=d.style.cssText=s,r.style.marginRight=r.style.width="0",d.style.width="1px",t.reliableMarginRight=!parseFloat((e.getComputedStyle(r,null)||{}).marginRight)),typeof d.style.zoom!==i&&(d.innerHTML="",d.style.cssText=s+"width:1px;padding:1px;display:inline;zoom:1",t.inlineBlockNeedsLayout=3===d.offsetWidth,d.style.display="block",d.innerHTML="
",d.firstChild.style.width="5px",t.shrinkWrapBlocks=3!==d.offsetWidth,t.inlineBlockNeedsLayout&&(u.style.zoom=1)),u.removeChild(n),n=d=a=r=null)}),n=s=u=l=r=a=null,t}();var O=/(?:\{[\s\S]*\}|\[[\s\S]*\])$/,B=/([A-Z])/g;function P(e,n,r,i){if(b.acceptData(e)){var o,a,s=b.expando,u="string"==typeof n,l=e.nodeType,p=l?b.cache:e,f=l?e[s]:e[s]&&s;if(f&&p[f]&&(i||p[f].data)||!u||r!==t)return f||(l?e[s]=f=c.pop()||b.guid++:f=s),p[f]||(p[f]={},l||(p[f].toJSON=b.noop)),("object"==typeof n||"function"==typeof n)&&(i?p[f]=b.extend(p[f],n):p[f].data=b.extend(p[f].data,n)),o=p[f],i||(o.data||(o.data={}),o=o.data),r!==t&&(o[b.camelCase(n)]=r),u?(a=o[n],null==a&&(a=o[b.camelCase(n)])):a=o,a}}function R(e,t,n){if(b.acceptData(e)){var r,i,o,a=e.nodeType,s=a?b.cache:e,u=a?e[b.expando]:b.expando;if(s[u]){if(t&&(o=n?s[u]:s[u].data)){b.isArray(t)?t=t.concat(b.map(t,b.camelCase)):t in o?t=[t]:(t=b.camelCase(t),t=t in o?[t]:t.split(" "));for(r=0,i=t.length;i>r;r++)delete o[t[r]];if(!(n?$:b.isEmptyObject)(o))return}(n||(delete s[u].data,$(s[u])))&&(a?b.cleanData([e],!0):b.support.deleteExpando||s!=s.window?delete s[u]:s[u]=null)}}}b.extend({cache:{},expando:"jQuery"+(p+Math.random()).replace(/\D/g,""),noData:{embed:!0,object:"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",applet:!0},hasData:function(e){return e=e.nodeType?b.cache[e[b.expando]]:e[b.expando],!!e&&!$(e)},data:function(e,t,n){return P(e,t,n)},removeData:function(e,t){return R(e,t)},_data:function(e,t,n){return P(e,t,n,!0)},_removeData:function(e,t){return R(e,t,!0)},acceptData:function(e){if(e.nodeType&&1!==e.nodeType&&9!==e.nodeType)return!1;var t=e.nodeName&&b.noData[e.nodeName.toLowerCase()];return!t||t!==!0&&e.getAttribute("classid")===t}}),b.fn.extend({data:function(e,n){var r,i,o=this[0],a=0,s=null;if(e===t){if(this.length&&(s=b.data(o),1===o.nodeType&&!b._data(o,"parsedAttrs"))){for(r=o.attributes;r.length>a;a++)i=r[a].name,i.indexOf("data-")||(i=b.camelCase(i.slice(5)),W(o,i,s[i]));b._data(o,"parsedAttrs",!0)}return s}return"object"==typeof e?this.each(function(){b.data(this,e)}):b.access(this,function(n){return n===t?o?W(o,e,b.data(o,e)):null:(this.each(function(){b.data(this,e,n)}),t)},null,n,arguments.length>1,null,!0)},removeData:function(e){return this.each(function(){b.removeData(this,e)})}});function W(e,n,r){if(r===t&&1===e.nodeType){var i="data-"+n.replace(B,"-$1").toLowerCase();if(r=e.getAttribute(i),"string"==typeof r){try{r="true"===r?!0:"false"===r?!1:"null"===r?null:+r+""===r?+r:O.test(r)?b.parseJSON(r):r}catch(o){}b.data(e,n,r)}else r=t}return r}function $(e){var t;for(t in e)if(("data"!==t||!b.isEmptyObject(e[t]))&&"toJSON"!==t)return!1;return!0}b.extend({queue:function(e,n,r){var i;return e?(n=(n||"fx")+"queue",i=b._data(e,n),r&&(!i||b.isArray(r)?i=b._data(e,n,b.makeArray(r)):i.push(r)),i||[]):t},dequeue:function(e,t){t=t||"fx";var n=b.queue(e,t),r=n.length,i=n.shift(),o=b._queueHooks(e,t),a=function(){b.dequeue(e,t)};"inprogress"===i&&(i=n.shift(),r--),o.cur=i,i&&("fx"===t&&n.unshift("inprogress"),delete o.stop,i.call(e,a,o)),!r&&o&&o.empty.fire()},_queueHooks:function(e,t){var n=t+"queueHooks";return b._data(e,n)||b._data(e,n,{empty:b.Callbacks("once memory").add(function(){b._removeData(e,t+"queue"),b._removeData(e,n)})})}}),b.fn.extend({queue:function(e,n){var r=2;return"string"!=typeof e&&(n=e,e="fx",r--),r>arguments.length?b.queue(this[0],e):n===t?this:this.each(function(){var t=b.queue(this,e,n);b._queueHooks(this,e),"fx"===e&&"inprogress"!==t[0]&&b.dequeue(this,e)})},dequeue:function(e){return this.each(function(){b.dequeue(this,e)})},delay:function(e,t){return e=b.fx?b.fx.speeds[e]||e:e,t=t||"fx",this.queue(t,function(t,n){var r=setTimeout(t,e);n.stop=function(){clearTimeout(r)}})},clearQueue:function(e){return this.queue(e||"fx",[])},promise:function(e,n){var r,i=1,o=b.Deferred(),a=this,s=this.length,u=function(){--i||o.resolveWith(a,[a])};"string"!=typeof e&&(n=e,e=t),e=e||"fx";while(s--)r=b._data(a[s],e+"queueHooks"),r&&r.empty&&(i++,r.empty.add(u));return u(),o.promise(n)}});var I,z,X=/[\t\r\n]/g,U=/\r/g,V=/^(?:input|select|textarea|button|object)$/i,Y=/^(?:a|area)$/i,J=/^(?:checked|selected|autofocus|autoplay|async|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped)$/i,G=/^(?:checked|selected)$/i,Q=b.support.getSetAttribute,K=b.support.input;b.fn.extend({attr:function(e,t){return b.access(this,b.attr,e,t,arguments.length>1)},removeAttr:function(e){return this.each(function(){b.removeAttr(this,e)})},prop:function(e,t){return b.access(this,b.prop,e,t,arguments.length>1)},removeProp:function(e){return e=b.propFix[e]||e,this.each(function(){try{this[e]=t,delete this[e]}catch(n){}})},addClass:function(e){var t,n,r,i,o,a=0,s=this.length,u="string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).addClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):" ")){o=0;while(i=t[o++])0>r.indexOf(" "+i+" ")&&(r+=i+" ");n.className=b.trim(r)}return this},removeClass:function(e){var t,n,r,i,o,a=0,s=this.length,u=0===arguments.length||"string"==typeof e&&e;if(b.isFunction(e))return this.each(function(t){b(this).removeClass(e.call(this,t,this.className))});if(u)for(t=(e||"").match(w)||[];s>a;a++)if(n=this[a],r=1===n.nodeType&&(n.className?(" "+n.className+" ").replace(X," "):"")){o=0;while(i=t[o++])while(r.indexOf(" "+i+" ")>=0)r=r.replace(" "+i+" "," ");n.className=e?b.trim(r):""}return this},toggleClass:function(e,t){var n=typeof e,r="boolean"==typeof t;return b.isFunction(e)?this.each(function(n){b(this).toggleClass(e.call(this,n,this.className,t),t)}):this.each(function(){if("string"===n){var o,a=0,s=b(this),u=t,l=e.match(w)||[];while(o=l[a++])u=r?u:!s.hasClass(o),s[u?"addClass":"removeClass"](o)}else(n===i||"boolean"===n)&&(this.className&&b._data(this,"__className__",this.className),this.className=this.className||e===!1?"":b._data(this,"__className__")||"")})},hasClass:function(e){var t=" "+e+" ",n=0,r=this.length;for(;r>n;n++)if(1===this[n].nodeType&&(" "+this[n].className+" ").replace(X," ").indexOf(t)>=0)return!0;return!1},val:function(e){var n,r,i,o=this[0];{if(arguments.length)return i=b.isFunction(e),this.each(function(n){var o,a=b(this);1===this.nodeType&&(o=i?e.call(this,n,a.val()):e,null==o?o="":"number"==typeof o?o+="":b.isArray(o)&&(o=b.map(o,function(e){return null==e?"":e+""})),r=b.valHooks[this.type]||b.valHooks[this.nodeName.toLowerCase()],r&&"set"in r&&r.set(this,o,"value")!==t||(this.value=o))});if(o)return r=b.valHooks[o.type]||b.valHooks[o.nodeName.toLowerCase()],r&&"get"in r&&(n=r.get(o,"value"))!==t?n:(n=o.value,"string"==typeof n?n.replace(U,""):null==n?"":n)}}}),b.extend({valHooks:{option:{get:function(e){var t=e.attributes.value;return!t||t.specified?e.value:e.text}},select:{get:function(e){var t,n,r=e.options,i=e.selectedIndex,o="select-one"===e.type||0>i,a=o?null:[],s=o?i+1:r.length,u=0>i?s:o?i:0;for(;s>u;u++)if(n=r[u],!(!n.selected&&u!==i||(b.support.optDisabled?n.disabled:null!==n.getAttribute("disabled"))||n.parentNode.disabled&&b.nodeName(n.parentNode,"optgroup"))){if(t=b(n).val(),o)return t;a.push(t)}return a},set:function(e,t){var n=b.makeArray(t);return b(e).find("option").each(function(){this.selected=b.inArray(b(this).val(),n)>=0}),n.length||(e.selectedIndex=-1),n}}},attr:function(e,n,r){var o,a,s,u=e.nodeType;if(e&&3!==u&&8!==u&&2!==u)return typeof e.getAttribute===i?b.prop(e,n,r):(a=1!==u||!b.isXMLDoc(e),a&&(n=n.toLowerCase(),o=b.attrHooks[n]||(J.test(n)?z:I)),r===t?o&&a&&"get"in o&&null!==(s=o.get(e,n))?s:(typeof e.getAttribute!==i&&(s=e.getAttribute(n)),null==s?t:s):null!==r?o&&a&&"set"in o&&(s=o.set(e,r,n))!==t?s:(e.setAttribute(n,r+""),r):(b.removeAttr(e,n),t))},removeAttr:function(e,t){var n,r,i=0,o=t&&t.match(w);if(o&&1===e.nodeType)while(n=o[i++])r=b.propFix[n]||n,J.test(n)?!Q&&G.test(n)?e[b.camelCase("default-"+n)]=e[r]=!1:e[r]=!1:b.attr(e,n,""),e.removeAttribute(Q?n:r)},attrHooks:{type:{set:function(e,t){if(!b.support.radioValue&&"radio"===t&&b.nodeName(e,"input")){var n=e.value;return e.setAttribute("type",t),n&&(e.value=n),t}}}},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(e,n,r){var i,o,a,s=e.nodeType;if(e&&3!==s&&8!==s&&2!==s)return a=1!==s||!b.isXMLDoc(e),a&&(n=b.propFix[n]||n,o=b.propHooks[n]),r!==t?o&&"set"in o&&(i=o.set(e,r,n))!==t?i:e[n]=r:o&&"get"in o&&null!==(i=o.get(e,n))?i:e[n]},propHooks:{tabIndex:{get:function(e){var n=e.getAttributeNode("tabindex");return n&&n.specified?parseInt(n.value,10):V.test(e.nodeName)||Y.test(e.nodeName)&&e.href?0:t}}}}),z={get:function(e,n){var r=b.prop(e,n),i="boolean"==typeof r&&e.getAttribute(n),o="boolean"==typeof r?K&&Q?null!=i:G.test(n)?e[b.camelCase("default-"+n)]:!!i:e.getAttributeNode(n);return o&&o.value!==!1?n.toLowerCase():t},set:function(e,t,n){return t===!1?b.removeAttr(e,n):K&&Q||!G.test(n)?e.setAttribute(!Q&&b.propFix[n]||n,n):e[b.camelCase("default-"+n)]=e[n]=!0,n}},K&&Q||(b.attrHooks.value={get:function(e,n){var r=e.getAttributeNode(n);return b.nodeName(e,"input")?e.defaultValue:r&&r.specified?r.value:t},set:function(e,n,r){return b.nodeName(e,"input")?(e.defaultValue=n,t):I&&I.set(e,n,r)}}),Q||(I=b.valHooks.button={get:function(e,n){var r=e.getAttributeNode(n);return r&&("id"===n||"name"===n||"coords"===n?""!==r.value:r.specified)?r.value:t},set:function(e,n,r){var i=e.getAttributeNode(r);return i||e.setAttributeNode(i=e.ownerDocument.createAttribute(r)),i.value=n+="","value"===r||n===e.getAttribute(r)?n:t}},b.attrHooks.contenteditable={get:I.get,set:function(e,t,n){I.set(e,""===t?!1:t,n)}},b.each(["width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{set:function(e,r){return""===r?(e.setAttribute(n,"auto"),r):t}})})),b.support.hrefNormalized||(b.each(["href","src","width","height"],function(e,n){b.attrHooks[n]=b.extend(b.attrHooks[n],{get:function(e){var r=e.getAttribute(n,2);return null==r?t:r}})}),b.each(["href","src"],function(e,t){b.propHooks[t]={get:function(e){return e.getAttribute(t,4)}}})),b.support.style||(b.attrHooks.style={get:function(e){return e.style.cssText||t},set:function(e,t){return e.style.cssText=t+""}}),b.support.optSelected||(b.propHooks.selected=b.extend(b.propHooks.selected,{get:function(e){var t=e.parentNode;return t&&(t.selectedIndex,t.parentNode&&t.parentNode.selectedIndex),null}})),b.support.enctype||(b.propFix.enctype="encoding"),b.support.checkOn||b.each(["radio","checkbox"],function(){b.valHooks[this]={get:function(e){return null===e.getAttribute("value")?"on":e.value}}}),b.each(["radio","checkbox"],function(){b.valHooks[this]=b.extend(b.valHooks[this],{set:function(e,n){return b.isArray(n)?e.checked=b.inArray(b(e).val(),n)>=0:t}})});var Z=/^(?:input|select|textarea)$/i,et=/^key/,tt=/^(?:mouse|contextmenu)|click/,nt=/^(?:focusinfocus|focusoutblur)$/,rt=/^([^.]*)(?:\.(.+)|)$/;function it(){return!0}function ot(){return!1}b.event={global:{},add:function(e,n,r,o,a){var s,u,l,c,p,f,d,h,g,m,y,v=b._data(e);if(v){r.handler&&(c=r,r=c.handler,a=c.selector),r.guid||(r.guid=b.guid++),(u=v.events)||(u=v.events={}),(f=v.handle)||(f=v.handle=function(e){return typeof b===i||e&&b.event.triggered===e.type?t:b.event.dispatch.apply(f.elem,arguments)},f.elem=e),n=(n||"").match(w)||[""],l=n.length;while(l--)s=rt.exec(n[l])||[],g=y=s[1],m=(s[2]||"").split(".").sort(),p=b.event.special[g]||{},g=(a?p.delegateType:p.bindType)||g,p=b.event.special[g]||{},d=b.extend({type:g,origType:y,data:o,handler:r,guid:r.guid,selector:a,needsContext:a&&b.expr.match.needsContext.test(a),namespace:m.join(".")},c),(h=u[g])||(h=u[g]=[],h.delegateCount=0,p.setup&&p.setup.call(e,o,m,f)!==!1||(e.addEventListener?e.addEventListener(g,f,!1):e.attachEvent&&e.attachEvent("on"+g,f))),p.add&&(p.add.call(e,d),d.handler.guid||(d.handler.guid=r.guid)),a?h.splice(h.delegateCount++,0,d):h.push(d),b.event.global[g]=!0;e=null}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,p,f,d,h,g,m=b.hasData(e)&&b._data(e);if(m&&(c=m.events)){t=(t||"").match(w)||[""],l=t.length;while(l--)if(s=rt.exec(t[l])||[],d=g=s[1],h=(s[2]||"").split(".").sort(),d){p=b.event.special[d]||{},d=(r?p.delegateType:p.bindType)||d,f=c[d]||[],s=s[2]&&RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),u=o=f.length;while(o--)a=f[o],!i&&g!==a.origType||n&&n.guid!==a.guid||s&&!s.test(a.namespace)||r&&r!==a.selector&&("**"!==r||!a.selector)||(f.splice(o,1),a.selector&&f.delegateCount--,p.remove&&p.remove.call(e,a));u&&!f.length&&(p.teardown&&p.teardown.call(e,h,m.handle)!==!1||b.removeEvent(e,d,m.handle),delete c[d])}else for(d in c)b.event.remove(e,d+t[l],n,r,!0);b.isEmptyObject(c)&&(delete m.handle,b._removeData(e,"events"))}},trigger:function(n,r,i,a){var s,u,l,c,p,f,d,h=[i||o],g=y.call(n,"type")?n.type:n,m=y.call(n,"namespace")?n.namespace.split("."):[];if(l=f=i=i||o,3!==i.nodeType&&8!==i.nodeType&&!nt.test(g+b.event.triggered)&&(g.indexOf(".")>=0&&(m=g.split("."),g=m.shift(),m.sort()),u=0>g.indexOf(":")&&"on"+g,n=n[b.expando]?n:new b.Event(g,"object"==typeof n&&n),n.isTrigger=!0,n.namespace=m.join("."),n.namespace_re=n.namespace?RegExp("(^|\\.)"+m.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,n.result=t,n.target||(n.target=i),r=null==r?[n]:b.makeArray(r,[n]),p=b.event.special[g]||{},a||!p.trigger||p.trigger.apply(i,r)!==!1)){if(!a&&!p.noBubble&&!b.isWindow(i)){for(c=p.delegateType||g,nt.test(c+g)||(l=l.parentNode);l;l=l.parentNode)h.push(l),f=l;f===(i.ownerDocument||o)&&h.push(f.defaultView||f.parentWindow||e)}d=0;while((l=h[d++])&&!n.isPropagationStopped())n.type=d>1?c:p.bindType||g,s=(b._data(l,"events")||{})[n.type]&&b._data(l,"handle"),s&&s.apply(l,r),s=u&&l[u],s&&b.acceptData(l)&&s.apply&&s.apply(l,r)===!1&&n.preventDefault();if(n.type=g,!(a||n.isDefaultPrevented()||p._default&&p._default.apply(i.ownerDocument,r)!==!1||"click"===g&&b.nodeName(i,"a")||!b.acceptData(i)||!u||!i[g]||b.isWindow(i))){f=i[u],f&&(i[u]=null),b.event.triggered=g;try{i[g]()}catch(v){}b.event.triggered=t,f&&(i[u]=f)}return n.result}},dispatch:function(e){e=b.event.fix(e);var n,r,i,o,a,s=[],u=h.call(arguments),l=(b._data(this,"events")||{})[e.type]||[],c=b.event.special[e.type]||{};if(u[0]=e,e.delegateTarget=this,!c.preDispatch||c.preDispatch.call(this,e)!==!1){s=b.event.handlers.call(this,e,l),n=0;while((o=s[n++])&&!e.isPropagationStopped()){e.currentTarget=o.elem,a=0;while((i=o.handlers[a++])&&!e.isImmediatePropagationStopped())(!e.namespace_re||e.namespace_re.test(i.namespace))&&(e.handleObj=i,e.data=i.data,r=((b.event.special[i.origType]||{}).handle||i.handler).apply(o.elem,u),r!==t&&(e.result=r)===!1&&(e.preventDefault(),e.stopPropagation()))}return c.postDispatch&&c.postDispatch.call(this,e),e.result}},handlers:function(e,n){var r,i,o,a,s=[],u=n.delegateCount,l=e.target;if(u&&l.nodeType&&(!e.button||"click"!==e.type))for(;l!=this;l=l.parentNode||this)if(1===l.nodeType&&(l.disabled!==!0||"click"!==e.type)){for(o=[],a=0;u>a;a++)i=n[a],r=i.selector+" ",o[r]===t&&(o[r]=i.needsContext?b(r,this).index(l)>=0:b.find(r,this,null,[l]).length),o[r]&&o.push(i);o.length&&s.push({elem:l,handlers:o})}return n.length>u&&s.push({elem:this,handlers:n.slice(u)}),s},fix:function(e){if(e[b.expando])return e;var t,n,r,i=e.type,a=e,s=this.fixHooks[i];s||(this.fixHooks[i]=s=tt.test(i)?this.mouseHooks:et.test(i)?this.keyHooks:{}),r=s.props?this.props.concat(s.props):this.props,e=new b.Event(a),t=r.length;while(t--)n=r[t],e[n]=a[n];return e.target||(e.target=a.srcElement||o),3===e.target.nodeType&&(e.target=e.target.parentNode),e.metaKey=!!e.metaKey,s.filter?s.filter(e,a):e},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(e,t){return null==e.which&&(e.which=null!=t.charCode?t.charCode:t.keyCode),e}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(e,n){var r,i,a,s=n.button,u=n.fromElement;return null==e.pageX&&null!=n.clientX&&(i=e.target.ownerDocument||o,a=i.documentElement,r=i.body,e.pageX=n.clientX+(a&&a.scrollLeft||r&&r.scrollLeft||0)-(a&&a.clientLeft||r&&r.clientLeft||0),e.pageY=n.clientY+(a&&a.scrollTop||r&&r.scrollTop||0)-(a&&a.clientTop||r&&r.clientTop||0)),!e.relatedTarget&&u&&(e.relatedTarget=u===e.target?n.toElement:u),e.which||s===t||(e.which=1&s?1:2&s?3:4&s?2:0),e}},special:{load:{noBubble:!0},click:{trigger:function(){return b.nodeName(this,"input")&&"checkbox"===this.type&&this.click?(this.click(),!1):t}},focus:{trigger:function(){if(this!==o.activeElement&&this.focus)try{return this.focus(),!1}catch(e){}},delegateType:"focusin"},blur:{trigger:function(){return this===o.activeElement&&this.blur?(this.blur(),!1):t},delegateType:"focusout"},beforeunload:{postDispatch:function(e){e.result!==t&&(e.originalEvent.returnValue=e.result)}}},simulate:function(e,t,n,r){var i=b.extend(new b.Event,n,{type:e,isSimulated:!0,originalEvent:{}});r?b.event.trigger(i,null,t):b.event.dispatch.call(t,i),i.isDefaultPrevented()&&n.preventDefault()}},b.removeEvent=o.removeEventListener?function(e,t,n){e.removeEventListener&&e.removeEventListener(t,n,!1)}:function(e,t,n){var r="on"+t;e.detachEvent&&(typeof e[r]===i&&(e[r]=null),e.detachEvent(r,n))},b.Event=function(e,n){return this instanceof b.Event?(e&&e.type?(this.originalEvent=e,this.type=e.type,this.isDefaultPrevented=e.defaultPrevented||e.returnValue===!1||e.getPreventDefault&&e.getPreventDefault()?it:ot):this.type=e,n&&b.extend(this,n),this.timeStamp=e&&e.timeStamp||b.now(),this[b.expando]=!0,t):new b.Event(e,n)},b.Event.prototype={isDefaultPrevented:ot,isPropagationStopped:ot,isImmediatePropagationStopped:ot,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=it,e&&(e.preventDefault?e.preventDefault():e.returnValue=!1)},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=it,e&&(e.stopPropagation&&e.stopPropagation(),e.cancelBubble=!0)},stopImmediatePropagation:function(){this.isImmediatePropagationStopped=it,this.stopPropagation()}},b.each({mouseenter:"mouseover",mouseleave:"mouseout"},function(e,t){b.event.special[e]={delegateType:t,bindType:t,handle:function(e){var n,r=this,i=e.relatedTarget,o=e.handleObj; 4 | return(!i||i!==r&&!b.contains(r,i))&&(e.type=o.origType,n=o.handler.apply(this,arguments),e.type=t),n}}}),b.support.submitBubbles||(b.event.special.submit={setup:function(){return b.nodeName(this,"form")?!1:(b.event.add(this,"click._submit keypress._submit",function(e){var n=e.target,r=b.nodeName(n,"input")||b.nodeName(n,"button")?n.form:t;r&&!b._data(r,"submitBubbles")&&(b.event.add(r,"submit._submit",function(e){e._submit_bubble=!0}),b._data(r,"submitBubbles",!0))}),t)},postDispatch:function(e){e._submit_bubble&&(delete e._submit_bubble,this.parentNode&&!e.isTrigger&&b.event.simulate("submit",this.parentNode,e,!0))},teardown:function(){return b.nodeName(this,"form")?!1:(b.event.remove(this,"._submit"),t)}}),b.support.changeBubbles||(b.event.special.change={setup:function(){return Z.test(this.nodeName)?(("checkbox"===this.type||"radio"===this.type)&&(b.event.add(this,"propertychange._change",function(e){"checked"===e.originalEvent.propertyName&&(this._just_changed=!0)}),b.event.add(this,"click._change",function(e){this._just_changed&&!e.isTrigger&&(this._just_changed=!1),b.event.simulate("change",this,e,!0)})),!1):(b.event.add(this,"beforeactivate._change",function(e){var t=e.target;Z.test(t.nodeName)&&!b._data(t,"changeBubbles")&&(b.event.add(t,"change._change",function(e){!this.parentNode||e.isSimulated||e.isTrigger||b.event.simulate("change",this.parentNode,e,!0)}),b._data(t,"changeBubbles",!0))}),t)},handle:function(e){var n=e.target;return this!==n||e.isSimulated||e.isTrigger||"radio"!==n.type&&"checkbox"!==n.type?e.handleObj.handler.apply(this,arguments):t},teardown:function(){return b.event.remove(this,"._change"),!Z.test(this.nodeName)}}),b.support.focusinBubbles||b.each({focus:"focusin",blur:"focusout"},function(e,t){var n=0,r=function(e){b.event.simulate(t,e.target,b.event.fix(e),!0)};b.event.special[t]={setup:function(){0===n++&&o.addEventListener(e,r,!0)},teardown:function(){0===--n&&o.removeEventListener(e,r,!0)}}}),b.fn.extend({on:function(e,n,r,i,o){var a,s;if("object"==typeof e){"string"!=typeof n&&(r=r||n,n=t);for(a in e)this.on(a,n,r,e[a],o);return this}if(null==r&&null==i?(i=n,r=n=t):null==i&&("string"==typeof n?(i=r,r=t):(i=r,r=n,n=t)),i===!1)i=ot;else if(!i)return this;return 1===o&&(s=i,i=function(e){return b().off(e),s.apply(this,arguments)},i.guid=s.guid||(s.guid=b.guid++)),this.each(function(){b.event.add(this,e,i,r,n)})},one:function(e,t,n,r){return this.on(e,t,n,r,1)},off:function(e,n,r){var i,o;if(e&&e.preventDefault&&e.handleObj)return i=e.handleObj,b(e.delegateTarget).off(i.namespace?i.origType+"."+i.namespace:i.origType,i.selector,i.handler),this;if("object"==typeof e){for(o in e)this.off(o,n,e[o]);return this}return(n===!1||"function"==typeof n)&&(r=n,n=t),r===!1&&(r=ot),this.each(function(){b.event.remove(this,e,r,n)})},bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},trigger:function(e,t){return this.each(function(){b.event.trigger(e,t,this)})},triggerHandler:function(e,n){var r=this[0];return r?b.event.trigger(e,n,r,!0):t}}),function(e,t){var n,r,i,o,a,s,u,l,c,p,f,d,h,g,m,y,v,x="sizzle"+-new Date,w=e.document,T={},N=0,C=0,k=it(),E=it(),S=it(),A=typeof t,j=1<<31,D=[],L=D.pop,H=D.push,q=D.slice,M=D.indexOf||function(e){var t=0,n=this.length;for(;n>t;t++)if(this[t]===e)return t;return-1},_="[\\x20\\t\\r\\n\\f]",F="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=F.replace("w","w#"),B="([*^$|!~]?=)",P="\\["+_+"*("+F+")"+_+"*(?:"+B+_+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+O+")|)|)"+_+"*\\]",R=":("+F+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+P.replace(3,8)+")*)|.*)\\)|)",W=RegExp("^"+_+"+|((?:^|[^\\\\])(?:\\\\.)*)"+_+"+$","g"),$=RegExp("^"+_+"*,"+_+"*"),I=RegExp("^"+_+"*([\\x20\\t\\r\\n\\f>+~])"+_+"*"),z=RegExp(R),X=RegExp("^"+O+"$"),U={ID:RegExp("^#("+F+")"),CLASS:RegExp("^\\.("+F+")"),NAME:RegExp("^\\[name=['\"]?("+F+")['\"]?\\]"),TAG:RegExp("^("+F.replace("w","w*")+")"),ATTR:RegExp("^"+P),PSEUDO:RegExp("^"+R),CHILD:RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+_+"*(even|odd|(([+-]|)(\\d*)n|)"+_+"*(?:([+-]|)"+_+"*(\\d+)|))"+_+"*\\)|)","i"),needsContext:RegExp("^"+_+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+_+"*((?:-\\d)?\\d*)"+_+"*\\)|)(?=[^-]|$)","i")},V=/[\x20\t\r\n\f]*[+~]/,Y=/^[^{]+\{\s*\[native code/,J=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,G=/^(?:input|select|textarea|button)$/i,Q=/^h\d$/i,K=/'|\\/g,Z=/\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,et=/\\([\da-fA-F]{1,6}[\x20\t\r\n\f]?|.)/g,tt=function(e,t){var n="0x"+t-65536;return n!==n?t:0>n?String.fromCharCode(n+65536):String.fromCharCode(55296|n>>10,56320|1023&n)};try{q.call(w.documentElement.childNodes,0)[0].nodeType}catch(nt){q=function(e){var t,n=[];while(t=this[e++])n.push(t);return n}}function rt(e){return Y.test(e+"")}function it(){var e,t=[];return e=function(n,r){return t.push(n+=" ")>i.cacheLength&&delete e[t.shift()],e[n]=r}}function ot(e){return e[x]=!0,e}function at(e){var t=p.createElement("div");try{return e(t)}catch(n){return!1}finally{t=null}}function st(e,t,n,r){var i,o,a,s,u,l,f,g,m,v;if((t?t.ownerDocument||t:w)!==p&&c(t),t=t||p,n=n||[],!e||"string"!=typeof e)return n;if(1!==(s=t.nodeType)&&9!==s)return[];if(!d&&!r){if(i=J.exec(e))if(a=i[1]){if(9===s){if(o=t.getElementById(a),!o||!o.parentNode)return n;if(o.id===a)return n.push(o),n}else if(t.ownerDocument&&(o=t.ownerDocument.getElementById(a))&&y(t,o)&&o.id===a)return n.push(o),n}else{if(i[2])return H.apply(n,q.call(t.getElementsByTagName(e),0)),n;if((a=i[3])&&T.getByClassName&&t.getElementsByClassName)return H.apply(n,q.call(t.getElementsByClassName(a),0)),n}if(T.qsa&&!h.test(e)){if(f=!0,g=x,m=t,v=9===s&&e,1===s&&"object"!==t.nodeName.toLowerCase()){l=ft(e),(f=t.getAttribute("id"))?g=f.replace(K,"\\$&"):t.setAttribute("id",g),g="[id='"+g+"'] ",u=l.length;while(u--)l[u]=g+dt(l[u]);m=V.test(e)&&t.parentNode||t,v=l.join(",")}if(v)try{return H.apply(n,q.call(m.querySelectorAll(v),0)),n}catch(b){}finally{f||t.removeAttribute("id")}}}return wt(e.replace(W,"$1"),t,n,r)}a=st.isXML=function(e){var t=e&&(e.ownerDocument||e).documentElement;return t?"HTML"!==t.nodeName:!1},c=st.setDocument=function(e){var n=e?e.ownerDocument||e:w;return n!==p&&9===n.nodeType&&n.documentElement?(p=n,f=n.documentElement,d=a(n),T.tagNameNoComments=at(function(e){return e.appendChild(n.createComment("")),!e.getElementsByTagName("*").length}),T.attributes=at(function(e){e.innerHTML="";var t=typeof e.lastChild.getAttribute("multiple");return"boolean"!==t&&"string"!==t}),T.getByClassName=at(function(e){return e.innerHTML="",e.getElementsByClassName&&e.getElementsByClassName("e").length?(e.lastChild.className="e",2===e.getElementsByClassName("e").length):!1}),T.getByName=at(function(e){e.id=x+0,e.innerHTML="
",f.insertBefore(e,f.firstChild);var t=n.getElementsByName&&n.getElementsByName(x).length===2+n.getElementsByName(x+0).length;return T.getIdNotName=!n.getElementById(x),f.removeChild(e),t}),i.attrHandle=at(function(e){return e.innerHTML="",e.firstChild&&typeof e.firstChild.getAttribute!==A&&"#"===e.firstChild.getAttribute("href")})?{}:{href:function(e){return e.getAttribute("href",2)},type:function(e){return e.getAttribute("type")}},T.getIdNotName?(i.find.ID=function(e,t){if(typeof t.getElementById!==A&&!d){var n=t.getElementById(e);return n&&n.parentNode?[n]:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){return e.getAttribute("id")===t}}):(i.find.ID=function(e,n){if(typeof n.getElementById!==A&&!d){var r=n.getElementById(e);return r?r.id===e||typeof r.getAttributeNode!==A&&r.getAttributeNode("id").value===e?[r]:t:[]}},i.filter.ID=function(e){var t=e.replace(et,tt);return function(e){var n=typeof e.getAttributeNode!==A&&e.getAttributeNode("id");return n&&n.value===t}}),i.find.TAG=T.tagNameNoComments?function(e,n){return typeof n.getElementsByTagName!==A?n.getElementsByTagName(e):t}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},i.find.NAME=T.getByName&&function(e,n){return typeof n.getElementsByName!==A?n.getElementsByName(name):t},i.find.CLASS=T.getByClassName&&function(e,n){return typeof n.getElementsByClassName===A||d?t:n.getElementsByClassName(e)},g=[],h=[":focus"],(T.qsa=rt(n.querySelectorAll))&&(at(function(e){e.innerHTML="",e.querySelectorAll("[selected]").length||h.push("\\["+_+"*(?:checked|disabled|ismap|multiple|readonly|selected|value)"),e.querySelectorAll(":checked").length||h.push(":checked")}),at(function(e){e.innerHTML="",e.querySelectorAll("[i^='']").length&&h.push("[*^$]="+_+"*(?:\"\"|'')"),e.querySelectorAll(":enabled").length||h.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),h.push(",.*:")})),(T.matchesSelector=rt(m=f.matchesSelector||f.mozMatchesSelector||f.webkitMatchesSelector||f.oMatchesSelector||f.msMatchesSelector))&&at(function(e){T.disconnectedMatch=m.call(e,"div"),m.call(e,"[s!='']:x"),g.push("!=",R)}),h=RegExp(h.join("|")),g=RegExp(g.join("|")),y=rt(f.contains)||f.compareDocumentPosition?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},v=f.compareDocumentPosition?function(e,t){var r;return e===t?(u=!0,0):(r=t.compareDocumentPosition&&e.compareDocumentPosition&&e.compareDocumentPosition(t))?1&r||e.parentNode&&11===e.parentNode.nodeType?e===n||y(w,e)?-1:t===n||y(w,t)?1:0:4&r?-1:1:e.compareDocumentPosition?-1:1}:function(e,t){var r,i=0,o=e.parentNode,a=t.parentNode,s=[e],l=[t];if(e===t)return u=!0,0;if(!o||!a)return e===n?-1:t===n?1:o?-1:a?1:0;if(o===a)return ut(e,t);r=e;while(r=r.parentNode)s.unshift(r);r=t;while(r=r.parentNode)l.unshift(r);while(s[i]===l[i])i++;return i?ut(s[i],l[i]):s[i]===w?-1:l[i]===w?1:0},u=!1,[0,0].sort(v),T.detectDuplicates=u,p):p},st.matches=function(e,t){return st(e,null,null,t)},st.matchesSelector=function(e,t){if((e.ownerDocument||e)!==p&&c(e),t=t.replace(Z,"='$1']"),!(!T.matchesSelector||d||g&&g.test(t)||h.test(t)))try{var n=m.call(e,t);if(n||T.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(r){}return st(t,p,null,[e]).length>0},st.contains=function(e,t){return(e.ownerDocument||e)!==p&&c(e),y(e,t)},st.attr=function(e,t){var n;return(e.ownerDocument||e)!==p&&c(e),d||(t=t.toLowerCase()),(n=i.attrHandle[t])?n(e):d||T.attributes?e.getAttribute(t):((n=e.getAttributeNode(t))||e.getAttribute(t))&&e[t]===!0?t:n&&n.specified?n.value:null},st.error=function(e){throw Error("Syntax error, unrecognized expression: "+e)},st.uniqueSort=function(e){var t,n=[],r=1,i=0;if(u=!T.detectDuplicates,e.sort(v),u){for(;t=e[r];r++)t===e[r-1]&&(i=n.push(r));while(i--)e.splice(n[i],1)}return e};function ut(e,t){var n=t&&e,r=n&&(~t.sourceIndex||j)-(~e.sourceIndex||j);if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function lt(e){return function(t){var n=t.nodeName.toLowerCase();return"input"===n&&t.type===e}}function ct(e){return function(t){var n=t.nodeName.toLowerCase();return("input"===n||"button"===n)&&t.type===e}}function pt(e){return ot(function(t){return t=+t,ot(function(n,r){var i,o=e([],n.length,t),a=o.length;while(a--)n[i=o[a]]&&(n[i]=!(r[i]=n[i]))})})}o=st.getText=function(e){var t,n="",r=0,i=e.nodeType;if(i){if(1===i||9===i||11===i){if("string"==typeof e.textContent)return e.textContent;for(e=e.firstChild;e;e=e.nextSibling)n+=o(e)}else if(3===i||4===i)return e.nodeValue}else for(;t=e[r];r++)n+=o(t);return n},i=st.selectors={cacheLength:50,createPseudo:ot,match:U,find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(et,tt),e[3]=(e[4]||e[5]||"").replace(et,tt),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||st.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&st.error(e[0]),e},PSEUDO:function(e){var t,n=!e[5]&&e[2];return U.CHILD.test(e[0])?null:(e[4]?e[2]=e[4]:n&&z.test(n)&&(t=ft(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){return"*"===e?function(){return!0}:(e=e.replace(et,tt).toLowerCase(),function(t){return t.nodeName&&t.nodeName.toLowerCase()===e})},CLASS:function(e){var t=k[e+" "];return t||(t=RegExp("(^|"+_+")"+e+"("+_+"|$)"))&&k(e,function(e){return t.test(e.className||typeof e.getAttribute!==A&&e.getAttribute("class")||"")})},ATTR:function(e,t,n){return function(r){var i=st.attr(r,e);return null==i?"!="===t:t?(i+="","="===t?i===n:"!="===t?i!==n:"^="===t?n&&0===i.indexOf(n):"*="===t?n&&i.indexOf(n)>-1:"$="===t?n&&i.slice(-n.length)===n:"~="===t?(" "+i+" ").indexOf(n)>-1:"|="===t?i===n||i.slice(0,n.length+1)===n+"-":!1):!0}},CHILD:function(e,t,n,r,i){var o="nth"!==e.slice(0,3),a="last"!==e.slice(-4),s="of-type"===t;return 1===r&&0===i?function(e){return!!e.parentNode}:function(t,n,u){var l,c,p,f,d,h,g=o!==a?"nextSibling":"previousSibling",m=t.parentNode,y=s&&t.nodeName.toLowerCase(),v=!u&&!s;if(m){if(o){while(g){p=t;while(p=p[g])if(s?p.nodeName.toLowerCase()===y:1===p.nodeType)return!1;h=g="only"===e&&!h&&"nextSibling"}return!0}if(h=[a?m.firstChild:m.lastChild],a&&v){c=m[x]||(m[x]={}),l=c[e]||[],d=l[0]===N&&l[1],f=l[0]===N&&l[2],p=d&&m.childNodes[d];while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if(1===p.nodeType&&++f&&p===t){c[e]=[N,d,f];break}}else if(v&&(l=(t[x]||(t[x]={}))[e])&&l[0]===N)f=l[1];else while(p=++d&&p&&p[g]||(f=d=0)||h.pop())if((s?p.nodeName.toLowerCase()===y:1===p.nodeType)&&++f&&(v&&((p[x]||(p[x]={}))[e]=[N,f]),p===t))break;return f-=i,f===r||0===f%r&&f/r>=0}}},PSEUDO:function(e,t){var n,r=i.pseudos[e]||i.setFilters[e.toLowerCase()]||st.error("unsupported pseudo: "+e);return r[x]?r(t):r.length>1?(n=[e,e,"",t],i.setFilters.hasOwnProperty(e.toLowerCase())?ot(function(e,n){var i,o=r(e,t),a=o.length;while(a--)i=M.call(e,o[a]),e[i]=!(n[i]=o[a])}):function(e){return r(e,0,n)}):r}},pseudos:{not:ot(function(e){var t=[],n=[],r=s(e.replace(W,"$1"));return r[x]?ot(function(e,t,n,i){var o,a=r(e,null,i,[]),s=e.length;while(s--)(o=a[s])&&(e[s]=!(t[s]=o))}):function(e,i,o){return t[0]=e,r(t,null,o,n),!n.pop()}}),has:ot(function(e){return function(t){return st(e,t).length>0}}),contains:ot(function(e){return function(t){return(t.textContent||t.innerText||o(t)).indexOf(e)>-1}}),lang:ot(function(e){return X.test(e||"")||st.error("unsupported lang: "+e),e=e.replace(et,tt).toLowerCase(),function(t){var n;do if(n=d?t.getAttribute("xml:lang")||t.getAttribute("lang"):t.lang)return n=n.toLowerCase(),n===e||0===n.indexOf(e+"-");while((t=t.parentNode)&&1===t.nodeType);return!1}}),target:function(t){var n=e.location&&e.location.hash;return n&&n.slice(1)===t.id},root:function(e){return e===f},focus:function(e){return e===p.activeElement&&(!p.hasFocus||p.hasFocus())&&!!(e.type||e.href||~e.tabIndex)},enabled:function(e){return e.disabled===!1},disabled:function(e){return e.disabled===!0},checked:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&!!e.checked||"option"===t&&!!e.selected},selected:function(e){return e.parentNode&&e.parentNode.selectedIndex,e.selected===!0},empty:function(e){for(e=e.firstChild;e;e=e.nextSibling)if(e.nodeName>"@"||3===e.nodeType||4===e.nodeType)return!1;return!0},parent:function(e){return!i.pseudos.empty(e)},header:function(e){return Q.test(e.nodeName)},input:function(e){return G.test(e.nodeName)},button:function(e){var t=e.nodeName.toLowerCase();return"input"===t&&"button"===e.type||"button"===t},text:function(e){var t;return"input"===e.nodeName.toLowerCase()&&"text"===e.type&&(null==(t=e.getAttribute("type"))||t.toLowerCase()===e.type)},first:pt(function(){return[0]}),last:pt(function(e,t){return[t-1]}),eq:pt(function(e,t,n){return[0>n?n+t:n]}),even:pt(function(e,t){var n=0;for(;t>n;n+=2)e.push(n);return e}),odd:pt(function(e,t){var n=1;for(;t>n;n+=2)e.push(n);return e}),lt:pt(function(e,t,n){var r=0>n?n+t:n;for(;--r>=0;)e.push(r);return e}),gt:pt(function(e,t,n){var r=0>n?n+t:n;for(;t>++r;)e.push(r);return e})}};for(n in{radio:!0,checkbox:!0,file:!0,password:!0,image:!0})i.pseudos[n]=lt(n);for(n in{submit:!0,reset:!0})i.pseudos[n]=ct(n);function ft(e,t){var n,r,o,a,s,u,l,c=E[e+" "];if(c)return t?0:c.slice(0);s=e,u=[],l=i.preFilter;while(s){(!n||(r=$.exec(s)))&&(r&&(s=s.slice(r[0].length)||s),u.push(o=[])),n=!1,(r=I.exec(s))&&(n=r.shift(),o.push({value:n,type:r[0].replace(W," ")}),s=s.slice(n.length));for(a in i.filter)!(r=U[a].exec(s))||l[a]&&!(r=l[a](r))||(n=r.shift(),o.push({value:n,type:a,matches:r}),s=s.slice(n.length));if(!n)break}return t?s.length:s?st.error(e):E(e,u).slice(0)}function dt(e){var t=0,n=e.length,r="";for(;n>t;t++)r+=e[t].value;return r}function ht(e,t,n){var i=t.dir,o=n&&"parentNode"===i,a=C++;return t.first?function(t,n,r){while(t=t[i])if(1===t.nodeType||o)return e(t,n,r)}:function(t,n,s){var u,l,c,p=N+" "+a;if(s){while(t=t[i])if((1===t.nodeType||o)&&e(t,n,s))return!0}else while(t=t[i])if(1===t.nodeType||o)if(c=t[x]||(t[x]={}),(l=c[i])&&l[0]===p){if((u=l[1])===!0||u===r)return u===!0}else if(l=c[i]=[p],l[1]=e(t,n,s)||r,l[1]===!0)return!0}}function gt(e){return e.length>1?function(t,n,r){var i=e.length;while(i--)if(!e[i](t,n,r))return!1;return!0}:e[0]}function mt(e,t,n,r,i){var o,a=[],s=0,u=e.length,l=null!=t;for(;u>s;s++)(o=e[s])&&(!n||n(o,r,i))&&(a.push(o),l&&t.push(s));return a}function yt(e,t,n,r,i,o){return r&&!r[x]&&(r=yt(r)),i&&!i[x]&&(i=yt(i,o)),ot(function(o,a,s,u){var l,c,p,f=[],d=[],h=a.length,g=o||xt(t||"*",s.nodeType?[s]:s,[]),m=!e||!o&&t?g:mt(g,f,e,s,u),y=n?i||(o?e:h||r)?[]:a:m;if(n&&n(m,y,s,u),r){l=mt(y,d),r(l,[],s,u),c=l.length;while(c--)(p=l[c])&&(y[d[c]]=!(m[d[c]]=p))}if(o){if(i||e){if(i){l=[],c=y.length;while(c--)(p=y[c])&&l.push(m[c]=p);i(null,y=[],l,u)}c=y.length;while(c--)(p=y[c])&&(l=i?M.call(o,p):f[c])>-1&&(o[l]=!(a[l]=p))}}else y=mt(y===a?y.splice(h,y.length):y),i?i(null,a,y,u):H.apply(a,y)})}function vt(e){var t,n,r,o=e.length,a=i.relative[e[0].type],s=a||i.relative[" "],u=a?1:0,c=ht(function(e){return e===t},s,!0),p=ht(function(e){return M.call(t,e)>-1},s,!0),f=[function(e,n,r){return!a&&(r||n!==l)||((t=n).nodeType?c(e,n,r):p(e,n,r))}];for(;o>u;u++)if(n=i.relative[e[u].type])f=[ht(gt(f),n)];else{if(n=i.filter[e[u].type].apply(null,e[u].matches),n[x]){for(r=++u;o>r;r++)if(i.relative[e[r].type])break;return yt(u>1&>(f),u>1&&dt(e.slice(0,u-1)).replace(W,"$1"),n,r>u&&vt(e.slice(u,r)),o>r&&vt(e=e.slice(r)),o>r&&dt(e))}f.push(n)}return gt(f)}function bt(e,t){var n=0,o=t.length>0,a=e.length>0,s=function(s,u,c,f,d){var h,g,m,y=[],v=0,b="0",x=s&&[],w=null!=d,T=l,C=s||a&&i.find.TAG("*",d&&u.parentNode||u),k=N+=null==T?1:Math.random()||.1;for(w&&(l=u!==p&&u,r=n);null!=(h=C[b]);b++){if(a&&h){g=0;while(m=e[g++])if(m(h,u,c)){f.push(h);break}w&&(N=k,r=++n)}o&&((h=!m&&h)&&v--,s&&x.push(h))}if(v+=b,o&&b!==v){g=0;while(m=t[g++])m(x,y,u,c);if(s){if(v>0)while(b--)x[b]||y[b]||(y[b]=L.call(f));y=mt(y)}H.apply(f,y),w&&!s&&y.length>0&&v+t.length>1&&st.uniqueSort(f)}return w&&(N=k,l=T),x};return o?ot(s):s}s=st.compile=function(e,t){var n,r=[],i=[],o=S[e+" "];if(!o){t||(t=ft(e)),n=t.length;while(n--)o=vt(t[n]),o[x]?r.push(o):i.push(o);o=S(e,bt(i,r))}return o};function xt(e,t,n){var r=0,i=t.length;for(;i>r;r++)st(e,t[r],n);return n}function wt(e,t,n,r){var o,a,u,l,c,p=ft(e);if(!r&&1===p.length){if(a=p[0]=p[0].slice(0),a.length>2&&"ID"===(u=a[0]).type&&9===t.nodeType&&!d&&i.relative[a[1].type]){if(t=i.find.ID(u.matches[0].replace(et,tt),t)[0],!t)return n;e=e.slice(a.shift().value.length)}o=U.needsContext.test(e)?0:a.length;while(o--){if(u=a[o],i.relative[l=u.type])break;if((c=i.find[l])&&(r=c(u.matches[0].replace(et,tt),V.test(a[0].type)&&t.parentNode||t))){if(a.splice(o,1),e=r.length&&dt(a),!e)return H.apply(n,q.call(r,0)),n;break}}}return s(e,p)(r,t,d,n,V.test(e)),n}i.pseudos.nth=i.pseudos.eq;function Tt(){}i.filters=Tt.prototype=i.pseudos,i.setFilters=new Tt,c(),st.attr=b.attr,b.find=st,b.expr=st.selectors,b.expr[":"]=b.expr.pseudos,b.unique=st.uniqueSort,b.text=st.getText,b.isXMLDoc=st.isXML,b.contains=st.contains}(e);var at=/Until$/,st=/^(?:parents|prev(?:Until|All))/,ut=/^.[^:#\[\.,]*$/,lt=b.expr.match.needsContext,ct={children:!0,contents:!0,next:!0,prev:!0};b.fn.extend({find:function(e){var t,n,r,i=this.length;if("string"!=typeof e)return r=this,this.pushStack(b(e).filter(function(){for(t=0;i>t;t++)if(b.contains(r[t],this))return!0}));for(n=[],t=0;i>t;t++)b.find(e,this[t],n);return n=this.pushStack(i>1?b.unique(n):n),n.selector=(this.selector?this.selector+" ":"")+e,n},has:function(e){var t,n=b(e,this),r=n.length;return this.filter(function(){for(t=0;r>t;t++)if(b.contains(this,n[t]))return!0})},not:function(e){return this.pushStack(ft(this,e,!1))},filter:function(e){return this.pushStack(ft(this,e,!0))},is:function(e){return!!e&&("string"==typeof e?lt.test(e)?b(e,this.context).index(this[0])>=0:b.filter(e,this).length>0:this.filter(e).length>0)},closest:function(e,t){var n,r=0,i=this.length,o=[],a=lt.test(e)||"string"!=typeof e?b(e,t||this.context):0;for(;i>r;r++){n=this[r];while(n&&n.ownerDocument&&n!==t&&11!==n.nodeType){if(a?a.index(n)>-1:b.find.matchesSelector(n,e)){o.push(n);break}n=n.parentNode}}return this.pushStack(o.length>1?b.unique(o):o)},index:function(e){return e?"string"==typeof e?b.inArray(this[0],b(e)):b.inArray(e.jquery?e[0]:e,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(e,t){var n="string"==typeof e?b(e,t):b.makeArray(e&&e.nodeType?[e]:e),r=b.merge(this.get(),n);return this.pushStack(b.unique(r))},addBack:function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}}),b.fn.andSelf=b.fn.addBack;function pt(e,t){do e=e[t];while(e&&1!==e.nodeType);return e}b.each({parent:function(e){var t=e.parentNode;return t&&11!==t.nodeType?t:null},parents:function(e){return b.dir(e,"parentNode")},parentsUntil:function(e,t,n){return b.dir(e,"parentNode",n)},next:function(e){return pt(e,"nextSibling")},prev:function(e){return pt(e,"previousSibling")},nextAll:function(e){return b.dir(e,"nextSibling")},prevAll:function(e){return b.dir(e,"previousSibling")},nextUntil:function(e,t,n){return b.dir(e,"nextSibling",n)},prevUntil:function(e,t,n){return b.dir(e,"previousSibling",n)},siblings:function(e){return b.sibling((e.parentNode||{}).firstChild,e)},children:function(e){return b.sibling(e.firstChild)},contents:function(e){return b.nodeName(e,"iframe")?e.contentDocument||e.contentWindow.document:b.merge([],e.childNodes)}},function(e,t){b.fn[e]=function(n,r){var i=b.map(this,t,n);return at.test(e)||(r=n),r&&"string"==typeof r&&(i=b.filter(r,i)),i=this.length>1&&!ct[e]?b.unique(i):i,this.length>1&&st.test(e)&&(i=i.reverse()),this.pushStack(i)}}),b.extend({filter:function(e,t,n){return n&&(e=":not("+e+")"),1===t.length?b.find.matchesSelector(t[0],e)?[t[0]]:[]:b.find.matches(e,t)},dir:function(e,n,r){var i=[],o=e[n];while(o&&9!==o.nodeType&&(r===t||1!==o.nodeType||!b(o).is(r)))1===o.nodeType&&i.push(o),o=o[n];return i},sibling:function(e,t){var n=[];for(;e;e=e.nextSibling)1===e.nodeType&&e!==t&&n.push(e);return n}});function ft(e,t,n){if(t=t||0,b.isFunction(t))return b.grep(e,function(e,r){var i=!!t.call(e,r,e);return i===n});if(t.nodeType)return b.grep(e,function(e){return e===t===n});if("string"==typeof t){var r=b.grep(e,function(e){return 1===e.nodeType});if(ut.test(t))return b.filter(t,r,!n);t=b.filter(t,r)}return b.grep(e,function(e){return b.inArray(e,t)>=0===n})}function dt(e){var t=ht.split("|"),n=e.createDocumentFragment();if(n.createElement)while(t.length)n.createElement(t.pop());return n}var ht="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",gt=/ jQuery\d+="(?:null|\d+)"/g,mt=RegExp("<(?:"+ht+")[\\s/>]","i"),yt=/^\s+/,vt=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,bt=/<([\w:]+)/,xt=/\s*$/g,At={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:b.support.htmlSerialize?[0,"",""]:[1,"X
","
"]},jt=dt(o),Dt=jt.appendChild(o.createElement("div"));At.optgroup=At.option,At.tbody=At.tfoot=At.colgroup=At.caption=At.thead,At.th=At.td,b.fn.extend({text:function(e){return b.access(this,function(e){return e===t?b.text(this):this.empty().append((this[0]&&this[0].ownerDocument||o).createTextNode(e))},null,e,arguments.length)},wrapAll:function(e){if(b.isFunction(e))return this.each(function(t){b(this).wrapAll(e.call(this,t))});if(this[0]){var t=b(e,this[0].ownerDocument).eq(0).clone(!0);this[0].parentNode&&t.insertBefore(this[0]),t.map(function(){var e=this;while(e.firstChild&&1===e.firstChild.nodeType)e=e.firstChild;return e}).append(this)}return this},wrapInner:function(e){return b.isFunction(e)?this.each(function(t){b(this).wrapInner(e.call(this,t))}):this.each(function(){var t=b(this),n=t.contents();n.length?n.wrapAll(e):t.append(e)})},wrap:function(e){var t=b.isFunction(e);return this.each(function(n){b(this).wrapAll(t?e.call(this,n):e)})},unwrap:function(){return this.parent().each(function(){b.nodeName(this,"body")||b(this).replaceWith(this.childNodes)}).end()},append:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.appendChild(e)})},prepend:function(){return this.domManip(arguments,!0,function(e){(1===this.nodeType||11===this.nodeType||9===this.nodeType)&&this.insertBefore(e,this.firstChild)})},before:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this)})},after:function(){return this.domManip(arguments,!1,function(e){this.parentNode&&this.parentNode.insertBefore(e,this.nextSibling)})},remove:function(e,t){var n,r=0;for(;null!=(n=this[r]);r++)(!e||b.filter(e,[n]).length>0)&&(t||1!==n.nodeType||b.cleanData(Ot(n)),n.parentNode&&(t&&b.contains(n.ownerDocument,n)&&Mt(Ot(n,"script")),n.parentNode.removeChild(n)));return this},empty:function(){var e,t=0;for(;null!=(e=this[t]);t++){1===e.nodeType&&b.cleanData(Ot(e,!1));while(e.firstChild)e.removeChild(e.firstChild);e.options&&b.nodeName(e,"select")&&(e.options.length=0)}return this},clone:function(e,t){return e=null==e?!1:e,t=null==t?e:t,this.map(function(){return b.clone(this,e,t)})},html:function(e){return b.access(this,function(e){var n=this[0]||{},r=0,i=this.length;if(e===t)return 1===n.nodeType?n.innerHTML.replace(gt,""):t;if(!("string"!=typeof e||Tt.test(e)||!b.support.htmlSerialize&&mt.test(e)||!b.support.leadingWhitespace&&yt.test(e)||At[(bt.exec(e)||["",""])[1].toLowerCase()])){e=e.replace(vt,"<$1>");try{for(;i>r;r++)n=this[r]||{},1===n.nodeType&&(b.cleanData(Ot(n,!1)),n.innerHTML=e);n=0}catch(o){}}n&&this.empty().append(e)},null,e,arguments.length)},replaceWith:function(e){var t=b.isFunction(e);return t||"string"==typeof e||(e=b(e).not(this).detach()),this.domManip([e],!0,function(e){var t=this.nextSibling,n=this.parentNode;n&&(b(this).remove(),n.insertBefore(e,t))})},detach:function(e){return this.remove(e,!0)},domManip:function(e,n,r){e=f.apply([],e);var i,o,a,s,u,l,c=0,p=this.length,d=this,h=p-1,g=e[0],m=b.isFunction(g);if(m||!(1>=p||"string"!=typeof g||b.support.checkClone)&&Ct.test(g))return this.each(function(i){var o=d.eq(i);m&&(e[0]=g.call(this,i,n?o.html():t)),o.domManip(e,n,r)});if(p&&(l=b.buildFragment(e,this[0].ownerDocument,!1,this),i=l.firstChild,1===l.childNodes.length&&(l=i),i)){for(n=n&&b.nodeName(i,"tr"),s=b.map(Ot(l,"script"),Ht),a=s.length;p>c;c++)o=l,c!==h&&(o=b.clone(o,!0,!0),a&&b.merge(s,Ot(o,"script"))),r.call(n&&b.nodeName(this[c],"table")?Lt(this[c],"tbody"):this[c],o,c);if(a)for(u=s[s.length-1].ownerDocument,b.map(s,qt),c=0;a>c;c++)o=s[c],kt.test(o.type||"")&&!b._data(o,"globalEval")&&b.contains(u,o)&&(o.src?b.ajax({url:o.src,type:"GET",dataType:"script",async:!1,global:!1,"throws":!0}):b.globalEval((o.text||o.textContent||o.innerHTML||"").replace(St,"")));l=i=null}return this}});function Lt(e,t){return e.getElementsByTagName(t)[0]||e.appendChild(e.ownerDocument.createElement(t))}function Ht(e){var t=e.getAttributeNode("type");return e.type=(t&&t.specified)+"/"+e.type,e}function qt(e){var t=Et.exec(e.type);return t?e.type=t[1]:e.removeAttribute("type"),e}function Mt(e,t){var n,r=0;for(;null!=(n=e[r]);r++)b._data(n,"globalEval",!t||b._data(t[r],"globalEval"))}function _t(e,t){if(1===t.nodeType&&b.hasData(e)){var n,r,i,o=b._data(e),a=b._data(t,o),s=o.events;if(s){delete a.handle,a.events={};for(n in s)for(r=0,i=s[n].length;i>r;r++)b.event.add(t,n,s[n][r])}a.data&&(a.data=b.extend({},a.data))}}function Ft(e,t){var n,r,i;if(1===t.nodeType){if(n=t.nodeName.toLowerCase(),!b.support.noCloneEvent&&t[b.expando]){i=b._data(t);for(r in i.events)b.removeEvent(t,r,i.handle);t.removeAttribute(b.expando)}"script"===n&&t.text!==e.text?(Ht(t).text=e.text,qt(t)):"object"===n?(t.parentNode&&(t.outerHTML=e.outerHTML),b.support.html5Clone&&e.innerHTML&&!b.trim(t.innerHTML)&&(t.innerHTML=e.innerHTML)):"input"===n&&Nt.test(e.type)?(t.defaultChecked=t.checked=e.checked,t.value!==e.value&&(t.value=e.value)):"option"===n?t.defaultSelected=t.selected=e.defaultSelected:("input"===n||"textarea"===n)&&(t.defaultValue=e.defaultValue)}}b.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(e,t){b.fn[e]=function(e){var n,r=0,i=[],o=b(e),a=o.length-1;for(;a>=r;r++)n=r===a?this:this.clone(!0),b(o[r])[t](n),d.apply(i,n.get());return this.pushStack(i)}});function Ot(e,n){var r,o,a=0,s=typeof e.getElementsByTagName!==i?e.getElementsByTagName(n||"*"):typeof e.querySelectorAll!==i?e.querySelectorAll(n||"*"):t;if(!s)for(s=[],r=e.childNodes||e;null!=(o=r[a]);a++)!n||b.nodeName(o,n)?s.push(o):b.merge(s,Ot(o,n));return n===t||n&&b.nodeName(e,n)?b.merge([e],s):s}function Bt(e){Nt.test(e.type)&&(e.defaultChecked=e.checked)}b.extend({clone:function(e,t,n){var r,i,o,a,s,u=b.contains(e.ownerDocument,e);if(b.support.html5Clone||b.isXMLDoc(e)||!mt.test("<"+e.nodeName+">")?o=e.cloneNode(!0):(Dt.innerHTML=e.outerHTML,Dt.removeChild(o=Dt.firstChild)),!(b.support.noCloneEvent&&b.support.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||b.isXMLDoc(e)))for(r=Ot(o),s=Ot(e),a=0;null!=(i=s[a]);++a)r[a]&&Ft(i,r[a]);if(t)if(n)for(s=s||Ot(e),r=r||Ot(o),a=0;null!=(i=s[a]);a++)_t(i,r[a]);else _t(e,o);return r=Ot(o,"script"),r.length>0&&Mt(r,!u&&Ot(e,"script")),r=s=i=null,o},buildFragment:function(e,t,n,r){var i,o,a,s,u,l,c,p=e.length,f=dt(t),d=[],h=0;for(;p>h;h++)if(o=e[h],o||0===o)if("object"===b.type(o))b.merge(d,o.nodeType?[o]:o);else if(wt.test(o)){s=s||f.appendChild(t.createElement("div")),u=(bt.exec(o)||["",""])[1].toLowerCase(),c=At[u]||At._default,s.innerHTML=c[1]+o.replace(vt,"<$1>")+c[2],i=c[0];while(i--)s=s.lastChild;if(!b.support.leadingWhitespace&&yt.test(o)&&d.push(t.createTextNode(yt.exec(o)[0])),!b.support.tbody){o="table"!==u||xt.test(o)?""!==c[1]||xt.test(o)?0:s:s.firstChild,i=o&&o.childNodes.length;while(i--)b.nodeName(l=o.childNodes[i],"tbody")&&!l.childNodes.length&&o.removeChild(l) 5 | }b.merge(d,s.childNodes),s.textContent="";while(s.firstChild)s.removeChild(s.firstChild);s=f.lastChild}else d.push(t.createTextNode(o));s&&f.removeChild(s),b.support.appendChecked||b.grep(Ot(d,"input"),Bt),h=0;while(o=d[h++])if((!r||-1===b.inArray(o,r))&&(a=b.contains(o.ownerDocument,o),s=Ot(f.appendChild(o),"script"),a&&Mt(s),n)){i=0;while(o=s[i++])kt.test(o.type||"")&&n.push(o)}return s=null,f},cleanData:function(e,t){var n,r,o,a,s=0,u=b.expando,l=b.cache,p=b.support.deleteExpando,f=b.event.special;for(;null!=(n=e[s]);s++)if((t||b.acceptData(n))&&(o=n[u],a=o&&l[o])){if(a.events)for(r in a.events)f[r]?b.event.remove(n,r):b.removeEvent(n,r,a.handle);l[o]&&(delete l[o],p?delete n[u]:typeof n.removeAttribute!==i?n.removeAttribute(u):n[u]=null,c.push(o))}}});var Pt,Rt,Wt,$t=/alpha\([^)]*\)/i,It=/opacity\s*=\s*([^)]*)/,zt=/^(top|right|bottom|left)$/,Xt=/^(none|table(?!-c[ea]).+)/,Ut=/^margin/,Vt=RegExp("^("+x+")(.*)$","i"),Yt=RegExp("^("+x+")(?!px)[a-z%]+$","i"),Jt=RegExp("^([+-])=("+x+")","i"),Gt={BODY:"block"},Qt={position:"absolute",visibility:"hidden",display:"block"},Kt={letterSpacing:0,fontWeight:400},Zt=["Top","Right","Bottom","Left"],en=["Webkit","O","Moz","ms"];function tn(e,t){if(t in e)return t;var n=t.charAt(0).toUpperCase()+t.slice(1),r=t,i=en.length;while(i--)if(t=en[i]+n,t in e)return t;return r}function nn(e,t){return e=t||e,"none"===b.css(e,"display")||!b.contains(e.ownerDocument,e)}function rn(e,t){var n,r,i,o=[],a=0,s=e.length;for(;s>a;a++)r=e[a],r.style&&(o[a]=b._data(r,"olddisplay"),n=r.style.display,t?(o[a]||"none"!==n||(r.style.display=""),""===r.style.display&&nn(r)&&(o[a]=b._data(r,"olddisplay",un(r.nodeName)))):o[a]||(i=nn(r),(n&&"none"!==n||!i)&&b._data(r,"olddisplay",i?n:b.css(r,"display"))));for(a=0;s>a;a++)r=e[a],r.style&&(t&&"none"!==r.style.display&&""!==r.style.display||(r.style.display=t?o[a]||"":"none"));return e}b.fn.extend({css:function(e,n){return b.access(this,function(e,n,r){var i,o,a={},s=0;if(b.isArray(n)){for(o=Rt(e),i=n.length;i>s;s++)a[n[s]]=b.css(e,n[s],!1,o);return a}return r!==t?b.style(e,n,r):b.css(e,n)},e,n,arguments.length>1)},show:function(){return rn(this,!0)},hide:function(){return rn(this)},toggle:function(e){var t="boolean"==typeof e;return this.each(function(){(t?e:nn(this))?b(this).show():b(this).hide()})}}),b.extend({cssHooks:{opacity:{get:function(e,t){if(t){var n=Wt(e,"opacity");return""===n?"1":n}}}},cssNumber:{columnCount:!0,fillOpacity:!0,fontWeight:!0,lineHeight:!0,opacity:!0,orphans:!0,widows:!0,zIndex:!0,zoom:!0},cssProps:{"float":b.support.cssFloat?"cssFloat":"styleFloat"},style:function(e,n,r,i){if(e&&3!==e.nodeType&&8!==e.nodeType&&e.style){var o,a,s,u=b.camelCase(n),l=e.style;if(n=b.cssProps[u]||(b.cssProps[u]=tn(l,u)),s=b.cssHooks[n]||b.cssHooks[u],r===t)return s&&"get"in s&&(o=s.get(e,!1,i))!==t?o:l[n];if(a=typeof r,"string"===a&&(o=Jt.exec(r))&&(r=(o[1]+1)*o[2]+parseFloat(b.css(e,n)),a="number"),!(null==r||"number"===a&&isNaN(r)||("number"!==a||b.cssNumber[u]||(r+="px"),b.support.clearCloneStyle||""!==r||0!==n.indexOf("background")||(l[n]="inherit"),s&&"set"in s&&(r=s.set(e,r,i))===t)))try{l[n]=r}catch(c){}}},css:function(e,n,r,i){var o,a,s,u=b.camelCase(n);return n=b.cssProps[u]||(b.cssProps[u]=tn(e.style,u)),s=b.cssHooks[n]||b.cssHooks[u],s&&"get"in s&&(a=s.get(e,!0,r)),a===t&&(a=Wt(e,n,i)),"normal"===a&&n in Kt&&(a=Kt[n]),""===r||r?(o=parseFloat(a),r===!0||b.isNumeric(o)?o||0:a):a},swap:function(e,t,n,r){var i,o,a={};for(o in t)a[o]=e.style[o],e.style[o]=t[o];i=n.apply(e,r||[]);for(o in t)e.style[o]=a[o];return i}}),e.getComputedStyle?(Rt=function(t){return e.getComputedStyle(t,null)},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s.getPropertyValue(n)||s[n]:t,l=e.style;return s&&(""!==u||b.contains(e.ownerDocument,e)||(u=b.style(e,n)),Yt.test(u)&&Ut.test(n)&&(i=l.width,o=l.minWidth,a=l.maxWidth,l.minWidth=l.maxWidth=l.width=u,u=s.width,l.width=i,l.minWidth=o,l.maxWidth=a)),u}):o.documentElement.currentStyle&&(Rt=function(e){return e.currentStyle},Wt=function(e,n,r){var i,o,a,s=r||Rt(e),u=s?s[n]:t,l=e.style;return null==u&&l&&l[n]&&(u=l[n]),Yt.test(u)&&!zt.test(n)&&(i=l.left,o=e.runtimeStyle,a=o&&o.left,a&&(o.left=e.currentStyle.left),l.left="fontSize"===n?"1em":u,u=l.pixelLeft+"px",l.left=i,a&&(o.left=a)),""===u?"auto":u});function on(e,t,n){var r=Vt.exec(t);return r?Math.max(0,r[1]-(n||0))+(r[2]||"px"):t}function an(e,t,n,r,i){var o=n===(r?"border":"content")?4:"width"===t?1:0,a=0;for(;4>o;o+=2)"margin"===n&&(a+=b.css(e,n+Zt[o],!0,i)),r?("content"===n&&(a-=b.css(e,"padding"+Zt[o],!0,i)),"margin"!==n&&(a-=b.css(e,"border"+Zt[o]+"Width",!0,i))):(a+=b.css(e,"padding"+Zt[o],!0,i),"padding"!==n&&(a+=b.css(e,"border"+Zt[o]+"Width",!0,i)));return a}function sn(e,t,n){var r=!0,i="width"===t?e.offsetWidth:e.offsetHeight,o=Rt(e),a=b.support.boxSizing&&"border-box"===b.css(e,"boxSizing",!1,o);if(0>=i||null==i){if(i=Wt(e,t,o),(0>i||null==i)&&(i=e.style[t]),Yt.test(i))return i;r=a&&(b.support.boxSizingReliable||i===e.style[t]),i=parseFloat(i)||0}return i+an(e,t,n||(a?"border":"content"),r,o)+"px"}function un(e){var t=o,n=Gt[e];return n||(n=ln(e,t),"none"!==n&&n||(Pt=(Pt||b("