diff --git a/extensions/chromium/antizapret-chrome-extension.crx b/extensions/chromium/antizapret-chrome-extension.crx deleted file mode 100755 index 3d81411..0000000 Binary files a/extensions/chromium/antizapret-chrome-extension.crx and /dev/null differ diff --git a/extensions/chromium/assets/icons/rkn-chain.png b/extensions/chromium/assets/icons/rkn-chain.png new file mode 100755 index 0000000..1d9e7a1 Binary files /dev/null and b/extensions/chromium/assets/icons/rkn-chain.png differ diff --git a/extensions/chromium/assets/icons/rkn-chain2.png b/extensions/chromium/assets/icons/rkn-chain2.png new file mode 100755 index 0000000..32a63d9 Binary files /dev/null and b/extensions/chromium/assets/icons/rkn-chain2.png differ diff --git a/extensions/chromium/assets/icons/rkn-core.png b/extensions/chromium/assets/icons/rkn-core.png new file mode 100755 index 0000000..46ac856 Binary files /dev/null and b/extensions/chromium/assets/icons/rkn-core.png differ diff --git a/extensions/chromium/assets/icons/rkn-core2.png b/extensions/chromium/assets/icons/rkn-core2.png new file mode 100755 index 0000000..109d749 Binary files /dev/null and b/extensions/chromium/assets/icons/rkn-core2.png differ diff --git a/extensions/chromium/assets/icons/rkn-disabled.png b/extensions/chromium/assets/icons/rkn-disabled.png new file mode 100755 index 0000000..54574f9 Binary files /dev/null and b/extensions/chromium/assets/icons/rkn-disabled.png differ diff --git a/extensions/chromium/assets/icons/rkn-empty.png b/extensions/chromium/assets/icons/rkn-empty.png new file mode 100755 index 0000000..54574f9 Binary files /dev/null and b/extensions/chromium/assets/icons/rkn-empty.png differ diff --git a/extensions/chromium/assets/icons/rkn-red.png b/extensions/chromium/assets/icons/rkn-red.png new file mode 100755 index 0000000..74ca456 Binary files /dev/null and b/extensions/chromium/assets/icons/rkn-red.png differ diff --git a/extensions/chromium/assets/icons/rkn-rred.png b/extensions/chromium/assets/icons/rkn-rred.png new file mode 100755 index 0000000..cdfc9fe Binary files /dev/null and b/extensions/chromium/assets/icons/rkn-rred.png differ diff --git a/extensions/chromium/assets/icons/rkn-white.png b/extensions/chromium/assets/icons/rkn-white.png new file mode 100755 index 0000000..3e18915 Binary files /dev/null and b/extensions/chromium/assets/icons/rkn-white.png differ diff --git a/extensions/chromium/assets/icons/rkn.png b/extensions/chromium/assets/icons/rkn.png new file mode 100755 index 0000000..cc68ac3 Binary files /dev/null and b/extensions/chromium/assets/icons/rkn.png differ diff --git a/extensions/chromium/assets/icons/rock-closed-red.png b/extensions/chromium/assets/icons/rock-closed-red.png new file mode 100755 index 0000000..7f6a4ea Binary files /dev/null and b/extensions/chromium/assets/icons/rock-closed-red.png differ diff --git a/extensions/chromium/assets/icons/rock-closed.png b/extensions/chromium/assets/icons/rock-closed.png new file mode 100755 index 0000000..e640b29 Binary files /dev/null and b/extensions/chromium/assets/icons/rock-closed.png differ diff --git a/extensions/chromium/assets/icons/rock-goat-red.png b/extensions/chromium/assets/icons/rock-goat-red.png new file mode 100755 index 0000000..5f88a43 Binary files /dev/null and b/extensions/chromium/assets/icons/rock-goat-red.png differ diff --git a/extensions/chromium/assets/icons/rock-goat.png b/extensions/chromium/assets/icons/rock-goat.png new file mode 100755 index 0000000..d8292c6 Binary files /dev/null and b/extensions/chromium/assets/icons/rock-goat.png differ diff --git a/extensions/chromium/assets/icons/rock-open.png b/extensions/chromium/assets/icons/rock-open.png new file mode 100755 index 0000000..6064195 Binary files /dev/null and b/extensions/chromium/assets/icons/rock-open.png differ diff --git a/extensions/chromium/assets/icons/rock-tune.png b/extensions/chromium/assets/icons/rock-tune.png new file mode 100755 index 0000000..45a4d1b Binary files /dev/null and b/extensions/chromium/assets/icons/rock-tune.png differ diff --git a/extensions/chromium/assets/icons/rock5.png b/extensions/chromium/assets/icons/rock5.png new file mode 100755 index 0000000..1dd1621 Binary files /dev/null and b/extensions/chromium/assets/icons/rock5.png differ diff --git a/extensions/chromium/antizapret-chrome-extension/unlock.ico b/extensions/chromium/assets/icons/unlock.ico similarity index 100% rename from extensions/chromium/antizapret-chrome-extension/unlock.ico rename to extensions/chromium/assets/icons/unlock.ico diff --git a/extensions/chromium/antizapret-chrome-extension/unlock.png b/extensions/chromium/assets/icons/unlock.png similarity index 100% rename from extensions/chromium/antizapret-chrome-extension/unlock.png rename to extensions/chromium/assets/icons/unlock.png diff --git a/extensions/chromium/assets/icons/warn.png b/extensions/chromium/assets/icons/warn.png new file mode 100755 index 0000000..fb96ce3 Binary files /dev/null and b/extensions/chromium/assets/icons/warn.png differ diff --git a/extensions/chromium/antizapret-chrome-extension/background.js b/extensions/chromium/background.js similarity index 86% rename from extensions/chromium/antizapret-chrome-extension/background.js rename to extensions/chromium/background.js index fac5a4a..e84bdf6 100755 --- a/extensions/chromium/antizapret-chrome-extension/background.js +++ b/extensions/chromium/background.js @@ -1,32 +1,106 @@ 'use strict'; -var Antizapret = { +var RKN = { + + version: chrome.runtime.getManifest().version, csvMirrors: [ 'https://raw.githubusercontent.com/zapret-info/z-i/master/dump.csv', 'http://sourceforge.net/p/z-i/code-0/HEAD/tree/dump.csv?format=raw', 'https://www.assembla.com/spaces/z-i/git/source/master/dump.csv?_format=raw' ], - lastUpdate: new Date(0), + lastUpdate: (new Date(0)).toString(), updatePeriodInMinutes: 7*60, + ifEnabled: false, + + updateIcon: function(cb) { + var cb = cb || () => {}; + return chrome.browserAction.setIcon( + { path: this.ifEnabled ? './assets/icons/rkn.png' : './assets/icons/rkn-disabled.png' }, + cb + ); + }, + + disable: function(cb) { + var cb = cb || () => {}; + + if(!this.ifEnabled) + return cb(); + + this.checkForUpdates( (err, res) => { + if (err) return cb(err); + this.applyPac(); + this.ifEnabled = false; + this.persistToStorage(); + return this.updateIcon(cb); + }); + + }, + + enable: function(cb) { + var cb = cb || () => {}; + + return chrome.proxy.settings.clear({/*All*/}, () => { + this.ifEnabled = true; + this.persistToStorage(); + return this.updateIcon(cb); + }); + + }, + + switch: function(cb) { + var cb = cb || () => {}; + return this.ifEnabled ? this.disable(cb) : this.enable(cb); + }, + + persistToStorage: function(cb) { + var cb = cb || () => {}; + var storage = {}; + storage[this.version] = JSON.stringify(this); + chrome.storage.local.set(storage, cb); + }, + syncWithStorage: function(cb) { + var cb = cb || () => {}; + chrome.storage.local.get( + this.version, + object => { + if (!Object.keys(object).length) + return this.persistToStorage(cb); + + var self = JSON.parse(object[this.version]); + + for(var key of Object.keys(self)) + this[key] = self[key]; + + return cb(this); + } + ); + }, + + install: function() { + chrome.storage.local.clear(); + this.disable(); + }, + rescheduleUpdate: function(period) { var checkNewBlocked = 'Check for new blocked sites'; var period = period || this.updatePeriodInMinutes; - chrome.alarms.clearAll( (ifWasCleared) => { + chrome.alarms.clearAll( ifWasCleared => { chrome.alarms.create(checkNewBlocked, { delayInMinutes: period }); chrome.alarms.onAlarm.addListener( alarm => { - if (alarm.name === checkNewBlocked) + if (alarm.name === checkNewBlocked) { this.checkForUpdate(); + } }); }); }, checkForUpdates: function(url, cb) { - if (!url) + if (!url || !cb) return this._useTheMirrorsLuke(this.checkForUpdates, url, cb); var req = new XMLHttpRequest(); @@ -37,7 +111,7 @@ var Antizapret = { return cb(req.status); var date = Date.parse(req.getResponseHeader('Date')); - if (date > this.lastUpdate) + if (date > Date.parse(this.lastUpdate)) return this.update(url, cb); return cb(null); @@ -46,21 +120,28 @@ var Antizapret = { }, update: function(url, cb) { - if (!url) + if (!url || !cb) return this._useTheMirrorsLuke(this.update, url, cb); var req = new XMLHttpRequest(); req.open('GET', url, true); req.onload = event => { - this.lastUpdate = Date.now(); - this.applyCsv( req.responseText ); + this.lastUpdate = (new Date()).toString(); + this.generatePacFromCsv(req.responseText); + this.persistToStorage(); this.rescheduleUpdate(); return cb(null, req.responseText); }; req.send(null); }, - applyCsv: function(csv) { - var pac = generatePac(csv); + generatePacFromCsv: function(csv) { + this.pac = chrome.extension.getBackgroundPage().generatePac(csv); + return this.pac; + }, + applyPac: function(pac) { + + var pac = pac || this.pac; + var config = { mode: 'pac_script', pacScript: { @@ -102,15 +183,18 @@ var Antizapret = { } }; +chrome.storage.local.clear(); +RKN.syncWithStorage( () => RKN.updateIcon() ); + chrome.runtime.onInstalled.addListener( details => { switch(details.reason) { case 'install': case 'update': - Antizapret.checkForUpdates() + RKN.install(); } }); -chrome.browserAction.onClicked.addListener( tab => Antizapret.checkForUpdates() ); +chrome.browserAction.onClicked.addListener( tab => {alert('!!');} ); //==============GENERATE-PACS.JS============================ diff --git a/extensions/chromium/antizapret-chrome-extension/manifest.json b/extensions/chromium/manifest.json similarity index 54% rename from extensions/chromium/antizapret-chrome-extension/manifest.json rename to extensions/chromium/manifest.json index 9d4c6a0..5f3f18f 100755 --- a/extensions/chromium/antizapret-chrome-extension/manifest.json +++ b/extensions/chromium/manifest.json @@ -1,14 +1,10 @@ { "manifest_version": 2, - "name": "Антизапрет", - "description": "Безопасный Интернет от РосКомНадзор.", + "name": "РосКомНадзор", + "description": "Безопасный Интернет от РосКомНадзор с возможностью отказаться.", "version": "0.1", - "browser_action": { - "default_icon": "unlock.png", - "default_title": "Обсуждай на https://reddit.com/r/ru" - }, "permissions": [ "proxy", "storage", @@ -18,14 +14,19 @@ "https://*/", "ftp://*/" ], - "icons": { "16": "unlock.ico", - "128": "unlock.png" }, + "icons": { + "128": "./assets/icons/rkn.png" + }, "background": { "scripts": ["background.js"], "persistent": false }, + "browser_action": { + "default_popup": "./pages/popup.html" + }, + "options_page": "./pages/options.html", "author": "ilyaigpetrov@gmail.com", - "homepage_url": "https://github.com/ilyaigpetrov/antizapret-chrome-extension", + "homepage_url": "https://github.com/ilyaigpetrov/consorship-free", "short_name": "Антизапрет" } diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_locales/en/lang.js b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_locales/en/lang.js new file mode 100755 index 0000000..153a788 --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_locales/en/lang.js @@ -0,0 +1,45 @@ +nl.drew.cp.lang.s['en'] = { + "msgOn":"on", + "msgOff":"off", + + "allSites":"All Sites", + "thisSite":"This Site", + "listsTab":"Lists Sites", + "userProTab":"User proxys", + + "proxyEnabled": "Proxy enabled for all sites", + "anonymityEnabled": "Enable anonymity for all sites", + "locationForAll": "Use proxy location for all sites:", + "torForAll": "TOR for all sites", + "notUseProxy":"Not use proxy for this site", + "alwUseProxy":"Always use proxy for this site", + "anonForSite":"Enable anonymity for this site", + "locSite":"Use proxy location for this site:", + "torForSite": "TOR for this site", + "setHttp":"Use proxy for https traffic", + "setHelp":"Tips enable", + + "proxyOff": "proxy off for this site", + "proxyEnabledHelp": "if you disable this option, you will have access to all proxies, not just public and increases speed", + "anonymityEnabledHelp": "Anonymity allows you to hide your IP, but it also imposes some restrictions. Some sites may block the access because of anonymity.", + "locationForAllHelp": "If possible, the proxy will be chosen this country", + + "notUseProxyHelp":"even if proxy is enabled for all sites", + "alwUseProxyHelp":"even if proxy is disabled for all sites", + "anonForSiteHelp":"only for this site", + "locSiteHelp":"", + "torAllHelp":"send all traffic through TOR", + "torSiteHelp":"send site traffic through TOR", + + "EmptyURL":"Empty URL", + "WrongURLformat":"Wrong URL format", + "WrongURLprotocol":"Wrong URL protocol", + "ThisURLalreadyadded":"This URL already added", + "Nooptionschanged":"No options changed", + + "interfaceLanguage":"Interface language", + + "uProxyNameFormat": "Wrong format of the list name. Must consist of letters, digits and _-", + "uProxyNameAlreadyHave": "Already there is the proxy named ", + "errUproxyIpFormat": "Proxy is defined as IP:PORT, for example: 127.0.0.1:443 or proxyname.example:1080" +} \ No newline at end of file diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_locales/en/messages.json b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_locales/en/messages.json new file mode 100755 index 0000000..dbe6789 --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_locales/en/messages.json @@ -0,0 +1,11 @@ +{ + "chrome_extension_name": { + "message": "Proxy for Chrome" + }, + "chrome_extension_description": { + "message": "Free proxy servers for you" + }, + "browser_action_title": { + "message": "on/off" + } +} \ No newline at end of file diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_locales/ru/lang.js b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_locales/ru/lang.js new file mode 100755 index 0000000..dd48164 --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_locales/ru/lang.js @@ -0,0 +1,45 @@ +nl.drew.cp.lang.s['ru'] = { + "msgOn":"вкл", + "msgOff":"выкл", + + "allSites":"Все сайты", + "thisSite":"Текущий сайт", + "listsTab":"Списки сайтов", + "userProTab":"Мои прокси", + + "proxyOff": "прокси выкл. для этого сайта", + "proxyEnabled": "Вкл. прокси для всех сайтов", + "anonymityEnabled": "Вкл. анонимность для всех сайтов", + "locationForAll": "Для всех сайтов использовать локацию:", + "torForAll": "Все сайты через TOR", + + "notUseProxy":"Для этого сайта не использовать прокси", + "alwUseProxy":"Всегда использовать прокси для этого сайта", + "anonForSite":"Вкл. анонимность для этого сайта", + "locSite":"Для этого сайта использовать локацию:", + "torForSite": "Этот сайт через TOR", + "setHttp":"Использовать прокси для https протокола", + "setHelp":"Включить подсказки", + + "locationForAllHelp": "По возможности будет выбран прокси этой страны", + "proxyEnabledHelp": "если отключить эту опцию, то будут доступны все прокси, а не только общественные, что может значительно увеличить скорость", + "anonymityEnabledHelp": "Анонимность позволяет скрыть свой IP, но одновременно накладывает некоторые ограничения. Некоторые сайты могут прекратить ваш доступ из-за анонимности.", + "notUseProxyHelp":"даже если прокси включен для всех сайтов", + "alwUseProxyHelp":"даже если прокси отключен для всех сайтов", + "anonForSiteHelp":"только для этого сайта", + "locSiteHelp":"", + "torAllHelp":"направить весь трафик через шлюз tor", + "torSiteHelp":"использовать tor для доступа к этому сайту", + + "EmptyURL":"Поле URL пустое", + "WrongURLformat":"Неправильный формать URL", + "WrongURLprotocol":"Неправильный протокол URL", + "ThisURLalreadyadded":"Этот адрес уже добавлен", + "Nooptionschanged":"Нет измененных опций", + + "interfaceLanguage":"Язык интерфейса", + + "errUProxyNameFormat": "Имя прокси должно состоять из букв, цифр, тире и знака подчеркивания. От 3 до 9 символов", + "errUProxyNameAlreadyHave": "Уже есть прокси с именем ", + "errUproxyIpFormat": "Прокси задается в виде IP:PORT, например 127.0.0.1:443 или proxyname.example:1080" +} \ No newline at end of file diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_locales/ru/messages.json b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_locales/ru/messages.json new file mode 100755 index 0000000..28d6810 --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_locales/ru/messages.json @@ -0,0 +1,11 @@ +{ + "chrome_extension_name": { + "message": "Proxy for Chrome" + }, + "chrome_extension_description": { + "message": "Бесплатные прокси сервера для вашего браузера" + }, + "browser_action_title": { + "message": "babyList - вкл/выкл" + } +} \ No newline at end of file diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_metadata/verified_contents.json b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_metadata/verified_contents.json new file mode 100755 index 0000000..16ad263 --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/_metadata/verified_contents.json @@ -0,0 +1 @@ +[{"description":"treehash per file","signed_content":{"payload":"eyJjb250ZW50X2hhc2hlcyI6W3siYmxvY2tfc2l6ZSI6NDA5NiwiZGlnZXN0Ijoic2hhMjU2IiwiZmlsZXMiOlt7InBhdGgiOiJfbG9jYWxlcy9lbi9sYW5nLmpzIiwicm9vdF9oYXNoIjoia1FQTTkzYk1VR1ZKbGh1TV9sSE91UVVMM2dScHVTRUZBREZfMnJLRWxINCJ9LHsiY2Fub25pY2FsX2pzb25fcm9vdF9oYXNoIjoieTRVanJxbG5LcUhOcDdzbGxGNjlmNmItSWFGZEFyRDV5SDRVZGRWdG1fRSIsInBhdGgiOiJfbG9jYWxlcy9lbi9tZXNzYWdlcy5qc29uIiwicm9vdF9oYXNoIjoiWm5LRmlJWmlYV3AxQ3pjQ0NpMU1kV3BDbDQzeFpJOWlIQzFnWktLZkNoayJ9LHsicGF0aCI6Il9sb2NhbGVzL3J1L2xhbmcuanMiLCJyb290X2hhc2giOiJId1U4MmdDcFd6M1FPZ21jV2hoOE9obnA4bVdpT2J3Z0ZDLXFjcEVoVDhnIn0seyJjYW5vbmljYWxfanNvbl9yb290X2hhc2giOiI0azRzOE0xcWYtRmtQN2QyNDB1VzB2TE9FNFNPYnJGdVNNMXI3OFlRZDRNIiwicGF0aCI6Il9sb2NhbGVzL3J1L21lc3NhZ2VzLmpzb24iLCJyb290X2hhc2giOiJhdDItNFVsNk5zWjRTazhvams2NlNacEktMnpidkctLW11UnE1YnRwVmd3In0seyJwYXRoIjoiYmFja2dyb3VuZC5odG1sIiwicm9vdF9oYXNoIjoiYklzWHMyaTBJZGNZS2o0UW5BLWo1R040Ymh0STk2SzhVa2NOLVRpSGRvYyJ9LHsicGF0aCI6ImNzcy9tYWluLmNzcyIsInJvb3RfaGFzaCI6IkdQT3BVTDk4eFd0dWZraGpZWjljNzRLX3lTUjc3dE80Wk1jQnM4Q2tyQ00ifSx7InBhdGgiOiJjc3Mvbm90aWZ5LmFsbW9zdC1mbGF0LmNzcyIsInJvb3RfaGFzaCI6IjNoNmRGYlNsNVFKR2RLYVVuYUQ0X0NUekpMdENMdGs2Y0dGNU5sV1YzelkifSx7InBhdGgiOiJjc3Mvc3dpdGNoZXIuY3NzIiwicm9vdF9oYXNoIjoieHREWmZFOVByVEFjeGdVTEx3Q2xQNWhZYTAyeEIxVGw0NGN3aDJtYndTSSJ9LHsicGF0aCI6ImNzcy91aWtpdC5hbG1vc3QtZmxhdC5jc3MiLCJyb290X2hhc2giOiIzSHQtU0E4VlQ2cUtMZWdNQWI0WFVCWEpSZTJZeHpIQ0hGVXpFYWIzaDcwIn0seyJwYXRoIjoiZm9udHMvT3BlblNhbnMtQm9sZC53b2ZmIiwicm9vdF9oYXNoIjoibkpycUhGeHZNWUhmVG0xWkNoOEdkZ1I3SkV1X0UtRHdsREQyOVdrUHFHTSJ9LHsicGF0aCI6ImZvbnRzL09wZW5TYW5zLUNvbmRlbnNlZEJvbGQud29mZiIsInJvb3RfaGFzaCI6InB6MmRrV0pMdGYyUzdnTkU1cG4zUUF3ckU4UThOWjZwcUV1dHlGOVdYUzQifSx7InBhdGgiOiJmb250cy9PcGVuU2Fucy1Db25kZW5zZWRMaWdodC53b2ZmIiwicm9vdF9oYXNoIjoiUzlKZE10N3hfcjdaR0swVnN2NTBVN3BEX21adnhZYWN2ZW92a3hUdmJYRSJ9LHsicGF0aCI6ImZvbnRzL09wZW5TYW5zLUxpZ2h0LndvZmYiLCJyb290X2hhc2giOiJWVDFWRjB2MnBkSzlJZEF0a2t4eF91TlNGVTZyM0Z2d1ozSl94OWQzN1ljIn0seyJwYXRoIjoiZm9udHMvT3BlblNhbnMud29mZiIsInJvb3RfaGFzaCI6ImxpNFB2bmx4eDZySVRPRlRwUklPRFVUa0lLQWZWZjNqeU0wdjRiTG02VzAifSx7InBhdGgiOiJmb250cy9mb250YXdlc29tZS13ZWJmb250LndvZmYiLCJyb290X2hhc2giOiJsRHJud3Z0ekxRR0Zta0IxUjNKUkF1ajhoZHpjUWlTcWl3NEFhZUNwckc4In0seyJwYXRoIjoiaW0vY28vYmUucG5nIiwicm9vdF9oYXNoIjoib3JUM1AyZF9ZLTBaVUNlamxrdDZBaGZVTmM5UlBEWm9xVjh5YmhhaG9lZyJ9LHsicGF0aCI6ImltL2NvL2JnLnBuZyIsInJvb3RfaGFzaCI6InJkUURkY08ydUtIWnhuT25kUWhfZGpZNk9tRGRCOGhDZ3FFWUJuX0JzY3cifSx7InBhdGgiOiJpbS9jby9jaC5wbmciLCJyb290X2hhc2giOiJybjBmMDA4VHVfUFlSN3ItTlhIdWxBck9ZVVkwbUF2SXM2SXJqSEMzdG9rIn0seyJwYXRoIjoiaW0vY28vY24ucG5nIiwicm9vdF9oYXNoIjoiTDRiMWRscldqZ09qTG1ld1JhUjBNU3hid0w2LXowTkZZR05fc04ybjlOMCJ9LHsicGF0aCI6ImltL2NvL2N6LnBuZyIsInJvb3RfaGFzaCI6IjFOVWZkeDlQZUdBcGFtV3FkQjdWenlTVHBBVWdFNWt1S29uUk1tS0t0c0kifSx7InBhdGgiOiJpbS9jby9kZS5wbmciLCJyb290X2hhc2giOiI2eVN4OFJnakZQd0JQWkJzNnpyNDM2czFjcHBEMXFjSWtHemdBOWh1clRvIn0seyJwYXRoIjoiaW0vY28vZGsucG5nIiwicm9vdF9oYXNoIjoid2lLQmRGRUhIUFQtaG5zS0EwZFpNQmVOWmhYUDNIam5yNWs5SWpQZGZtMCJ9LHsicGF0aCI6ImltL2NvL2VlLnBuZyIsInJvb3RfaGFzaCI6Im5xSWZhNFA5TURic3dGZ2dNMWtCeVNTc25BMy1zZ19BaUo1SHNQREpycGcifSx7InBhdGgiOiJpbS9jby9lcnIucG5nIiwicm9vdF9oYXNoIjoiMkdoaTcwbmgzVTB0dzZoZ3dzZHhjc1lFRFMxSFE5aXBZdWJkbnNDX2RWTSJ9LHsicGF0aCI6ImltL2NvL2VzLnBuZyIsInJvb3RfaGFzaCI6IkZVbzdhSjgzc3dnWVplc3VQdTRuTUlPQlpfbXVwWXA2ZGxCMUhYS1hqU3MifSx7InBhdGgiOiJpbS9jby9ldS5wbmciLCJyb290X2hhc2giOiJwNXFsMDNVcTRwbkFlMDVTeFEtbzR4SFNuZVJYbTVMWm1qdWdkc2RBTHE0In0seyJwYXRoIjoiaW0vY28vZmkucG5nIiwicm9vdF9oYXNoIjoiVWRoeFVtLUw3a3JkWjNqQm93NC03TmxheE1LcDJDVjZQaFFDQXA4bjl1NCJ9LHsicGF0aCI6ImltL2NvL2ZyLnBuZyIsInJvb3RfaGFzaCI6IjU5ZXBQbndDVlZ2MU1KVVFBanRPYVgyVUtTaDJWTnhpZXYtNW1UZHdvYzQifSx7InBhdGgiOiJpbS9jby9nb29nbGUucG5nIiwicm9vdF9oYXNoIjoiTnlWclp3UzZvM1cxTjA5bGlvQXpoQzhXWFhfWThMdGlsRmFpNUc1YnFjcyJ9LHsicGF0aCI6ImltL2NvL2dvb2dsZTY0LnBuZyIsInJvb3RfaGFzaCI6IjZqNVBQZFVsN1ZFU2txRXdxS3dBVW0xdkVCdWRxSm1GVTFVUGxhLVBLbE0ifSx7InBhdGgiOiJpbS9jby9pZS5wbmciLCJyb290X2hhc2giOiJvNlU3UzZsRTVEWXM2Wm1JQWxkaVYxZUZveTR1SVdVTDdoVXROYmRkejhJIn0seyJwYXRoIjoiaW0vY28vaXQucG5nIiwicm9vdF9oYXNoIjoicGROb1daRkJXM2s5NFlkNEFRV20ySkFYLWxvWFgxRENSd1ZMZUFNTmhoWSJ9LHsicGF0aCI6ImltL2NvL2x0LnBuZyIsInJvb3RfaGFzaCI6Im1vWDZkZ1pRWE44dGVoYllaOWdJdnhwVk9GV1NReVRfWTNzUW5Bdzl2a2MifSx7InBhdGgiOiJpbS9jby9ubC5wbmciLCJyb290X2hhc2giOiJENm9xQXJsWGFyRlR6U211ZVF3b0xxdXpWclJZWkF3dHJqYjNhUmg3TTlnIn0seyJwYXRoIjoiaW0vY28vcC5wbmciLCJyb290X2hhc2giOiJ3U0FYc2dua1BoS3hYN3VIVVlWVnFRV1FTR3A2OG9uYlNNUTl1VWdSSUtJIn0seyJwYXRoIjoiaW0vY28vcGwucG5nIiwicm9vdF9oYXNoIjoiSzBicm5lS3d2Zk5uMVQ3a1BGZURXbV80YTFBTl9FYlVscjUzUHQtMTNtZyJ9LHsicGF0aCI6ImltL2NvL3Byb3h5LnBuZyIsInJvb3RfaGFzaCI6IlAzQ2t0ZEV1eEl0dHczQU9zYnp1LUdQc0FfM05oRWs1Rk91VFMzVWVKZ2cifSx7InBhdGgiOiJpbS9jby9wdC5wbmciLCJyb290X2hhc2giOiJjUzhQVGM1OC1pWFAwbUdEeGZjWm1qb0MyY1FRNDNwLXlZZzc4aXdsT0RVIn0seyJwYXRoIjoiaW0vY28vcnUucG5nIiwicm9vdF9oYXNoIjoic0VDMndsVDNJZF9uVzlNNXJlTVlJRFNwdUlkRElsRm1YdXlrV095U2RZVSJ9LHsicGF0aCI6ImltL2NvL3NlLnBuZyIsInJvb3RfaGFzaCI6IlBLQS02V3hHaFJhaUxoMnNTXzBfSmdRYzlNTFBiNnVBQnVxYXRqWFF4aGMifSx7InBhdGgiOiJpbS9jby90b3IucG5nIiwicm9vdF9oYXNoIjoiUHExVnVJVm9HcUpsYVBMcHpfS0pyWWFKaTlPZHExV0lsU0UtSlExLXEyNCJ9LHsicGF0aCI6ImltL2NvL3VhLnBuZyIsInJvb3RfaGFzaCI6IktkQ2Z1Wm5PRXlsRl9RZFdyMGdNS2xrN1dtU0hMR3BsUXFEbHBzcWVQMDAifSx7InBhdGgiOiJpbS9jby91ay5wbmciLCJyb290X2hhc2giOiJ4cXFFemoxREZ6WFFVdDN5MUdxTF9PMExOZUQxcVNiMnN2XzRLaTNtYm13In0seyJwYXRoIjoiaW0vY28vdW5rbm93bi5wbmciLCJyb290X2hhc2giOiItQ2FZOVY4NnBoLThsUG1YS1c2QldpdTN4M0ZQanc1X0ZENU9Rb3JHSE93In0seyJwYXRoIjoiaW0vY28vdXMucG5nIiwicm9vdF9oYXNoIjoiTFl1ZFVwZXZ5Zks4UkdXRHNqUVlzeU9OUjFjZFZ6ZG9kMGlmNmdhTk1SUSJ9LHsicGF0aCI6ImltL2NvL3VzZXIucG5nIiwicm9vdF9oYXNoIjoiY0kyb05Nb0VHMXpWM2lWOTNlalNWaGphaktZRjg2VXV1dXd0Z2hYQ1lhRSJ9LHsicGF0aCI6ImltL2dvb2dsZS5wbmciLCJyb290X2hhc2giOiI5SFBwcTdQMmFEUWd0Qm13R0VKdVZrSm9xTlhOamwxRnVXU2lCSGMwVzVjIn0seyJwYXRoIjoiaW0vaGlkZS5wbmciLCJyb290X2hhc2giOiJpeTBTY0l2QkUwWmllZTQwWVBpSXAxUEJiSVIzNFhqaFdnOWs4TnA0QXc0In0seyJwYXRoIjoiaW0vaWNvMTI4LTIucG5nIiwicm9vdF9oYXNoIjoid19VQTlKejZZem96SEJUcUxSWTF3TndDdl9RZ2xjb1FWdDh2YXpOdzZpMCJ9LHsicGF0aCI6ImltL2ljbzE5LTIucG5nIiwicm9vdF9oYXNoIjoiT0hOMlo1Qmd1NHFKVEd2TUdMTHZNeXIzc1IwSE9KRVhTRS1RWWhFRnZvcyJ9LHsicGF0aCI6ImltL2ljbzE5Zy0yLnBuZyIsInJvb3RfaGFzaCI6Im5PUm9MV0RjbmJZeGlXaG1FY1NpOVJpenhiY1YzdURBRGZkY1p3WFAxUlEifSx7InBhdGgiOiJpbS9pY28zOC0yLnBuZyIsInJvb3RfaGFzaCI6ImxuLXpCWW1MZnJkNkF1MU4xUVdQU1puQUhkMWZtTG56M1ZvbFhmd1YyV2sifSx7InBhdGgiOiJpbS9pY28zOGctMi5wbmciLCJyb290X2hhc2giOiJ0U2lmeFpoZE5ROHpQbjZxbzJZaS13SE9oTjhseTBzV3FoY2VORDNOWnRJIn0seyJwYXRoIjoiaW0vaWNvNjQtMi5wbmciLCJyb290X2hhc2giOiJNa2JwMmN4VmpiQ01GdVhvaVc4SmIyQ0NhaFhRR0Y0dTlXYk1CLTFVZzZNIn0seyJwYXRoIjoiaW0vbm8ucG5nIiwicm9vdF9oYXNoIjoibWhpYmszNUpaU1RfYVJBR0dDdlF0V0FyLVpNVEU4RF8tZzVDdUVXamNTdyJ9LHsicGF0aCI6ImltL29uLnBuZyIsInJvb3RfaGFzaCI6IkJGVmoxYVczZE5IZW16YUVhQVR1Nmpha1lLOHNoYTJPX1RHcDhpNUh5VTgifSx7InBhdGgiOiJpbS9vbmlvbi5wbmciLCJyb290X2hhc2giOiI2aG9RYVhHb0o2WnNBTHlHd2F6NlRBaWN3M3hWeVhtYmtoeU42WkdOaWZJIn0seyJwYXRoIjoianMvY29yZS9hcGkuanMiLCJyb290X2hhc2giOiI4d1B6WU5KYXY5MGVHVzVVXy1iS1NYVi1LNEdpVG85alprS043Si1tamFVIn0seyJwYXRoIjoianMvY29yZS9jYWNoZS5qcyIsInJvb3RfaGFzaCI6IjNJSDBjQXRISnA0SDMxOE5leF9BelZtWlk0enVIYVVPa2M5RC0wdDBiczQifSx7InBhdGgiOiJqcy9jb3JlL2NvbmYuanMiLCJyb290X2hhc2giOiJ4ZUVPSHRVQ0p4c0U3OWVqQzNCcjF5a2VQSW9wVmNqYmJHTFN6d3c2UWxJIn0seyJwYXRoIjoianMvY29yZS9jb3JlLmpzIiwicm9vdF9oYXNoIjoiVDZxVUNJZmlMcDlySW4xRE9qSmRDRV9VYTRpckNrWVpjeDJ4Z0dVX3RWYyJ9LHsicGF0aCI6ImpzL2NvcmUvaGVhZGVyLmpzIiwicm9vdF9oYXNoIjoiNWowZUlGbHFnXzIxNHozTnZ1TVZzOUU0V1JhaDVUbDJDVnNtcFdrQXE4USJ9LHsicGF0aCI6ImpzL2NvcmUvaW50ZXJmLmpzIiwicm9vdF9oYXNoIjoiWWlZMUQ2cGdqVjVNWmtNMXBDa0piMHJNRVZEdlhRV1NSc1E5YjRQbGt5USJ9LHsicGF0aCI6ImpzL2NvcmUvbGliLmpzIiwicm9vdF9oYXNoIjoiUmxBZDZTQ2Z6dDRlbVdLX2FwWEhFUG5ENGwwVnlIZlNTbW1QNlpLaW5hSSJ9LHsicGF0aCI6ImpzL2NvcmUvb25vZmYuanMiLCJyb290X2hhc2giOiJuM3BvLUJpNU1jRy1ZaDRWRGRGd1dZaTd4Mi12WEtaLVExRUc3Q1V1LWpJIn0seyJwYXRoIjoianMvY29yZS9wcm94eS5qcyIsInJvb3RfaGFzaCI6ImxTTm1NY195WS1zZVFxTlRzODdpc2Z0SmFBS1dDWkZZa05qTkFuV1N5VTgifSx7InBhdGgiOiJqcy9jb3JlL3ZhcnMuanMiLCJyb290X2hhc2giOiJZUEtTSm1QaFAtWTlKbHloVGxmNVlJd2dCR3RSZjFOZ1NONE50WEJvSGFjIn0seyJwYXRoIjoianMvbGliL2ljb2FuaW1hdGlvbi5qcyIsInJvb3RfaGFzaCI6Ik9iYW1VLVVrcGZkM1RHMElhYkVDZjc1bVpBbU1FMHFSRUNYakd1ZVJWaWMifSx7InBhdGgiOiJqcy9saWIvanF1ZXJ5LTIuMS4zLmpzIiwicm9vdF9oYXNoIjoiSnJFTnB6ejJ1NGdnZVJKeE5VSG9icEhuZXR0Vi1jT2ZpRExKdnc0b0ZUWSJ9LHsicGF0aCI6ImpzL2xpYi9qcXVlcnkuZGRzbGljay5qcyIsInJvb3RfaGFzaCI6Ino1b2RxV21NNDRvdnBHY0dROWl0OWdaUHFsN3JyaUxsbW9WNGhsY1kySDgifSx7InBhdGgiOiJqcy9saWIvanF1ZXJ5LnNjcm9sbFRvLmpzIiwicm9vdF9oYXNoIjoiS1pGZVIzM0xhcHQ5bmhTUGk4eUR1emJqNWxQdmVRS1E4RzJwUW1mNTVDZyJ9LHsicGF0aCI6ImpzL2xpYi9sYW5nLmpzIiwicm9vdF9oYXNoIjoiWmtmMkl1WEtuaUpwSjVCSlRYQ25ZUFZSM1JPX2FyVXA3YUMtZXJaazlkYyJ9LHsicGF0aCI6ImpzL2xpYi9saWIuanMiLCJyb290X2hhc2giOiJPa1lZRG9KZDdxWHJXZFhOaEVTZmZ4OG81Wl9HenV3eVh0MXRLdlNwSlhFIn0seyJwYXRoIjoianMvbGliL2xzLmpzIiwicm9vdF9oYXNoIjoiTTdiaFE0LUtHeFk1MFZyOHpBRjFQZlRSOHdPTkxzSDZVU0p2cW1DSklkWSJ9LHsicGF0aCI6ImpzL2xpYi9zd2l0Y2hlci5qcyIsInJvb3RfaGFzaCI6Im5CNmh6dm5mWGhhVThMb1p6ZFJWV0pscUpuVlN1bFhGSWVmdm5SNDNQQWsifSx7InBhdGgiOiJqcy9wb3B1cC9hcGkuanMiLCJyb290X2hhc2giOiJqUUl3bFhRTGZoby1jdTRXQTk0X3dOLWpjaHVkcnI3alRtWWxQSHdib1pNIn0seyJwYXRoIjoianMvcG9wdXAvbGliLmpzIiwicm9vdF9oYXNoIjoiM1JtVXAzQjFWWnoybmQ3QTA5Q1RHTXFJbWhXRVFPWG56QUtWd1RVOW11cyJ9LHsicGF0aCI6ImpzL3BvcHVwL2xpc3RzLmpzIiwicm9vdF9oYXNoIjoiTHhxWVRVbVlGNC1TLU0taS03Tl9USW5RaVFUaUswSDlza0FjSGpCTGhmbyJ9LHsicGF0aCI6ImpzL3BvcHVwL3BvcHVwLmpzIiwicm9vdF9oYXNoIjoia0FDbThuNEQzWmVaLUpfSlI5UExkbm95d2l5cmlWYWVLUEV5c0ZuWUxxYyJ9LHsicGF0aCI6ImpzL3BvcHVwL3Vwcm94eXMuanMiLCJyb290X2hhc2giOiJQemNhaFowZV9tNFo5cTFpenhBV1lGTU9IN2hxMjA0dDFZRENtazNEdFRvIn0seyJwYXRoIjoianMvcG9wdXAvdmFycy5qcyIsInJvb3RfaGFzaCI6IkktRk1NWUFfUjY5dkg4U2ttR3F2NXotOWdvdE9VY21hbFdYQ1cxOUxOcEkifSx7InBhdGgiOiJqcy91aWtpdC9jb21wb25lbnRzL25vdGlmeS5qcyIsInJvb3RfaGFzaCI6ImY2QWVhOU9HdE0yalJzTVBQVEVfd1NIaHJpbmMtWmwxTEtJT19aZWV4RVEifSx7InBhdGgiOiJqcy91aWtpdC91aWtpdC5qcyIsInJvb3RfaGFzaCI6IjZ4bGxzeUkzMDZIT3dSLXR1clhEUWVqV0Z5ZWM3THB0aHVsdzh3QjB4RlEifSx7ImNhbm9uaWNhbF9qc29uX3Jvb3RfaGFzaCI6InZ6MnRDRk1xSVZVU2JtanBKNUhEREhxdmZNZElEMTUweW82bzl4NFdUSmciLCJwYXRoIjoibWFuaWZlc3QuanNvbiIsInJvb3RfaGFzaCI6IkVyVXlVdURNVXA4R0xtVFhpcFdSd1lmcXVLbFBhdHBKSGJSZnhWRHVsY0kifSx7InBhdGgiOiJwb3B1cC5odG1sIiwicm9vdF9oYXNoIjoiWnR2ZEEzVHRvYUZHUWFyZHlnbUtIVHNnOXFHS0pnNEdiTU9xSllLWTJhZyJ9XSwiZm9ybWF0IjoidHJlZWhhc2giLCJoYXNoX2Jsb2NrX3NpemUiOjQwOTZ9XSwiaXRlbV9pZCI6ImlpbHBpYmhpaWhva2VjbmJka2FtaW5lbW5tZWNqZmVkIiwiaXRlbV92ZXJzaW9uIjoiMS4xMiIsInByb3RvY29sX3ZlcnNpb24iOjF9","signatures":[{"header":{"kid":"publisher"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"EgdfSMw59h8Fnc_1vtzNUt9jpeh4VlCHqkcGTYy2Mg7AYfZ_gHrE27inHqHtZzdBUF_MxztgXW9JRui1Co_vz0RrTI6zzA8zHenqcbACU5UnfrqWt27omvex0xvoM9-v6orHm67hckUB6onxgSFzh4y5RlUOzH0--sGjpIcmQc4ft1z1OTHdqHx9miC27Y3Ip3F1MSOSx3uv2e4qQXn-rNwTpvFbdadZDKKRFN_SNE7ckzEUwSSK_oKw45G2n_cO9cREt2xwKydKf6KfXOKerC05lA66uikYQg2EOmEQ_mj7vqwCpeo4hhl3MlJL8JPiFjccbYzNXjZqQN9yh10Fpg"},{"header":{"kid":"webstore"},"protected":"eyJhbGciOiJSUzI1NiJ9","signature":"G2TAhVxwh8E7PILOb-KLRJni0M5tRNv2Sj1OCtDIU9MEZDbA_tlomQXMtdf85Ks2n96CWvOnpjUER2vzUqzcB00G22z1wPB_0ePTyYTebdIkrIvth_b11bza-hYeJPeJ2jrenNGYJcXmogHC9Nt4EvQpoDs9ChjbDzN4j3eI017XUp7Mt1vF0HA-VqMm_9tuu_kr8Sw2b28aA4PwVAB4n9SNiChtx4kQTm5IGGe8eHww83Hj_RhNJWb2Y3Kn-Aqnbayp-1XARWrgN5vVkBb5yNql_SB5Sw9G9CUYw1jRPFq5FG-0WvXRwNldjmLaqjRsT96AB2Cz2g9BxBwybZQpJg"}]}}] \ No newline at end of file diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/background.html b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/background.html new file mode 100755 index 0000000..83ba9bb --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/background.html @@ -0,0 +1,29 @@ + + +
+ + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/css/main.css b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/css/main.css new file mode 100755 index 0000000..fa5903d --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/css/main.css @@ -0,0 +1,245 @@ + +div#foot { + position: absolute; + bottom: 0; + display: block; + width: 100%; + margin-bottom: 5px; + padding-top: 5px; +} + +.cp-os-light { + font-family: 'Open Sans', sans-serif; + font-weight: 300; +} + +.cp-os { + font-family: 'Open Sans', sans-serif; + font-weight: 400; +} + +.cp-os-bold { + font-family: 'Open Sans', sans-serif; + font-weight: 700; +} + +.cp-os-condensed { + font-family: 'Open Sans Condensed', sans-serif; + font-weight: 300; +} + +.cp-os-condensed-bold { + font-family: 'Open Sans Condensed', sans-serif; + font-weight: 700; +} + +.cp-pointer { + cursor: pointer; +} + +.cp-pointer:hover { + color: #777777; +} + +#mainproxy { + font-size: 14px; +} + +td#mainproxyco { + width: 44px; +} + +#mainproxyco img { + height: 28px; + width: 42px; + box-shadow: 0 0 1px 1px #dfdfdf; +} + +#listtable img { + width: 20px; +} + +#hideip img { + height: 30px; +} + +.uk-text-success { + color: #5B7900; +} + +.uk-tab li { + font-family: 'Open Sans', sans-serif; + font-weight: 700; + font-size: 12px; +} + +#configproxy > li { + padding: 20px 20px 20px 15px; +} + +#configproxy > li.uk-active { + background-color: #fff; +} + +a, .uk-tab > li > a { + color: #006D9A; +} + +#flags-all, #flags-site { + position: relative; +} + +.cp-flags { + display: none; + position: relative; +} + +.cp-uproxy { + padding-left: 7px; + display: inline-block; + *display: inline; + *zoom: 1; +} + +.cp-uproxy > div { + +} + +.cp-flag { + cursor: pointer; + display: inline-block; + *display: inline; + *zoom: 1; + + background-color: #fff; + border: 1px solid #fff; + border-radius: 3px; + + padding: 5px 5px 5px 5px; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + +} + +.cp-flag img { + margin: 0; + padding: 0; + width: 32px; + box-shadow: 0 0 2px 1px #efefef; +} + +label img { + margin: 0; + padding: 0; + width: 22px; + box-shadow: 0 0 2px 1px #d0d0d0; +} + +.cp-flag:hover { + border: 1px solid #ccc; + box-shadow: 0 0 2px 1px #dfdfdf; +} + +.cp-flag.is-active { + + border: 1px solid #fff; + background: #B8BDC6; + /* + background: -webkit-radial-gradient(center, ellipse cover, #ffffff 0%, #646473 200%); + */ +} + +.cp-uproxy.is-active { + +} + +.cp-flag.is-active:after, .cp-uproxy.is-active:after { + font-family: FontAwesome; + content: "\f058"; + position: absolute; + margin-left: -22px; + top: 26px; + color: #80A000; +} + +tr, td, table { + border: 0px solid #da314b; +} + +.cp-uppercase { + text-transform: uppercase; +} + +::selection { + background: #006D9A; +} + +.uk-form { + font-size: 11px; +} + +.cp-newhost input { + margin-left: -3px; +} + +.uk-form input[type="text"] { + height: 23px; +} + +td.cp-act { + width: 54px; +} + +.cp-pname, .cp-pproto { + font-size: 14px; +} + +.cp-pip { + font-weight: bold; + font-size: 12px; +} + +.cp-pproto select { + height: 23px; +} + +#addproxy { + font-size: 24px; + margin-right: 18px; +} + +.uk-badge { + background: #006D9A; +} + +.uk-badge a { + color: #fff; +} + +.uk-dropdown { + width: 200px; +} + +.uk-dropdown-scrollable { + max-height: 140px; +} + +.cp-vspace { + height: 7px; + padding: 0; + margin: 0; +} + +.cp-unvis { + visibility: hidden; +} + +.uk-scrollable-text { + max-height: 300px; + min-height: 100px; + height: auto; +} \ No newline at end of file diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/css/notify.almost-flat.css b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/css/notify.almost-flat.css new file mode 100755 index 0000000..6c76167 --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/css/notify.almost-flat.css @@ -0,0 +1,99 @@ +/*! UIkit 2.12.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */ +/* ======================================================================== + Component: Notify + ========================================================================== */ +/* + * Message container for positioning + */ +.uk-notify { + position: fixed; + top: 10px; + left: 10px; + z-index: 1040; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 350px; +} +/* Position modifiers +========================================================================== */ +.uk-notify-top-right, +.uk-notify-bottom-right { + left: auto; + right: 10px; +} +.uk-notify-top-center, +.uk-notify-bottom-center { + left: 50%; + margin-left: -175px; +} +.uk-notify-bottom-left, +.uk-notify-bottom-right, +.uk-notify-bottom-center { + top: auto; + bottom: 10px; +} +/* Responsiveness +========================================================================== */ +/* Phones portrait and smaller */ +@media (max-width: 479px) { + /* + * Fit in small screen + */ + .uk-notify { + left: 10px; + right: 10px; + width: auto; + margin: 0; + } +} +/* Sub-object: `uk-notify-message` +========================================================================== */ +.uk-notify-message { + position: relative; + margin-bottom: 10px; + padding: 15px; + background: #444444; + color: #ffffff; + font-size: 16px; + line-height: 22px; + cursor: pointer; + border: 1px solid #444444; + border-radius: 4px; +} +/* Close in notify + ========================================================================== */ +.uk-notify-message > .uk-close { + visibility: hidden; + float: right; +} +.uk-notify-message:hover > .uk-close { + visibility: visible; +} +/* Modifier: `uk-alert-info` + ========================================================================== */ +.uk-notify-message-primary { + background: #ebf7fd; + color: #2d7091; + border-color: rgba(45, 112, 145, 0.3); +} +/* Modifier: `uk-alert-success` + ========================================================================== */ +.uk-notify-message-success { + background: #f2fae3; + color: #659f13; + border-color: rgba(101, 159, 19, 0.3); +} +/* Modifier: `uk-notify-message-warning` + ========================================================================== */ +.uk-notify-message-warning { + background: #fffceb; + color: #e28327; + border-color: rgba(226, 131, 39, 0.3); +} +/* Modifier: `uk-notify-message-danger` + ========================================================================== */ +.uk-notify-message-danger { + background: #fff1f0; + color: #d85030; + border-color: rgba(216, 80, 48, 0.3); +} diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/css/switcher.css b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/css/switcher.css new file mode 100755 index 0000000..d08d246 --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/css/switcher.css @@ -0,0 +1,123 @@ +/* jquery.switcher - 1.2.4 +* https://github.com/djanix/jquery-switcher +* Copyright (c) 2014-11-04 - */ + + +.switcher { + cursor: pointer; + /* + font-family: "Lucida Sans Unicode", "Lucida Grande", sans-serif; + */ + font-size: 12px; + text-transform: uppercase; + display: inline-block; + *display: inline; + *zoom: 1; +} +.switcher .content { + position: relative; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} +.switcher .text { + display: none; + overflow: hidden; + text-align: center; + white-space: nowrap; +} +.switcher.is-disabled { + opacity: 0.4; +} + +.switcher.default { + background-color: #efeff0; + border: 1px solid #eee; + border-radius: 4px; + line-height: 26px; + min-width: 80px; + padding: 2px; + -webkit-transition: background-color 0.3s; + transition: background-color 0.3s; + margin: 4px 6px 0px 0px; +} +.switcher.default input { + display: none; +} +.switcher.default .slider { + background-color: white; + border-radius: 4px; + -webkit-box-shadow: 0 0 2px 1px #dfdfdf; + box-shadow: 0 0 2px 1px #dfdfdf; + height: 26px; + left: 0; + position: absolute; + top: 0; + -webkit-transform: translateX(0%); + -ms-transform: translateX(0%); + transform: translateX(0%); + -webkit-transition: -webkit-transform 0.3s; + transition: transform 0.3s; + width: 50%; + z-index: 2; +} +.switcher.default .text { + width: 50%; + display: inline-block; + *display: inline; + *zoom: 1; +} +.switcher.default .textYes { + color: white; + float: left; +} +.switcher.default .textNo { + color: #9f9f9f; + float: right; +} +.switcher.default.is-active { + background-color: #80A000; +} +.switcher.default.is-active .slider { + -webkit-transform: translateX(100%); + -ms-transform: translateX(100%); + transform: translateX(100%); +} + +.switcher.short { + cursor: pointer; + display: inline-block; + margin-right: 5px; + vertical-align: middle; + margin-bottom: 3px; +} +.switcher.short input { + display: none; +} +.switcher.short .content { + border: 1px solid #aaaaaa; + border-radius: 50%; + height: 18px; + padding: 0; + width: 18px; +} +.switcher.short .slider { + background-color: #519b20; + border-radius: 50%; + height: 12px; + margin: 3px; + opacity: 0; + -webkit-transform: scale(0); + -ms-transform: scale(0); + transform: scale(0); + -webkit-transition: all 0.2s; + transition: all 0.2s; + width: 12px; +} +.switcher.short.is-active .slider { + opacity: 1; + -webkit-transform: scale(1); + -ms-transform: scale(1); + transform: scale(1); +} diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/css/uikit.almost-flat.css b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/css/uikit.almost-flat.css new file mode 100755 index 0000000..eaf7b8b --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/css/uikit.almost-flat.css @@ -0,0 +1,7362 @@ +/*! UIkit 2.13.1 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */ +/* ======================================================================== + Component: Base + ========================================================================== */ +/* + * 1. Normalizes default `font-family` and sets `font-size` here to support `rem` units + * 2. Prevents iOS text size adjust after orientation change, without disabling user zoom + * 3. Style + */ +html { + /* 1 */ + font: normal 14px / 20px "Helvetica Neue", Helvetica, Arial, sans-serif; + /* 2 */ + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; + /* 3 */ + background: #ffffff; + color: #444444; +} +/* + * Removes default margin. + */ +body { + margin: 0; +} +/* Links + ========================================================================== */ +/* + * Remove the gray background color from active links in IE 10. + */ +a { + background: transparent; +} +/* + * Improves readability when focused and also mouse hovered in all browsers. + */ +a:active, +a:hover { + outline: 0; +} +/* + * Style + */ +a, +.uk-link { + color: #0077dd; + text-decoration: none; + cursor: pointer; +} +a:hover, +.uk-link:hover { + color: #005599; + text-decoration: underline; +} +/* Text-level semantics + ========================================================================== */ +/* + * Addresses styling not present in Chrome, Safari, Opera and IE 8/9/10. + */ +abbr[title] { + border-bottom: 1px dotted; +} +/* + * Addresses style set to `bolder` in Firefox + */ +b, +strong { + font-weight: bold; +} +/* + * 1. Address odd `em`-unit font size rendering in all browsers. + * 2. Consolas has a better baseline in running text compared to `Courier` + */ +:not(pre) > code, +:not(pre) > kbd, +:not(pre) > samp { + /* 1 */ + font-size: 12px; + /* 2 */ + font-family: Consolas, monospace, serif; + /* 3 */ + color: #dd0055; + white-space: nowrap; + padding: 0 4px; + border: 1px solid #dddddd; + border-radius: 3px; + background: #fafafa; +} +/* + * Emphasize + */ +em { + color: #dd0055; +} +/* + * Insert + */ +ins { + background: #ffffaa; + color: #444444; + text-decoration: none; +} +/* + * Mark + * Note: Addresses styling not present in IE 8/9. + */ +mark { + background: #ffffaa; + color: #444444; +} +/* + * Quote + */ +q { + font-style: italic; +} +/* + * Addresses inconsistent and variable font size in all browsers. + */ +small { + font-size: 80%; +} +/* + * Prevents `sub` and `sup` affecting `line-height` in all browsers. + */ +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +/* Images + ========================================================================== */ +/* + * 1. Responsiveness: Sets a maximum width relative to the parent and auto scales the height + * 2. Corrects `max-width` behavior if padding and border are used + * 3. Remove border when inside `a` element in IE 8/9/10. + * 4. Remove the gap between images and the bottom of their containers + */ +img { + /* 1 */ + max-width: 100%; + height: auto; + /* 2 */ + -moz-box-sizing: border-box; + box-sizing: border-box; + /* 3 */ + border: 0; + /* 4 */ + vertical-align: middle; +} +/* + * Preserve original image dimensions + */ +.uk-img-preserve, +.uk-img-preserve img { + max-width: none; +} +/* + * Correct overflow not hidden in IE 9/10/11. + */ +svg:not(:root) { + overflow: hidden; +} +/* Block elements + ========================================================================== */ +/* + * Reset margin + */ +blockquote, +figure { + margin: 0; +} +/* + * Margins + */ +p, +ul, +ol, +dl, +blockquote, +pre, +address, +fieldset, +figure { + margin: 0 0 15px 0; +} +* + p, +* + ul, +* + ol, +* + dl, +* + blockquote, +* + pre, +* + address, +* + fieldset, +* + figure { + margin-top: 15px; +} +/* Headings + ========================================================================== */ +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0 0 15px 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: normal; + color: #444444; + text-transform: none; +} +/* + * Margins + */ +* + h1, +* + h2, +* + h3, +* + h4, +* + h5, +* + h6 { + margin-top: 25px; +} +/* + * Sizes + */ +h1, +.uk-h1 { + font-size: 36px; + line-height: 42px; +} +h2, +.uk-h2 { + font-size: 24px; + line-height: 30px; +} +h3, +.uk-h3 { + font-size: 18px; + line-height: 24px; +} +h4, +.uk-h4 { + font-size: 16px; + line-height: 22px; +} +h5, +.uk-h5 { + font-size: 14px; + line-height: 20px; +} +h6, +.uk-h6 { + font-size: 12px; + line-height: 18px; +} +/* Lists + ========================================================================== */ +ul, +ol { + padding-left: 30px; +} +/* + * Reset margin for nested lists + */ +ul > li > ul, +ul > li > ol, +ol > li > ol, +ol > li > ul { + margin: 0; +} +/* Description lists + ========================================================================== */ +dt { + font-weight: bold; +} +dd { + margin-left: 0; +} +/* Horizontal rules + ========================================================================== */ +/* + * 1. Address differences between Firefox and other browsers. + * 2. Style + */ +hr { + /* 1 */ + -moz-box-sizing: content-box; + box-sizing: content-box; + height: 0; + /* 2 */ + margin: 15px 0; + border: 0; + border-top: 1px solid #dddddd; +} +/* Address + ========================================================================== */ +address { + font-style: normal; +} +/* Blockquotes + ========================================================================== */ +blockquote { + padding-left: 15px; + border-left: 5px solid #dddddd; + font-size: 16px; + line-height: 22px; + font-style: italic; +} +/* Preformatted text + ========================================================================== */ +/* + * 1. Contain overflow in all browsers. + */ +pre { + padding: 10px; + background: #fafafa; + font: 12px / 18px Consolas, monospace, serif; + color: #444444; + -moz-tab-size: 4; + tab-size: 4; + /* 1 */ + overflow: auto; + border: 1px solid #dddddd; + border-radius: 3px; +} +/* Selection pseudo-element + ========================================================================== */ +::-moz-selection { + background: #3399ff; + color: #ffffff; + text-shadow: none; +} +::selection { + background: #3399ff; + color: #ffffff; + text-shadow: none; +} +/* HTML5 elements + ========================================================================== */ +/* + * Corrects `block` display not defined in IE 8/9. + */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +main, +nav, +section, +summary { + display: block; +} +/* + * Addresses inconsistent vertical alignment of `progress` in Chrome, Firefox and Opera. + */ +progress { + vertical-align: baseline; +} +/* + * Prevent displaying `audio` without controls in Chrome, Safari and Opera + */ +audio:not([controls]) { + display: none; +} +/* + * Address `[hidden]` styling not present in IE 8/9. + * Hide the `template` element in IE and Safari + */ +[hidden], +template { + display: none; +} +/* Iframe + ========================================================================== */ +iframe { + border: 0; +} +/* Fix viewport for IE10 snap mode + ========================================================================== */ +@media screen and (max-width: 400px) { + @-ms-viewport { + width: device-width; + } +} +/* ======================================================================== + Component: Grid + ========================================================================== */ +/* + * 1. Needed for the gutter + * 2. Makes grid more robust so that it can be used with other block elements like lists + */ +.uk-grid { + display: -ms-flexbox; + display: -webkit-flex; + display: flex; + -ms-flex-wrap: wrap; + -webkit-flex-wrap: wrap; + flex-wrap: wrap; + /* 1 */ + margin: 0 0 0 -25px; + /* 2 */ + padding: 0; + list-style: none; +} +/* + * DEPRECATED + * Micro clearfix + * 1. Not possible to use `table` because it creates a 1px gap when it becomes a flex item + */ +.uk-grid:before, +.uk-grid:after { + content: ""; + /* 1 */ + display: block; +} +.uk-grid:after { + clear: both; +} +/* + * Grid cell + * 1. Space is allocated solely based on content dimensions + * 2. Makes grid more robust so that it can be used with other block elements + * 3. Create horizontal gutter + * 4. DEPRECATED Using `float` to support IE9 + */ +.uk-grid > * { + /* 1 */ + -ms-flex: none; + -webkit-flex: none; + flex: none; + /* 2 */ + margin: 0; + /* 3 */ + padding-left: 25px; + /* 4 */ + float: left; +} +/* + * Remove margin from the last-child + */ +.uk-grid > * > :last-child { + margin-bottom: 0; +} +/* Grid gutter + ========================================================================== */ +/* + * Vertical gutter + */ +.uk-grid + .uk-grid { + margin-top: 25px; +} +/* + * This class is set by JavaScript and applies a vertical gutter if the columns stack or float into the next row + * Higher specificity to override margin + */ +.uk-grid > .uk-grid-margin { + margin-top: 25px; +} +/* + * Vertical gutter for panels + */ +.uk-grid > * > .uk-panel + .uk-panel { + margin-top: 25px; +} +/* + * Larger gutter for large screens + */ +/* Large screen and bigger */ +@media (min-width: 1220px) { + /* Horizontal gutter */ + .uk-grid:not(.uk-grid-preserve) { + margin-left: -35px; + } + .uk-grid:not(.uk-grid-preserve) > * { + padding-left: 35px; + } + /* Vertical gutter */ + .uk-grid:not(.uk-grid-preserve) + .uk-grid { + margin-top: 35px; + } + .uk-grid:not(.uk-grid-preserve) > .uk-grid-margin { + margin-top: 35px; + } + /* Vertical gutter for panels */ + .uk-grid:not(.uk-grid-preserve) > * > .uk-panel + .uk-panel { + margin-top: 35px; + } +} +/* + * Small gutter + * Higher specificity to override large gutter + */ +.uk-grid.uk-grid-small { + margin-left: -10px; +} +.uk-grid.uk-grid-small > * { + padding-left: 10px; +} +.uk-grid.uk-grid-small + .uk-grid-small { + margin-top: 10px; +} +.uk-grid.uk-grid-small > .uk-grid-margin { + margin-top: 10px; +} +.uk-grid.uk-grid-small > * > .uk-panel + .uk-panel { + margin-top: 10px; +} +/* Modifier: `uk-grid-divider` + ========================================================================== */ +/* + * Horizontal divider + * Does not work with `uk-push-*`, `uk-pull-*` and not if the columns float into the next row + */ +.uk-grid-divider:not(:empty) { + margin-left: -25px; + margin-right: -25px; +} +.uk-grid-divider > * { + padding-left: 25px; + padding-right: 25px; +} +.uk-grid-divider > [class*='uk-width-1-']:not(.uk-width-1-1):nth-child(n+2), +.uk-grid-divider > [class*='uk-width-2-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-3-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-4-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-5-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-6-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-7-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-8-']:nth-child(n+2), +.uk-grid-divider > [class*='uk-width-9-']:nth-child(n+2) { + border-left: 1px solid #dddddd; +} +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-grid-divider > [class*='uk-width-medium-']:not(.uk-width-medium-1-1):nth-child(n+2) { + border-left: 1px solid #dddddd; + } +} +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-grid-divider > [class*='uk-width-large-']:not(.uk-width-large-1-1):nth-child(n+2) { + border-left: 1px solid #dddddd; + } +} +/* Large screen and bigger */ +@media (min-width: 1220px) { + /* + * Large gutter + */ + .uk-grid-divider:not(.uk-grid-preserve):not(:empty) { + margin-left: -35px; + margin-right: -35px; + } + .uk-grid-divider:not(.uk-grid-preserve) > * { + padding-left: 35px; + padding-right: 35px; + } + .uk-grid-divider:not(.uk-grid-preserve):empty { + margin-top: 35px; + margin-bottom: 35px; + } +} +/* + * Vertical divider + */ +.uk-grid-divider:empty { + margin-top: 25px; + margin-bottom: 25px; + border-top: 1px solid #dddddd; +} +/* Match panels in grids + ========================================================================== */ +.uk-grid-match > * { + display: -ms-flexbox; + display: -webkit-flex; + display: flex; +} +/* + * 1. Behave like a block element + */ +.uk-grid-match > * > * { + -ms-flex: none; + -webkit-flex: none; + flex: none; + /* 1 */ + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; +} +/* Even grid cell widths + ========================================================================== */ +[class*='uk-grid-width'] > * { + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; +} +.uk-grid-width-1-2 > * { + width: 50%; +} +.uk-grid-width-1-3 > * { + width: 33.333%; +} +.uk-grid-width-1-4 > * { + width: 25%; +} +.uk-grid-width-1-5 > * { + width: 20%; +} +.uk-grid-width-1-6 > * { + width: 16.666%; +} +.uk-grid-width-1-10 > * { + width: 10%; +} +/* Phone landscape and bigger */ +@media (min-width: 480px) { + .uk-grid-width-small-1-2 > * { + width: 50%; + } + .uk-grid-width-small-1-3 > * { + width: 33.333%; + } + .uk-grid-width-small-1-4 > * { + width: 25%; + } + .uk-grid-width-small-1-5 > * { + width: 20%; + } + .uk-grid-width-small-1-6 > * { + width: 16.666%; + } + .uk-grid-width-small-1-10 > * { + width: 10%; + } +} +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-grid-width-medium-1-2 > * { + width: 50%; + } + .uk-grid-width-medium-1-3 > * { + width: 33.333%; + } + .uk-grid-width-medium-1-4 > * { + width: 25%; + } + .uk-grid-width-medium-1-5 > * { + width: 20%; + } + .uk-grid-width-medium-1-6 > * { + width: 16.666%; + } + .uk-grid-width-medium-1-10 > * { + width: 10%; + } +} +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-grid-width-large-1-2 > * { + width: 50%; + } + .uk-grid-width-large-1-3 > * { + width: 33.333%; + } + .uk-grid-width-large-1-4 > * { + width: 25%; + } + .uk-grid-width-large-1-5 > * { + width: 20%; + } + .uk-grid-width-large-1-6 > * { + width: 16.666%; + } + .uk-grid-width-large-1-10 > * { + width: 10%; + } +} +/* Large screen and bigger */ +@media (min-width: 1220px) { + .uk-grid-width-xlarge-1-2 > * { + width: 50%; + } + .uk-grid-width-xlarge-1-3 > * { + width: 33.333%; + } + .uk-grid-width-xlarge-1-4 > * { + width: 25%; + } + .uk-grid-width-xlarge-1-5 > * { + width: 20%; + } + .uk-grid-width-xlarge-1-6 > * { + width: 16.666%; + } + .uk-grid-width-xlarge-1-10 > * { + width: 10%; + } +} +/* Sub-objects: `uk-width-*` + ========================================================================== */ +[class*='uk-width'] { + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; +} +/* + * Widths + */ +/* Whole */ +.uk-width-1-1 { + width: 100%; +} +/* Halves */ +.uk-width-1-2, +.uk-width-2-4, +.uk-width-3-6, +.uk-width-5-10 { + width: 50%; +} +/* Thirds */ +.uk-width-1-3, +.uk-width-2-6 { + width: 33.333%; +} +.uk-width-2-3, +.uk-width-4-6 { + width: 66.666%; +} +/* Quarters */ +.uk-width-1-4 { + width: 25%; +} +.uk-width-3-4 { + width: 75%; +} +/* Fifths */ +.uk-width-1-5, +.uk-width-2-10 { + width: 20%; +} +.uk-width-2-5, +.uk-width-4-10 { + width: 40%; +} +.uk-width-3-5, +.uk-width-6-10 { + width: 60%; +} +.uk-width-4-5, +.uk-width-8-10 { + width: 80%; +} +/* Sixths */ +.uk-width-1-6 { + width: 16.666%; +} +.uk-width-5-6 { + width: 83.333%; +} +/* Tenths */ +.uk-width-1-10 { + width: 10%; +} +.uk-width-3-10 { + width: 30%; +} +.uk-width-7-10 { + width: 70%; +} +.uk-width-9-10 { + width: 90%; +} +/* Phone landscape and bigger */ +@media (min-width: 480px) { + /* Whole */ + .uk-width-small-1-1 { + width: 100%; + } + /* Halves */ + .uk-width-small-1-2, + .uk-width-small-2-4, + .uk-width-small-3-6, + .uk-width-small-5-10 { + width: 50%; + } + /* Thirds */ + .uk-width-small-1-3, + .uk-width-small-2-6 { + width: 33.333%; + } + .uk-width-small-2-3, + .uk-width-small-4-6 { + width: 66.666%; + } + /* Quarters */ + .uk-width-small-1-4 { + width: 25%; + } + .uk-width-small-3-4 { + width: 75%; + } + /* Fifths */ + .uk-width-small-1-5, + .uk-width-small-2-10 { + width: 20%; + } + .uk-width-small-2-5, + .uk-width-small-4-10 { + width: 40%; + } + .uk-width-small-3-5, + .uk-width-small-6-10 { + width: 60%; + } + .uk-width-small-4-5, + .uk-width-small-8-10 { + width: 80%; + } + /* Sixths */ + .uk-width-small-1-6 { + width: 16.666%; + } + .uk-width-small-5-6 { + width: 83.333%; + } + /* Tenths */ + .uk-width-small-1-10 { + width: 10%; + } + .uk-width-small-3-10 { + width: 30%; + } + .uk-width-small-7-10 { + width: 70%; + } + .uk-width-small-9-10 { + width: 90%; + } +} +/* Tablet and bigger */ +@media (min-width: 768px) { + /* Whole */ + .uk-width-medium-1-1 { + width: 100%; + } + /* Halves */ + .uk-width-medium-1-2, + .uk-width-medium-2-4, + .uk-width-medium-3-6, + .uk-width-medium-5-10 { + width: 50%; + } + /* Thirds */ + .uk-width-medium-1-3, + .uk-width-medium-2-6 { + width: 33.333%; + } + .uk-width-medium-2-3, + .uk-width-medium-4-6 { + width: 66.666%; + } + /* Quarters */ + .uk-width-medium-1-4 { + width: 25%; + } + .uk-width-medium-3-4 { + width: 75%; + } + /* Fifths */ + .uk-width-medium-1-5, + .uk-width-medium-2-10 { + width: 20%; + } + .uk-width-medium-2-5, + .uk-width-medium-4-10 { + width: 40%; + } + .uk-width-medium-3-5, + .uk-width-medium-6-10 { + width: 60%; + } + .uk-width-medium-4-5, + .uk-width-medium-8-10 { + width: 80%; + } + /* Sixths */ + .uk-width-medium-1-6 { + width: 16.666%; + } + .uk-width-medium-5-6 { + width: 83.333%; + } + /* Tenths */ + .uk-width-medium-1-10 { + width: 10%; + } + .uk-width-medium-3-10 { + width: 30%; + } + .uk-width-medium-7-10 { + width: 70%; + } + .uk-width-medium-9-10 { + width: 90%; + } +} +/* Desktop and bigger */ +@media (min-width: 960px) { + /* Whole */ + .uk-width-large-1-1 { + width: 100%; + } + /* Halves */ + .uk-width-large-1-2, + .uk-width-large-2-4, + .uk-width-large-3-6, + .uk-width-large-5-10 { + width: 50%; + } + /* Thirds */ + .uk-width-large-1-3, + .uk-width-large-2-6 { + width: 33.333%; + } + .uk-width-large-2-3, + .uk-width-large-4-6 { + width: 66.666%; + } + /* Quarters */ + .uk-width-large-1-4 { + width: 25%; + } + .uk-width-large-3-4 { + width: 75%; + } + /* Fifths */ + .uk-width-large-1-5, + .uk-width-large-2-10 { + width: 20%; + } + .uk-width-large-2-5, + .uk-width-large-4-10 { + width: 40%; + } + .uk-width-large-3-5, + .uk-width-large-6-10 { + width: 60%; + } + .uk-width-large-4-5, + .uk-width-large-8-10 { + width: 80%; + } + /* Sixths */ + .uk-width-large-1-6 { + width: 16.666%; + } + .uk-width-large-5-6 { + width: 83.333%; + } + /* Tenths */ + .uk-width-large-1-10 { + width: 10%; + } + .uk-width-large-3-10 { + width: 30%; + } + .uk-width-large-7-10 { + width: 70%; + } + .uk-width-large-9-10 { + width: 90%; + } +} +/* Sub-object: `uk-push-*` and `uk-pull-*` + ========================================================================== */ +/* + * Source ordering + * Works only with `uk-width-medium-*` + */ +/* Tablet and bigger */ +@media (min-width: 768px) { + [class*='uk-push-'], + [class*='uk-pull-'] { + position: relative; + } + /* + * Push + */ + /* Halves */ + .uk-push-1-2, + .uk-push-2-4, + .uk-push-3-6, + .uk-push-5-10 { + left: 50%; + } + /* Thirds */ + .uk-push-1-3, + .uk-push-2-6 { + left: 33.333%; + } + .uk-push-2-3, + .uk-push-4-6 { + left: 66.666%; + } + /* Quarters */ + .uk-push-1-4 { + left: 25%; + } + .uk-push-3-4 { + left: 75%; + } + /* Fifths */ + .uk-push-1-5, + .uk-push-2-10 { + left: 20%; + } + .uk-push-2-5, + .uk-push-4-10 { + left: 40%; + } + .uk-push-3-5, + .uk-push-6-10 { + left: 60%; + } + .uk-push-4-5, + .uk-push-8-10 { + left: 80%; + } + /* Sixths */ + .uk-push-1-6 { + left: 16.666%; + } + .uk-push-5-6 { + left: 83.333%; + } + /* Tenths */ + .uk-push-1-10 { + left: 10%; + } + .uk-push-3-10 { + left: 30%; + } + .uk-push-7-10 { + left: 70%; + } + .uk-push-9-10 { + left: 90%; + } + /* + * Pull + */ + /* Halves */ + .uk-pull-1-2, + .uk-pull-2-4, + .uk-pull-3-6, + .uk-pull-5-10 { + left: -50%; + } + /* Thirds */ + .uk-pull-1-3, + .uk-pull-2-6 { + left: -33.333%; + } + .uk-pull-2-3, + .uk-pull-4-6 { + left: -66.666%; + } + /* Quarters */ + .uk-pull-1-4 { + left: -25%; + } + .uk-pull-3-4 { + left: -75%; + } + /* Fifths */ + .uk-pull-1-5, + .uk-pull-2-10 { + left: -20%; + } + .uk-pull-2-5, + .uk-pull-4-10 { + left: -40%; + } + .uk-pull-3-5, + .uk-pull-6-10 { + left: -60%; + } + .uk-pull-4-5, + .uk-pull-8-10 { + left: -80%; + } + /* Sixths */ + .uk-pull-1-6 { + left: -16.666%; + } + .uk-pull-5-6 { + left: -83.333%; + } + /* Tenths */ + .uk-pull-1-10 { + left: -10%; + } + .uk-pull-3-10 { + left: -30%; + } + .uk-pull-7-10 { + left: -70%; + } + .uk-pull-9-10 { + left: -90%; + } +} +/* ======================================================================== + Component: Panel + ========================================================================== */ +/* + * 1. Needed for `a` elements + * 2. Create position context for badges + */ +.uk-panel { + /* 1 */ + display: block; + /* 2 */ + position: relative; +} +/* + * Micro clearfix to make panels more robust + */ +.uk-panel:before, +.uk-panel:after { + content: ""; + display: block; +} +.uk-panel:after { + clear: both; +} +/* + * Remove margin from the last-child if not `uk-widget-title` + */ +.uk-panel > :not(.uk-panel-title):last-child { + margin-bottom: 0; +} +/* Sub-object: `uk-panel-title` + ========================================================================== */ +.uk-panel-title { + margin-top: 0; + margin-bottom: 15px; + font-size: 18px; + line-height: 24px; + font-weight: normal; + text-transform: none; + color: #444444; +} +/* Sub-object: `uk-panel-badge` + ========================================================================== */ +.uk-panel-badge { + position: absolute; + top: 0; + right: 0; + z-index: 1; +} +/* Modifier: `uk-panel-box` + ========================================================================== */ +.uk-panel-box { + padding: 15px; + background: #fafafa; + color: #444444; + border: 1px solid #dddddd; + border-radius: 4px; +} +.uk-panel-box .uk-panel-title { + color: #444444; +} +.uk-panel-box .uk-panel-badge { + top: 10px; + right: 10px; +} +.uk-panel-box .uk-panel-teaser { + margin: -16px -16px 15px -16px; +} +/* + * Nav in panel + */ +.uk-panel-box > .uk-nav-side { + margin: 0 -15px; +} +/* + * Sub-modifier: `uk-panel-box-primary` + */ +.uk-panel-box-primary { + background-color: #ebf7fd; + color: #2d7091; + border-color: rgba(45, 112, 145, 0.3); +} +.uk-panel-box-primary .uk-panel-title { + color: #2d7091; +} +/* + * Sub-modifier: `uk-panel-box-secondary` + */ +.uk-panel-box-secondary { + background-color: #ffffff; + color: #444444; +} +.uk-panel-box-secondary .uk-panel-title { + color: #444444; +} +/* Modifier: `uk-panel-header` + ========================================================================== */ +.uk-panel-header .uk-panel-title { + padding-bottom: 10px; + border-bottom: 1px solid #dddddd; + color: #444444; +} +/* Modifier: `uk-panel-space` + ========================================================================== */ +.uk-panel-space { + padding: 30px; +} +.uk-panel-space .uk-panel-badge { + top: 30px; + right: 30px; +} +/* Modifier: `uk-panel-divider` + ========================================================================== */ +.uk-panel + .uk-panel-divider { + margin-top: 50px !important; +} +.uk-panel + .uk-panel-divider:before { + content: ""; + display: block; + position: absolute; + top: -25px; + left: 0; + right: 0; + border-top: 1px solid #dddddd; +} +/* Large screen and bigger */ +@media (min-width: 1220px) { + .uk-panel + .uk-panel-divider { + margin-top: 70px !important; + } + .uk-panel + .uk-panel-divider:before { + top: -35px; + } +} +.uk-panel-box .uk-panel-teaser > * { + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} +/* ======================================================================== + Component: Article + ========================================================================== */ +/* + * Micro clearfix to make articles more robust + */ +.uk-article:before, +.uk-article:after { + content: ""; + display: block; +} +.uk-article:after { + clear: both; +} +/* + * Remove margin from the last-child + */ +.uk-article > :last-child { + margin-bottom: 0; +} +/* + * Vertical gutter for articles + */ +.uk-article + .uk-article { + margin-top: 25px; +} +/* Sub-object `uk-article-title` + ========================================================================== */ +.uk-article-title { + font-size: 36px; + line-height: 42px; + font-weight: normal; + text-transform: none; +} +.uk-article-title a { + color: inherit; + text-decoration: none; +} +/* Sub-object `uk-article-meta` + ========================================================================== */ +.uk-article-meta { + font-size: 12px; + line-height: 18px; + color: #999999; +} +/* Sub-object `uk-article-lead` + ========================================================================== */ +.uk-article-lead { + color: #444444; + font-size: 18px; + line-height: 24px; + font-weight: normal; +} +/* Sub-object `uk-article-divider` + ========================================================================== */ +.uk-article-divider { + margin-bottom: 25px; + border-color: #dddddd; +} +* + .uk-article-divider { + margin-top: 25px; +} +.uk-article + .uk-article { + padding-top: 25px; + border-top: 1px solid #dddddd; +} +/* ======================================================================== + Component: Comment + ========================================================================== */ +/* Sub-object `uk-comment-header` + ========================================================================== */ +.uk-comment-header { + margin-bottom: 15px; + padding: 10px; + border: 1px solid #dddddd; + border-radius: 4px; + background: #fafafa; +} +/* + * Micro clearfix + */ +.uk-comment-header:before, +.uk-comment-header:after { + content: ""; + display: block; +} +.uk-comment-header:after { + clear: both; +} +/* Sub-object `uk-comment-avatar` + ========================================================================== */ +.uk-comment-avatar { + margin-right: 15px; + float: left; +} +/* Sub-object `uk-comment-title` + ========================================================================== */ +.uk-comment-title { + margin: 5px 0 0 0; + font-size: 16px; + line-height: 22px; +} +/* Sub-object `uk-comment-meta` + ========================================================================== */ +.uk-comment-meta { + margin: 2px 0 0 0; + font-size: 11px; + line-height: 16px; + color: #999999; +} +/* Sub-object `uk-comment-body` + ========================================================================== */ +.uk-comment-body { + padding-left: 10px; + padding-right: 10px; +} +/* + * Remove margin from the last-child + */ +.uk-comment-body > :last-child { + margin-bottom: 0; +} +/* Sub-object `uk-comment-list` + ========================================================================== */ +.uk-comment-list { + padding: 0; + list-style: none; +} +.uk-comment-list .uk-comment + ul { + margin: 25px 0 0 0; + list-style: none; +} +.uk-comment-list > li:nth-child(n+2), +.uk-comment-list .uk-comment + ul > li:nth-child(n+2) { + margin-top: 25px; +} +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-comment-list .uk-comment + ul { + padding-left: 100px; + } +} +/* Modifier `uk-comment-primary` + ========================================================================== */ +.uk-comment-primary .uk-comment-header { + border-color: rgba(45, 112, 145, 0.3); + background-color: #ebf7fd; + color: #2d7091; + text-shadow: 0 1px 0 #ffffff; +} +/* ======================================================================== + Component: Nav + ========================================================================== */ +.uk-nav, +.uk-nav ul { + margin: 0; + padding: 0; + list-style: none; +} +/* + * Items + */ +.uk-nav li > a { + display: block; + text-decoration: none; +} +.uk-nav > li > a { + padding: 5px 15px; +} +/* + * Nested items + */ +.uk-nav ul { + padding-left: 15px; +} +.uk-nav ul a { + padding: 2px 0; +} +/* + * Item subtitle + */ +.uk-nav li > a > div { + font-size: 12px; + line-height: 18px; +} +/* Sub-object: `uk-nav-header` + ========================================================================== */ +.uk-nav-header { + padding: 5px 15px; + text-transform: uppercase; + font-weight: bold; + font-size: 12px; +} +.uk-nav-header:not(:first-child) { + margin-top: 15px; +} +/* Sub-object: `uk-nav-divider` + ========================================================================== */ +.uk-nav-divider { + margin: 9px 15px; +} +/* Sub-object: `uk-nav-sub` + ========================================================================== */ +/* + * `ul` needed for higher specificity to override padding + */ +ul.uk-nav-sub { + padding: 5px 0 5px 15px; +} +/* Modifier: `uk-nav-parent-icon` + ========================================================================== */ +.uk-nav-parent-icon > .uk-parent > a:after { + content: "\f104"; + width: 20px; + margin-right: -10px; + float: right; + font-family: FontAwesome; + text-align: center; +} +.uk-nav-parent-icon > .uk-parent.uk-open > a:after { + content: "\f107"; +} +/* Modifier `uk-nav-side` + ========================================================================== */ +/* + * Items + */ +.uk-nav-side > li > a { + color: #444444; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-nav-side > li > a:hover, +.uk-nav-side > li > a:focus { + background: rgba(0, 0, 0, 0.03); + color: #444444; + /* 2 */ + outline: none; + box-shadow: inset 0 0 1px rgba(0, 0, 0, 0.06); + text-shadow: 0 -1px 0 #ffffff; +} +/* Active */ +.uk-nav-side > li.uk-active > a { + background: #00a8e6; + color: #ffffff; + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1); +} +/* + * Sub-object: `uk-nav-header` + */ +.uk-nav-side .uk-nav-header { + color: #444444; +} +/* + * Sub-object: `uk-nav-divider` + */ +.uk-nav-side .uk-nav-divider { + border-top: 1px solid #dddddd; + box-shadow: 0 1px 0 #ffffff; +} +/* + * Nested items + */ +.uk-nav-side ul a { + color: #0077dd; +} +.uk-nav-side ul a:hover { + color: #005599; +} +/* Modifier `uk-nav-dropdown` + ========================================================================== */ +/* + * Items + */ +.uk-nav-dropdown > li > a { + color: #444444; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-nav-dropdown > li > a:hover, +.uk-nav-dropdown > li > a:focus { + background: #00a8e6; + color: #ffffff; + /* 2 */ + outline: none; + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1); +} +/* + * Sub-object: `uk-nav-header` + */ +.uk-nav-dropdown .uk-nav-header { + color: #999999; +} +/* + * Sub-object: `uk-nav-divider` + */ +.uk-nav-dropdown .uk-nav-divider { + border-top: 1px solid #dddddd; +} +/* + * Nested items + */ +.uk-nav-dropdown ul a { + color: #0077dd; +} +.uk-nav-dropdown ul a:hover { + color: #005599; +} +/* Modifier `uk-nav-navbar` + ========================================================================== */ +/* + * Items + */ +.uk-nav-navbar > li > a { + color: #444444; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-nav-navbar > li > a:hover, +.uk-nav-navbar > li > a:focus { + background: #00a8e6; + color: #ffffff; + /* 2 */ + outline: none; + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1); +} +/* + * Sub-object: `uk-nav-header` + */ +.uk-nav-navbar .uk-nav-header { + color: #999999; +} +/* + * Sub-object: `uk-nav-divider` + */ +.uk-nav-navbar .uk-nav-divider { + border-top: 1px solid #dddddd; +} +/* + * Nested items + */ +.uk-nav-navbar ul a { + color: #0077dd; +} +.uk-nav-navbar ul a:hover { + color: #005599; +} +/* Modifier `uk-nav-offcanvas` + ========================================================================== */ +/* + * Items + */ +.uk-nav-offcanvas > li > a { + color: #cccccc; + padding: 10px 15px; + border-top: 1px solid rgba(0, 0, 0, 0.3); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05); + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); +} +/* + * Hover + * No hover on touch devices because it behaves buggy in fixed offcanvas + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-nav-offcanvas > .uk-open > a, +html:not(.uk-touch) .uk-nav-offcanvas > li > a:hover, +html:not(.uk-touch) .uk-nav-offcanvas > li > a:focus { + background: #404040; + color: #ffffff; + /* 2 */ + outline: none; +} +/* + * Active + * `html .uk-nav` needed for higher specificity to override hover + */ +html .uk-nav.uk-nav-offcanvas > li.uk-active > a { + background: #1a1a1a; + color: #ffffff; + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3); +} +/* + * Sub-object: `uk-nav-header` + */ +.uk-nav-offcanvas .uk-nav-header { + color: #777777; + margin-top: 0; + border-top: 1px solid rgba(0, 0, 0, 0.3); + background: #404040; + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05); + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); +} +/* + * Sub-object: `uk-nav-divider` + */ +.uk-nav-offcanvas .uk-nav-divider { + border-top: 1px solid rgba(255, 255, 255, 0.01); + margin: 0; + height: 4px; + background: rgba(0, 0, 0, 0.2); + box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.3); +} +/* + * Nested items + * No hover on touch devices because it behaves buggy in fixed offcanvas + */ +.uk-nav-offcanvas ul a { + color: #cccccc; +} +html:not(.uk-touch) .uk-nav-offcanvas ul a:hover { + color: #ffffff; +} +/* + * Modifier `uk-nav-offcanvas` + */ +.uk-nav-offcanvas { + border-bottom: 1px solid rgba(0, 0, 0, 0.3); + box-shadow: 0 1px 0 rgba(255, 255, 255, 0.05); +} +/* + * Sub-object: `uk-nav-sub` + */ +.uk-nav-offcanvas .uk-nav-sub { + border-top: 1px solid rgba(0, 0, 0, 0.3); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.05); +} +/* ======================================================================== + Component: Navbar + ========================================================================== */ +.uk-navbar { + background: #f5f5f5; + color: #444444; + border: 1px solid rgba(0, 0, 0, 0.06); + border-radius: 4px; +} +/* + * Micro clearfix + */ +.uk-navbar:before, +.uk-navbar:after { + content: ""; + display: block; +} +.uk-navbar:after { + clear: both; +} +/* Sub-object: `uk-navbar-nav` + ========================================================================== */ +.uk-navbar-nav { + margin: 0; + padding: 0; + list-style: none; + float: left; +} +/* + * 1. Create position context for dropdowns + */ +.uk-navbar-nav > li { + float: left; + /* 1 */ + position: relative; +} +/* + * 1. Dimensions + * 2. Style + */ +.uk-navbar-nav > li > a { + display: block; + -moz-box-sizing: border-box; + box-sizing: border-box; + text-decoration: none; + /* 1 */ + height: 41px; + padding: 0 15px; + line-height: 40px; + /* 2 */ + color: #444444; + font-size: 14px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-weight: normal; + margin-top: -1px; + margin-left: -1px; + border: 1px solid transparent; + border-bottom-width: 0; + text-shadow: 0 1px 0 #ffffff; +} +/* Appear not as link */ +.uk-navbar-nav > li > a[href='#'] { + cursor: text; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Also apply if dropdown is opened + * 3. Remove default focus style + */ +.uk-navbar-nav > li:hover > a, +.uk-navbar-nav > li > a:focus, +.uk-navbar-nav > li.uk-open > a { + background-color: #fafafa; + color: #444444; + /* 3 */ + outline: none; + position: relative; + z-index: 1; + border-left-color: rgba(0, 0, 0, 0.1); + border-right-color: rgba(0, 0, 0, 0.1); + border-top-color: rgba(0, 0, 0, 0.1); +} +/* OnClick */ +.uk-navbar-nav > li > a:active { + background-color: #eeeeee; + color: #444444; + border-left-color: rgba(0, 0, 0, 0.1); + border-right-color: rgba(0, 0, 0, 0.1); + border-top-color: rgba(0, 0, 0, 0.2); +} +/* Active */ +.uk-navbar-nav > li.uk-active > a { + background-color: #fafafa; + color: #444444; + border-left-color: rgba(0, 0, 0, 0.1); + border-right-color: rgba(0, 0, 0, 0.1); + border-top-color: rgba(0, 0, 0, 0.1); +} +/* Sub-objects: `uk-navbar-nav-subtitle` + ========================================================================== */ +.uk-navbar-nav .uk-navbar-nav-subtitle { + line-height: 28px; +} +.uk-navbar-nav-subtitle > div { + margin-top: -6px; + font-size: 10px; + line-height: 12px; +} +/* Sub-objects: `uk-navbar-content`, `uk-navbar-brand`, `uk-navbar-toggle` + ========================================================================== */ +/* + * Imitate navbar items + */ +.uk-navbar-content, +.uk-navbar-brand, +.uk-navbar-toggle { + -moz-box-sizing: border-box; + box-sizing: border-box; + display: block; + height: 41px; + padding: 0 15px; + float: left; + margin-top: -1px; + text-shadow: 0 1px 0 #ffffff; +} +/* + * Helper to center all child elements vertically + */ +.uk-navbar-content:before, +.uk-navbar-brand:before, +.uk-navbar-toggle:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; +} +/* Sub-objects: `uk-navbar-content` + ========================================================================== */ +/* + * Better sibling spacing + */ +.uk-navbar-content + .uk-navbar-content:not(.uk-navbar-center) { + padding-left: 0; +} +/* + * Link colors + */ +.uk-navbar-content > a:not([class]) { + color: #0077dd; +} +.uk-navbar-content > a:not([class]):hover { + color: #005599; +} +/* Sub-objects: `uk-navbar-brand` + ========================================================================== */ +.uk-navbar-brand { + font-size: 18px; + color: #444444; + text-decoration: none; +} +/* + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-navbar-brand:hover, +.uk-navbar-brand:focus { + color: #444444; + text-decoration: none; + /* 2 */ + outline: none; +} +/* Sub-object: `uk-navbar-toggle` + ========================================================================== */ +.uk-navbar-toggle { + font-size: 18px; + color: #444444; + text-decoration: none; +} +/* + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-navbar-toggle:hover, +.uk-navbar-toggle:focus { + color: #444444; + text-decoration: none; + /* 2 */ + outline: none; +} +/* + * 1. Center icon vertically + */ +.uk-navbar-toggle:after { + content: "\f0c9"; + font-family: FontAwesome; + /* 1 */ + vertical-align: middle; +} +.uk-navbar-toggle-alt:after { + content: "\f002"; +} +/* Sub-object: `uk-navbar-center` + ========================================================================== */ +/* + * The element with this class needs to be last child in the navbar + * 1. This hack is needed because other float elements shift centered text + */ +.uk-navbar-center { + float: none; + text-align: center; + /* 1 */ + max-width: 50%; + margin-left: auto; + margin-right: auto; +} +/* Sub-object: `uk-navbar-flip` + ========================================================================== */ +.uk-navbar-flip { + float: right; +} +/* + * Apply same `border-radius` as `uk-navbar` + */ +.uk-navbar-nav:first-child > li:first-child > a { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; +} +/* + * Sub-modifier `uk-navbar-flip` + */ +/* Collapse border */ +.uk-navbar-flip .uk-navbar-nav > li > a { + margin-left: 0; + margin-right: -1px; +} +/* Apply same `border-radius` as `uk-navbar` */ +.uk-navbar-flip .uk-navbar-nav:first-child > li:first-child > a { + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +.uk-navbar-flip .uk-navbar-nav:last-child > li:last-child > a { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; +} +/* + * Sub-modifier `uk-navbar-attached` + */ +.uk-navbar-attached { + border-top-color: transparent; + border-left-color: transparent; + border-right-color: transparent; + border-radius: 0; +} +.uk-navbar-attached .uk-navbar-nav > li > a { + border-radius: 0 !important; +} +/* ======================================================================== + Component: Subnav + ========================================================================== */ +/* + * 1. Remove default list style + * 2. Remove whitespace between child elements when using `inline-block` + */ +.uk-subnav { + /* 1 */ + padding: 0; + list-style: none; + /* 2 */ + font-size: 0.001px; +} +/* Items + ========================================================================== */ +/* + * 1. Create position context for dropdowns + * 2. Reset whitespace hack + */ +.uk-subnav > li { + /* 1 */ + position: relative; + /* 2 */ + font-size: 1rem; + vertical-align: top; +} +.uk-subnav > li, +.uk-subnav > li > a, +.uk-subnav > li > span { + display: inline-block; +} +.uk-subnav > li:nth-child(n+2) { + margin-left: 10px; +} +/* + * Items + */ +.uk-subnav > li > a { + color: #0077dd; +} +.uk-subnav > li > a:hover { + color: #005599; +} +/* + * Active + */ +/* + * Disabled + */ +.uk-subnav > li > span { + color: #999999; +} +/* Modifier: 'subnav-line' + ========================================================================== */ +.uk-subnav-line > li:nth-child(n+2):before { + content: ""; + display: inline-block; + height: 10px; + margin-right: 10px; + border-left: 1px solid #dddddd; +} +/* Modifier: 'subnav-pill' + ========================================================================== */ +.uk-subnav-pill > li > a, +.uk-subnav-pill > li > span { + padding: 3px 9px; + text-decoration: none; + border-radius: 4px; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-subnav-pill > li > a:hover, +.uk-subnav-pill > li > a:focus { + background: #fafafa; + color: #444444; + /* 2 */ + outline: none; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.15); +} +/* + * Active + * `li` needed for higher specificity to override hover + */ +.uk-subnav-pill > li.uk-active > a { + background: #00a8e6; + color: #ffffff; + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05); +} +/* ======================================================================== + Component: Breadcrumb + ========================================================================== */ +/* + * 1. Remove default list style + * 2. Remove whitespace between child elements when using `inline-block` + */ +.uk-breadcrumb { + /* 1 */ + padding: 0; + list-style: none; + /* 2 */ + font-size: 0.001px; +} +/* Items + ========================================================================== */ +/* + * Reset whitespace hack + */ +.uk-breadcrumb > li { + font-size: 1rem; + vertical-align: top; +} +.uk-breadcrumb > li, +.uk-breadcrumb > li > a, +.uk-breadcrumb > li > span { + display: inline-block; +} +.uk-breadcrumb > li:nth-child(n+2):before { + content: "/"; + display: inline-block; + margin: 0 8px; +} +/* + * Disabled + */ +.uk-breadcrumb > li:not(.uk-active) > span { + color: #999999; +} +/* ======================================================================== + Component: Pagination + ========================================================================== */ +/* + * 1. Remove default list style + * 2. Center pagination by default + * 3. Remove whitespace between child elements when using `inline-block` + */ +.uk-pagination { + /* 1 */ + padding: 0; + list-style: none; + /* 2 */ + text-align: center; + /* 3 */ + font-size: 0.001px; +} +/* + * Micro clearfix + * Needed if `uk-pagination-previous` or `uk-pagination-next` sub-objects are used + */ +.uk-pagination:before, +.uk-pagination:after { + content: ""; + display: block; +} +.uk-pagination:after { + clear: both; +} +/* Items + ========================================================================== */ +/* + * 1. Reset whitespace hack + * 2. Remove the gap at the bottom of it container + */ +.uk-pagination > li { + display: inline-block; + /* 1 */ + font-size: 1rem; + /* 2 */ + vertical-align: top; +} +.uk-pagination > li:nth-child(n+2) { + margin-left: 5px; +} +/* + * 1. Makes pagination more robust against different box-sizing use + * 2. Reset text-align to center if alignment modifier is used + */ +.uk-pagination > li > a, +.uk-pagination > li > span { + display: inline-block; + min-width: 16px; + padding: 3px 5px; + line-height: 20px; + text-decoration: none; + /* 1 */ + -moz-box-sizing: content-box; + box-sizing: content-box; + /* 2 */ + text-align: center; + border: 1px solid rgba(0, 0, 0, 0.06); + border-radius: 4px; +} +/* + * Links + */ +.uk-pagination > li > a { + background: #f5f5f5; + color: #444444; + text-shadow: 0 1px 0 #ffffff; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-pagination > li > a:hover, +.uk-pagination > li > a:focus { + background-color: #fafafa; + color: #444444; + /* 2 */ + outline: none; + border-color: rgba(0, 0, 0, 0.16); +} +/* OnClick */ +.uk-pagination > li > a:active { + background-color: #eeeeee; + color: #444444; +} +/* + * Active + */ +.uk-pagination > .uk-active > span { + background: #00a8e6; + color: #ffffff; + border-color: transparent; + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1); +} +/* + * Disabled + */ +.uk-pagination > .uk-disabled > span { + background-color: #fafafa; + color: #999999; + border: 1px solid rgba(0, 0, 0, 0.06); + text-shadow: 0 1px 0 #ffffff; +} +/* Previous and next navigation + ========================================================================== */ +.uk-pagination-previous { + float: left; +} +.uk-pagination-next { + float: right; +} +/* Alignment modifiers + ========================================================================== */ +.uk-pagination-left { + text-align: left; +} +.uk-pagination-right { + text-align: right; +} +/* ======================================================================== + Component: Tab + ========================================================================== */ +.uk-tab { + margin: 0; + padding: 0; + list-style: none; + border-bottom: 1px solid #dddddd; +} +/* + * Micro clearfix on the deepest container + */ +.uk-tab:before, +.uk-tab:after { + content: ""; + display: block; +} +.uk-tab:after { + clear: both; +} +/* + * Items + * 1. Create position context for dropdowns + */ +.uk-tab > li { + margin-bottom: -1px; + float: left; + /* 1 */ + position: relative; +} +.uk-tab > li > a { + display: block; + padding: 8px 12px 8px 12px; + border: 1px solid transparent; + border-bottom-width: 0; + color: #0077dd; + text-decoration: none; + border-radius: 4px 4px 0 0; + text-shadow: 0 1px 0 #ffffff; +} +.uk-tab > li:nth-child(n+2) > a { + margin-left: 5px; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Also apply if dropdown is opened + * 3. Remove default focus style + */ +.uk-tab > li > a:hover, +.uk-tab > li > a:focus, +.uk-tab > li.uk-open > a { + border-color: rgba(0, 0, 0, 0.06); + background: #f5f5f5; + color: #005599; + /* 2 */ + outline: none; +} +.uk-tab > li:not(.uk-active) > a:hover, +.uk-tab > li:not(.uk-active) > a:focus, +.uk-tab > li.uk-open:not(.uk-active) > a { + margin-bottom: 1px; + padding-bottom: 7px; +} +/* Active */ +.uk-tab > li.uk-active > a { + border-color: #dddddd; + border-bottom-color: transparent; + background: #ffffff; + color: #444444; +} +/* Disabled */ +.uk-tab > li.uk-disabled > a { + color: #999999; + cursor: auto; +} +.uk-tab > li.uk-disabled > a:hover, +.uk-tab > li.uk-disabled > a:focus, +.uk-tab > li.uk-disabled.uk-active > a { + background: none; + border-color: transparent; +} +/* Modifier: 'tab-flip' + ========================================================================== */ +.uk-tab-flip > li { + float: right; +} +.uk-tab-flip > li:nth-child(n+2) > a { + margin-left: 0; + margin-right: 5px; +} +/* Modifier: 'tab-responsive' + ========================================================================== */ +.uk-tab > li.uk-tab-responsive > a { + margin-left: 0; + margin-right: 0; +} +/* + * Icon + */ +.uk-tab-responsive > a:before { + content: "\f0c9\00a0"; + font-family: FontAwesome; +} +/* Modifier: 'tab-center' + ========================================================================== */ +.uk-tab-center { + border-bottom: 1px solid #dddddd; +} +.uk-tab-center-bottom { + border-bottom: none; + border-top: 1px solid #dddddd; +} +.uk-tab-center:before, +.uk-tab-center:after { + content: ""; + display: block; +} +.uk-tab-center:after { + clear: both; +} +/* + * 1. Using `right` to prevent vertical scrollbar caused by centering if to many tabs + */ +.uk-tab-center .uk-tab { + position: relative; + right: 50%; + border: none; + float: right; +} +.uk-tab-center .uk-tab > li { + position: relative; + right: -50%; +} +.uk-tab-center .uk-tab > li > a { + text-align: center; +} +/* Modifier: 'tab-bottom' + ========================================================================== */ +.uk-tab-bottom { + border-top: 1px solid #dddddd; + border-bottom: none; +} +.uk-tab-bottom > li { + margin-top: -1px; + margin-bottom: 0; +} +.uk-tab-bottom > li > a { + padding-top: 8px; + padding-bottom: 8px; + border-bottom-width: 1px; + border-top-width: 0; +} +.uk-tab-bottom > li:not(.uk-active) > a:hover, +.uk-tab-bottom > li:not(.uk-active) > a:focus, +.uk-tab-bottom > li.uk-open:not(.uk-active) > a { + margin-bottom: 0; + margin-top: 1px; + padding-bottom: 8px; + padding-top: 7px; +} +.uk-tab-bottom > li.uk-active > a { + border-top-color: transparent; + border-bottom-color: #dddddd; +} +/* Modifier: 'tab-grid' + ========================================================================== */ +/* + * 1. Create position context to prevent hidden border because of negative `z-index` + */ +.uk-tab-grid { + margin-left: -5px; + border-bottom: none; + /* 1 */ + position: relative; + z-index: 0; +} +.uk-tab-grid:before { + display: block; + position: absolute; + left: 5px; + right: 0; + bottom: -1px; + border-top: 1px solid #dddddd; + /* 1 */ + z-index: -1; +} +.uk-tab-grid > li:first-child > a { + margin-left: 5px; +} +.uk-tab-grid > li > a { + text-align: center; +} +/* + * If `uk-tab-bottom` + */ +.uk-tab-grid.uk-tab-bottom { + border-top: none; +} +.uk-tab-grid.uk-tab-bottom:before { + top: -1px; + bottom: auto; +} +/* Modifier: 'tab-left', 'tab-right' + ========================================================================== */ +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-tab-left, + .uk-tab-right { + border-bottom: none; + } + .uk-tab-left > li, + .uk-tab-right > li { + margin-bottom: 0; + float: none; + } + .uk-tab-left > li > a, + .uk-tab-right > li > a { + padding-top: 8px; + padding-bottom: 8px; + } + .uk-tab-left > li:nth-child(n+2) > a, + .uk-tab-right > li:nth-child(n+2) > a { + margin-left: 0; + margin-top: 5px; + } + .uk-tab-left > li.uk-active > a, + .uk-tab-right > li.uk-active > a { + border-color: #dddddd; + } + /* + * Modifier: 'tab-left' + */ + .uk-tab-left { + border-right: 1px solid #dddddd; + } + .uk-tab-left > li { + margin-right: -1px; + } + .uk-tab-left > li > a { + border-bottom-width: 1px; + border-right-width: 0; + } + .uk-tab-left > li:not(.uk-active) > a:hover, + .uk-tab-left > li:not(.uk-active) > a:focus { + margin-bottom: 0; + margin-right: 1px; + padding-bottom: 8px; + padding-right: 11px; + } + .uk-tab-left > li.uk-active > a { + border-right-color: transparent; + } + /* + * Modifier: 'tab-right' + */ + .uk-tab-right { + border-left: 1px solid #dddddd; + } + .uk-tab-right > li { + margin-left: -1px; + } + .uk-tab-right > li > a { + border-bottom-width: 1px; + border-left-width: 0; + } + .uk-tab-right > li:not(.uk-active) > a:hover, + .uk-tab-right > li:not(.uk-active) > a:focus { + margin-bottom: 0; + margin-left: 1px; + padding-bottom: 8px; + padding-left: 11px; + } + .uk-tab-right > li.uk-active > a { + border-left-color: transparent; + } +} +/* Modifier: `uk-tab-bottom' + ========================================================================== */ +.uk-tab-bottom > li > a { + border-radius: 0 0 4px 4px; +} +/* Modifier: `uk-tab-left', `uk-tab-right' + ========================================================================== */ +/* Tablet and bigger */ +@media (min-width: 768px) { + /* + * Modifier: `uk-tab-left' + */ + .uk-tab-left > li > a { + border-radius: 4px 0 0 4px; + } + /* + * Modifier: `uk-tab-right' + */ + .uk-tab-right > li > a { + border-radius: 0 4px 4px 0; + } +} +/* ======================================================================== + Component: List + ========================================================================== */ +.uk-list { + padding: 0; + list-style: none; +} +/* + * Micro clearfix to make list more robust + */ +.uk-list > li:before, +.uk-list > li:after { + content: ""; + display: block; +} +.uk-list > li:after { + clear: both; +} +/* + * Remove margin from the last-child + */ +.uk-list > li > :last-child { + margin-bottom: 0; +} +/* + * Nested lists + */ +.uk-list ul { + margin: 0; + padding-left: 20px; + list-style: none; +} +/* Modifier: `uk-list-line` + ========================================================================== */ +.uk-list-line > li:nth-child(n+2) { + margin-top: 5px; + padding-top: 5px; + border-top: 1px solid #dddddd; +} +/* Modifier: `uk-list-striped` + ========================================================================== */ +.uk-list-striped > li { + padding: 5px 5px; + border-bottom: 1px solid #dddddd; +} +.uk-list-striped > li:nth-of-type(odd) { + background: #fafafa; +} +/* Modifier: `uk-list-space` + ========================================================================== */ +.uk-list-space > li:nth-child(n+2) { + margin-top: 10px; +} +.uk-list-striped > li:first-child { + border-top: 1px solid #dddddd; +} +/* ======================================================================== + Component: Description list + ========================================================================== */ +/* Modifier: `uk-description-list-horizontal` + ========================================================================== */ +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-description-list-horizontal { + overflow: hidden; + } + .uk-description-list-horizontal > dt { + width: 160px; + float: left; + clear: both; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + } + .uk-description-list-horizontal > dd { + margin-left: 180px; + } +} +/* Modifier: `uk-description-list-line` + ========================================================================== */ +.uk-description-list-line > dt { + font-weight: normal; +} +.uk-description-list-line > dt:nth-child(n+2) { + margin-top: 5px; + padding-top: 5px; + border-top: 1px solid #dddddd; +} +.uk-description-list-line > dd { + color: #999999; +} +/* ======================================================================== + Component: Table + ========================================================================== */ +/* + * 1. Remove most spacing between table cells. + * 2. Block element behavior + * 3. Style + */ +.uk-table { + /* 1 */ + border-collapse: collapse; + border-spacing: 0; + /* 2 */ + width: 100%; + /* 3 */ + margin-bottom: 15px; +} +/* + * Add margin if adjacent element + */ +* + .uk-table { + margin-top: 15px; +} +.uk-table th, +.uk-table td { + padding: 8px 8px; + border-bottom: 1px solid #dddddd; +} +/* + * Set alignment + */ +.uk-table th { + text-align: left; +} +.uk-table td { + vertical-align: top; +} +.uk-table thead th { + vertical-align: bottom; +} +/* + * Caption and footer + */ +.uk-table caption, +.uk-table tfoot { + font-size: 12px; + font-style: italic; +} +.uk-table caption { + text-align: left; + color: #999999; +} +/* Sub-modifier: `uk-table-middle` + ========================================================================== */ +.uk-table-middle, +.uk-table-middle td { + vertical-align: middle !important; +} +/* Modifier: `uk-table-striped` + ========================================================================== */ +.uk-table-striped tbody tr:nth-of-type(odd) { + background: #fafafa; +} +/* Modifier: `uk-table-condensed` + ========================================================================== */ +.uk-table-condensed td { + padding: 4px 8px; +} +/* Modifier: `uk-table-hover` + ========================================================================== */ +.uk-table-hover tbody tr:hover { + background: #f0f0f0; +} +/* ======================================================================== + Component: Form + ========================================================================== */ +/* + * 1. Define consistent box sizing. + * Default is `content-box` with following exceptions set to `border-box` + * `button`, `select`, `input[type="checkbox"]` and `input[type="radio"]` + * `input[type="search"]` in Chrome, Safari and Opera + * `input[type="color"]` in Firefox + * 2. Address margins set differently in Firefox/IE and Chrome/Safari/Opera. + * 3. Remove `border-radius` in iOS. + * 4. Correct `font` properties and `color` not being inherited. + */ +.uk-form input, +.uk-form select, +.uk-form textarea { + /* 1 */ + -moz-box-sizing: border-box; + box-sizing: border-box; + /* 2 */ + margin: 0; + /* 3 */ + border-radius: 0; + /* 4 */ + font: inherit; + color: inherit; +} +/* + * Address inconsistent `text-transform` inheritance which is only inherit in Firefox + */ +.uk-form select { + text-transform: none; +} +/* + * 1. Correct `font` properties not being inherited. + * 2. Don't inherit the `font-weight` and use `bold` instead. + * NOTE: Both declarations don't work in Chrome, Safari and Opera. + */ +.uk-form optgroup { + /* 1 */ + font: inherit; + /* 2 */ + font-weight: bold; +} +/* + * Removes inner padding and border in Firefox 4+. + */ +.uk-form input::-moz-focus-inner { + border: 0; + padding: 0; +} +/* + * Removes excess padding in IE 8/9/10. + */ +.uk-form input[type="checkbox"], +.uk-form input[type="radio"] { + padding: 0; +} +/* + * Improves consistency of cursor style for clickable elements + */ +.uk-form input[type="checkbox"]:not(:disabled), +.uk-form input[type="radio"]:not(:disabled) { + cursor: pointer; +} +/* + * Remove default style in iOS. + */ +.uk-form textarea, +.uk-form input:not([type]), +.uk-form input[type="text"], +.uk-form input[type="password"], +.uk-form input[type="email"], +.uk-form input[type="url"], +.uk-form input[type="search"], +.uk-form input[type="tel"], +.uk-form input[type="number"], +.uk-form input[type="datetime"] { + -webkit-appearance: none; +} +/* + * Remove inner padding and search cancel button in Chrome, Safari and Opera on OS X. + */ +.uk-form input[type="search"]::-webkit-search-cancel-button, +.uk-form input[type="search"]::-webkit-search-decoration { + -webkit-appearance: none; +} +/* + * Fix the cursor style for Chrome's increment/decrement buttons. For certain + * `font-size` values of the `input`, it causes the cursor style of the + * decrement button to change from `default` to `text`. + */ +.uk-form input[type="number"]::-webkit-inner-spin-button, +.uk-form input[type="number"]::-webkit-outer-spin-button { + height: auto; +} +/* + * Define consistent border, margin, and padding. + */ +.uk-form fieldset { + border: none; + margin: 0; + padding: 0; +} +/* + * 1. Remove default vertical scrollbar in IE 8/9/10/11. + * 2. Improve readability and alignment in all browsers. + */ +.uk-form textarea { + /* 1 */ + overflow: auto; + /* 2 */ + vertical-align: top; +} +/* + * Removes placeholder transparency in Firefox. + */ +.uk-form ::-moz-placeholder { + opacity: 1; +} +/* + * Removes `box-shadow` for invalid controls in Firefox. + */ +.uk-form :invalid { + box-shadow: none; +} +/* + * Vertical alignment + */ +.uk-form input:not([type="radio"]):not([type="checkbox"]), +.uk-form select { + vertical-align: middle; +} +/* Style + ========================================================================== */ +/* + * Remove margin from the last-child + */ +.uk-form > :last-child { + margin-bottom: 0; +} +/* + * Controls + * Except for `range`, `radio`, `checkbox`, `file`, `submit`, `reset`, `button` and `image` + * 1. Must be `height` because `min-height` is not working in OSX + * 2. Responsiveness: Sets a maximum width relative to the parent to scale on narrower viewports + * 3. Vertical `padding` needed for `select` elements in Firefox + * 4. Style + */ +.uk-form select, +.uk-form textarea, +.uk-form input:not([type]), +.uk-form input[type="text"], +.uk-form input[type="password"], +.uk-form input[type="datetime"], +.uk-form input[type="datetime-local"], +.uk-form input[type="date"], +.uk-form input[type="month"], +.uk-form input[type="time"], +.uk-form input[type="week"], +.uk-form input[type="number"], +.uk-form input[type="email"], +.uk-form input[type="url"], +.uk-form input[type="search"], +.uk-form input[type="tel"], +.uk-form input[type="color"] { + /* 1 */ + height: 30px; + /* 2 */ + max-width: 100%; + /* 3 */ + padding: 4px 6px; + /* 4 */ + border: 1px solid #dddddd; + background: #ffffff; + color: #444444; + -webkit-transition: all linear 0.2s; + transition: all linear 0.2s; + border-radius: 4px; +} +.uk-form select:focus, +.uk-form textarea:focus, +.uk-form input:not([type]):focus, +.uk-form input[type="text"]:focus, +.uk-form input[type="password"]:focus, +.uk-form input[type="datetime"]:focus, +.uk-form input[type="datetime-local"]:focus, +.uk-form input[type="date"]:focus, +.uk-form input[type="month"]:focus, +.uk-form input[type="time"]:focus, +.uk-form input[type="week"]:focus, +.uk-form input[type="number"]:focus, +.uk-form input[type="email"]:focus, +.uk-form input[type="url"]:focus, +.uk-form input[type="search"]:focus, +.uk-form input[type="tel"]:focus, +.uk-form input[type="color"]:focus { + border-color: #99baca; + outline: 0; + background: #f5fbfe; + color: #444444; +} +.uk-form select:disabled, +.uk-form textarea:disabled, +.uk-form input:not([type]):disabled, +.uk-form input[type="text"]:disabled, +.uk-form input[type="password"]:disabled, +.uk-form input[type="datetime"]:disabled, +.uk-form input[type="datetime-local"]:disabled, +.uk-form input[type="date"]:disabled, +.uk-form input[type="month"]:disabled, +.uk-form input[type="time"]:disabled, +.uk-form input[type="week"]:disabled, +.uk-form input[type="number"]:disabled, +.uk-form input[type="email"]:disabled, +.uk-form input[type="url"]:disabled, +.uk-form input[type="search"]:disabled, +.uk-form input[type="tel"]:disabled, +.uk-form input[type="color"]:disabled { + border-color: #dddddd; + background-color: #fafafa; + color: #999999; +} +/* + * Placeholder + */ +.uk-form :-ms-input-placeholder { + color: #999999 !important; +} +.uk-form ::-moz-placeholder { + color: #999999; +} +.uk-form ::-webkit-input-placeholder { + color: #999999; +} +.uk-form :disabled:-ms-input-placeholder { + color: #999999 !important; +} +.uk-form :disabled::-moz-placeholder { + color: #999999; +} +.uk-form :disabled::-webkit-input-placeholder { + color: #999999; +} +/* + * Legend + * 1. Behave like block element + * 2. Correct `color` not being inherited in IE 8/9/10/11. + * 3. Remove padding + * 4. `margin-bottom` is not working in Safari and Opera. + * Using `padding` and :after instead to create the border + * 5. Style + */ +.uk-form legend { + /* 1 */ + width: 100%; + /* 2 */ + border: 0; + /* 3 */ + padding: 0; + /* 4 */ + padding-bottom: 15px; + /* 5 */ + font-size: 18px; + line-height: 30px; +} +/* + * 1. Fixes IE9 + */ +.uk-form legend:after { + content: ""; + display: block; + border-bottom: 1px solid #dddddd; + /* 1 */ + width: 100%; +} +/* Size modifiers + * Higher specificity needed to override defaults + ========================================================================== */ +select.uk-form-small, +textarea.uk-form-small, +input[type].uk-form-small, +input:not([type]).uk-form-small { + height: 25px; + padding: 3px 3px; + font-size: 12px; +} +select.uk-form-large, +textarea.uk-form-large, +input[type].uk-form-large, +input:not([type]).uk-form-large { + height: 40px; + padding: 8px 6px; + font-size: 16px; +} +/* Reset height + * Must be after size modifiers + ========================================================================== */ +.uk-form textarea, +.uk-form select[multiple], +.uk-form select[size] { + height: auto; +} +/* Validation states + * Using !important to keep the selector simple + ========================================================================== */ +/* + * Error state + */ +.uk-form-danger { + border-color: #dc8d99 !important; + background: #fff7f8 !important; + color: #d85030 !important; +} +/* + * Success state + */ +.uk-form-success { + border-color: #8ec73b !important; + background: #fafff2 !important; + color: #659f13 !important; +} +/* Style modifiers + * Using !important to keep the selector simple + ========================================================================== */ +/* + * Blank form + */ +.uk-form-blank { + border-color: transparent !important; + border-style: dashed !important; + background: none !important; +} +.uk-form-blank:focus { + border-color: #dddddd !important; +} +/* Size sub-modifiers + ========================================================================== */ +/* + * Fixed widths + * Different widths for mini sized `input` and `select` elements + */ +input.uk-form-width-mini { + width: 40px; +} +select.uk-form-width-mini { + width: 65px; +} +.uk-form-width-small { + width: 130px; +} +.uk-form-width-medium { + width: 200px; +} +.uk-form-width-large { + width: 500px; +} +/* Sub-objects: `uk-form-row` + * Groups labels and controls in rows + ========================================================================== */ +/* + * Micro clearfix + * Needed for `uk-form-horizontal` modifier + */ +.uk-form-row:before, +.uk-form-row:after { + content: ""; + display: block; +} +.uk-form-row:after { + clear: both; +} +/* + * Vertical gutter + */ +.uk-form-row + .uk-form-row { + margin-top: 15px; +} +/* Help text + * Sub-object: `uk-form-help-inline`, `uk-form-help-block` + ========================================================================== */ +.uk-form-help-inline { + display: inline-block; + margin: 0 0 0 10px; +} +.uk-form-help-block { + margin: 5px 0 0 0; +} +/* Controls content + * Sub-object: `uk-form-controls`, `uk-form-controls-condensed` + ========================================================================== */ +/* + * Remove margins + */ +.uk-form-controls > :first-child { + margin-top: 0; +} +.uk-form-controls > :last-child { + margin-bottom: 0; +} +/* + * Group controls and text into blocks with a small spacing between blocks + */ +.uk-form-controls-condensed { + margin: 5px 0; +} +/* Modifier: `uk-form-stacked` + * Requires sub-object: `uk-form-label` + ========================================================================== */ +.uk-form-stacked .uk-form-label { + display: block; + margin-bottom: 5px; + font-weight: bold; +} +/* Modifier: `uk-form-horizontal` + * Requires sub-objects: `uk-form-label`, `uk-form-controls` + ========================================================================== */ +/* Tablet portrait and smaller */ +@media (max-width: 959px) { + /* Behave like `uk-form-stacked` */ + .uk-form-horizontal .uk-form-label { + display: block; + margin-bottom: 5px; + font-weight: bold; + } +} +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-form-horizontal .uk-form-label { + width: 200px; + margin-top: 5px; + float: left; + } + .uk-form-horizontal .uk-form-controls { + margin-left: 215px; + } + /* Better vertical alignment if controls are checkboxes and radio buttons with text */ + .uk-form-horizontal .uk-form-controls-text { + padding-top: 5px; + } +} +/* Sub-object: `uk-form-icon` + ========================================================================== */ +/* + * 1. Container width fits its content + * 2. Create position context + * 3. Prevent `inline-block` consequences + */ +.uk-form-icon { + /* 1 */ + display: inline-block; + /* 2 */ + position: relative; + /* 3 */ + max-width: 100%; +} +/* + * 1. Make form element clickable through icon + */ +.uk-form-icon > [class*='uk-icon-'] { + position: absolute; + top: 50%; + width: 30px; + margin-top: -7px; + font-size: 14px; + color: #999999; + text-align: center; + /* 1 */ + pointer-events: none; +} +.uk-form-icon:not(.uk-form-icon-flip) > input { + padding-left: 30px !important; +} +/* + * Sub-modifier: `uk-form-icon-flip` + */ +.uk-form-icon-flip > [class*='uk-icon-'] { + right: 0; +} +.uk-form-icon-flip > input { + padding-right: 30px !important; +} +/* ======================================================================== + Component: Button + ========================================================================== */ +/* + * Removes inner padding and border in Firefox 4+. + */ +.uk-button::-moz-focus-inner { + border: 0; + padding: 0; +} +/* + * 1. Correct inability to style clickable `input` types in iOS. + * 2. Remove margins in Chrome, Safari and Opera. + * 3. Remove borders for `button`. + * 4. Address `overflow` set to `hidden` in IE 8/9/10/11. + * 5. Correct `font` properties and `color` not being inherited for `button`. + * 6. Address inconsistent `text-transform` inheritance which is only inherit in Firefox and IE + * 7. Style + * 8. `line-height` is used to create a height + * 9. `min-height` is necessary for `input` elements in Firefox and Opera because `line-height` is not working. + * 10. Reset button group whitespace hack + * 11. Required for `a`. + */ +.uk-button { + /* 1 */ + -webkit-appearance: none; + /* 2 */ + margin: 0; + /* 3 */ + border: none; + /* 4 */ + overflow: visible; + /* 5 */ + font: inherit; + color: #444444; + /* 6 */ + text-transform: none; + /* 7 */ + display: inline-block; + -moz-box-sizing: border-box; + box-sizing: border-box; + padding: 0 12px; + background: #f5f5f5; + vertical-align: middle; + /* 8 */ + line-height: 28px; + /* 9 */ + min-height: 30px; + /* 10 */ + font-size: 1rem; + /* 11 */ + text-decoration: none; + text-align: center; + border: 1px solid rgba(0, 0, 0, 0.06); + border-radius: 4px; + text-shadow: 0 1px 0 #ffffff; +} +.uk-button:not(:disabled) { + cursor: pointer; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + * 3. Required for `a` elements + */ +.uk-button:hover, +.uk-button:focus { + background-color: #fafafa; + color: #444444; + /* 2 */ + outline: none; + /* 3 */ + text-decoration: none; + border-color: rgba(0, 0, 0, 0.16); +} +/* Active */ +.uk-button:active, +.uk-button.uk-active { + background-color: #eeeeee; + color: #444444; +} +/* Color modifiers + ========================================================================== */ +/* + * Modifier: `uk-button-primary` + */ +.uk-button-primary { + background-color: #00a8e6; + color: #ffffff; +} +/* Hover */ +.uk-button-primary:hover, +.uk-button-primary:focus { + background-color: #35b3ee; + color: #ffffff; +} +/* Active */ +.uk-button-primary:active, +.uk-button-primary.uk-active { + background-color: #0091ca; + color: #ffffff; +} +/* + * Modifier: `uk-button-success` + */ +.uk-button-success { + background-color: #8cc14c; + color: #ffffff; +} +/* Hover */ +.uk-button-success:hover, +.uk-button-success:focus { + background-color: #8ec73b; + color: #ffffff; +} +/* Active */ +.uk-button-success:active, +.uk-button-success.uk-active { + background-color: #72ae41; + color: #ffffff; +} +/* + * Modifier: `uk-button-danger` + */ +.uk-button-danger { + background-color: #da314b; + color: #ffffff; +} +/* Hover */ +.uk-button-danger:hover, +.uk-button-danger:focus { + background-color: #e4354f; + color: #ffffff; +} +/* Active */ +.uk-button-danger:active, +.uk-button-danger.uk-active { + background-color: #c91032; + color: #ffffff; +} +/* Disabled state + * Overrides also the color modifiers + ========================================================================== */ +/* Equal for all button types */ +.uk-button:disabled { + background-color: #fafafa; + color: #999999; + border-color: rgba(0, 0, 0, 0.06); + box-shadow: none; + text-shadow: 0 1px 0 #ffffff; +} +/* Modifier: `uk-button-link` + ========================================================================== */ +/* Reset */ +.uk-button-link, +.uk-button-link:hover, +.uk-button-link:focus, +.uk-button-link:active, +.uk-button-link.uk-active, +.uk-button-link:disabled { + border-color: transparent; + background: none; + box-shadow: none; + text-shadow: none; +} +/* Color */ +.uk-button-link { + color: #0077dd; +} +.uk-button-link:hover, +.uk-button-link:focus, +.uk-button-link:active, +.uk-button-link.uk-active { + color: #005599; + text-decoration: underline; +} +.uk-button-link:disabled { + color: #999999; +} +/* Focus */ +.uk-button-link:focus { + outline: 1px dotted; +} +/* Size modifiers + ========================================================================== */ +.uk-button-mini { + min-height: 20px; + padding: 0 6px; + line-height: 18px; + font-size: 11px; +} +.uk-button-small { + min-height: 25px; + padding: 0 10px; + line-height: 23px; + font-size: 12px; +} +.uk-button-large { + min-height: 40px; + padding: 0 15px; + line-height: 38px; + font-size: 16px; + border-radius: 5px; +} +/* Sub-object `uk-button-group` + ========================================================================== */ +/* + * 1. Behave like buttons + * 2. Create position context for dropdowns + * 3. Remove whitespace between child elements when using `inline-block` + * 4. Prevent buttons from wrapping + * 5. Remove whitespace between child elements when using `inline-block` + */ +.uk-button-group { + /* 1 */ + display: inline-block; + vertical-align: middle; + /* 2 */ + position: relative; + /* 3 */ + font-size: 0.001px; + /* 4 */ + white-space: nowrap; +} +.uk-button-group > * { + display: inline-block; +} +/* 5 */ +.uk-button-group .uk-button { + vertical-align: top; +} +/* Sub-object: `uk-button-dropdown` + ========================================================================== */ +/* + * 1. Behave like buttons + * 2. Create position context for dropdowns + */ +.uk-button-dropdown { + /* 1 */ + display: inline-block; + vertical-align: middle; + /* 2 */ + position: relative; +} +/* Color modifiers + ========================================================================== */ +.uk-button-primary, +.uk-button-success, +.uk-button-danger { + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1); +} +.uk-button-primary:hover, +.uk-button-primary:focus, +.uk-button-success:hover, +.uk-button-success:focus, +.uk-button-danger:hover, +.uk-button-danger:focus { + border-color: rgba(0, 0, 0, 0.21); +} +/* Sub-object `uk-button-group` + ========================================================================== */ +/* + * Reset border-radius + */ +.uk-button-group > .uk-button:not(:first-child):not(:last-child), +.uk-button-group > div:not(:first-child):not(:last-child) .uk-button { + border-left-color: rgba(0, 0, 0, 0.1); + border-right-color: rgba(0, 0, 0, 0.1); + border-radius: 0; +} +.uk-button-group > .uk-button:first-child, +.uk-button-group > div:first-child .uk-button { + border-right-color: rgba(0, 0, 0, 0.1); + border-top-right-radius: 0; + border-bottom-right-radius: 0; +} +.uk-button-group > .uk-button:last-child, +.uk-button-group > div:last-child .uk-button { + border-left-color: rgba(0, 0, 0, 0.1); + border-top-left-radius: 0; + border-bottom-left-radius: 0; +} +/* + * Collapse border + */ +.uk-button-group > .uk-button:nth-child(n+2), +.uk-button-group > div:nth-child(n+2) .uk-button { + margin-left: -1px; +} +/* + * Create position context to superimpose the successor elements border + * Known issue: If you use an `a` element as button and an icon inside, + * the active state will not work if you click the icon inside the button + * Workaround: Just use a `button` or `input` element as button + */ +.uk-button-group .uk-button:hover, +.uk-button-group .uk-button:active { + position: relative; +} +/* ======================================================================== + Component: Icon + ========================================================================== */ +@font-face { + font-family: 'FontAwesome'; + src: url("../fonts/fontawesome-webfont.woff") format("woff"); + font-weight: normal; + font-style: normal; +} +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Light'), local('OpenSans-Light'), url("../fonts/OpenSans-Light.woff") format('woff'); +} +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 400; + src: local('Open Sans'), local('OpenSans'), url("../fonts/OpenSans.woff") format('woff'); +} +@font-face { + font-family: 'Open Sans'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Bold'), local('OpenSans-Bold'), url("../fonts/OpenSans-Bold.woff") format('woff'); +} +@font-face { + font-family: 'Open Sans Condensed'; + font-style: normal; + font-weight: 300; + src: local('Open Sans Cond Light'), local('OpenSans-CondensedLight'), url("../fonts/OpenSans-CondensedLight.woff") format('woff'); +} +@font-face { + font-family: 'Open Sans Condensed'; + font-style: normal; + font-weight: 700; + src: local('Open Sans Condensed Bold'), local('OpenSans-CondensedBold'), url("../fonts/OpenSans-CondensedBold.woff") format('woff'); +} + +/* + * 1. Allow margin + * 2. Prevent inherit font style + * 4. Correct line-height + * 5. Better font rendering + */ +[class*='uk-icon-'] { + font-family: FontAwesome; + /* 1 */ + display: inline-block; + /* 2 */ + font-weight: normal; + font-style: normal; + /* 4 */ + line-height: 1; + /* 5 */ + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; +} +/* Size modifiers + ========================================================================== */ +.uk-icon-small:before { + font-size: 150%; + vertical-align: -10%; +} +.uk-icon-medium:before { + font-size: 200%; + vertical-align: -16%; +} +.uk-icon-large:before { + font-size: 250%; + vertical-align: -22%; +} +/* Modifier: `uk-icon-spin` + ========================================================================== */ +.uk-icon-spin { + display: inline-block; + -webkit-animation: uk-rotate 2s infinite linear; + animation: uk-rotate 2s infinite linear; +} +/* Modifier: `uk-icon-button` + ========================================================================== */ +.uk-icon-button { + -moz-box-sizing: border-box; + box-sizing: border-box; + display: inline-block; + width: 35px; + height: 35px; + border-radius: 100%; + background: #f5f5f5; + line-height: 35px; + color: #444444; + font-size: 18px; + text-align: center; + border: 1px solid #e7e7e7; + text-shadow: 0 1px 0 #ffffff; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + */ +.uk-icon-button:hover, +.uk-icon-button:focus { + background-color: #fafafa; + color: #444444; + text-decoration: none; + /* 2 */ + outline: none; + border-color: #d3d3d3; +} +/* Active */ +.uk-icon-button:active { + background-color: #eeeeee; + color: #444444; +} +/* Icon mapping + ========================================================================== */ +.uk-icon-glass:before { + content: "\f000"; +} +.uk-icon-music:before { + content: "\f001"; +} +.uk-icon-search:before { + content: "\f002"; +} +.uk-icon-envelope-o:before { + content: "\f003"; +} +.uk-icon-heart:before { + content: "\f004"; +} +.uk-icon-star:before { + content: "\f005"; +} +.uk-icon-star-o:before { + content: "\f006"; +} +.uk-icon-user:before { + content: "\f007"; +} +.uk-icon-film:before { + content: "\f008"; +} +.uk-icon-th-large:before { + content: "\f009"; +} +.uk-icon-th:before { + content: "\f00a"; +} +.uk-icon-th-list:before { + content: "\f00b"; +} +.uk-icon-check:before { + content: "\f00c"; +} +.uk-icon-remove:before, +.uk-icon-close:before, +.uk-icon-times:before { + content: "\f00d"; +} +.uk-icon-search-plus:before { + content: "\f00e"; +} +.uk-icon-search-minus:before { + content: "\f010"; +} +.uk-icon-power-off:before { + content: "\f011"; +} +.uk-icon-signal:before { + content: "\f012"; +} +.uk-icon-gear:before, +.uk-icon-cog:before { + content: "\f013"; +} +.uk-icon-trash-o:before { + content: "\f014"; +} +.uk-icon-home:before { + content: "\f015"; +} +.uk-icon-file-o:before { + content: "\f016"; +} +.uk-icon-clock-o:before { + content: "\f017"; +} +.uk-icon-road:before { + content: "\f018"; +} +.uk-icon-download:before { + content: "\f019"; +} +.uk-icon-arrow-circle-o-down:before { + content: "\f01a"; +} +.uk-icon-arrow-circle-o-up:before { + content: "\f01b"; +} +.uk-icon-inbox:before { + content: "\f01c"; +} +.uk-icon-play-circle-o:before { + content: "\f01d"; +} +.uk-icon-rotate-right:before, +.uk-icon-repeat:before { + content: "\f01e"; +} +.uk-icon-refresh:before { + content: "\f021"; +} +.uk-icon-list-alt:before { + content: "\f022"; +} +.uk-icon-lock:before { + content: "\f023"; +} +.uk-icon-flag:before { + content: "\f024"; +} +.uk-icon-headphones:before { + content: "\f025"; +} +.uk-icon-volume-off:before { + content: "\f026"; +} +.uk-icon-volume-down:before { + content: "\f027"; +} +.uk-icon-volume-up:before { + content: "\f028"; +} +.uk-icon-qrcode:before { + content: "\f029"; +} +.uk-icon-barcode:before { + content: "\f02a"; +} +.uk-icon-tag:before { + content: "\f02b"; +} +.uk-icon-tags:before { + content: "\f02c"; +} +.uk-icon-book:before { + content: "\f02d"; +} +.uk-icon-bookmark:before { + content: "\f02e"; +} +.uk-icon-print:before { + content: "\f02f"; +} +.uk-icon-camera:before { + content: "\f030"; +} +.uk-icon-font:before { + content: "\f031"; +} +.uk-icon-bold:before { + content: "\f032"; +} +.uk-icon-italic:before { + content: "\f033"; +} +.uk-icon-text-height:before { + content: "\f034"; +} +.uk-icon-text-width:before { + content: "\f035"; +} +.uk-icon-align-left:before { + content: "\f036"; +} +.uk-icon-align-center:before { + content: "\f037"; +} +.uk-icon-align-right:before { + content: "\f038"; +} +.uk-icon-align-justify:before { + content: "\f039"; +} +.uk-icon-list:before { + content: "\f03a"; +} +.uk-icon-dedent:before, +.uk-icon-outdent:before { + content: "\f03b"; +} +.uk-icon-indent:before { + content: "\f03c"; +} +.uk-icon-video-camera:before { + content: "\f03d"; +} +.uk-icon-photo:before, +.uk-icon-image:before, +.uk-icon-picture-o:before { + content: "\f03e"; +} +.uk-icon-pencil:before { + content: "\f040"; +} +.uk-icon-map-marker:before { + content: "\f041"; +} +.uk-icon-adjust:before { + content: "\f042"; +} +.uk-icon-tint:before { + content: "\f043"; +} +.uk-icon-edit:before, +.uk-icon-pencil-square-o:before { + content: "\f044"; +} +.uk-icon-share-square-o:before { + content: "\f045"; +} +.uk-icon-check-square-o:before { + content: "\f046"; +} +.uk-icon-arrows:before { + content: "\f047"; +} +.uk-icon-step-backward:before { + content: "\f048"; +} +.uk-icon-fast-backward:before { + content: "\f049"; +} +.uk-icon-backward:before { + content: "\f04a"; +} +.uk-icon-play:before { + content: "\f04b"; +} +.uk-icon-pause:before { + content: "\f04c"; +} +.uk-icon-stop:before { + content: "\f04d"; +} +.uk-icon-forward:before { + content: "\f04e"; +} +.uk-icon-fast-forward:before { + content: "\f050"; +} +.uk-icon-step-forward:before { + content: "\f051"; +} +.uk-icon-eject:before { + content: "\f052"; +} +.uk-icon-chevron-left:before { + content: "\f053"; +} +.uk-icon-chevron-right:before { + content: "\f054"; +} +.uk-icon-plus-circle:before { + content: "\f055"; +} +.uk-icon-minus-circle:before { + content: "\f056"; +} +.uk-icon-times-circle:before { + content: "\f057"; +} +.uk-icon-check-circle:before { + content: "\f058"; +} +.uk-icon-question-circle:before { + content: "\f059"; +} +.uk-icon-info-circle:before { + content: "\f05a"; +} +.uk-icon-crosshairs:before { + content: "\f05b"; +} +.uk-icon-times-circle-o:before { + content: "\f05c"; +} +.uk-icon-check-circle-o:before { + content: "\f05d"; +} +.uk-icon-ban:before { + content: "\f05e"; +} +.uk-icon-arrow-left:before { + content: "\f060"; +} +.uk-icon-arrow-right:before { + content: "\f061"; +} +.uk-icon-arrow-up:before { + content: "\f062"; +} +.uk-icon-arrow-down:before { + content: "\f063"; +} +.uk-icon-mail-forward:before, +.uk-icon-share:before { + content: "\f064"; +} +.uk-icon-expand:before { + content: "\f065"; +} +.uk-icon-compress:before { + content: "\f066"; +} +.uk-icon-plus:before { + content: "\f067"; +} +.uk-icon-minus:before { + content: "\f068"; +} +.uk-icon-asterisk:before { + content: "\f069"; +} +.uk-icon-exclamation-circle:before { + content: "\f06a"; +} +.uk-icon-gift:before { + content: "\f06b"; +} +.uk-icon-leaf:before { + content: "\f06c"; +} +.uk-icon-fire:before { + content: "\f06d"; +} +.uk-icon-eye:before { + content: "\f06e"; +} +.uk-icon-eye-slash:before { + content: "\f070"; +} +.uk-icon-warning:before, +.uk-icon-exclamation-triangle:before { + content: "\f071"; +} +.uk-icon-plane:before { + content: "\f072"; +} +.uk-icon-calendar:before { + content: "\f073"; +} +.uk-icon-random:before { + content: "\f074"; +} +.uk-icon-comment:before { + content: "\f075"; +} +.uk-icon-magnet:before { + content: "\f076"; +} +.uk-icon-chevron-up:before { + content: "\f077"; +} +.uk-icon-chevron-down:before { + content: "\f078"; +} +.uk-icon-retweet:before { + content: "\f079"; +} +.uk-icon-shopping-cart:before { + content: "\f07a"; +} +.uk-icon-folder:before { + content: "\f07b"; +} +.uk-icon-folder-open:before { + content: "\f07c"; +} +.uk-icon-arrows-v:before { + content: "\f07d"; +} +.uk-icon-arrows-h:before { + content: "\f07e"; +} +.uk-icon-bar-chart-o:before, +.uk-icon-bar-chart:before { + content: "\f080"; +} +.uk-icon-twitter-square:before { + content: "\f081"; +} +.uk-icon-facebook-square:before { + content: "\f082"; +} +.uk-icon-camera-retro:before { + content: "\f083"; +} +.uk-icon-key:before { + content: "\f084"; +} +.uk-icon-gears:before, +.uk-icon-cogs:before { + content: "\f085"; +} +.uk-icon-comments:before { + content: "\f086"; +} +.uk-icon-thumbs-o-up:before { + content: "\f087"; +} +.uk-icon-thumbs-o-down:before { + content: "\f088"; +} +.uk-icon-star-half:before { + content: "\f089"; +} +.uk-icon-heart-o:before { + content: "\f08a"; +} +.uk-icon-sign-out:before { + content: "\f08b"; +} +.uk-icon-linkedin-square:before { + content: "\f08c"; +} +.uk-icon-thumb-tack:before { + content: "\f08d"; +} +.uk-icon-external-link:before { + content: "\f08e"; +} +.uk-icon-sign-in:before { + content: "\f090"; +} +.uk-icon-trophy:before { + content: "\f091"; +} +.uk-icon-github-square:before { + content: "\f092"; +} +.uk-icon-upload:before { + content: "\f093"; +} +.uk-icon-lemon-o:before { + content: "\f094"; +} +.uk-icon-phone:before { + content: "\f095"; +} +.uk-icon-square-o:before { + content: "\f096"; +} +.uk-icon-bookmark-o:before { + content: "\f097"; +} +.uk-icon-phone-square:before { + content: "\f098"; +} +.uk-icon-twitter:before { + content: "\f099"; +} +.uk-icon-facebook:before { + content: "\f09a"; +} +.uk-icon-github:before { + content: "\f09b"; +} +.uk-icon-unlock:before { + content: "\f09c"; +} +.uk-icon-credit-card:before { + content: "\f09d"; +} +.uk-icon-rss:before { + content: "\f09e"; +} +.uk-icon-hdd-o:before { + content: "\f0a0"; +} +.uk-icon-bullhorn:before { + content: "\f0a1"; +} +.uk-icon-bell:before { + content: "\f0f3"; +} +.uk-icon-certificate:before { + content: "\f0a3"; +} +.uk-icon-hand-o-right:before { + content: "\f0a4"; +} +.uk-icon-hand-o-left:before { + content: "\f0a5"; +} +.uk-icon-hand-o-up:before { + content: "\f0a6"; +} +.uk-icon-hand-o-down:before { + content: "\f0a7"; +} +.uk-icon-arrow-circle-left:before { + content: "\f0a8"; +} +.uk-icon-arrow-circle-right:before { + content: "\f0a9"; +} +.uk-icon-arrow-circle-up:before { + content: "\f0aa"; +} +.uk-icon-arrow-circle-down:before { + content: "\f0ab"; +} +.uk-icon-globe:before { + content: "\f0ac"; +} +.uk-icon-wrench:before { + content: "\f0ad"; +} +.uk-icon-tasks:before { + content: "\f0ae"; +} +.uk-icon-filter:before { + content: "\f0b0"; +} +.uk-icon-briefcase:before { + content: "\f0b1"; +} +.uk-icon-arrows-alt:before { + content: "\f0b2"; +} +.uk-icon-group:before, +.uk-icon-users:before { + content: "\f0c0"; +} +.uk-icon-chain:before, +.uk-icon-link:before { + content: "\f0c1"; +} +.uk-icon-cloud:before { + content: "\f0c2"; +} +.uk-icon-flask:before { + content: "\f0c3"; +} +.uk-icon-cut:before, +.uk-icon-scissors:before { + content: "\f0c4"; +} +.uk-icon-copy:before, +.uk-icon-files-o:before { + content: "\f0c5"; +} +.uk-icon-paperclip:before { + content: "\f0c6"; +} +.uk-icon-save:before, +.uk-icon-floppy-o:before { + content: "\f0c7"; +} +.uk-icon-square:before { + content: "\f0c8"; +} +.uk-icon-navicon:before, +.uk-icon-reorder:before, +.uk-icon-bars:before { + content: "\f0c9"; +} +.uk-icon-list-ul:before { + content: "\f0ca"; +} +.uk-icon-list-ol:before { + content: "\f0cb"; +} +.uk-icon-strikethrough:before { + content: "\f0cc"; +} +.uk-icon-underline:before { + content: "\f0cd"; +} +.uk-icon-table:before { + content: "\f0ce"; +} +.uk-icon-magic:before { + content: "\f0d0"; +} +.uk-icon-truck:before { + content: "\f0d1"; +} +.uk-icon-pinterest:before { + content: "\f0d2"; +} +.uk-icon-pinterest-square:before { + content: "\f0d3"; +} +.uk-icon-google-plus-square:before { + content: "\f0d4"; +} +.uk-icon-google-plus:before { + content: "\f0d5"; +} +.uk-icon-money:before { + content: "\f0d6"; +} +.uk-icon-caret-down:before { + content: "\f0d7"; +} +.uk-icon-caret-up:before { + content: "\f0d8"; +} +.uk-icon-caret-left:before { + content: "\f0d9"; +} +.uk-icon-caret-right:before { + content: "\f0da"; +} +.uk-icon-columns:before { + content: "\f0db"; +} +.uk-icon-unsorted:before, +.uk-icon-sort:before { + content: "\f0dc"; +} +.uk-icon-sort-down:before, +.uk-icon-sort-desc:before { + content: "\f0dd"; +} +.uk-icon-sort-up:before, +.uk-icon-sort-asc:before { + content: "\f0de"; +} +.uk-icon-envelope:before { + content: "\f0e0"; +} +.uk-icon-linkedin:before { + content: "\f0e1"; +} +.uk-icon-rotate-left:before, +.uk-icon-undo:before { + content: "\f0e2"; +} +.uk-icon-legal:before, +.uk-icon-gavel:before { + content: "\f0e3"; +} +.uk-icon-dashboard:before, +.uk-icon-tachometer:before { + content: "\f0e4"; +} +.uk-icon-comment-o:before { + content: "\f0e5"; +} +.uk-icon-comments-o:before { + content: "\f0e6"; +} +.uk-icon-flash:before, +.uk-icon-bolt:before { + content: "\f0e7"; +} +.uk-icon-sitemap:before { + content: "\f0e8"; +} +.uk-icon-umbrella:before { + content: "\f0e9"; +} +.uk-icon-paste:before, +.uk-icon-clipboard:before { + content: "\f0ea"; +} +.uk-icon-lightbulb-o:before { + content: "\f0eb"; +} +.uk-icon-exchange:before { + content: "\f0ec"; +} +.uk-icon-cloud-download:before { + content: "\f0ed"; +} +.uk-icon-cloud-upload:before { + content: "\f0ee"; +} +.uk-icon-user-md:before { + content: "\f0f0"; +} +.uk-icon-stethoscope:before { + content: "\f0f1"; +} +.uk-icon-suitcase:before { + content: "\f0f2"; +} +.uk-icon-bell-o:before { + content: "\f0a2"; +} +.uk-icon-coffee:before { + content: "\f0f4"; +} +.uk-icon-cutlery:before { + content: "\f0f5"; +} +.uk-icon-file-text-o:before { + content: "\f0f6"; +} +.uk-icon-building-o:before { + content: "\f0f7"; +} +.uk-icon-hospital-o:before { + content: "\f0f8"; +} +.uk-icon-ambulance:before { + content: "\f0f9"; +} +.uk-icon-medkit:before { + content: "\f0fa"; +} +.uk-icon-fighter-jet:before { + content: "\f0fb"; +} +.uk-icon-beer:before { + content: "\f0fc"; +} +.uk-icon-h-square:before { + content: "\f0fd"; +} +.uk-icon-plus-square:before { + content: "\f0fe"; +} +.uk-icon-angle-double-left:before { + content: "\f100"; +} +.uk-icon-angle-double-right:before { + content: "\f101"; +} +.uk-icon-angle-double-up:before { + content: "\f102"; +} +.uk-icon-angle-double-down:before { + content: "\f103"; +} +.uk-icon-angle-left:before { + content: "\f104"; +} +.uk-icon-angle-right:before { + content: "\f105"; +} +.uk-icon-angle-up:before { + content: "\f106"; +} +.uk-icon-angle-down:before { + content: "\f107"; +} +.uk-icon-desktop:before { + content: "\f108"; +} +.uk-icon-laptop:before { + content: "\f109"; +} +.uk-icon-tablet:before { + content: "\f10a"; +} +.uk-icon-mobile-phone:before, +.uk-icon-mobile:before { + content: "\f10b"; +} +.uk-icon-circle-o:before { + content: "\f10c"; +} +.uk-icon-quote-left:before { + content: "\f10d"; +} +.uk-icon-quote-right:before { + content: "\f10e"; +} +.uk-icon-spinner:before { + content: "\f110"; +} +.uk-icon-circle:before { + content: "\f111"; +} +.uk-icon-mail-reply:before, +.uk-icon-reply:before { + content: "\f112"; +} +.uk-icon-github-alt:before { + content: "\f113"; +} +.uk-icon-folder-o:before { + content: "\f114"; +} +.uk-icon-folder-open-o:before { + content: "\f115"; +} +.uk-icon-smile-o:before { + content: "\f118"; +} +.uk-icon-frown-o:before { + content: "\f119"; +} +.uk-icon-meh-o:before { + content: "\f11a"; +} +.uk-icon-gamepad:before { + content: "\f11b"; +} +.uk-icon-keyboard-o:before { + content: "\f11c"; +} +.uk-icon-flag-o:before { + content: "\f11d"; +} +.uk-icon-flag-checkered:before { + content: "\f11e"; +} +.uk-icon-terminal:before { + content: "\f120"; +} +.uk-icon-code:before { + content: "\f121"; +} +.uk-icon-mail-reply-all:before, +.uk-icon-reply-all:before { + content: "\f122"; +} +.uk-icon-star-half-empty:before, +.uk-icon-star-half-full:before, +.uk-icon-star-half-o:before { + content: "\f123"; +} +.uk-icon-location-arrow:before { + content: "\f124"; +} +.uk-icon-crop:before { + content: "\f125"; +} +.uk-icon-code-fork:before { + content: "\f126"; +} +.uk-icon-unlink:before, +.uk-icon-chain-broken:before { + content: "\f127"; +} +.uk-icon-question:before { + content: "\f128"; +} +.uk-icon-info:before { + content: "\f129"; +} +.uk-icon-exclamation:before { + content: "\f12a"; +} +.uk-icon-superscript:before { + content: "\f12b"; +} +.uk-icon-subscript:before { + content: "\f12c"; +} +.uk-icon-eraser:before { + content: "\f12d"; +} +.uk-icon-puzzle-piece:before { + content: "\f12e"; +} +.uk-icon-microphone:before { + content: "\f130"; +} +.uk-icon-microphone-slash:before { + content: "\f131"; +} +.uk-icon-shield:before { + content: "\f132"; +} +.uk-icon-calendar-o:before { + content: "\f133"; +} +.uk-icon-fire-extinguisher:before { + content: "\f134"; +} +.uk-icon-rocket:before { + content: "\f135"; +} +.uk-icon-maxcdn:before { + content: "\f136"; +} +.uk-icon-chevron-circle-left:before { + content: "\f137"; +} +.uk-icon-chevron-circle-right:before { + content: "\f138"; +} +.uk-icon-chevron-circle-up:before { + content: "\f139"; +} +.uk-icon-chevron-circle-down:before { + content: "\f13a"; +} +.uk-icon-html5:before { + content: "\f13b"; +} +.uk-icon-css3:before { + content: "\f13c"; +} +.uk-icon-anchor:before { + content: "\f13d"; +} +.uk-icon-unlock-alt:before { + content: "\f13e"; +} +.uk-icon-bullseye:before { + content: "\f140"; +} +.uk-icon-ellipsis-h:before { + content: "\f141"; +} +.uk-icon-ellipsis-v:before { + content: "\f142"; +} +.uk-icon-rss-square:before { + content: "\f143"; +} +.uk-icon-play-circle:before { + content: "\f144"; +} +.uk-icon-ticket:before { + content: "\f145"; +} +.uk-icon-minus-square:before { + content: "\f146"; +} +.uk-icon-minus-square-o:before { + content: "\f147"; +} +.uk-icon-level-up:before { + content: "\f148"; +} +.uk-icon-level-down:before { + content: "\f149"; +} +.uk-icon-check-square:before { + content: "\f14a"; +} +.uk-icon-pencil-square:before { + content: "\f14b"; +} +.uk-icon-external-link-square:before { + content: "\f14c"; +} +.uk-icon-share-square:before { + content: "\f14d"; +} +.uk-icon-compass:before { + content: "\f14e"; +} +.uk-icon-toggle-down:before, +.uk-icon-caret-square-o-down:before { + content: "\f150"; +} +.uk-icon-toggle-up:before, +.uk-icon-caret-square-o-up:before { + content: "\f151"; +} +.uk-icon-toggle-right:before, +.uk-icon-caret-square-o-right:before { + content: "\f152"; +} +.uk-icon-euro:before, +.uk-icon-eur:before { + content: "\f153"; +} +.uk-icon-gbp:before { + content: "\f154"; +} +.uk-icon-dollar:before, +.uk-icon-usd:before { + content: "\f155"; +} +.uk-icon-rupee:before, +.uk-icon-inr:before { + content: "\f156"; +} +.uk-icon-cny:before, +.uk-icon-rmb:before, +.uk-icon-yen:before, +.uk-icon-jpy:before { + content: "\f157"; +} +.uk-icon-ruble:before, +.uk-icon-rouble:before, +.uk-icon-rub:before { + content: "\f158"; +} +.uk-icon-won:before, +.uk-icon-krw:before { + content: "\f159"; +} +.uk-icon-bitcoin:before, +.uk-icon-btc:before { + content: "\f15a"; +} +.uk-icon-file:before { + content: "\f15b"; +} +.uk-icon-file-text:before { + content: "\f15c"; +} +.uk-icon-sort-alpha-asc:before { + content: "\f15d"; +} +.uk-icon-sort-alpha-desc:before { + content: "\f15e"; +} +.uk-icon-sort-amount-asc:before { + content: "\f160"; +} +.uk-icon-sort-amount-desc:before { + content: "\f161"; +} +.uk-icon-sort-numeric-asc:before { + content: "\f162"; +} +.uk-icon-sort-numeric-desc:before { + content: "\f163"; +} +.uk-icon-thumbs-up:before { + content: "\f164"; +} +.uk-icon-thumbs-down:before { + content: "\f165"; +} +.uk-icon-youtube-square:before { + content: "\f166"; +} +.uk-icon-youtube:before { + content: "\f167"; +} +.uk-icon-xing:before { + content: "\f168"; +} +.uk-icon-xing-square:before { + content: "\f169"; +} +.uk-icon-youtube-play:before { + content: "\f16a"; +} +.uk-icon-dropbox:before { + content: "\f16b"; +} +.uk-icon-stack-overflow:before { + content: "\f16c"; +} +.uk-icon-instagram:before { + content: "\f16d"; +} +.uk-icon-flickr:before { + content: "\f16e"; +} +.uk-icon-adn:before { + content: "\f170"; +} +.uk-icon-bitbucket:before { + content: "\f171"; +} +.uk-icon-bitbucket-square:before { + content: "\f172"; +} +.uk-icon-tumblr:before { + content: "\f173"; +} +.uk-icon-tumblr-square:before { + content: "\f174"; +} +.uk-icon-long-arrow-down:before { + content: "\f175"; +} +.uk-icon-long-arrow-up:before { + content: "\f176"; +} +.uk-icon-long-arrow-left:before { + content: "\f177"; +} +.uk-icon-long-arrow-right:before { + content: "\f178"; +} +.uk-icon-apple:before { + content: "\f179"; +} +.uk-icon-windows:before { + content: "\f17a"; +} +.uk-icon-android:before { + content: "\f17b"; +} +.uk-icon-linux:before { + content: "\f17c"; +} +.uk-icon-dribbble:before { + content: "\f17d"; +} +.uk-icon-skype:before { + content: "\f17e"; +} +.uk-icon-foursquare:before { + content: "\f180"; +} +.uk-icon-trello:before { + content: "\f181"; +} +.uk-icon-female:before { + content: "\f182"; +} +.uk-icon-male:before { + content: "\f183"; +} +.uk-icon-gittip:before { + content: "\f184"; +} +.uk-icon-sun-o:before { + content: "\f185"; +} +.uk-icon-moon-o:before { + content: "\f186"; +} +.uk-icon-archive:before { + content: "\f187"; +} +.uk-icon-bug:before { + content: "\f188"; +} +.uk-icon-vk:before { + content: "\f189"; +} +.uk-icon-weibo:before { + content: "\f18a"; +} +.uk-icon-renren:before { + content: "\f18b"; +} +.uk-icon-pagelines:before { + content: "\f18c"; +} +.uk-icon-stack-exchange:before { + content: "\f18d"; +} +.uk-icon-arrow-circle-o-right:before { + content: "\f18e"; +} +.uk-icon-arrow-circle-o-left:before { + content: "\f190"; +} +.uk-icon-toggle-left:before, +.uk-icon-caret-square-o-left:before { + content: "\f191"; +} +.uk-icon-dot-circle-o:before { + content: "\f192"; +} +.uk-icon-wheelchair:before { + content: "\f193"; +} +.uk-icon-vimeo-square:before { + content: "\f194"; +} +.uk-icon-turkish-lira:before, +.uk-icon-try:before { + content: "\f195"; +} +.uk-icon-plus-square-o:before { + content: "\f196"; +} +.uk-icon-space-shuttle:before { + content: "\f197"; +} +.uk-icon-slack:before { + content: "\f198"; +} +.uk-icon-envelope-square:before { + content: "\f199"; +} +.uk-icon-wordpress:before { + content: "\f19a"; +} +.uk-icon-openid:before { + content: "\f19b"; +} +.uk-icon-institution:before, +.uk-icon-bank:before, +.uk-icon-university:before { + content: "\f19c"; +} +.uk-icon-mortar-board:before, +.uk-icon-graduation-cap:before { + content: "\f19d"; +} +.uk-icon-yahoo:before { + content: "\f19e"; +} +.uk-icon-google:before { + content: "\f1a0"; +} +.uk-icon-reddit:before { + content: "\f1a1"; +} +.uk-icon-reddit-square:before { + content: "\f1a2"; +} +.uk-icon-stumbleupon-circle:before { + content: "\f1a3"; +} +.uk-icon-stumbleupon:before { + content: "\f1a4"; +} +.uk-icon-delicious:before { + content: "\f1a5"; +} +.uk-icon-digg:before { + content: "\f1a6"; +} +.uk-icon-pied-piper:before { + content: "\f1a7"; +} +.uk-icon-pied-piper-alt:before { + content: "\f1a8"; +} +.uk-icon-drupal:before { + content: "\f1a9"; +} +.uk-icon-joomla:before { + content: "\f1aa"; +} +.uk-icon-language:before { + content: "\f1ab"; +} +.uk-icon-fax:before { + content: "\f1ac"; +} +.uk-icon-building:before { + content: "\f1ad"; +} +.uk-icon-child:before { + content: "\f1ae"; +} +.uk-icon-paw:before { + content: "\f1b0"; +} +.uk-icon-spoon:before { + content: "\f1b1"; +} +.uk-icon-cube:before { + content: "\f1b2"; +} +.uk-icon-cubes:before { + content: "\f1b3"; +} +.uk-icon-behance:before { + content: "\f1b4"; +} +.uk-icon-behance-square:before { + content: "\f1b5"; +} +.uk-icon-steam:before { + content: "\f1b6"; +} +.uk-icon-steam-square:before { + content: "\f1b7"; +} +.uk-icon-recycle:before { + content: "\f1b8"; +} +.uk-icon-automobile:before, +.uk-icon-car:before { + content: "\f1b9"; +} +.uk-icon-cab:before, +.uk-icon-taxi:before { + content: "\f1ba"; +} +.uk-icon-tree:before { + content: "\f1bb"; +} +.uk-icon-spotify:before { + content: "\f1bc"; +} +.uk-icon-deviantart:before { + content: "\f1bd"; +} +.uk-icon-soundcloud:before { + content: "\f1be"; +} +.uk-icon-database:before { + content: "\f1c0"; +} +.uk-icon-file-pdf-o:before { + content: "\f1c1"; +} +.uk-icon-file-word-o:before { + content: "\f1c2"; +} +.uk-icon-file-excel-o:before { + content: "\f1c3"; +} +.uk-icon-file-powerpoint-o:before { + content: "\f1c4"; +} +.uk-icon-file-photo-o:before, +.uk-icon-file-picture-o:before, +.uk-icon-file-image-o:before { + content: "\f1c5"; +} +.uk-icon-file-zip-o:before, +.uk-icon-file-archive-o:before { + content: "\f1c6"; +} +.uk-icon-file-sound-o:before, +.uk-icon-file-audio-o:before { + content: "\f1c7"; +} +.uk-icon-file-movie-o:before, +.uk-icon-file-video-o:before { + content: "\f1c8"; +} +.uk-icon-file-code-o:before { + content: "\f1c9"; +} +.uk-icon-vine:before { + content: "\f1ca"; +} +.uk-icon-codepen:before { + content: "\f1cb"; +} +.uk-icon-jsfiddle:before { + content: "\f1cc"; +} +.uk-icon-life-bouy:before, +.uk-icon-life-buoy:before, +.uk-icon-life-saver:before, +.uk-icon-support:before, +.uk-icon-life-ring:before { + content: "\f1cd"; +} +.uk-icon-circle-o-notch:before { + content: "\f1ce"; +} +.uk-icon-ra:before, +.uk-icon-rebel:before { + content: "\f1d0"; +} +.uk-icon-ge:before, +.uk-icon-empire:before { + content: "\f1d1"; +} +.uk-icon-git-square:before { + content: "\f1d2"; +} +.uk-icon-git:before { + content: "\f1d3"; +} +.uk-icon-hacker-news:before { + content: "\f1d4"; +} +.uk-icon-tencent-weibo:before { + content: "\f1d5"; +} +.uk-icon-qq:before { + content: "\f1d6"; +} +.uk-icon-wechat:before, +.uk-icon-weixin:before { + content: "\f1d7"; +} +.uk-icon-send:before, +.uk-icon-paper-plane:before { + content: "\f1d8"; +} +.uk-icon-send-o:before, +.uk-icon-paper-plane-o:before { + content: "\f1d9"; +} +.uk-icon-history:before { + content: "\f1da"; +} +.uk-icon-circle-thin:before { + content: "\f1db"; +} +.uk-icon-header:before { + content: "\f1dc"; +} +.uk-icon-paragraph:before { + content: "\f1dd"; +} +.uk-icon-sliders:before { + content: "\f1de"; +} +.uk-icon-share-alt:before { + content: "\f1e0"; +} +.uk-icon-share-alt-square:before { + content: "\f1e1"; +} +.uk-icon-bomb:before { + content: "\f1e2"; +} +.uk-icon-soccer-ball-o:before, +.uk-icon-futbol-o:before { + content: "\f1e3"; +} +.uk-icon-tty:before { + content: "\f1e4"; +} +.uk-icon-binoculars:before { + content: "\f1e5"; +} +.uk-icon-plug:before { + content: "\f1e6"; +} +.uk-icon-slideshare:before { + content: "\f1e7"; +} +.uk-icon-twitch:before { + content: "\f1e8"; +} +.uk-icon-yelp:before { + content: "\f1e9"; +} +.uk-icon-newspaper-o:before { + content: "\f1ea"; +} +.uk-icon-wifi:before { + content: "\f1eb"; +} +.uk-icon-calculator:before { + content: "\f1ec"; +} +.uk-icon-paypal:before { + content: "\f1ed"; +} +.uk-icon-google-wallet:before { + content: "\f1ee"; +} +.uk-icon-cc-visa:before { + content: "\f1f0"; +} +.uk-icon-cc-mastercard:before { + content: "\f1f1"; +} +.uk-icon-cc-discover:before { + content: "\f1f2"; +} +.uk-icon-cc-amex:before { + content: "\f1f3"; +} +.uk-icon-cc-paypal:before { + content: "\f1f4"; +} +.uk-icon-cc-stripe:before { + content: "\f1f5"; +} +.uk-icon-bell-slash:before { + content: "\f1f6"; +} +.uk-icon-bell-slash-o:before { + content: "\f1f7"; +} +.uk-icon-trash:before { + content: "\f1f8"; +} +.uk-icon-copyright:before { + content: "\f1f9"; +} +.uk-icon-at:before { + content: "\f1fa"; +} +.uk-icon-eyedropper:before { + content: "\f1fb"; +} +.uk-icon-paint-brush:before { + content: "\f1fc"; +} +.uk-icon-birthday-cake:before { + content: "\f1fd"; +} +.uk-icon-area-chart:before { + content: "\f1fe"; +} +.uk-icon-pie-chart:before { + content: "\f200"; +} +.uk-icon-line-chart:before { + content: "\f201"; +} +.uk-icon-lastfm:before { + content: "\f202"; +} +.uk-icon-lastfm-square:before { + content: "\f203"; +} +.uk-icon-toggle-off:before { + content: "\f204"; +} +.uk-icon-toggle-on:before { + content: "\f205"; +} +.uk-icon-bicycle:before { + content: "\f206"; +} +.uk-icon-bus:before { + content: "\f207"; +} +.uk-icon-ioxhost:before { + content: "\f208"; +} +.uk-icon-angellist:before { + content: "\f209"; +} +.uk-icon-cc:before { + content: "\f20a"; +} +.uk-icon-shekel:before, +.uk-icon-sheqel:before, +.uk-icon-ils:before { + content: "\f20b"; +} +.uk-icon-meanpath:before { + content: "\f20c"; +} +/* ======================================================================== + Component: Close + ========================================================================== */ +/* + * Removes inner padding and border in Firefox 4+. + */ +.uk-close::-moz-focus-inner { + border: 0; + padding: 0; +} +/* + * 1. Correct inability to style clickable `input` types in iOS. + * 2. Remove margins in Chrome, Safari and Opera. + * 3. Remove borders for `button`. + * 4. Address `overflow` set to `hidden` in IE 8/9/10/11. + * 5. Correct `font` properties and `color` not being inherited for `button`. + * 6. Address inconsistent `text-transform` inheritance which is only inherit in Firefox and IE + * 7. Remove default `button` padding and background color + * 8. Style + */ +.uk-close { + /* 1 */ + -webkit-appearance: none; + /* 2 */ + margin: 0; + /* 3 */ + border: none; + /* 4 */ + overflow: visible; + /* 5 */ + font: inherit; + color: inherit; + /* 6 */ + text-transform: none; + /* 7. */ + padding: 0; + background: transparent; + /* 8 */ + display: inline-block; + -moz-box-sizing: content-box; + box-sizing: content-box; + width: 20px; + line-height: 20px; + text-align: center; + vertical-align: middle; + opacity: 0.3; +} +/* Icon */ +.uk-close:after { + display: block; + content: "\f00d"; + font-family: FontAwesome; +} +/* + * Hover + * 1. Apply hover style also to focus state + * 2. Remove default focus style + * 3. Required for `a` elements + */ +.uk-close:hover, +.uk-close:focus { + opacity: 0.5; + /* 2 */ + outline: none; + /* 3 */ + color: inherit; + text-decoration: none; + cursor: pointer; +} +/* Modifier + ========================================================================== */ +.uk-close-alt { + padding: 2px; + border-radius: 50%; + background: #ffffff; + opacity: 1; + box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.1), 0 0 6px rgba(0, 0, 0, 0.3); +} +/* Hover */ +.uk-close-alt:hover, +.uk-close-alt:focus { + opacity: 1; +} +/* Icon */ +.uk-close-alt:after { + opacity: 0.5; +} +.uk-close-alt:hover:after, +.uk-close-alt:focus:after { + opacity: 0.8; +} +/* ======================================================================== + Component: Badge + ========================================================================== */ +.uk-badge { + display: inline-block; + padding: 0 5px; + background: #00a8e6; + font-size: 10px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + text-align: center; + vertical-align: middle; + text-transform: none; + border: 1px solid rgba(0, 0, 0, 0.06); + border-radius: 2px; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.1); +} +/* + * Keep color when badge is a link + */ +a.uk-badge:hover { + color: #ffffff; +} +/* Modifier: `uk-badge-notification`; + ========================================================================== */ +.uk-badge-notification { + -moz-box-sizing: border-box; + box-sizing: border-box; + min-width: 18px; + border-radius: 500px; + font-size: 12px; + line-height: 18px; +} +/* Color modifier + ========================================================================== */ +/* + * Modifier: `uk-badge-success` + */ +.uk-badge-success { + background-color: #8cc14c; +} +/* + * Modifier: `uk-badge-warning` + */ +.uk-badge-warning { + background-color: #faa732; +} +/* + * Modifier: `uk-badge-danger` + */ +.uk-badge-danger { + background-color: #da314b; +} +/* ======================================================================== + Component: Alert + ========================================================================== */ +.uk-alert { + margin-bottom: 15px; + padding: 10px; + background: #ebf7fd; + color: #2d7091; + border: 1px solid rgba(45, 112, 145, 0.3); + border-radius: 4px; + text-shadow: 0 1px 0 #ffffff; +} +/* + * Add margin if adjacent element + */ +* + .uk-alert { + margin-top: 15px; +} +/* + * Remove margin from the last-child + */ +.uk-alert > :last-child { + margin-bottom: 0; +} +/* + * Keep color for headings if the default heading color is changed + */ +.uk-alert h1, +.uk-alert h2, +.uk-alert h3, +.uk-alert h4, +.uk-alert h5, +.uk-alert h6 { + color: inherit; +} +/* Close in alert + ========================================================================== */ +.uk-alert > .uk-close:first-child { + float: right; +} +/* + * Remove margin from adjacent element + */ +.uk-alert > .uk-close:first-child + * { + margin-top: 0; +} +/* Modifier: `uk-alert-success` + ========================================================================== */ +.uk-alert-success { + background: #f2fae3; + color: #659f13; + border-color: rgba(101, 159, 19, 0.3); +} +/* Modifier: `uk-alert-warning` + ========================================================================== */ +.uk-alert-warning { + background: #fffceb; + color: #e28327; + border-color: rgba(226, 131, 39, 0.3); +} +/* Modifier: `uk-alert-danger` + ========================================================================== */ +.uk-alert-danger { + background: #fff1f0; + color: #d85030; + border-color: rgba(216, 80, 48, 0.3); +} +/* Modifier: `uk-alert-large` + ========================================================================== */ +.uk-alert-large { + padding: 20px; +} +.uk-alert-large > .uk-close:first-child { + margin: -10px -10px 0 0; +} +/* ======================================================================== + Component: Thumbnail + ========================================================================== */ +/* + * 1. Container width fits its content + * 2. Responsive behavior + * 3. Corrects `max-width` behavior sed + * 4. Required for `figure` element + * 5. Style + */ +.uk-thumbnail { + /* 1 */ + display: inline-block; + /* 2 */ + max-width: 100%; + /* 3 */ + -moz-box-sizing: border-box; + box-sizing: border-box; + /* 3 */ + margin: 0; + /* 4 */ + padding: 4px; + border: 1px solid #dddddd; + background: #ffffff; + border-radius: 4px; +} +/* + * Hover state for `a` elements + * 1. Apply hover style also to focus state + * 2. Needed for caption + * 3. Remove default focus style + */ +a.uk-thumbnail:hover, +a.uk-thumbnail:focus { + border-color: #aaaaaa; + background-color: #ffffff; + /* 2 */ + text-decoration: none; + /* 3 */ + outline: none; +} +/* Caption + ========================================================================== */ +.uk-thumbnail-caption { + padding-top: 4px; + text-align: center; + color: #444444; +} +/* Sizes + ========================================================================== */ +.uk-thumbnail-mini { + width: 150px; +} +.uk-thumbnail-small { + width: 200px; +} +.uk-thumbnail-medium { + width: 300px; +} +.uk-thumbnail-large { + width: 400px; +} +.uk-thumbnail-expand, +.uk-thumbnail-expand > img { + width: 100%; +} +/* ======================================================================== + Component: Overlay + ========================================================================== */ +/* + * 1. Container width fits its content + * 2. Create position context + * 3. Set max-width for responsive images to prevent `inline-block` consequences + * 4. Remove the gap between the container and its child element + * 5. Fixed wrong scaling calculation for images in Chrome + */ +.uk-overlay { + /* 1 */ + display: inline-block; + /* 2 */ + position: relative; + /* 3 */ + max-width: 100%; + /* 4 */ + vertical-align: middle; + /* 5 */ + overflow: hidden; +} +/* + * Remove margin from content + */ +.uk-overlay > :first-child { + margin-bottom: 0; +} +/* Sub-object `uk-overlay-area` + ========================================================================== */ +/* + * 1. Set position + * 2. Set style + * 3. Fade-in transition + */ +.uk-overlay-area { + /* 1 */ + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; + /* 2 */ + background: rgba(0, 0, 0, 0.3); + /* 3 */ + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; + -webkit-transform: translate3d(0, 0, 0); +} +/* + * Hover + * 1. `uk-hover` to support touch devices + * 2. Use optional `uk-overlay-toggle` to trigger the overlay earlier + */ +.uk-overlay:hover .uk-overlay-area, +.uk-overlay.uk-hover .uk-overlay-area, +.uk-overlay-toggle:hover .uk-overlay-area, +.uk-overlay-toggle.uk-hover .uk-overlay-area { + opacity: 1; +} +/* + * Icon + */ +.uk-overlay-area:empty:before { + content: "\f002"; + position: absolute; + top: 50%; + left: 50%; + width: 50px; + height: 50px; + margin-top: -25px; + margin-left: -25px; + font-size: 50px; + line-height: 1; + font-family: FontAwesome; + text-align: center; + color: #ffffff; +} +/* Sub-object `uk-overlay-area-content` + ========================================================================== */ +/* + * Remove whitespace between child elements when using `inline-block` + * Needed for Firefox + */ +.uk-overlay-area:not(:empty) { + font-size: 0.001px; +} +/* + * 1. Needed for vertical alignment + */ +.uk-overlay-area:not(:empty):before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; +} +/* + * 1. Set vertical alignment + * 2. Reset whitespace hack + * 3. Set horizontal alignment + * 4. Set style + */ +.uk-overlay-area-content { + /* 1 */ + display: inline-block; + -moz-box-sizing: border-box; + box-sizing: border-box; + width: 100%; + vertical-align: middle; + /* 2 */ + font-size: 1rem; + /* 3 */ + text-align: center; + /* 4 */ + padding: 0 15px; + color: #ffffff; +} +/* + * Remove margin from the last-child + */ +.uk-overlay-area-content > :last-child { + margin-bottom: 0; +} +/* + * Links in overlay area + */ +.uk-overlay-area-content a:not([class]), +.uk-overlay-area-content a:not([class]):hover { + color: inherit; +} +/* DEPRECATED + * Sub-object `uk-overlay-caption` + ========================================================================== */ +/* + * 1. Set position + * 2. Set style + * 3. Fade-in transition + */ +.uk-overlay-caption { + /* 1 */ + position: absolute; + bottom: 0; + left: 0; + right: 0; + /* 2 */ + padding: 15px; + background: rgba(0, 0, 0, 0.5); + color: #ffffff; + /* 3 */ + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; + -webkit-transform: translate3d(0, 0, 0); +} +/* + * Hover + * 1. `uk-hover` to support touch devices + * 2. Use optional `uk-overlay-toggle` to trigger the overlay earlier + */ +.uk-overlay:hover .uk-overlay-caption, +.uk-overlay.uk-hover .uk-overlay-caption, +.uk-overlay-toggle:hover .uk-overlay-caption, +.uk-overlay-toggle.uk-hover .uk-overlay-caption { + opacity: 1; +} +/* ======================================================================== + Component: Progress + ========================================================================== */ +/* + * 1. Clearing + * 2. Vertical alignment if text is used + */ +.uk-progress { + -moz-box-sizing: border-box; + box-sizing: border-box; + height: 20px; + margin-bottom: 15px; + background: #f5f5f5; + /* 1 */ + overflow: hidden; + /* 2 */ + line-height: 20px; + box-shadow: inset 0 0 0 1px rgba(0, 0, 0, 0.06); + border-radius: 4px; +} +/* + * Add margin if adjacent element + */ +* + .uk-progress { + margin-top: 15px; +} +/* Sub-object: `uk-progress-bar` + ========================================================================== */ +/* + * 1. Transition + * 2. Needed for text + */ +.uk-progress-bar { + width: 0; + height: 100%; + background: #00a8e6; + float: left; + /* 1 */ + -webkit-transition: width 0.6s ease; + transition: width 0.6s ease; + /* 2 */ + font-size: 12px; + color: #ffffff; + text-align: center; + box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.05); + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.1); +} +/* Size modifiers + ========================================================================== */ +/* Mini */ +.uk-progress-mini { + height: 6px; +} +/* Small */ +.uk-progress-small { + height: 12px; +} +/* Color modifiers + ========================================================================== */ +.uk-progress-success .uk-progress-bar { + background-color: #8cc14c; +} +.uk-progress-warning .uk-progress-bar { + background-color: #faa732; +} +.uk-progress-danger .uk-progress-bar { + background-color: #da314b; +} +/* Modifier: `uk-progress-striped` + ========================================================================== */ +.uk-progress-striped .uk-progress-bar { + background-image: -webkit-linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(-45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-size: 30px 30px; +} +/* + * Animation + */ +.uk-progress-striped.uk-active .uk-progress-bar { + -webkit-animation: uk-progress-bar-stripes 2s linear infinite; + animation: uk-progress-bar-stripes 2s linear infinite; +} +@-webkit-keyframes uk-progress-bar-stripes { + 0% { + background-position: 0 0; + } + 100% { + background-position: 30px 0; + } +} +@keyframes uk-progress-bar-stripes { + 0% { + background-position: 0 0; + } + 100% { + background-position: 30px 0; + } +} +/* Size modifiers + ========================================================================== */ +.uk-progress-mini, +.uk-progress-small { + border-radius: 500px; +} +/* ======================================================================== + Component: Animation + ========================================================================== */ +[class*='uk-animation-'] { + -webkit-animation-duration: 0.5s; + animation-duration: 0.5s; + -webkit-animation-timing-function: ease-out; + animation-timing-function: ease-out; + -webkit-animation-fill-mode: both; + animation-fill-mode: both; +} +/* Hide animated element if scrollspy is used */ +@media screen { + [data-uk-scrollspy*='uk-animation-'] { + opacity: 0; + } +} +/* + * Fade + * Higher specificity (!important) needed because of reverse modifier + */ +.uk-animation-fade { + -webkit-animation-name: uk-fade; + animation-name: uk-fade; + -webkit-animation-duration: 0.8s; + animation-duration: 0.8s; + -webkit-animation-timing-function: linear !important; + animation-timing-function: linear !important; +} +/* + * Fade with scale + */ +.uk-animation-scale-up { + -webkit-animation-name: uk-fade-scale-02; + animation-name: uk-fade-scale-02; +} +.uk-animation-scale-down { + -webkit-animation-name: uk-fade-scale-18; + animation-name: uk-fade-scale-18; +} +/* + * Fade with slide + */ +.uk-animation-slide-top { + -webkit-animation-name: uk-fade-top; + animation-name: uk-fade-top; +} +.uk-animation-slide-bottom { + -webkit-animation-name: uk-fade-bottom; + animation-name: uk-fade-bottom; +} +.uk-animation-slide-left { + -webkit-animation-name: uk-fade-left; + animation-name: uk-fade-left; +} +.uk-animation-slide-right { + -webkit-animation-name: uk-fade-right; + animation-name: uk-fade-right; +} +/* + * Scale + */ +.uk-animation-scale { + -webkit-animation-name: uk-scale-12; + animation-name: uk-scale-12; +} +/* + * Shake + */ +.uk-animation-shake { + -webkit-animation-name: uk-shake; + animation-name: uk-shake; +} +/* Direction modifiers + ========================================================================== */ +.uk-animation-reverse { + -webkit-animation-direction: reverse; + animation-direction: reverse; + -webkit-animation-timing-function: ease-in; + animation-timing-function: ease-in; +} +/* Duration modifiers +========================================================================== */ +.uk-animation-15 { + -webkit-animation-duration: 15s; + animation-duration: 15s; +} +/* Origin modifiers +========================================================================== */ +.uk-animation-top-left { + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} +.uk-animation-top-center { + -webkit-transform-origin: 50% 0; + transform-origin: 50% 0; +} +.uk-animation-top-right { + -webkit-transform-origin: 100% 0; + transform-origin: 100% 0; +} +.uk-animation-middle-left { + -webkit-transform-origin: 0 50%; + transform-origin: 0 50%; +} +.uk-animation-middle-right { + -webkit-transform-origin: 100% 50%; + transform-origin: 100% 50%; +} +.uk-animation-bottom-left { + -webkit-transform-origin: 0 100%; + transform-origin: 0 100%; +} +.uk-animation-bottom-center { + -webkit-transform-origin: 50% 100%; + transform-origin: 50% 100%; +} +.uk-animation-bottom-right { + -webkit-transform-origin: 100% 100%; + transform-origin: 100% 100%; +} +/* Sub-object: `uk-animation-hover` +========================================================================== */ +/* + * Enable animation only on hover + * Needed for Firefox because animations are not triggered when switching between display `hidden` and `block` + */ +.uk-animation-hover:not(:hover), +.uk-animation-hover:not(:hover) [class*='uk-animation-'], +.uk-touch .uk-animation-hover:not(.uk-hover), +.uk-touch .uk-animation-hover:not(.uk-hover) [class*='uk-animation-'] { + -webkit-animation-name: none; + animation-name: none; +} +/* Keyframes: Fade + * Used by dropdown, datepicker and slideshow component + ========================================================================== */ +@-webkit-keyframes uk-fade { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes uk-fade { + 0% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +/* Keyframes: Fade with slide + ========================================================================== */ +/* + * Top + */ +@-webkit-keyframes uk-fade-top { + 0% { + opacity: 0; + -webkit-transform: translateY(-100%); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} +@keyframes uk-fade-top { + 0% { + opacity: 0; + transform: translateY(-100%); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} +/* + * Bottom + */ +@-webkit-keyframes uk-fade-bottom { + 0% { + opacity: 0; + -webkit-transform: translateY(100%); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} +@keyframes uk-fade-bottom { + 0% { + opacity: 0; + transform: translateY(100%); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} +/* + * Left + */ +@-webkit-keyframes uk-fade-left { + 0% { + opacity: 0; + -webkit-transform: translateX(-100%); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} +@keyframes uk-fade-left { + 0% { + opacity: 0; + transform: translateX(-100%); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} +/* + * Right + */ +@-webkit-keyframes uk-fade-right { + 0% { + opacity: 0; + -webkit-transform: translateX(100%); + } + 100% { + opacity: 1; + -webkit-transform: translateX(0); + } +} +@keyframes uk-fade-right { + 0% { + opacity: 0; + transform: translateX(100%); + } + 100% { + opacity: 1; + transform: translateX(0); + } +} +/* Keyframes: Fade with scale + ========================================================================== */ +/* + * Scale by 0.2 + */ +@-webkit-keyframes uk-fade-scale-02 { + 0% { + opacity: 0; + -webkit-transform: scale(0.2); + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + } +} +@keyframes uk-fade-scale-02 { + 0% { + opacity: 0; + transform: scale(0.2); + } + 100% { + opacity: 1; + transform: scale(1); + } +} +/* + * Scale by 1.5 + * Used by slideshow component + */ +@-webkit-keyframes uk-fade-scale-15 { + 0% { + opacity: 0; + -webkit-transform: scale(1.5); + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + } +} +@keyframes uk-fade-scale-15 { + 0% { + opacity: 0; + transform: scale(1.5); + } + 100% { + opacity: 1; + transform: scale(1); + } +} +/* + * Scale by 1.8 + */ +@-webkit-keyframes uk-fade-scale-18 { + 0% { + opacity: 0; + -webkit-transform: scale(1.8); + } + 100% { + opacity: 1; + -webkit-transform: scale(1); + } +} +@keyframes uk-fade-scale-18 { + 0% { + opacity: 0; + transform: scale(1.8); + } + 100% { + opacity: 1; + transform: scale(1); + } +} +/* Keyframes: Slide + * Used by slideshow component + ========================================================================== */ +/* + * Left + */ +@-webkit-keyframes uk-slide-left { + 0% { + -webkit-transform: translateX(-100%); + } + 100% { + -webkit-transform: translateX(0); + } +} +@keyframes uk-slide-left { + 0% { + transform: translateX(-100%); + } + 100% { + transform: translateX(0); + } +} +/* + * Right + */ +@-webkit-keyframes uk-slide-right { + 0% { + -webkit-transform: translateX(100%); + } + 100% { + -webkit-transform: translateX(0); + } +} +@keyframes uk-slide-right { + 0% { + transform: translateX(100%); + } + 100% { + transform: translateX(0); + } +} +/* + * Left third + */ +@-webkit-keyframes uk-slide-left-33 { + 0% { + -webkit-transform: translateX(33%); + } + 100% { + -webkit-transform: translateX(0); + } +} +@keyframes uk-slide-left-33 { + 0% { + transform: translateX(33%); + } + 100% { + transform: translateX(0); + } +} +/* + * Right third + */ +@-webkit-keyframes uk-slide-right-33 { + 0% { + -webkit-transform: translateX(-33%); + } + 100% { + -webkit-transform: translateX(0); + } +} +@keyframes uk-slide-right-33 { + 0% { + transform: translateX(-33%); + } + 100% { + transform: translateX(0); + } +} +/* Keyframes: Scale + ========================================================================== */ +@-webkit-keyframes uk-scale-12 { + 0% { + -webkit-transform: scale(1.2); + } + 100% { + -webkit-transform: scale(1); + } +} +@keyframes uk-scale-12 { + 0% { + transform: scale(1.2); + } + 100% { + transform: scale(1); + } +} +/* Keyframes: Rotate + * Used by icon and search component + ========================================================================== */ +@-webkit-keyframes uk-rotate { + 0% { + -webkit-transform: rotate(0deg); + } + 100% { + -webkit-transform: rotate(359deg); + } +} +@keyframes uk-rotate { + 0% { + transform: rotate(0deg); + } + 100% { + transform: rotate(359deg); + } +} +/* Keyframes: Shake + ========================================================================== */ +@-webkit-keyframes uk-shake { + 0%, + 100% { + -webkit-transform: translateX(0); + } + 10% { + -webkit-transform: translateX(-9px); + } + 20% { + -webkit-transform: translateX(8px); + } + 30% { + -webkit-transform: translateX(-7px); + } + 40% { + -webkit-transform: translateX(6px); + } + 50% { + -webkit-transform: translateX(-5px); + } + 60% { + -webkit-transform: translateX(4px); + } + 70% { + -webkit-transform: translateX(-3px); + } + 80% { + -webkit-transform: translateX(2px); + } + 90% { + -webkit-transform: translateX(-1px); + } +} +@keyframes uk-shake { + 0%, + 100% { + transform: translateX(0); + } + 10% { + transform: translateX(-9px); + } + 20% { + transform: translateX(8px); + } + 30% { + transform: translateX(-7px); + } + 40% { + transform: translateX(6px); + } + 50% { + transform: translateX(-5px); + } + 60% { + transform: translateX(4px); + } + 70% { + transform: translateX(-3px); + } + 80% { + transform: translateX(2px); + } + 90% { + transform: translateX(-1px); + } +} +/* Keyframes: Fade with slide fixed + * Used by dropdown and search component + ========================================================================== */ +/* + * Top fixed + */ +@-webkit-keyframes uk-slide-top-fixed { + 0% { + opacity: 0; + -webkit-transform: translateY(-10px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} +@keyframes uk-slide-top-fixed { + 0% { + opacity: 0; + transform: translateY(-10px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} +/* + * Bottom fixed + */ +@-webkit-keyframes uk-slide-bottom-fixed { + 0% { + opacity: 0; + -webkit-transform: translateY(10px); + } + 100% { + opacity: 1; + -webkit-transform: translateY(0); + } +} +@keyframes uk-slide-bottom-fixed { + 0% { + opacity: 0; + transform: translateY(10px); + } + 100% { + opacity: 1; + transform: translateY(0); + } +} +/* ======================================================================== + Component: Dropdown + ========================================================================== */ +/* + * 1. Hide by default + * 2. Set position + * 3. Box-sizing is needed for `uk-dropdown-justify` + * 4. Set style + * 5. Reset button group whitespace hack + */ +.uk-dropdown { + /* 1 */ + display: none; + /* 2 */ + position: absolute; + top: 100%; + left: 0; + z-index: 1020; + /* 3 */ + -moz-box-sizing: border-box; + box-sizing: border-box; + /* 4 */ + width: 200px; + margin-top: 5px; + padding: 15px; + background: #ffffff; + color: #444444; + /* 5 */ + font-size: 1rem; + vertical-align: top; + border: 1px solid #dddddd; + border-radius: 4px; +} +/* + * 1. Show dropdown + * 2. Set animation + * 3. Needed for scale animation + */ +.uk-open > .uk-dropdown { + /* 1 */ + display: block; + /* 2 */ + -webkit-animation: uk-fade 0.2s ease-in-out; + animation: uk-fade 0.2s ease-in-out; + /* 3 */ + -webkit-transform-origin: 0 0; + transform-origin: 0 0; +} +/* Alignment modifiers + ========================================================================== */ +/* + * Modifier `uk-dropdown-flip` + */ +.uk-dropdown-flip { + left: auto; + right: 0; +} +/* + * Modifier `uk-dropdown-up` + */ +.uk-dropdown-up { + top: auto; + bottom: 100%; + margin-top: auto; + margin-bottom: 5px; +} +/* Nav in dropdown + ========================================================================== */ +.uk-dropdown .uk-nav { + margin: 0 -15px; +} +/* Grid and panel in dropdown + ========================================================================== */ +/* +* Vertical gutter +*/ +/* + * Grid + * Higher specificity to override large gutter + */ +.uk-grid .uk-dropdown-grid + .uk-dropdown-grid { + margin-top: 15px; +} +/* Panels */ +.uk-dropdown-grid > [class*='uk-width-'] > .uk-panel + .uk-panel { + margin-top: 15px; +} +/* Tablet and bigger */ +@media (min-width: 768px) { + /* + * Horizontal gutter + */ + .uk-dropdown:not(.uk-dropdown-stack) > .uk-dropdown-grid { + margin-left: -15px; + margin-right: -15px; + } + .uk-dropdown:not(.uk-dropdown-stack) > .uk-dropdown-grid > [class*='uk-width-'] { + padding-left: 15px; + padding-right: 15px; + } + /* + * Column divider + */ + .uk-dropdown:not(.uk-dropdown-stack) > .uk-dropdown-grid > [class*='uk-width-']:nth-child(n+2) { + border-left: 1px solid #dddddd; + } + /* + * Width multiplier for dropdown columns + */ + .uk-dropdown-width-2:not(.uk-dropdown-stack) { + width: 400px; + } + .uk-dropdown-width-3:not(.uk-dropdown-stack) { + width: 600px; + } + .uk-dropdown-width-4:not(.uk-dropdown-stack) { + width: 800px; + } + .uk-dropdown-width-5:not(.uk-dropdown-stack) { + width: 1000px; + } +} +/* Phone landscape and smaller */ +@media (max-width: 767px) { + /* + * Stack columns and take full width + */ + .uk-dropdown-grid > [class*='uk-width-'] { + width: 100%; + } + /* + * Vertical gutter + */ + .uk-dropdown-grid > [class*='uk-width-']:nth-child(n+2) { + margin-top: 15px; + } +} +/* +* Stack grid columns +*/ +.uk-dropdown-stack > .uk-dropdown-grid > [class*='uk-width-'] { + width: 100%; +} +.uk-dropdown-stack > .uk-dropdown-grid > [class*='uk-width-']:nth-child(n+2) { + margin-top: 15px; +} +/* Modifier `uk-dropdown-small` + ========================================================================== */ +/* + * Set min-width and text expands dropdown if needed + */ +.uk-dropdown-small { + min-width: 150px; + width: auto; + padding: 5px; + white-space: nowrap; +} +/* + * Nav in dropdown + */ +.uk-dropdown-small .uk-nav { + margin: 0 -5px; +} +/* Modifier: `uk-dropdown-navbar` + ========================================================================== */ +.uk-dropdown-navbar { + margin-top: 6px; + background: #ffffff; + color: #444444; + left: -1px; + border: 1px solid #dddddd; + border-radius: 4px; +} +.uk-open > .uk-dropdown-navbar { + -webkit-animation: uk-slide-top-fixed 0.2s ease-in-out; + animation: uk-slide-top-fixed 0.2s ease-in-out; +} +/* Modifier `uk-dropdown-scrollable` + ========================================================================== */ +/* + * Usefull for long lists + */ +.uk-dropdown-scrollable { + overflow-y: auto; + max-height: 200px; +} +.uk-dropdown-navbar.uk-dropdown-flip { + left: auto; +} +/* ======================================================================== + Component: Modal + ========================================================================== */ +/* + * This is the modal overlay and modal dialog container + * 1. Hide by default + * 2. Set fixed position + * 3. Allow scrolling for the modal dialog + * 4. Mask the background page + * 5. Fade-in transition + */ +.uk-modal { + /* 1 */ + display: none; + /* 2 */ + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1010; + /* 3 */ + overflow-y: auto; + -webkit-overflow-scrolling: touch; + /* 4 */ + background: rgba(0, 0, 0, 0.6); + /* 5 */ + opacity: 0; + -webkit-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +/* + * Open state + */ +.uk-modal.uk-open { + opacity: 1; +} +/* + * Prevents duplicated scrollbar caused by 4. + */ +.uk-modal-page, +.uk-modal-page body { + overflow: hidden; +} +/* Sub-object: `uk-modal-dialog` + ========================================================================== */ +/* + * 1. Create position context for `uk-modal-dialog-frameless` + * 2. Set box sizing + * 3. Set style + * 4. Slide-in transition + */ +.uk-modal-dialog { + /* 1 */ + position: relative; + /* 2 */ + -moz-box-sizing: border-box; + box-sizing: border-box; + margin: 50px auto; + padding: 20px; + width: 600px; + max-width: 100%; + max-width: calc(100% - 20px); + /* 3 */ + background: #ffffff; + /* 4 */ + opacity: 0; + -webkit-transform: translateY(-100px); + transform: translateY(-100px); + -webkit-transition: opacity 0.3s linear, -webkit-transform 0.3s ease-out; + transition: opacity 0.3s linear, transform 0.3s ease-out; + border-radius: 4px; + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3); +} +/* Phone landscape and smaller */ +@media (max-width: 767px) { + /* + * Fit in small screen + */ + .uk-modal-dialog { + width: auto; + margin: 10px; + } +} +/* + * Open state + */ +.uk-open .uk-modal-dialog { + /* 4 */ + opacity: 1; + -webkit-transform: translateY(0); + transform: translateY(0); +} +/* + * Remove margin from the last-child + */ +.uk-modal-dialog > :last-child { + margin-bottom: 0; +} +/* Close in modal + ========================================================================== */ +.uk-modal-dialog > .uk-close:first-child { + margin: -10px -10px 0 0; + float: right; +} +/* + * Remove margin from adjacent element + */ +.uk-modal-dialog > .uk-close:first-child + * { + margin-top: 0; +} +/* Modifier: `uk-modal-dialog-frameless` + ========================================================================== */ +.uk-modal-dialog-frameless { + padding: 0; +} +/* + * Close in modal + */ +.uk-modal-dialog-frameless > .uk-close:first-child { + position: absolute; + top: -12px; + right: -12px; + margin: 0; + float: none; +} +/* Phone landscape and smaller */ +@media (max-width: 767px) { + .uk-modal-dialog-frameless > .uk-close:first-child { + top: -7px; + right: -7px; + } +} +/* Modifier: `uk-modal-dialog-large` + ========================================================================== */ +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-modal-dialog-large { + width: 930px; + } +} +/* Large screen and bigger */ +@media (min-width: 1220px) { + .uk-modal-dialog-large { + width: 1130px; + } +} +/* ======================================================================== + Component: Off-canvas + ========================================================================== */ +/* + * This is the offcanvas overlay and bar container + * 1. Hide by default + * 2. Set fixed position + * 3. Deactivate browser touch actions in IE11 + * 4. Mask the background page + */ +.uk-offcanvas { + /* 1 */ + display: none; + /* 2 */ + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1000; + /* 3 */ + touch-action: none; + /* 4 */ + background: rgba(0, 0, 0, 0.1); +} +.uk-offcanvas.uk-active { + display: block; +} +/* Sub-object `uk-offcanvas-page` + ========================================================================== */ +/* + * Prepares the whole HTML page to slide-out + * 1. Fix the main page and disallow scrolling + * 2. Side-out transition + */ +.uk-offcanvas-page { + /* 1 */ + position: fixed; + /* 2 */ + -webkit-transition: margin-left 0.3s ease-in-out; + transition: margin-left 0.3s ease-in-out; +} +/* Sub-object `uk-offcanvas-bar` + ========================================================================== */ +/* + * This is the offcanvas bar + * 1. Set fixed position + * 2. Size and style + * 3. Allow scrolling + * 4. Side-out transition + * 5. Deavtivate scroll chaining in IE11 + */ +.uk-offcanvas-bar { + /* 1 */ + position: fixed; + top: 0; + bottom: 0; + left: 0; + -webkit-transform: translateX(-100%); + transform: translateX(-100%); + z-index: 1001; + /* 2 */ + width: 270px; + max-width: 100%; + background: #333333; + /* 3 */ + overflow-y: auto; + -webkit-overflow-scrolling: touch; + /* 4 */ + -webkit-transition: -webkit-transform 0.3s ease-in-out; + transition: transform 0.3s ease-in-out; + /* 5 */ + -ms-scroll-chaining: none; +} +.uk-offcanvas.uk-active .uk-offcanvas-bar.uk-offcanvas-bar-show { + -webkit-transform: translateX(0%); + transform: translateX(0%); +} +/* Modifier `uk-offcanvas-bar-flip` + ========================================================================== */ +.uk-offcanvas-bar-flip { + left: auto; + right: 0; + -webkit-transform: translateX(100%); + transform: translateX(100%); +} +/* Panel in offcanvas + ========================================================================== */ +.uk-offcanvas .uk-panel { + margin: 20px 15px; + color: #777777; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); +} +.uk-offcanvas .uk-panel-title { + color: #cccccc; +} +.uk-offcanvas .uk-panel a:not([class]) { + color: #cccccc; +} +.uk-offcanvas .uk-panel a:not([class]):hover { + color: #ffffff; +} +.uk-offcanvas-bar:after { + content: ""; + display: block; + position: absolute; + top: 0; + bottom: 0; + right: 0; + width: 1px; + background: rgba(0, 0, 0, 0.6); + box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.6); +} +.uk-offcanvas-bar-flip:after { + right: auto; + left: 0; + width: 1px; + background: rgba(0, 0, 0, 0.6); + box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.6); +} +/* ======================================================================== + Component: Switcher + ========================================================================== */ +.uk-switcher { + margin: 0; + padding: 0; + list-style: none; +} +/* + * Items + */ +.uk-switcher > *:not(.uk-active) { + display: none; +} +/* ======================================================================== + Component: Tooltip + ========================================================================== */ +/* + * 1. Hide by default + * 2. Set fixed position + * 3. Set dimensions + * 4. Set style + */ +.uk-tooltip { + /* 1 */ + display: none; + /* 2 */ + position: absolute; + z-index: 1030; + /* 3 */ + -moz-box-sizing: border-box; + box-sizing: border-box; + max-width: 200px; + padding: 5px 8px; + /* 4 */ + background: #333333; + color: rgba(255, 255, 255, 0.7); + font-size: 12px; + line-height: 18px; + text-align: center; + border-radius: 3px; + text-shadow: 0 1px 0 rgba(0, 0, 0, 0.5); +} +/* Triangle + ========================================================================== */ +/* + * 1. Dashed is less antialised than solid + */ +.uk-tooltip:after { + content: ""; + display: block; + position: absolute; + width: 0; + height: 0; + /* 1 */ + border: 5px dashed #333333; +} +/* Direction modifiers + ========================================================================== */ +/* + * Top + */ +.uk-tooltip-top:after, +.uk-tooltip-top-left:after, +.uk-tooltip-top-right:after { + bottom: -5px; + border-top-style: solid; + border-bottom: none; + border-left-color: transparent; + border-right-color: transparent; + border-top-color: #333333; +} +/* + * Bottom + */ +.uk-tooltip-bottom:after, +.uk-tooltip-bottom-left:after, +.uk-tooltip-bottom-right:after { + top: -5px; + border-bottom-style: solid; + border-top: none; + border-left-color: transparent; + border-right-color: transparent; + border-bottom-color: #333333; +} +/* + * Top/Bottom center + */ +.uk-tooltip-top:after, +.uk-tooltip-bottom:after { + left: 50%; + margin-left: -5px; +} +/* + * Top/Bottom left + */ +.uk-tooltip-top-left:after, +.uk-tooltip-bottom-left:after { + left: 10px; +} +/* + * Top/Bottom right + */ +.uk-tooltip-top-right:after, +.uk-tooltip-bottom-right:after { + right: 10px; +} +/* + * Left + */ +.uk-tooltip-left:after { + right: -5px; + top: 50%; + margin-top: -5px; + border-left-style: solid; + border-right: none; + border-top-color: transparent; + border-bottom-color: transparent; + border-left-color: #333333; +} +/* + * Right + */ +.uk-tooltip-right:after { + left: -5px; + top: 50%; + margin-top: -5px; + border-right-style: solid; + border-left: none; + border-top-color: transparent; + border-bottom-color: transparent; + border-right-color: #333333; +} +/* ======================================================================== + Component: Text + ========================================================================== */ +/* Size modifiers + ========================================================================== */ +.uk-text-small { + font-size: 11px; + line-height: 16px; +} +.uk-text-large { + font-size: 18px; + line-height: 24px; + font-weight: normal; +} +/* Weight modifiers + ========================================================================== */ +.uk-text-bold { + font-weight: bold; +} +/* Color modifiers + ========================================================================== */ +.uk-text-muted { + color: #999999 !important; +} +.uk-text-primary { + color: #2d7091 !important; +} +.uk-text-success { + color: #659f13 !important; +} +.uk-text-warning { + color: #e28327 !important; +} +.uk-text-danger { + color: #d85030 !important; +} +/* Alignment modifiers + ========================================================================== */ +.uk-text-left { + text-align: left !important; +} +.uk-text-right { + text-align: right !important; +} +.uk-text-center { + text-align: center !important; +} +.uk-text-justify { + text-align: justify !important; +} +.uk-text-top { + vertical-align: top !important; +} +.uk-text-middle { + vertical-align: middle !important; +} +.uk-text-bottom { + vertical-align: bottom !important; +} +/* Only tablets portrait and smaller */ +@media (max-width: 959px) { + .uk-text-center-medium { + text-align: center !important; + } +} +/* Phone landscape and smaller */ +@media (max-width: 767px) { + .uk-text-center-small { + text-align: center !important; + } +} +/* Wrap modifiers + ========================================================================== */ +/* + * Prevent text from wrapping onto multiple lines + */ +.uk-text-nowrap { + white-space: nowrap; +} +/* + * Prevent text from wrapping onto multiple lines, and truncate with an ellipsis + */ +.uk-text-truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +/* + * Break strings if their length exceeds the width of their container + */ +.uk-text-break { + word-wrap: break-word; + -webkit-hyphens: auto; + -ms-hyphens: auto; + -moz-hyphens: auto; + hyphens: auto; +} +/* ======================================================================== + Component: Utility + ========================================================================== */ +/* Container + ========================================================================== */ +.uk-container { + -moz-box-sizing: border-box; + box-sizing: border-box; + max-width: 980px; + padding: 0 25px; +} +/* Large screen and bigger */ +@media (min-width: 1220px) { + .uk-container { + max-width: 1200px; + padding: 0 35px; + } +} +/* + * Micro clearfix + */ +.uk-container:before, +.uk-container:after { + content: ""; + display: block; +} +.uk-container:after { + clear: both; +} +/* + * Center container + */ +.uk-container-center { + margin-left: auto; + margin-right: auto; +} +/* Clearing + ========================================================================== */ +/* + * Micro clearfix + * 1. Not possible to use `table` because it creates a 1px gap when it becomes a flex item + */ +.uk-clearfix:before, +.uk-clearfix:after { + content: ""; + /* 1 */ + display: block; +} +.uk-clearfix:after { + clear: both; +} +/* + * Create a new block formatting context + */ +.uk-nbfc { + overflow: hidden; +} +.uk-nbfc-alt { + display: table-cell; + width: 10000px; +} +/* Alignment of block elements + ========================================================================== */ +/* + * Float blocks + * 1. Prevent content overflow on small devices + */ +.uk-float-left { + float: left; +} +.uk-float-right { + float: right; +} +/* 1 */ +[class*='uk-float-'] { + max-width: 100%; +} +/* Alignment of images and objects + ========================================================================== */ +/* + * Alignment + */ +[class*='uk-align-'] { + display: block; + margin-bottom: 15px; +} +.uk-align-left { + margin-right: 15px; + float: left; +} +.uk-align-right { + margin-left: 15px; + float: right; +} +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-align-medium-left { + margin-right: 15px; + margin-bottom: 15px; + float: left; + } + .uk-align-medium-right { + margin-left: 15px; + margin-bottom: 15px; + float: right; + } +} +.uk-align-center { + margin-left: auto; + margin-right: auto; +} +/* Vertical alignment + ========================================================================== */ +/* + * Remove whitespace between child elements when using `inline-block` + */ +.uk-vertical-align { + font-size: 0.001px; +} +/* + * The `uk-vertical-align` container needs a specific height + */ +.uk-vertical-align:before { + content: ''; + display: inline-block; + height: 100%; + vertical-align: middle; +} +/* + * Sub-object which can have any height + * 1. Reset whitespace hack + */ +.uk-vertical-align-middle, +.uk-vertical-align-bottom { + display: inline-block; + max-width: 100%; + /* 1 */ + font-size: 1rem; +} +.uk-vertical-align-middle { + vertical-align: middle; +} +.uk-vertical-align-bottom { + vertical-align: bottom; +} +/* Height + ========================================================================== */ +/* + * More robust if padding and border are used + */ +[class*='uk-height'] { + -moz-box-sizing: border-box; + box-sizing: border-box; +} +/* + * Useful to extend the `html` and `body` element to the full height of the page. + */ +.uk-height-1-1 { + height: 100%; +} +/* + * Useful to create image teasers + */ +.uk-height-viewport { + height: 100vh; + min-height: 600px; +} +/* Responsive objects + * Note: Images are already responsive by default, see Base component + ========================================================================== */ +/* + * 1. Corrects `max-width` and `max-height` behavior if padding and border are used + */ +.uk-responsive-width, +.uk-responsive-height { + -moz-box-sizing: border-box; + box-sizing: border-box; +} +/* + * Responsiveness: Sets a maximum width relative to the parent and auto scales the height + * `important` needed to override `uk-img-preserve img` + */ +.uk-responsive-width { + max-width: 100% !important; + height: auto; +} +/* + * Responsiveness: Sets a maximum height relative to the parent and auto scales the width + * Only works if the parent element has a fixed height. + */ +.uk-responsive-height { + max-height: 100%; + width: auto; +} +/* Margin + ========================================================================== */ +/* + * Create a block with the same margin of a paragraph + * Add margin if adjacent element + */ +.uk-margin { + margin-bottom: 15px; +} +* + .uk-margin { + margin-top: 15px; +} +.uk-margin-top { + margin-top: 15px !important; +} +.uk-margin-bottom { + margin-bottom: 15px !important; +} +.uk-margin-left { + margin-left: 15px !important; +} +.uk-margin-right { + margin-right: 15px !important; +} +/* + * Larger margins + */ +.uk-margin-large { + margin-bottom: 50px; +} +* + .uk-margin-large { + margin-top: 50px; +} +.uk-margin-large-top { + margin-top: 50px !important; +} +.uk-margin-large-bottom { + margin-bottom: 50px !important; +} +.uk-margin-large-left { + margin-left: 50px !important; +} +.uk-margin-large-right { + margin-right: 50px !important; +} +/* + * Smaller margins + */ +.uk-margin-small { + margin-bottom: 5px; +} +* + .uk-margin-small { + margin-top: 5px; +} +.uk-margin-small-top { + margin-top: 5px !important; +} +.uk-margin-small-bottom { + margin-bottom: 5px !important; +} +.uk-margin-small-left { + margin-left: 5px !important; +} +.uk-margin-small-right { + margin-right: 5px !important; +} +/* + * Remove margins + */ +.uk-margin-remove { + margin: 0 !important; +} +.uk-margin-top-remove { + margin-top: 0 !important; +} +.uk-margin-bottom-remove { + margin-bottom: 0 !important; +} +/* Border + ========================================================================== */ +.uk-border-circle { + border-radius: 50%; +} +.uk-border-rounded { + border-radius: 5px; +} +/* Headings + ========================================================================== */ +/* Tablet and bigger */ +@media (min-width: 768px) { + .uk-heading-large { + font-size: 52px; + line-height: 64px; + } +} +/* Link + ========================================================================== */ +/* + * Let links appear in default text color + */ +.uk-link-muted, +.uk-link-muted a { + color: #444444; +} +.uk-link-muted:hover, +.uk-link-muted a:hover { + color: #444444; +} +/* + * Reset link style + */ +.uk-link-reset, +.uk-link-reset a, +.uk-link-reset:hover, +.uk-link-reset a:hover { + color: inherit; + text-decoration: none; +} +/* Scrollable + ========================================================================== */ +/* + * Enable scrolling for preformatted text + */ +.uk-scrollable-text { + height: 300px; + overflow-y: scroll; + -webkit-overflow-scrolling: touch; + resize: both; +} +/* + * Box with scrolling enabled + */ +.uk-scrollable-box { + -moz-box-sizing: border-box; + box-sizing: border-box; + height: 170px; + padding: 10px; + border: 1px solid #dddddd; + overflow: auto; + -webkit-overflow-scrolling: touch; + resize: both; + border-radius: 3px; +} +.uk-scrollable-box > :last-child { + margin-bottom: 0; +} +/* Overflow + ========================================================================== */ +/* + * Enable scrollbars if content is clipped + */ +.uk-overflow-container { + overflow: auto; + -webkit-overflow-scrolling: touch; +} +.uk-overflow-container > :last-child { + margin-bottom: 0; +} +/* Position + ========================================================================== */ +.uk-position-absolute { + position: absolute !important; +} +.uk-position-relative { + position: relative !important; +} +.uk-position-cover { + position: absolute; + top: 0; + bottom: 0; + left: 0; + right: 0; +} +/* Display + ========================================================================== */ +/* + * Display + */ +.uk-display-block { + display: block !important; +} +.uk-display-inline { + display: inline !important; +} +.uk-display-inline-block { + display: inline-block !important; +} +/* + * Visibility + * Avoids setting display to `block` so it works also with `inline-block` and `table` + */ +/* Desktop and bigger */ +@media (min-width: 960px) { + .uk-visible-small { + display: none !important; + } + .uk-visible-medium { + display: none !important; + } + .uk-hidden-large { + display: none !important; + } +} +/* Tablets portrait */ +@media (min-width: 768px) and (max-width: 959px) { + .uk-visible-small { + display: none !important; + } + .uk-visible-large { + display: none !important ; + } + .uk-hidden-medium { + display: none !important; + } +} +/* Phone landscape and smaller*/ +@media (max-width: 767px) { + .uk-visible-medium { + display: none !important; + } + .uk-visible-large { + display: none !important; + } + .uk-hidden-small { + display: none !important; + } +} +/* Remove from the flow and screen readers on any device */ +.uk-hidden { + display: none !important; + visibility: hidden !important; +} +/* It's hidden, but still affects layout */ +.uk-invisible { + visibility: hidden !important; +} +/* Show on hover */ +.uk-visible-hover:hover .uk-hidden, +.uk-visible-hover:hover .uk-invisible { + display: block !important; + visibility: visible !important; +} +.uk-visible-hover-inline:hover .uk-hidden, +.uk-visible-hover-inline:hover .uk-invisible { + display: inline-block !important; + visibility: visible !important; +} +/* ======================================================================== + Component: Print + ========================================================================== */ +@media print { + * { + background: transparent !important; + color: black !important; + box-shadow: none !important; + text-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans-Bold.woff b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans-Bold.woff new file mode 100755 index 0000000..df131b5 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans-Bold.woff differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans-CondensedBold.woff b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans-CondensedBold.woff new file mode 100755 index 0000000..7750b96 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans-CondensedBold.woff differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans-CondensedLight.woff b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans-CondensedLight.woff new file mode 100755 index 0000000..9c5168d Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans-CondensedLight.woff differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans-Light.woff b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans-Light.woff new file mode 100755 index 0000000..99bdbc5 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans-Light.woff differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans.woff b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans.woff new file mode 100755 index 0000000..28b9458 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/OpenSans.woff differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/fontawesome-webfont.woff b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/fontawesome-webfont.woff new file mode 100755 index 0000000..628b6a5 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/fonts/fontawesome-webfont.woff differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/be.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/be.png new file mode 100755 index 0000000..e857ef5 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/be.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/bg.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/bg.png new file mode 100755 index 0000000..70f9a0f Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/bg.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ch.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ch.png new file mode 100755 index 0000000..90bbd41 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ch.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/cn.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/cn.png new file mode 100755 index 0000000..54a8251 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/cn.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/cz.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/cz.png new file mode 100755 index 0000000..57afc80 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/cz.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/de.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/de.png new file mode 100755 index 0000000..11fdab3 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/de.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/dk.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/dk.png new file mode 100755 index 0000000..8059e39 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/dk.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ee.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ee.png new file mode 100755 index 0000000..e5e63ad Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ee.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/err.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/err.png new file mode 100755 index 0000000..0511b7f Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/err.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/es.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/es.png new file mode 100755 index 0000000..05e8ddc Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/es.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/eu.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/eu.png new file mode 100755 index 0000000..6c28b6c Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/eu.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/fi.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/fi.png new file mode 100755 index 0000000..c44a29a Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/fi.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/fr.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/fr.png new file mode 100755 index 0000000..ff3dbc3 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/fr.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/google.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/google.png new file mode 100755 index 0000000..a172302 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/google.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/google64.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/google64.png new file mode 100755 index 0000000..a69fa42 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/google64.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ie.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ie.png new file mode 100755 index 0000000..7e17c12 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ie.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/it.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/it.png new file mode 100755 index 0000000..eafa972 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/it.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/lt.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/lt.png new file mode 100755 index 0000000..2469f56 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/lt.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/nl.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/nl.png new file mode 100755 index 0000000..b914721 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/nl.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/p.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/p.png new file mode 100755 index 0000000..22eac9c Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/p.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/pl.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/pl.png new file mode 100755 index 0000000..e09b16a Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/pl.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/proxy.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/proxy.png new file mode 100755 index 0000000..6ce105e Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/proxy.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/pt.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/pt.png new file mode 100755 index 0000000..76ea388 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/pt.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ru.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ru.png new file mode 100755 index 0000000..237b309 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ru.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/se.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/se.png new file mode 100755 index 0000000..9855c26 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/se.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/tor.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/tor.png new file mode 100755 index 0000000..8f13886 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/tor.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ua.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ua.png new file mode 100755 index 0000000..7b91142 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/ua.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/uk.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/uk.png new file mode 100755 index 0000000..b4fd9b9 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/uk.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/unknown.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/unknown.png new file mode 100755 index 0000000..80edb7d Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/unknown.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/us.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/us.png new file mode 100755 index 0000000..ca535f8 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/us.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/user.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/user.png new file mode 100755 index 0000000..2f0df17 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/co/user.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/google.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/google.png new file mode 100755 index 0000000..992fb7b Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/google.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/hide.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/hide.png new file mode 100755 index 0000000..1468ab6 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/hide.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico128-2.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico128-2.png new file mode 100755 index 0000000..d7123c9 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico128-2.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico19-2.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico19-2.png new file mode 100755 index 0000000..9cf3926 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico19-2.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico19g-2.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico19g-2.png new file mode 100755 index 0000000..8c1e158 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico19g-2.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico38-2.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico38-2.png new file mode 100755 index 0000000..bee3339 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico38-2.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico38g-2.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico38g-2.png new file mode 100755 index 0000000..c917e74 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico38g-2.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico64-2.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico64-2.png new file mode 100755 index 0000000..ca0b3c0 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/ico64-2.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/no.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/no.png new file mode 100755 index 0000000..010b58b Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/no.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/on.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/on.png new file mode 100755 index 0000000..0940f06 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/on.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/onion.png b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/onion.png new file mode 100755 index 0000000..bc2cb81 Binary files /dev/null and b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/im/onion.png differ diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/api.js b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/api.js new file mode 100755 index 0000000..4cd0c85 --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/api.js @@ -0,0 +1,509 @@ +nl.drew.cp.core.api = function() { + var api = {port:null}; + api.handling = function(port, msg) { + var lid; + nl.drew.cp.core.api.port = port; + if (msg.msg == "log") { + nl.drew.cp.lib.debug(msg.param); + } else { + if (msg.msg == "on") { + nl.drew.cp.core.main.start(true); + nl.drew.cp.core.cache.nowProxyAllClean(); + } else { + if (msg.msg == "off") { + nl.drew.cp.core.main.stop(); + nl.drew.cp.core.cache.nowProxyAllClean(); + } else { + if (msg.msg == "icoupd") { + nl.drew.cp.core.interf.icoupdate2(); + } else { + if (msg.msg == "set") { + if (msg.param == "https") { + if (typeof msg.val != "undefined") { + nl.drew.cp.state.https = msg.val; + nl.drew.cp.ls.set("https", nl.drew.cp.state.https, false); + } + } else { + if (msg.param == "uproxyremove") { + if (typeof msg.val != "undefined" && typeof msg.val.co != "undefined" && msg.val.co) { + var delUproxyList = nl.drew.cp.core.lib.inUproxyList(msg.val.co); + if (delUproxyList > -1) { + nl.drew.cp.state.uproxys.splice(delUproxyList, 1); + nl.drew.cp.ls.set("uproxys", nl.drew.cp.state.uproxys, false); + nl.drew.cp.core.cache.nowProxyAllClean(); + nl.drew.cp.core.filter.inst(); + } + } + } else { + if (msg.param == "uproxy") { + if (typeof msg.val != "undefined" && typeof msg.val.oldname != "undefined" && msg.val.oldname) { + var i = nl.drew.cp.core.lib.inUproxyList(msg.val.oldname); + var newname = msg.val.proto.toUpperCase() + " " + msg.val.ip + ":" + msg.val.port; + if (i > -1) { + nl.drew.cp.state.uproxys[i].co = msg.val.co; + nl.drew.cp.state.uproxys[i].proto = msg.val.proto; + nl.drew.cp.state.uproxys[i].ip = msg.val.ip; + nl.drew.cp.state.uproxys[i].port = msg.val.port; + nl.drew.cp.state.uproxys[i].name = newname; + nl.drew.cp.state.uproxys[i].off = msg.val.hasOwnProperty("off") ? msg.val.off : nl.drew.cp.state.uproxys[i].off; + if (nl.drew.cp.state.listContrySite.hasOwnProperty(msg.val.oldname)) { + nl.drew.cp.state.listContrySite[msg.val.co] = nl.drew.cp.lib.clone(nl.drew.cp.state.listContrySite[msg.val.oldname]); + delete nl.drew.cp.state.listContrySite[msg.val.oldname]; + } + } else { + nl.drew.cp.state.uproxys.push({ip:msg.val.ip, port:msg.val.port, sport:"", proto:msg.val.proto, co:msg.val.co, name:newname, off:msg.val.hasOwnProperty("off") ? msg.val.off : false}); + } + nl.drew.cp.core.cache.nowProxyAllClean(); + nl.drew.cp.ls.set("uproxys", nl.drew.cp.state.uproxys, false); + nl.drew.cp.core.filter.inst(); + } + } else { + if (msg.param == "liston") { + if (typeof msg.val != "undefined") { + nl.drew.cp.core.lib.liston(msg.val); + nl.drew.cp.core.api.postMessage({param:"lists", val:nl.drew.cp.core.lib.globalListGen()}); + } + } else { + if (msg.param == "listoff") { + if (typeof msg.val != "undefined") { + nl.drew.cp.core.lib.listoff(msg.val); + } + } else { + if (msg.param == "listonrest") { + if (typeof msg.val != "undefined") { + nl.drew.cp.core.lib.liston(msg.val, true); + } + } else { + if (msg.param == "listonremove") { + if (typeof msg.val != "undefined") { + var nosend = false; + if (typeof msg.val.nosend != "undefined") { + nosend = msg.val.nosend; + } + nl.drew.cp.core.lib.listoff(msg.val.host, true, nosend); + } + } else { + if (msg.param == "listoffrest") { + if (typeof msg.val != "undefined") { + if (nl.drew.cp.core.lib.inOffSiteListAllParam(msg.val) == -1) { + nl.drew.cp.state.offlist.push(msg.val); + } + } + nl.drew.cp.core.cache.nowProxyClean({host:msg.val}); + } else { + if (msg.param == "listoffremove") { + if (typeof msg.val != "undefined") { + lid = nl.drew.cp.core.lib.inOffSiteListAllParam(msg.val); + if (lid == -1) { + return; + } + nl.drew.cp.state.offlist.splice(lid, 1); + nl.drew.cp.ls.set("offlist", nl.drew.cp.state.offlist, false); + nl.drew.cp.core.cache.nowProxyClean({host:msg.val}); + } + } else { + if (msg.param == "globalalwproxy") { + if (typeof msg.val != "undefined") { + nl.drew.cp.state.alwProxy = msg.val; + nl.drew.cp.ls.set("globalalwproxy", nl.drew.cp.state.alwProxy, false); + nl.drew.cp.core.cache.nowProxyAllClean(); + nl.drew.cp.core.filter.inst(); + } + } else { + if (msg.param == "contrymain") { + if (typeof msg.val != "undefined" && msg.val) { + nl.drew.cp.state.contryMain = msg.val; + nl.drew.cp.ls.set("contrymain", nl.drew.cp.state.contryMain, false); + nl.drew.cp.core.cache.nowProxyAllClean(); + nl.drew.cp.core.filter.inst(); + } + } else { + if (msg.param == "tor") { + if (typeof msg.val != "undefined") { + if (typeof msg.val.all != "undefined") { + nl.drew.cp.state.torAll = msg.val.all; + nl.drew.cp.ls.set("torall", nl.drew.cp.state.torAll, false); + } + nl.drew.cp.core.api.sendtoPortAnonymitynow(); + } + } else { + if (msg.param == "torsite") { + if (typeof msg.val != "undefined" && typeof msg.val.host != "undefined" && msg.val.host) { + chrome.tabs.getSelected(null, function(tab) { + var purl = nl.drew.cp.lib.parseUrl(tab.url); + if ((typeof msg.val.list == "undefined" || !msg.val.list) && (!purl.allow || msg.val.host != purl.host)) { + return; + } + if (msg.val.val) { + if (nl.drew.cp.core.lib.inTorSiteList(msg.val.host) > -1) { + return; + } + nl.drew.cp.state.listTorSite.push(msg.val.host); + } else { + var ind = nl.drew.cp.core.lib.inTorSiteList(msg.val.host); + if (ind == -1) { + return; + } + nl.drew.cp.state.listTorSite.splice(ind, 1); + } + nl.drew.cp.ls.set("torSite", nl.drew.cp.state.listTorSite, false); + nl.drew.cp.core.interf.icoupdate7(tab.url); + nl.drew.cp.core.api.sendtoPortAnonymitynow(msg.val); + }); + } + } else { + if (msg.param == "anonymity") { + if (typeof msg.val != "undefined") { + if (typeof msg.val.all != "undefined") { + nl.drew.cp.state.anonymityAll = msg.val.all; + nl.drew.cp.ls.set("anonymityall", nl.drew.cp.state.anonymityAll, false); + } + nl.drew.cp.core.api.sendtoPortAnonymitynow(); + } + } else { + if (msg.param == "anonymitysite") { + if (typeof msg.val != "undefined" && typeof msg.val.host != "undefined" && msg.val.host) { + chrome.tabs.getSelected(null, function(tab) { + var purl = nl.drew.cp.lib.parseUrl(tab.url); + if ((typeof msg.val.list == "undefined" || !msg.val.list) && (!purl.allow || msg.val.host != purl.host)) { + return; + } + if (msg.val.val) { + if (nl.drew.cp.core.lib.inAnSiteList(msg.val.host) > -1) { + return; + } + nl.drew.cp.state.listAnSite.push(msg.val.host); + } else { + var ind = nl.drew.cp.core.lib.inAnSiteList(msg.val.host); + if (ind == -1) { + return; + } + nl.drew.cp.state.listAnSite.splice(ind, 1); + } + lid = nl.drew.cp.core.lib.checkListOnOff(msg.val.host); + if (lid > -1) { + nl.drew.cp.state.offlist.splice(lid, 1); + } + nl.drew.cp.ls.set("anSite", nl.drew.cp.state.listAnSite, false); + var nosend = false; + if (typeof msg.val.nosend != "undefined") { + nosend = msg.val.nosend; + } + if (!nosend) { + nl.drew.cp.core.api.sendtoPortAnonymitynow(msg.val); + } + nl.drew.cp.core.api.sendList(msg.val.listRequest, msg.val.host); + }); + } + } else { + if (msg.param == "nonproxy") { + if (typeof msg.val != "undefined" && typeof msg.val.host != "undefined" && msg.val.host) { + chrome.tabs.getSelected(null, function(tab) { + var purl = nl.drew.cp.lib.parseUrl(tab.url); + nl.drew.cp.core.cache.nowProxyClean(purl); + if ((typeof msg.val.list == "undefined" || !msg.val.list) && (!purl.allow || msg.val.host != purl.host)) { + return; + } + if (msg.val.val) { + if (nl.drew.cp.core.lib.inNonProxySiteList(msg.val.host) > -1) { + return; + } + nl.drew.cp.state.listNonProxySite.push(msg.val.host); + var ind = nl.drew.cp.core.lib.inAlwProxySiteList(msg.val.host); + if (ind > -1) { + nl.drew.cp.state.listAlwProxySite.splice(ind, 1); + } + } else { + var ind = nl.drew.cp.core.lib.inNonProxySiteList(msg.val.host); + if (ind == -1) { + return; + } + nl.drew.cp.state.listNonProxySite.splice(ind, 1); + } + lid = nl.drew.cp.core.lib.checkListOnOff(msg.val.host); + if (lid > -1) { + nl.drew.cp.state.offlist.splice(lid, 1); + } + nl.drew.cp.ls.set("alwProxySite", nl.drew.cp.state.listAlwProxySite, false); + nl.drew.cp.ls.set("nonProxySite", nl.drew.cp.state.listNonProxySite, false); + nl.drew.cp.core.filter.inst(); + var nosend = false; + if (typeof msg.val.nosend != "undefined") { + nosend = msg.val.nosend; + } + if (!nosend) { + nl.drew.cp.core.api.sendtoPortInProxyList(msg.val); + } + nl.drew.cp.core.api.sendList(msg.val.listRequest, msg.val.host); + }); + } + } else { + if (msg.param == "alwproxy") { + if (typeof msg.val != "undefined" && typeof msg.val.host != "undefined" && msg.val.host) { + chrome.tabs.getSelected(null, function(tab) { + var purl = nl.drew.cp.lib.parseUrl(tab.url); + nl.drew.cp.core.cache.nowProxyClean(purl); + if ((typeof msg.val.list == "undefined" || !msg.val.list) && (!purl.allow || msg.val.host != purl.host)) { + return; + } + if (msg.val.val) { + if (nl.drew.cp.core.lib.inAlwProxySiteListEqually(msg.val.host) > -1) { + return; + } + nl.drew.cp.state.listAlwProxySite.push(msg.val.host); + var ind = nl.drew.cp.core.lib.inNonProxySiteList(msg.val.host); + if (ind > -1) { + nl.drew.cp.state.listNonProxySite.splice(ind, 1); + } + } else { + var ind = nl.drew.cp.core.lib.inAlwProxySiteListEqually(msg.val.host); + if (ind == -1) { + return; + } + nl.drew.cp.state.listAlwProxySite.splice(ind, 1); + } + lid = nl.drew.cp.core.lib.checkListOnOff(msg.val.host); + if (lid > -1) { + nl.drew.cp.state.offlist.splice(lid, 1); + } + nl.drew.cp.ls.set("alwProxySite", nl.drew.cp.state.listAlwProxySite, false); + nl.drew.cp.ls.set("nonProxySite", nl.drew.cp.state.listNonProxySite, false); + nl.drew.cp.core.filter.inst(); + var nosend = false; + if (typeof msg.val.nosend != "undefined") { + nosend = msg.val.nosend; + } + if (!nosend) { + nl.drew.cp.core.api.sendtoPortInProxyList(msg.val); + } + nl.drew.cp.core.api.sendList(msg.val.listRequest, msg.val.host); + }); + } + } else { + if (msg.param == "contrysite") { + if (typeof msg.val != "undefined" && typeof msg.val.host != "undefined" && msg.val.host) { + chrome.tabs.getSelected(null, function(tab) { + var purl = nl.drew.cp.lib.parseUrl(tab.url); + nl.drew.cp.core.cache.nowProxyClean(purl); + if ((typeof msg.val.list == "undefined" || !msg.val.list) && (!purl.allow || msg.val.host != purl.host)) { + return; + } + var key = msg.val.val; + if (key != "main") { + nl.drew.cp.core.lib.delContrySiteList(msg.val.host); + if (typeof nl.drew.cp.state.listContrySite[key] == "undefined") { + nl.drew.cp.state.listContrySite[key] = []; + } + nl.drew.cp.state.listContrySite[key].push(msg.val.host); + } else { + nl.drew.cp.core.lib.delContrySiteList(msg.val.host); + } + lid = nl.drew.cp.core.lib.checkListOnOff(msg.val.host); + if (lid > -1) { + nl.drew.cp.state.offlist.splice(lid, 1); + } + nl.drew.cp.ls.set("contrySiteList", nl.drew.cp.state.listContrySite, false); + nl.drew.cp.core.proxy.getNowProxy(null, purl, true, true); + nl.drew.cp.core.filter.inst(); + var nosend = false; + if (typeof msg.val.nosend != "undefined") { + nosend = msg.val.nosend; + } + if (!nosend) { + nl.drew.cp.core.api.sendtoPortInProxyList(msg.val); + if (typeof msg.val.list != "undefined" && msg.val.list) { + nl.drew.cp.core.api.sendtoPortContrys(msg.val); + } + nl.drew.cp.core.api.sendtoPortAnonymitynow(msg.val); + } + nl.drew.cp.core.api.sendList(msg.val.listRequest, msg.val.host); + }); + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } else { + if (msg.msg == "get") { + if (msg.param == "https") { + port.postMessage({param:"https", val:nl.drew.cp.state.https}); + } else { + if (msg.param == "globalalwproxy") { + port.postMessage({param:"globalalwproxy", val:nl.drew.cp.state.alwProxy}); + } else { + if (msg.param == "isenabled") { + port.postMessage({param:"isenabled", val:nl.drew.cp.state.isenabled}); + } else { + if (msg.param == "state") { + port.postMessage({param:"state", val:nl.drew.cp.state.state}); + } else { + if (msg.param == "uproxy") { + port.postMessage({param:"uproxy", val:{uproxy:nl.drew.cp.state.uproxys, template:nl.drew.cp.config.proxyTemplate}}); + } else { + if (msg.param == "mainproxy") { + nl.drew.cp.core.api.sendtoPortMainproxy(); + } else { + if (msg.param == "contrys") { + nl.drew.cp.core.api.sendtoPortContrys(msg.val); + } else { + if (msg.param == "anonymity") { + nl.drew.cp.core.api.sendtoPortAnonymity(msg.val); + } else { + if (msg.param == "anonymitynow") { + nl.drew.cp.core.api.sendtoPortAnonymitynow(msg.val); + } else { + if (msg.param == "tor") { + nl.drew.cp.core.api.sendtoPortTor(msg.val); + } else { + if (msg.param == "nonproxyalwproxy") { + nl.drew.cp.core.api.sendtoPortInProxyList(msg.val); + } else { + if (msg.param == "lists") { + nl.drew.cp.core.api.sendList(true); + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + } + }; + api.sendList = function(isSend, host) { + if (!isSend) { + return; + } + nl.drew.cp.core.api.postMessage({param:"lists", val:nl.drew.cp.core.lib.globalListGen(), host:host}); + }; + api.sendtoPortInProxyList = function(val) { + if (nl.drew.cp.core.api.port) { + chrome.tabs.getSelected(null, function(tab) { + var purl = nl.drew.cp.lib.parseUrl(tab.url); + purl.host = nl.drew.cp.core.api.preSendtoPort(val, purl); + nl.drew.cp.core.api.postMessage({param:"nonproxyalwproxy", val:{host:purl.host, nonproxy:nl.drew.cp.core.lib.inNonProxySiteList(purl.host), alwproxy:nl.drew.cp.core.lib.inAlwProxySiteList(purl.host)}}); + }); + } + }; + api.sendtoPortAnonymitynow = function(val) { + if (nl.drew.cp.core.api.port) { + chrome.tabs.getSelected(null, function(tab) { + var purl = nl.drew.cp.lib.parseUrl(tab.url); + purl.host = nl.drew.cp.core.api.preSendtoPort(val, purl); + var nowProxy = nl.drew.cp.core.proxy.getNowProxy(null, purl, true, true); + if (nowProxy && nowProxy.co.length > 2) { + nl.drew.cp.core.api.postMessage({param:"anonymitynow", val:[false, false]}); + } else { + nl.drew.cp.core.api.postMessage({param:"anonymitynow", val:[nl.drew.cp.core.header.getAnonymityNow(purl.host), nl.drew.cp.core.header.getTorNow(purl.host)]}); + } + nl.drew.cp.core.interf.icoupdate7(tab.url); + }); + } + }; + api.sendtoPortAnonymity = function(val) { + if (nl.drew.cp.core.api.port) { + chrome.tabs.getSelected(null, function(tab) { + var purl = nl.drew.cp.lib.parseUrl(tab.url); + purl.host = nl.drew.cp.core.api.preSendtoPort(val, purl); + nl.drew.cp.core.api.postMessage({param:"anonymity", val:nl.drew.cp.core.header.getAnonymity(purl.host)}); + }); + } + }; + api.sendtoPortTor = function(val) { + if (nl.drew.cp.core.api.port) { + chrome.tabs.getSelected(null, function(tab) { + var purl = nl.drew.cp.lib.parseUrl(tab.url); + purl.host = nl.drew.cp.core.api.preSendtoPort(val, purl); + nl.drew.cp.core.api.postMessage({param:"tor", val:nl.drew.cp.core.header.getTor(purl.host)}); + }); + } + }; + api.sendtoPortState = function() { + nl.drew.cp.core.api.postMessage({param:"state", val:nl.drew.cp.state.state}); + }; + api.sendtoPortMainproxy = function(nowProxys) { + if (nl.drew.cp.core.api.port) { + chrome.tabs.getSelected(null, function(tab) { + if (nl.drew.cp.state.started) { + var purl = nl.drew.cp.lib.parseUrl(tab.url); + var nowProxy = {}; + if (nl.drew.cp.state.alwProxy) { + nowProxy = {name:" proxy server", co:"public", allow:true}; + } else { + nowProxy = nl.drew.cp.core.proxy.getNowProxy(nowProxys, purl, true, true); + } + if (purl.allow && nowProxy == null) { + nowProxy = {host:purl.host}; + } + nl.drew.cp.core.interf.icoupdate7(tab.url); + nl.drew.cp.core.api.sendtoPort({param:"mainproxy", val:nowProxy}); + } else { + nl.drew.cp.core.api.postMessage({param:"mainproxy", val:false}); + } + }); + } + }; + api.sendtoPortContrys = function(val) { + if (nl.drew.cp.core.api.port) { + chrome.tabs.getSelected(null, function(tab) { + var purl = nl.drew.cp.lib.parseUrl(tab.url); + purl.host = nl.drew.cp.core.api.preSendtoPort(val, purl); + nl.drew.cp.core.api.postMessage({param:"contrys", val:{contrys:nl.drew.cp.state.contrys, uproxys:nl.drew.cp.state.uproxys, contrymain:nl.drew.cp.state.contryMain, contrysite:nl.drew.cp.core.lib.inContrySiteList(purl.host), host:purl.host}}); + }); + } + }; + api.preSendtoPort = function(val, purl) { + if ((!val || typeof val.list == "undefined" || !val.list) && !purl.allow) { + return ""; + } else { + if (val && typeof val.list != "undefined" && val.list) { + return val.host; + } else { + if (!val || typeof val.host == "undefined" || !val.host) { + return purl.host; + } else { + if (val.host != purl.host) { + return ""; + } + } + } + } + return purl.host; + }; + api.sendtoPort = function(msg) { + nl.drew.cp.core.api.postMessage(msg); + }; + api.postMessage = function(msg) { + if (nl.drew.cp.core.api.port) { + try { + nl.drew.cp.core.api.port.postMessage(msg); + } catch (err) { + } + } + }; + return api; +}(); + diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/cache.js b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/cache.js new file mode 100755 index 0000000..24acf9f --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/cache.js @@ -0,0 +1,13 @@ +nl.drew.cp.core.cache = function() { + var cache = {}; + cache.nowProxyAllClean = function() { + nl.drew.cp.state.nowProxyCache = {}; + }; + cache.nowProxyClean = function(purl) { + if (typeof purl.host != "undefined" && purl.host) { + delete nl.drew.cp.state.nowProxyCache[purl.host]; + } + }; + return cache; +}(); + diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/conf.js b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/conf.js new file mode 100755 index 0000000..ace98c3 --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/conf.js @@ -0,0 +1,185 @@ +nl.drew.cp.core.conf = function() { + var conf = {}; + conf.getApiUrl = function() { + if (nl.drew.cp.ls.isset("conf")) { + var conf = nl.drew.cp.ls.get("conf"); + if (conf) { + if (typeof conf.Apiurl != "undefined" && conf.Apiurl.length > 0) { + nl.drew.cp.config.apiurl = conf.Apiurl; + } + if (typeof conf.Apiext != "undefined" && conf.Apiext.length > 0) { + nl.drew.cp.config.apiext = conf.Apiext; + } + if (typeof conf.Apiind != "undefined" && conf.Apiind.length > 0) { + nl.drew.cp.config.apiind = conf.Apiind; + } + if (typeof conf.Apidop != "undefined" && conf.Apidop.length > 0) { + nl.drew.cp.config.apidop = conf.Apidop; + } + } + } + var ret = new Array; + var uriapi; + for (var i in nl.drew.cp.config.apiurl) { + for (var j in nl.drew.cp.config.apiext) { + for (var k in nl.drew.cp.config.apiind) { + uriapi = nl.drew.cp.config.apiurl[i] + nl.drew.cp.config.apiind[k] + "." + nl.drew.cp.config.apiext[j]; + ret.push("https://" + uriapi + "/"); + } + } + } + nl.drew.cp.state.allApiUrls = ret; + nl.drew.cp.state.allApiUrls = nl.drew.cp.state.allApiUrls.concat(nl.drew.cp.config.apidop); + }; + conf.preLoadConfigFromServer = function(callback) { + if (!nl.drew.cp.state.isenabled) { + if (callback != null) { + callback(); + } + return; + } + nl.drew.cp.state.loadConfigFailCount = 0; + var allapiurlsLen = nl.drew.cp.state.allApiUrls.length; + if (allapiurlsLen < 1) { + nl.drew.cp.lib.debug("+++++++ crome-proxy +++++++ no api urls"); + return null; + } + var ind = Math.random() * allapiurlsLen; + ind = ind ^ 0; + nl.drew.cp.state.apiUrl = nl.drew.cp.state.allApiUrls[ind]; + conf.loadConfigFromServer(callback, ind); + }; + conf.loadLocalConfig = function() { + if (nl.drew.cp.ls.isset("isenabled")) { + nl.drew.cp.state.isenabled = nl.drew.cp.ls.get("isenabled", false); + } else { + nl.drew.cp.state.isenabled = nl.drew.cp.config.isenabled; + } + if (nl.drew.cp.state.isenabled) { + if (nl.drew.cp.ls.isset("authHeader") && nl.drew.cp.ls.isset("authHeaderEnd")) { + nl.drew.cp.state.authHeader = nl.drew.cp.ls.get("authHeader", "96W3tAJeY40DufpX"); + nl.drew.cp.state.authHeaderEnd = nl.drew.cp.ls.get("authHeaderEnd", false); + } + if (nl.drew.cp.ls.isset("contrymain")) { + var contrymain = nl.drew.cp.ls.get("contrymain", false); + if (contrymain) { + nl.drew.cp.state.contryMain = contrymain; + } + } + if (nl.drew.cp.ls.isset("globalalwproxy")) { + nl.drew.cp.state.alwProxy = nl.drew.cp.ls.get("globalalwproxy", false); + } + if (nl.drew.cp.ls.isset("anonymityall")) { + nl.drew.cp.state.anonymityAll = nl.drew.cp.ls.get("anonymityall", false); + } + if (nl.drew.cp.ls.isset("contrySiteList")) { + nl.drew.cp.state.listContrySite = nl.drew.cp.ls.get("contrySiteList", false); + } + if (nl.drew.cp.ls.isset("alwProxySite")) { + nl.drew.cp.state.listAlwProxySite = nl.drew.cp.ls.get("alwProxySite", false); + } + if (nl.drew.cp.ls.isset("nonProxySite")) { + nl.drew.cp.state.listNonProxySite = nl.drew.cp.ls.get("nonProxySite", false); + } + if (nl.drew.cp.ls.isset("anSite")) { + nl.drew.cp.state.listAnSite = nl.drew.cp.ls.get("anSite", false); + } + if (nl.drew.cp.ls.isset("torSite")) { + nl.drew.cp.state.listTorSite = nl.drew.cp.ls.get("torSite", false); + } + if (nl.drew.cp.ls.isset("offlist")) { + nl.drew.cp.state.offlist = nl.drew.cp.ls.get("offlist", false); + } + if (nl.drew.cp.ls.isset("uproxys")) { + nl.drew.cp.state.uproxys = nl.drew.cp.ls.get("uproxys", false); + } + nl.drew.cp.core.proxy.loadLocalProxy(); + } + }; + conf.clearConfigTimer = function() { + if (nl.drew.cp.state.loadConfigUpdTimer) { + clearTimeout(nl.drew.cp.state.loadConfigUpdTimer); + nl.drew.cp.state.loadConfigUpdTimer = null; + } + }; + conf.startConfigTimer = function(callback) { + nl.drew.cp.state.loadConfigUpdTimer = setTimeout(function startLoadConfig() { + nl.drew.cp.core.conf.preLoadConfigFromServer(callback); + }, nl.drew.cp.config.loadConfigUpdT); + }; + conf.startConfigTimer3 = function() { + nl.drew.cp.state.loadConfigUpdTimer = setTimeout(function startLoadConfig() { + nl.drew.cp.core.conf.loadConfigFromServer(); + }, nl.drew.cp.config.loadConfigUpdT3); + }; + conf.loadConfigFromServer = function(callback, ind) { + var apiUrl = nl.drew.cp.state.apiUrl; + if (!apiUrl) { + nl.drew.cp.lib.debug("+++++++ crome-proxy +++++++ no api url"); + return null; + } + var onFail = function() { + var allapiurlsLen = nl.drew.cp.state.allApiUrls.length; + nl.drew.cp.state.loadConfigFailCount++; + if (ind !== null) { + ind++; + if (ind >= allapiurlsLen) { + ind = 0; + } + nl.drew.cp.state.apiUrl = nl.drew.cp.state.allApiUrls[ind]; + if (nl.drew.cp.state.loadConfigFailCount >= allapiurlsLen) { + nl.drew.cp.state.loadConfigFailCountt = 0; + conf.loadConfigFromServer(callback, null); + nl.drew.cp.core.interf.icoupdate(); + } else { + conf.loadConfigFromServer(callback, ind); + } + return null; + } else { + nl.drew.cp.core.conf.clearConfigTimer(); + nl.drew.cp.core.conf.startConfigTimer(callback); + } + }; + nl.drew.cp.lib.ReqJson(apiUrl + nl.drew.cp.config.api + "?crome-proxy-ywPHzueGrJX4vLYmC6Zj8TpotBacbgEf", 1E4, function(response) { + nl.drew.cp.core.conf.serverRespParse(response); + if (callback != null) { + callback(); + } + nl.drew.cp.core.conf.clearConfigTimer(); + nl.drew.cp.core.conf.startConfigTimer3(); + }, onFail, onFail, "POST", "ip=" + encodeURIComponent(nl.drew.cp.state.ip) + "&s=" + encodeURIComponent(nl.drew.cp.state.lastUpdate) + "&sk=" + encodeURIComponent(nl.drew.cp.state.lastUpdateKey)); + }; + conf.serverRespParse = function(response) { + var responseJSON = {}; + try { + responseJSON = JSON.parse(response); + } catch (e) { + nl.drew.cp.lib.debug("+++++++ crome-proxy +++++++ can't parse"); + return null; + } + if (typeof responseJSON.Key != "undefined" && responseJSON.Key && typeof responseJSON.KeyD != "undefined" && typeof responseJSON.Now != "undefined") { + nl.drew.cp.state.authHeader = responseJSON.Key; + nl.drew.cp.state.authHeaderEnd = responseJSON.KeyD + (nl.drew.cp.lib.time() - responseJSON.Now); + nl.drew.cp.ls.set("authHeader", nl.drew.cp.state.authHeader, "96W3tAJeY40DufpX"); + nl.drew.cp.ls.set("authHeaderEnd", nl.drew.cp.state.authHeaderEnd, false); + } + if (typeof responseJSON.Proxy != "undefined" && Object.prototype.toString.call(responseJSON.Proxy) === "[object Array]") { + nl.drew.cp.core.proxy.fromServerParser(responseJSON.Proxy); + } else { + if (typeof responseJSON.ProxyStat != "undefined") { + nl.drew.cp.core.proxy.setProxysCh(responseJSON.ProxyStat); + nl.drew.cp.core.proxy.setMainProxys(); + } + } + if (typeof responseJSON.Conf != "undefined" && responseJSON.Conf) { + } + if (typeof responseJSON.S != "undefined" && responseJSON.S) { + nl.drew.cp.state.lastUpdate = responseJSON.S; + } + if (typeof responseJSON.KeyD != "undefined" && responseJSON.KeyD) { + nl.drew.cp.state.lastUpdateKey = responseJSON.KeyD; + } + }; + return conf; +}(); + diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/core.js b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/core.js new file mode 100755 index 0000000..d44e416 --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/core.js @@ -0,0 +1,118 @@ +nl.drew.cp.core.main = function() { + var main = {}; + main.firstStart = function() { + chrome.runtime.onConnect.addListener(function(port) { + port.onMessage.addListener(function(msg) { + nl.drew.cp.core.api.handling(port, msg); + }); + }); + nl.drew.cp.state.icon = new iconAnimator("im/ico38-2.png"); + nl.drew.cp.state.iconoff = new iconAnimator("im/ico19g-2.png"); + chrome.tabs.onActivated.addListener(function onActTabs(info) { + nl.drew.cp.core.interf.icoupdate71(info.tabId); + }); + chrome.webRequest.onCompleted.addListener(function onCompleted(details) { + if (details.url) { + nl.drew.cp.core.interf.icoupdate7(details.url); + } + }, {urls:["http://*/*", "https://*/*", "ftp://*/*", "file://*/*"], types:["main_frame"]}); + nl.drew.cp.core.main.start(); + }; + main.onProxyError = function(details) { + if (details && typeof details.levelOfControl != "undefined" && details.levelOfControl != "controllable_by_this_extension" && details.levelOfControl != "controlled_by_this_extension") { + nl.drew.cp.state.started = null; + nl.drew.cp.core.main.started(false); + return false; + } else { + chrome.proxy.settings.get({"incognito":false}, function(details) { + if (details && typeof details.levelOfControl != "undefined" && details.levelOfControl != "controllable_by_this_extension" && details.levelOfControl != "controlled_by_this_extension") { + nl.drew.cp.state.started = null; + nl.drew.cp.core.main.started(false); + return false; + } + }); + } + if (!nl.drew.cp.state.timerCheckProxy) { + nl.drew.cp.state.timerCheckProxy = setInterval(nl.drew.cp.core.main.onProxyError, 7E3); + } + }; + main.start = function(needEnabled) { + chrome.proxy.settings.get({"incognito":false}, function(details) { + nl.drew.cp.core.main.onProxyError(details); + if (needEnabled) { + nl.drew.cp.state.isenabled = true; + nl.drew.cp.ls.set("isenabled", true, false); + } + if (nl.drew.cp.state.started !== null && !nl.drew.cp.state.started) { + nl.drew.cp.state.started = null; + nl.drew.cp.state.state = {text:"Starting...", cl:"uk-text-success", blink:true}; + nl.drew.cp.core.api.sendtoPortState(); + nl.drew.cp.core.conf.loadLocalConfig(); + if (nl.drew.cp.state.isenabled) { + nl.drew.cp.core.header.inst(); + var proxyObjKeys = Object.keys(nl.drew.cp.state.proxys); + if (proxyObjKeys.length > 1 && nl.drew.cp.state.authHeader.length > 0 && nl.drew.cp.state.authHeaderEnd > nl.drew.cp.lib.time()) { + nl.drew.cp.core.proxy.setMainProxys(); + nl.drew.cp.core.filter.inst(function() { + nl.drew.cp.core.main.started(true); + nl.drew.cp.core.conf.getApiUrl(); + nl.drew.cp.core.conf.preLoadConfigFromServer(function() { + nl.drew.cp.core.filter.inst(nl.drew.cp.core.interf.icoupdate71); + }); + }); + } else { + nl.drew.cp.core.conf.getApiUrl(); + nl.drew.cp.core.conf.preLoadConfigFromServer(function() { + nl.drew.cp.core.proxy.setMainProxys(); + nl.drew.cp.core.filter.inst(function() { + nl.drew.cp.core.main.started(true); + }); + }); + } + } else { + nl.drew.cp.core.main.started(false); + } + } else { + nl.drew.cp.core.interf.icoupdate(); + } + }); + }; + main.stop = function() { + nl.drew.cp.state.isenabled = false; + nl.drew.cp.ls.set("isenabled", false, false); + if (nl.drew.cp.state.started !== null && nl.drew.cp.state.started) { + nl.drew.cp.state.started = null; + nl.drew.cp.core.filter.uninst(function() { + }); + nl.drew.cp.core.header.uninst(); + nl.drew.cp.core.main.started(false); + } + if (nl.drew.cp.state.timerCheckProxy) { + clearInterval(nl.drew.cp.state.timerCheckProxy); + } + nl.drew.cp.state.timerCheckProxy = null; + }; + main.started = function(flag) { + if (flag) { + nl.drew.cp.state.state = {text:"Ok", cl:"uk-text-success", blink:false}; + nl.drew.cp.core.api.sendtoPortState(); + nl.drew.cp.state.started = true; + nl.drew.cp.core.interf.icoupdate71(); + } else { + nl.drew.cp.state.state = {text:"Off", cl:"uk-text-muted", blink:false}; + nl.drew.cp.core.api.sendtoPortState(); + nl.drew.cp.core.api.sendtoPortContrys(); + nl.drew.cp.core.interf.icoupdate(); + nl.drew.cp.state.started = false; + nl.drew.cp.core.api.sendtoPortMainproxy(); + } + }; + return main; +}(); +window.addEventListener("load", function load(event) { + window.removeEventListener("load", load, false); + setTimeout(nl.drew.cp.core.main.firstStart, 1); +}, false); +window.addEventListener("close", function load(event) { +}, false); + diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/header.js b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/header.js new file mode 100755 index 0000000..ede431a --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/header.js @@ -0,0 +1,96 @@ +nl.drew.cp.core.header = function() { + var header = {}; + header.inst = function() { + nl.drew.cp.core.header.uninst(); + chrome.webRequest.onHeadersReceived.addListener(nl.drew.cp.core.header.onResponse, {urls:["http://*/*"]}); + chrome.webRequest.onBeforeSendHeaders.addListener(nl.drew.cp.core.header.listener, {urls:["http://*/*"]}, ["requestHeaders", "blocking"]); + }; + header.uninst = function() { + if (chrome.webRequest.onBeforeSendHeaders.hasListener(nl.drew.cp.core.header.listener)) { + chrome.webRequest.onBeforeSendHeaders.removeListener(nl.drew.cp.core.header.listener); + } + if (chrome.webRequest.onHeadersReceived.hasListener(nl.drew.cp.core.header.onResponse)) { + chrome.webRequest.onHeadersReceived.removeListener(nl.drew.cp.core.header.onResponse); + } + }; + header.listener = function(details) { + var auth = ""; + var name = ""; + var purl = nl.drew.cp.lib.parseUrl(details.url); + if (!purl.allow) { + return{requestHeaders:details.requestHeaders}; + } + var nowProxy = nl.drew.cp.core.proxy.getNowProxy(null, purl, true, false); + if (!nowProxy) { + return{requestHeaders:details.requestHeaders}; + } + if (nowProxy.co.length == 2) { + name = "Proxy-Authorization"; + if (nl.drew.cp.core.header.getTorNow(purl.host) || nl.drew.cp.state.alwProxy) { + auth = nl.drew.cp.state.authHeader[2]; + } else { + if (nl.drew.cp.core.header.getAnonymityNow(purl.host)) { + auth = nl.drew.cp.state.authHeader[1]; + } else { + auth = nl.drew.cp.state.authHeader[0]; + } + } + } else { + if (nowProxy.ip == "proxy.googlezip.net" || nowProxy.ip == "compress.googlezip.net" || nowProxy.ip == "74.125.205.211") { + name = "Chrome-Proxy"; + auth = nl.drew.cp.core.header.authGoogleHeader(); + } + } + if (name) { + details.requestHeaders.push({name:name, value:auth}); + } + return{requestHeaders:details.requestHeaders}; + }; + header.getAnonymityNow = function(host) { + var ret = false; + if (nl.drew.cp.state.anonymityAll) { + return true; + } + if (nl.drew.cp.core.lib.inAnSiteList(host) > -1) { + return true; + } + return ret; + }; + header.getTorNow = function(host) { + var ret = false; + if (nl.drew.cp.state.torAll) { + return true; + } + if (nl.drew.cp.core.lib.inTorSiteList(host) > -1) { + return true; + } + return ret; + }; + header.getTor = function(host) { + var ret = {all:null, site:null, url:null}; + ret.all = nl.drew.cp.state.torAll; + if (host) { + ret.site = nl.drew.cp.core.lib.inTorSiteList(host) > -1; + } + return ret; + }; + header.getAnonymity = function(host) { + var ret = {all:null, site:null, url:null}; + ret.all = nl.drew.cp.state.anonymityAll; + if (host) { + ret.site = nl.drew.cp.core.lib.inAnSiteList(host) > -1; + ret.host = host; + } + return ret; + }; + header.authGoogleHeader = function() { + var authValue = "ac4500dd3b7579186c1b0620614fdb1f7d61f944"; + var timestamp = Date.now().toString().substring(0, 10); + var chromeVersion = navigator.appVersion.match(/Chrome\/(\d+)\.(\d+)\.(\d+)\.(\d+)/); + return "ps=" + timestamp + "-" + Math.floor(Math.random() * 1E9) + "-" + Math.floor(Math.random() * 1E9) + "-" + Math.floor(Math.random() * 1E9) + ", sid=" + nl.drew.cp.core.lib.MD5(timestamp + authValue + timestamp) + ", b=" + chromeVersion[3] + ", p=" + chromeVersion[4]; + }; + header.onResponse = function(response) { + }; + return header; +}(); + diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/interf.js b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/interf.js new file mode 100755 index 0000000..8c0c97d --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/interf.js @@ -0,0 +1,84 @@ +nl.drew.cp.core.interf = function() { + var interf = {}; + interf.icoupdate71 = function(tabid) { + var icoupd = function(tab) { + var url; + if (typeof tab.url != "undefined") { + url = tab.url; + nl.drew.cp.core.interf.icoupdate7(url); + } + }; + if (tabid) { + chrome.tabs.get(tabid, function(tab) { + icoupd(tab); + }); + } else { + chrome.tabs.getSelected(null, function(tab) { + icoupd(tab); + }); + } + }; + interf.icoupdate7 = function(url) { + var purl = nl.drew.cp.lib.parseUrl(url); + var nowproxy = nl.drew.cp.core.proxy.getNowProxy(null, purl, true, false); + if (nowproxy) { + var co = nowproxy.co; + if (purl.allow && co.length < 3 && nl.drew.cp.core.header.getTorNow(purl.host)) { + co = "tor"; + } + nl.drew.cp.core.interf.icoupdate3(co, purl.pathname); + } else { + nl.drew.cp.core.interf.icoupdate3(); + } + }; + interf.icoupdate3 = function(co, url) { + if (url) { + if (url.indexOf("_/chrome/newtab") != -1) { + co = false; + } + } + if (nl.drew.cp.lib.isNumeric(co)) { + co = false; + } + if (nl.drew.cp.state.isenabled && nl.drew.cp.state.started) { + if (co) { + if (nl.drew.cp.state.alwProxy) { + co = "public"; + } + nl.drew.cp.state.icon.setCo(co); + } else { + nl.drew.cp.state.icon.set(); + } + } else { + if (nl.drew.cp.state.started == null) { + nl.drew.cp.state.iconoff.setErr(); + } else { + nl.drew.cp.state.iconoff.set(); + } + } + }; + interf.icoupdate = function() { + if (nl.drew.cp.state.isenabled && nl.drew.cp.state.started) { + nl.drew.cp.state.icon.set(); + nl.drew.cp.state.icon.rotate(); + } else { + if (nl.drew.cp.state.started == null) { + nl.drew.cp.state.iconoff.setErr(); + } else { + nl.drew.cp.state.iconoff.set(); + nl.drew.cp.state.iconoff.rotate(); + } + } + }; + interf.icoupdate2 = function() { + if (nl.drew.cp.state.isenabled && nl.drew.cp.state.started) { + nl.drew.cp.state.icon.set(); + nl.drew.cp.state.icon.pulse2(); + } else { + nl.drew.cp.state.iconoff.set(); + nl.drew.cp.state.iconoff.pulse2(); + } + }; + return interf; +}(); + diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/lib.js b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/lib.js new file mode 100755 index 0000000..a4e319a --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/lib.js @@ -0,0 +1,463 @@ +nl.drew.cp.core.lib = function() { + var lib = {}; + lib.inTorSiteList = function(host) { + return this.isUriInAnyList(host, nl.drew.cp.state.listTorSite); + }; + lib.inAnSiteList = function(host) { + return this.isUriInAnyList(host, nl.drew.cp.state.listAnSite); + }; + lib.inAnSiteListEqually = function(host) { + return this.quickInArray2(host, nl.drew.cp.state.listAnSite); + }; + lib.inAlwProxySiteList = function(host) { + return this.isUriInAnyList(host, nl.drew.cp.state.listAlwProxySite); + }; + lib.inAlwProxySiteListEqually = function(host) { + return this.quickInArray2(host, nl.drew.cp.state.listAlwProxySite); + }; + lib.inNonProxySiteList = function(host) { + return this.isUriInAnyList(host, nl.drew.cp.state.listNonProxySite); + }; + lib.inNonProxySiteListEqually = function(host) { + return this.quickInArray2(host, nl.drew.cp.state.listNonProxySite); + }; + lib.inOffSiteList = function(host) { + return this.quickInArray(host, nl.drew.cp.state.offlist); + }; + lib.inUproxyList = function(co) { + var i = nl.drew.cp.state.uproxys.length; + while (i--) { + if (typeof nl.drew.cp.state.uproxys[i] == "undefined") { + continue; + } + if (nl.drew.cp.state.uproxys[i].co == co) { + return i; + } + } + return-1; + }; + lib.inOffSiteListAllParam = function(obj) { + var i = nl.drew.cp.state.offlist.length; + while (i--) { + if (typeof nl.drew.cp.state.offlist[i] == "undefined") { + continue; + } + if (nl.drew.cp.state.offlist[i].host == obj.host && nl.drew.cp.state.offlist[i].an == obj.an && nl.drew.cp.state.offlist[i].nonproxy == obj.nonproxy && nl.drew.cp.state.offlist[i].alwproxy == obj.alwproxy && nl.drew.cp.state.offlist[i].loc == obj.loc) { + return i; + } + } + return-1; + }; + lib.isUriInAnyList = function(host, list) { + var i, lenHost; + if (!host) { + return-1; + } + i = list.length; + while (i--) { + if (typeof list[i] == "undefined") { + continue; + } + if (list[i] == host) { + return i; + } else { + if (list[i][0] == "*") { + lenHost = -1 * (list[i].length - 2); + if (list[i].substr(lenHost) == host.substr(lenHost)) { + return i; + } + } + } + } + return-1; + }; + lib.delContrySiteList = function(host) { + if (host) { + var key; + var ind; + for (key in nl.drew.cp.state.listContrySite) { + if (!nl.drew.cp.state.listContrySite.hasOwnProperty(key)) { + continue; + } + if (nl.drew.cp.state.listContrySite[key].length < 1) { + continue; + } + ind = this.isUriInAnyList(host, nl.drew.cp.state.listContrySite[key]); + if (ind > -1) { + nl.drew.cp.state.listContrySite[key].splice(ind, 1); + } + } + } + }; + lib.inContrySiteList = function(host) { + if (host) { + var key; + var nowProxys = nl.drew.cp.core.proxy.getNowProxys(); + for (key in nl.drew.cp.state.listContrySite) { + if (!nl.drew.cp.state.listContrySite.hasOwnProperty(key)) { + continue; + } + if (nl.drew.cp.state.listContrySite[key].length < 1) { + continue; + } + if (this.isUriInAnyList(host, nl.drew.cp.state.listContrySite[key]) > -1) { + if (nowProxys.hasOwnProperty(key)) { + return key; + } + } + } + } + return "main"; + }; + lib.inContrySiteListEqually = function(host) { + if (host) { + var key; + for (key in nl.drew.cp.state.listContrySite) { + if (!nl.drew.cp.state.listContrySite.hasOwnProperty(key)) { + continue; + } + if (nl.drew.cp.state.listContrySite[key].length < 1) { + continue; + } + if (this.quickInArray2(host, nl.drew.cp.state.listContrySite[key]) > -1) { + return key; + } + } + } + return "main"; + }; + lib.quickInArray = function(it, arr) { + var i = arr.length; + while (i--) { + if (arr[i].host == it) { + return i; + } + } + return-1; + }; + lib.quickInArray2 = function(it, arr) { + var i = arr.length; + while (i--) { + if (typeof arr[i] == "undefined") { + continue; + } + if (arr[i] == it) { + return i; + } + } + return-1; + }; + lib.globalListGen = function() { + var retGlobal = []; + var i, findkey; + var listNonProxySite = nl.drew.cp.state.listNonProxySite.slice(); + var listAlwProxySite = nl.drew.cp.state.listAlwProxySite.slice(); + var offlist = nl.drew.cp.state.offlist.slice(); + while (i = offlist.shift()) { + retGlobal.push(i); + } + while (i = listNonProxySite.shift()) { + retGlobal.push({host:i, nonproxy:true, alwproxy:false, an:false, loc:"", del:false, off:false}); + } + while (i = listAlwProxySite.shift()) { + retGlobal.push({host:i, alwproxy:true, nonproxy:false, an:false, loc:"", del:false, off:false}); + } + var j = nl.drew.cp.state.listAnSite.length; + while (j--) { + if (typeof nl.drew.cp.state.listAnSite[j] == "undefined") { + continue; + } + if ((findkey = this.quickInArray(nl.drew.cp.state.listAnSite[j], retGlobal)) != -1) { + retGlobal[findkey].an = true; + } else { + retGlobal.push({host:nl.drew.cp.state.listAnSite[j], an:true, nonproxy:false, alwproxy:false, loc:"", del:false, off:false}); + } + } + var key; + for (key in nl.drew.cp.state.listContrySite) { + if (!nl.drew.cp.state.listContrySite.hasOwnProperty(key)) { + continue; + } + j = nl.drew.cp.state.listContrySite[key].length; + if (j < 1) { + continue; + } + while (j--) { + if (typeof nl.drew.cp.state.listContrySite[key][j] == "undefined") { + continue; + } + if ((findkey = this.quickInArray(nl.drew.cp.state.listContrySite[key][j], retGlobal)) != -1) { + retGlobal[findkey].loc = key; + } else { + retGlobal.push({host:nl.drew.cp.state.listContrySite[key][j], loc:key, nonproxy:false, alwproxy:false, an:false, del:false, off:false}); + } + } + } + var i = retGlobal.length; + while (i--) { + if (typeof retGlobal[i].par == "undefined") { + retGlobal[i].par = -1; + } + if (retGlobal[i].host[0] == "*") { + var lenHost = -1 * (retGlobal[i].host.length - 2); + var j = retGlobal.length; + while (j--) { + if (i != j) { + if (retGlobal[i].host.substr(lenHost) == retGlobal[j].host.substr(lenHost)) { + if (typeof retGlobal[j].par != "undefined" && retGlobal[j].par > -1) { + if (retGlobal[i].host.length > retGlobal[retGlobal[j].par].host.length) { + retGlobal[j].par = i; + } + } else { + retGlobal[j].par = i; + } + } + } + } + } + } + return retGlobal; + }; + lib.returnGen = function(nowProxy) { + var ret = "return 'DIRECT'"; + if (nowProxy) { + if (nowProxy.co.length == 2) { + ret = "if ( schema=='https' ) " + "return 'SOCKS5 " + nowProxy.ip + ":" + nowProxy.sport + "'; " + "else " + "return 'HTTPS " + nowProxy.ip + ":" + nowProxy.port + "'; "; + } else { + nowProxy.proto = nowProxy.proto.toUpperCase(); + ret = "return '" + nowProxy.proto + " " + nowProxy.ip + ":" + nowProxy.port + "'; "; + if (nowProxy.proto != "SOCKS5" && nowProxy.proto != "SOCKS") { + ret = "if ( schema=='http:' ) " + ret; + } + } + } + return ret; + }; + lib.searchInListCodeGen = function(listName, list, action) { + var ret; + if (list.length < 1) { + return " "; + } + var listJson = JSON.stringify(list); + ret = " var " + listName + " = " + listJson + "; " + "for (var i = 0, length = " + listName + ".length; i < length; i++) if (" + listName + ".hasOwnProperty(i)) {" + "if (" + listName + "[i]==host) {" + action + "break; } else {" + "if (" + listName + "[i][0] == '*') { " + "var lenHost = -1 * (" + listName + "[i].length - 2);" + "if (" + listName + "[i].substr(lenHost) == host.substr(lenHost)) {" + action + "break; }}}}"; + return ret; + }; + lib.checkListOnOff = function(host) { + var offiteam = {host:"", nonproxy:false, alwproxy:false, an:false, loc:"", del:false, off:true}; + var ch = false; + if (nl.drew.cp.core.lib.inAnSiteListEqually(host) > -1) { + ch = true; + offiteam.an = true; + } + var co = nl.drew.cp.core.lib.inContrySiteListEqually(host); + if (co != "main") { + offiteam.loc = co; + ch = true; + } + if (nl.drew.cp.core.lib.inAlwProxySiteListEqually(host) > -1) { + ch = true; + offiteam.alwproxy = true; + } + if (nl.drew.cp.core.lib.inNonProxySiteListEqually(host) > -1) { + ch = true; + offiteam.nonproxy = true; + } + if (ch) { + offiteam.host = host; + return nl.drew.cp.core.lib.inOffSiteListAllParam(offiteam); + } + return-1; + }; + lib.liston = function(val, onlsave) { + nl.drew.cp.core.cache.nowProxyClean(val); + if (!onlsave) { + var lid = nl.drew.cp.core.lib.inOffSiteListAllParam(val); + if (lid == -1) { + return; + } + } + var host = val.host; + this.listoff(host); + var ind; + if (val.an) { + if (nl.drew.cp.core.lib.inAnSiteListEqually(host) == -1) { + nl.drew.cp.state.listAnSite.push(host); + nl.drew.cp.ls.set("anSite", nl.drew.cp.state.listAnSite, false); + nl.drew.cp.core.api.sendtoPortAnonymitynow({host:host, list:true}); + nl.drew.cp.core.api.sendtoPortAnonymity({host:host, list:true}); + } + } + if (val.nonproxy) { + if (nl.drew.cp.core.lib.inNonProxySiteListEqually(host) == -1) { + nl.drew.cp.state.listNonProxySite.push(host); + } + ind = nl.drew.cp.core.lib.inAlwProxySiteListEqually(host); + if (ind > -1) { + nl.drew.cp.state.listAlwProxySite.splice(ind, 1); + } + nl.drew.cp.ls.set("alwProxySite", nl.drew.cp.state.listAlwProxySite, false); + nl.drew.cp.ls.set("nonProxySite", nl.drew.cp.state.listNonProxySite, false); + } else { + if (val.alwproxy) { + if (nl.drew.cp.core.lib.inAlwProxySiteListEqually(host) == -1) { + nl.drew.cp.state.listAlwProxySite.push(host); + } + ind = nl.drew.cp.core.lib.inNonProxySiteListEqually(host); + if (ind > -1) { + nl.drew.cp.state.listNonProxySite.splice(ind, 1); + } + nl.drew.cp.ls.set("alwProxySite", nl.drew.cp.state.listAlwProxySite, false); + nl.drew.cp.ls.set("nonProxySite", nl.drew.cp.state.listNonProxySite, false); + } + } + if (val.loc) { + if (val.loc != "main") { + nl.drew.cp.core.lib.delContrySiteList(host); + if (typeof nl.drew.cp.state.listContrySite[val.loc] == "undefined") { + nl.drew.cp.state.listContrySite[val.loc] = []; + } + nl.drew.cp.state.listContrySite[val.loc].push(host); + nl.drew.cp.ls.set("contrySiteList", nl.drew.cp.state.listContrySite, false); + nl.drew.cp.core.api.sendtoPortContrys({host:host, list:true}); + } + } + nl.drew.cp.core.filter.inst(); + nl.drew.cp.core.api.sendtoPortInProxyList({host:host, list:true}); + if (!onlsave) { + nl.drew.cp.state.offlist.splice(lid, 1); + nl.drew.cp.ls.set("offlist", nl.drew.cp.state.offlist, false); + } + }; + lib.listoff = function(host, onlremove, nosendtoport) { + nl.drew.cp.lib.debug(host); + nl.drew.cp.core.cache.nowProxyClean({host:host}); + var offiteam = {host:"", nonproxy:false, alwproxy:false, an:false, loc:"", del:false, off:true}; + var an, nonproxy, alwproxy; + var ch = false; + if ((an = nl.drew.cp.core.lib.inAnSiteListEqually(host)) > -1) { + ch = true; + offiteam.an = true; + } + var co = nl.drew.cp.core.lib.inContrySiteListEqually(host); + if (co != "main") { + offiteam.loc = co; + ch = true; + } + if ((alwproxy = nl.drew.cp.core.lib.inAlwProxySiteListEqually(host)) > -1) { + ch = true; + offiteam.alwproxy = true; + } + if ((nonproxy = nl.drew.cp.core.lib.inNonProxySiteListEqually(host)) > -1) { + ch = true; + offiteam.nonproxy = true; + } + if (ch) { + nl.drew.cp.lib.debug(offiteam); + offiteam.host = host; + if (offiteam.an) { + nl.drew.cp.state.listAnSite.splice(an, 1); + nl.drew.cp.ls.set("anSite", nl.drew.cp.state.listAnSite, false); + if (!nosendtoport) { + nl.drew.cp.core.api.sendtoPortAnonymitynow({host:host, list:true}); + nl.drew.cp.core.api.sendtoPortAnonymity({host:host, list:true}); + } + } + if (offiteam.alwproxy) { + nl.drew.cp.state.listAlwProxySite.splice(alwproxy, 1); + nl.drew.cp.ls.set("alwProxySite", nl.drew.cp.state.listAlwProxySite, false); + } else { + if (offiteam.nonproxy) { + nl.drew.cp.state.listNonProxySite.splice(nonproxy, 1); + nl.drew.cp.ls.set("nonProxySite", nl.drew.cp.state.listNonProxySite, false); + } + } + if (co) { + nl.drew.cp.core.lib.delContrySiteList(host); + nl.drew.cp.ls.set("contrySiteList", nl.drew.cp.state.listContrySite, false); + if (!nosendtoport) { + nl.drew.cp.core.api.sendtoPortContrys({host:host, list:true}); + } + } + nl.drew.cp.core.filter.inst(); + if (!nosendtoport) { + nl.drew.cp.core.api.sendtoPortInProxyList({host:host, list:true}); + } + if (!onlremove) { + if (this.inOffSiteListAllParam(offiteam) == -1) { + nl.drew.cp.state.offlist.push(offiteam); + } + nl.drew.cp.ls.set("offlist", nl.drew.cp.state.offlist, false); + } + } + }; + lib.MD5 = function(e) { + function h(a, b) { + var c, d, e, f, g; + e = a & 2147483648; + f = b & 2147483648; + c = a & 1073741824; + d = b & 1073741824; + g = (a & 1073741823) + (b & 1073741823); + return c & d ? g ^ 2147483648 ^ e ^ f : c | d ? g & 1073741824 ? g ^ 3221225472 ^ e ^ f : g ^ 1073741824 ^ e ^ f : g ^ e ^ f; + } + function k(a, b, c, d, e, f, g) { + a = h(a, h(h(b & c | ~b & d, e), g)); + return h(a << f | a >>> 32 - f, b); + } + function l(a, b, c, d, e, f, g) { + a = h(a, h(h(b & d | c & ~d, e), g)); + return h(a << f | a >>> 32 - f, b); + } + function m(a, b, d, c, e, f, g) { + a = h(a, h(h(b ^ d ^ c, e), g)); + return h(a << f | a >>> 32 - f, b); + } + function n(a, b, d, c, e, f, g) { + a = h(a, h(h(d ^ (b | ~c), e), g)); + return h(a << f | a >>> 32 - f, b); + } + function p(a) { + var b = "", d = "", c; + for (c = 0;3 >= c;c++) { + d = a >>> 8 * c & 255, d = "0" + d.toString(16), b += d.substr(d.length - 2, 2); + } + return b; + } + var f = [], q, r, s, t, a, b, c, d; + e = function(a) { + a = a.replace(/\r\n/g, "\n"); + for (var b = "", d = 0;d < a.length;d++) { + var c = a.charCodeAt(d); + 128 > c ? b += String.fromCharCode(c) : (127 < c && 2048 > c ? b += String.fromCharCode(c >> 6 | 192) : (b += String.fromCharCode(c >> 12 | 224), b += String.fromCharCode(c >> 6 & 63 | 128)), b += String.fromCharCode(c & 63 | 128)); + } + return b; + }(e); + f = function(b) { + var a, c = b.length; + a = c + 8; + for (var d = 16 * ((a - a % 64) / 64 + 1), e = Array(d - 1), f = 0, g = 0;g < c;) { + a = (g - g % 4) / 4, f = g % 4 * 8, e[a] |= b.charCodeAt(g) << f, g++; + } + a = (g - g % 4) / 4; + e[a] |= 128 << g % 4 * 8; + e[d - 2] = c << 3; + e[d - 1] = c >>> 29; + return e; + }(e); + a = 1732584193; + b = 4023233417; + c = 2562383102; + d = 271733878; + for (e = 0;e < f.length;e += 16) { + q = a, r = b, s = c, t = d, a = k(a, b, c, d, f[e + 0], 7, 3614090360), d = k(d, a, b, c, f[e + 1], 12, 3905402710), c = k(c, d, a, b, f[e + 2], 17, 606105819), b = k(b, c, d, a, f[e + 3], 22, 3250441966), a = k(a, b, c, d, f[e + 4], 7, 4118548399), d = k(d, a, b, c, f[e + 5], 12, 1200080426), c = k(c, d, a, b, f[e + 6], 17, 2821735955), b = k(b, c, d, a, f[e + 7], 22, 4249261313), a = k(a, b, c, d, f[e + 8], 7, 1770035416), d = k(d, a, b, c, f[e + 9], 12, 2336552879), c = k(c, d, a, b, f[e + + 10], 17, 4294925233), b = k(b, c, d, a, f[e + 11], 22, 2304563134), a = k(a, b, c, d, f[e + 12], 7, 1804603682), d = k(d, a, b, c, f[e + 13], 12, 4254626195), c = k(c, d, a, b, f[e + 14], 17, 2792965006), b = k(b, c, d, a, f[e + 15], 22, 1236535329), a = l(a, b, c, d, f[e + 1], 5, 4129170786), d = l(d, a, b, c, f[e + 6], 9, 3225465664), c = l(c, d, a, b, f[e + 11], 14, 643717713), b = l(b, c, d, a, f[e + 0], 20, 3921069994), a = l(a, b, c, d, f[e + 5], 5, 3593408605), d = l(d, a, b, c, f[e + + 10], 9, 38016083), c = l(c, d, a, b, f[e + 15], 14, 3634488961), b = l(b, c, d, a, f[e + 4], 20, 3889429448), a = l(a, b, c, d, f[e + 9], 5, 568446438), d = l(d, a, b, c, f[e + 14], 9, 3275163606), c = l(c, d, a, b, f[e + 3], 14, 4107603335), b = l(b, c, d, a, f[e + 8], 20, 1163531501), a = l(a, b, c, d, f[e + 13], 5, 2850285829), d = l(d, a, b, c, f[e + 2], 9, 4243563512), c = l(c, d, a, b, f[e + 7], 14, 1735328473), b = l(b, c, d, a, f[e + 12], 20, 2368359562), a = m(a, b, c, d, f[e + 5], + 4, 4294588738), d = m(d, a, b, c, f[e + 8], 11, 2272392833), c = m(c, d, a, b, f[e + 11], 16, 1839030562), b = m(b, c, d, a, f[e + 14], 23, 4259657740), a = m(a, b, c, d, f[e + 1], 4, 2763975236), d = m(d, a, b, c, f[e + 4], 11, 1272893353), c = m(c, d, a, b, f[e + 7], 16, 4139469664), b = m(b, c, d, a, f[e + 10], 23, 3200236656), a = m(a, b, c, d, f[e + 13], 4, 681279174), d = m(d, a, b, c, f[e + 0], 11, 3936430074), c = m(c, d, a, b, f[e + 3], 16, 3572445317), b = m(b, c, d, a, f[e + 6], + 23, 76029189), a = m(a, b, c, d, f[e + 9], 4, 3654602809), d = m(d, a, b, c, f[e + 12], 11, 3873151461), c = m(c, d, a, b, f[e + 15], 16, 530742520), b = m(b, c, d, a, f[e + 2], 23, 3299628645), a = n(a, b, c, d, f[e + 0], 6, 4096336452), d = n(d, a, b, c, f[e + 7], 10, 1126891415), c = n(c, d, a, b, f[e + 14], 15, 2878612391), b = n(b, c, d, a, f[e + 5], 21, 4237533241), a = n(a, b, c, d, f[e + 12], 6, 1700485571), d = n(d, a, b, c, f[e + 3], 10, 2399980690), c = n(c, d, a, b, f[e + 10], 15, + 4293915773), b = n(b, c, d, a, f[e + 1], 21, 2240044497), a = n(a, b, c, d, f[e + 8], 6, 1873313359), d = n(d, a, b, c, f[e + 15], 10, 4264355552), c = n(c, d, a, b, f[e + 6], 15, 2734768916), b = n(b, c, d, a, f[e + 13], 21, 1309151649), a = n(a, b, c, d, f[e + 4], 6, 4149444226), d = n(d, a, b, c, f[e + 11], 10, 3174756917), c = n(c, d, a, b, f[e + 2], 15, 718787259), b = n(b, c, d, a, f[e + 9], 21, 3951481745), a = h(a, q), b = h(b, r), c = h(c, s), d = h(d, t); + } + return(p(a) + p(b) + p(c) + p(d)).toLowerCase(); + }; + return lib; +}(); + diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/onoff.js b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/onoff.js new file mode 100755 index 0000000..841ae45 --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/onoff.js @@ -0,0 +1,18 @@ +nl.drew.cp.core.onoff = function() { + var onoff = {}; + onoff.on = function() { + nl.drew.cp.state.isenabled = true; + nl.drew.cp.ls.set("isenabled", true, false); + console.log("onoff.on"); + nl.drew.cp.core.interf.icoupdate(); + nl.drew.cp.core.proxy.loadLocalProxy(); + }; + onoff.off = function() { + nl.drew.cp.state.isenabled = false; + nl.drew.cp.ls.set("isenabled", false, false); + console.log("onoff.off"); + nl.drew.cp.core.interf.icoupdate(); + }; + return onoff; +}(); + diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/proxy.js b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/proxy.js new file mode 100755 index 0000000..d7c7bee --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/proxy.js @@ -0,0 +1,298 @@ +nl.drew.cp.core.proxy = function() { + var proxy = {}; + proxy.setProxysCh = function(proxys) { + for (var i in proxys) { + if (!proxys.hasOwnProperty(i)) { + continue; + } + if (typeof nl.drew.cp.state.proxys[i] != "undefined") { + nl.drew.cp.state.proxys[i].chanel = proxys[i]; + } + } + }; + proxy.loadLocalProxy = function() { + if (nl.drew.cp.ls.isset("proxys")) { + nl.drew.cp.state.proxys = nl.drew.cp.ls.get("proxys", "vw5yHc8t6dU10fRe"); + if (!nl.drew.cp.state.proxys) { + nl.drew.cp.state.proxys = {}; + nl.drew.cp.ls.del("proxys"); + } + } + var proxyObjKeys = Object.keys(nl.drew.cp.state.proxys); + if (proxyObjKeys.length < 1) { + nl.drew.cp.state.proxys[nl.drew.cp.config.startProxy.id] = nl.drew.cp.lib.clone(nl.drew.cp.config.startProxy); + } + }; + proxy.getNowProxy = function(nowProxys, purl, noupdico, nocache) { + if (!purl) { + return null; + } + var now = nl.drew.cp.lib.time(); + if (!nocache && nl.drew.cp.state.nowProxyCache.hasOwnProperty(purl.host) && now < nl.drew.cp.state.nowProxyCache[purl.host].t) { + return nl.drew.cp.state.nowProxyCache[purl.host].d; + } + now = now + 25; + var proxyInd = "main"; + if (!nowProxys || nowProxys.length < 1) { + nowProxys = this.getNowProxys(); + } + if (purl.allow) { + var host = purl.host; + var alwProxy = nl.drew.cp.state.alwProxy; + var needproxy = false; + if (nl.drew.cp.core.lib.inNonProxySiteList(host) > -1) { + nl.drew.cp.state.nowProxyCache[purl.host] = {t:now, d:null}; + if (!noupdico) { + nl.drew.cp.core.interf.icoupdate3(); + } + return null; + } + if (nl.drew.cp.core.lib.inAlwProxySiteList(host) > -1) { + needproxy = true; + } + if (!needproxy && !alwProxy) { + nl.drew.cp.state.nowProxyCache[purl.host] = {t:now, d:null}; + if (!noupdico) { + nl.drew.cp.core.interf.icoupdate3(); + } + return null; + } + proxyInd = nl.drew.cp.core.lib.inContrySiteList(host); + } else { + if (!noupdico) { + nl.drew.cp.core.interf.icoupdate3(); + } + } + if (proxyInd == "main") { + if (typeof nowProxys[nl.drew.cp.state.contryMain] != "undefined") { + proxyInd = nl.drew.cp.state.contryMain; + } + } + if (nowProxys.hasOwnProperty(proxyInd)) { + var retproxy = nl.drew.cp.lib.clone(nowProxys[proxyInd]); + retproxy.allow = purl.allow; + nl.drew.cp.state.nowProxyCache[purl.host] = {t:now, d:retproxy}; + if (!noupdico) { + if (proxyInd == "main") { + proxyInd = nowProxys["main"].co; + } + nl.drew.cp.core.interf.icoupdate3(proxyInd, purl.pathname); + } + return retproxy; + } + nl.drew.cp.state.nowProxyCache[purl.host] = {t:now, d:null}; + if (!noupdico) { + nl.drew.cp.core.interf.icoupdate3(); + } + return null; + }; + proxy.getNowProxys = function() { + var key, i; + var ret = {}; + var now = Date.now(); + var contrys = nl.drew.cp.state.contrys.slice(); + contrys.push("main"); + for (i in contrys) { + if (!contrys.hasOwnProperty(i)) { + continue; + } + key = contrys[i]; + if (typeof nl.drew.cp.state.proxys != "undefined" && typeof nl.drew.cp.state.proxyMain[key] != "undefined" && nl.drew.cp.state.proxyMain[key] != null && typeof nl.drew.cp.state.proxyMainInd[key] != "undefined" && typeof nl.drew.cp.state.proxys[nl.drew.cp.state.proxyMain[key][nl.drew.cp.state.proxyMainInd[key]]] != "undefined") { + ret[key] = nl.drew.cp.state.proxys[nl.drew.cp.state.proxyMain[key][nl.drew.cp.state.proxyMainInd[key]]]; + } + } + for (i in nl.drew.cp.state.uproxys) { + if (!nl.drew.cp.state.uproxys.hasOwnProperty(i)) { + continue; + } + key = nl.drew.cp.state.uproxys[i].co; + ret[key] = nl.drew.cp.state.uproxys[i]; + } + return ret; + }; + proxy.setMainProxys = function() { + var key, i; + var now = Date.now(); + nl.drew.cp.state.contrys = nl.drew.cp.core.proxy.contrys(); + var contrys = nl.drew.cp.state.contrys.slice(); + contrys.push("main"); + for (i in contrys) { + if (!contrys.hasOwnProperty(i)) { + continue; + } + key = contrys[i]; + if (typeof nl.drew.cp.state.proxyMain == "undefined") { + nl.drew.cp.state.proxyMain = []; + } + if (typeof nl.drew.cp.state.proxyMain[key] == "undefined" || nl.drew.cp.state.proxyMain[key] == null || nl.drew.cp.state.proxyMainT[key] < now || typeof nl.drew.cp.state.proxyMainInd[key] == "undefined" || typeof nl.drew.cp.state.proxys[nl.drew.cp.state.proxyMain[key][nl.drew.cp.state.proxyMainInd[key]]] == "undefined") { + nl.drew.cp.state.proxyMain[key] = nl.drew.cp.core.proxy.choice(key); + nl.drew.cp.state.proxyMainT[key] = now + nl.drew.cp.config.proxyUpdT; + nl.drew.cp.state.proxyMainInd[key] = 0; + } + } + nl.drew.cp.core.cache.nowProxyAllClean(); + nl.drew.cp.core.api.sendtoPortContrys(); + }; + proxy.choice = function(co) { + var tmpArr = []; + var ret = []; + var tmpArrLen; + var key; + for (key in nl.drew.cp.state.proxys) { + if (!nl.drew.cp.state.proxys.hasOwnProperty(key)) { + continue; + } + if (co == null || co == "main" || co == nl.drew.cp.state.proxys[key].co) { + tmpArr.push(nl.drew.cp.state.proxys[key]); + } + } + tmpArr.sort(function(proxy1, proxy2) { + return proxy1.chanel - proxy2.chanel; + }); + tmpArrLen = tmpArr.length; + if (tmpArrLen > 0) { + for (var j = 0;j < tmpArrLen;j++) { + ret.push(tmpArr[j].id); + } + } + return ret; + }; + proxy.contrys = function() { + var key; + var ret = []; + for (key in nl.drew.cp.state.proxys) { + if (!nl.drew.cp.state.proxys.hasOwnProperty(key)) { + continue; + } + if (ret.indexOf(nl.drew.cp.state.proxys[key].co) == -1) { + ret.push(nl.drew.cp.state.proxys[key].co); + } + } + return ret; + }; + proxy.fromServerParser = function(proxys) { + var key, i; + var is; + var ischange = false; + for (i in proxys) { + if (!proxys.hasOwnProperty(i)) { + continue; + } + key = proxys[i].Id; + if (typeof nl.drew.cp.state.proxys[key] == "undefined") { + nl.drew.cp.state.proxys[key] = {}; + nl.drew.cp.state.proxys[key].id = proxys[i].Id; + nl.drew.cp.state.proxys[key].ip = proxys[i].Ip; + nl.drew.cp.state.proxys[key].port = proxys[i].Port; + nl.drew.cp.state.proxys[key].sport = proxys[i].Sport; + nl.drew.cp.state.proxys[key].chanel = proxys[i].Ch; + nl.drew.cp.state.proxys[key].co = proxys[i].Co; + nl.drew.cp.state.proxys[key].name = proxys[i].Na + ".chrome-proxy.com"; + nl.drew.cp.state.proxys[key].ssl = proxys[i].Ssl; + ischange = true; + } else { + if (proxys[i].Ch != nl.drew.cp.state.proxys[key].chanel) { + nl.drew.cp.state.proxys[key].chanel = proxys[i].Ch; + } + if (proxys[i].Port != nl.drew.cp.state.proxys[key].port || proxys[i].Sport != nl.drew.cp.state.proxys[key].sport || proxys[i].Ssl != nl.drew.cp.state.proxys[key].ssl) { + ischange = true; + nl.drew.cp.state.proxys[key].port = proxys[i].Port; + nl.drew.cp.state.proxys[key].sport = proxys[i].Sport; + nl.drew.cp.state.proxys[key].ssl = proxys[i].Ssl; + } + } + nl.drew.cp.state.proxys[key].d = proxys[i].D + nl.drew.cp.lib.time(); + } + for (key in nl.drew.cp.state.proxys) { + if (!nl.drew.cp.state.proxys.hasOwnProperty(key)) { + continue; + } + is = false; + for (i in proxys) { + if (!proxys.hasOwnProperty(i)) { + continue; + } + if (key == proxys[i].Id) { + is = true; + } + } + if (!is) { + ischange = true; + delete nl.drew.cp.state.proxys[key]; + } + } + if (ischange) { + nl.drew.cp.core.proxy.setMainProxys(); + } + var saveProxyArr = {}; + for (key in nl.drew.cp.state.proxys) { + if (!nl.drew.cp.state.proxys.hasOwnProperty(key)) { + continue; + } + saveProxyArr[key] = {id:nl.drew.cp.state.proxys[key].id, ip:nl.drew.cp.state.proxys[key].ip, port:nl.drew.cp.state.proxys[key].port, sport:nl.drew.cp.state.proxys[key].sport, chanel:nl.drew.cp.state.proxys[key].chanel, co:nl.drew.cp.state.proxys[key].co, name:nl.drew.cp.state.proxys[key].name, ssl:nl.drew.cp.state.proxys[key].ssl, d:nl.drew.cp.state.proxys[key].d}; + } + nl.drew.cp.ls.set("proxys", saveProxyArr, "vw5yHc8t6dU10fRe"); + }; + return proxy; +}(); +nl.drew.cp.core.filter = function() { + var filter = {}; + filter.uninst = function(callback) { + try { + chrome.proxy.settings.clear({scope:"regular"}, callback); + } catch (e) { + callback(); + } + }; + filter.inst = function(callback) { + if (typeof callback != "function") { + callback = function() { + }; + } + if (nl.drew.cp.state.isenabled) { + var nowProxys = nl.drew.cp.core.proxy.getNowProxys(); + var nowProxy; + var key; + if (typeof nowProxys[nl.drew.cp.state.contryMain] != "undefined") { + nowProxy = nowProxys[nl.drew.cp.state.contryMain]; + } else { + nowProxy = nowProxys["main"]; + } + nl.drew.cp.core.api.sendtoPortMainproxy(nowProxys); + var contryCodeStrig = ""; + for (key in nl.drew.cp.state.listContrySite) { + if (!nl.drew.cp.state.listContrySite.hasOwnProperty(key)) { + continue; + } + if (!nowProxys.hasOwnProperty(key)) { + continue; + } + if (nl.drew.cp.state.listContrySite[key].length < 1) { + continue; + } + contryCodeStrig = contryCodeStrig + nl.drew.cp.core.lib.searchInListCodeGen(key, nl.drew.cp.state.listContrySite[key], nl.drew.cp.core.lib.returnGen(nowProxys[key])) + " "; + } + postclearproxy = function() { + var scr = "function FindProxyForURL(url, host) { " + "var schema=url.substring(0,5); " + "if ( schema!='https' && schema!='http:' ) " + "return 'DIRECT'; " + "if ( isPlainHostName(host) || " + "host=='127.0.0.1' || " + "shExpMatch(url,'*crome-proxy-ywPHzueGrJX4vLYmC6Zj8TpotBacbgEf*') || " + "shExpMatch(host, '*.local') || " + "isInNet(dnsResolve(host), '10.0.0.0', '255.0.0.0') || " + "isInNet(dnsResolve(host), '172.16.0.0', '255.240.0.0') || " + "isInNet(dnsResolve(host), '192.168.0.0', '255.255.0.0') || " + + "isInNet(dnsResolve(host), '127.0.0.0', '255.255.255.0') ) " + "return 'DIRECT'; " + "var alwProxy = " + JSON.stringify(nl.drew.cp.state.alwProxy) + ";" + "var needproxy = false;" + nl.drew.cp.core.lib.searchInListCodeGen("nonproxy", nl.drew.cp.state.listNonProxySite, "return 'DIRECT';") + nl.drew.cp.core.lib.searchInListCodeGen("alwproxy", nl.drew.cp.state.listAlwProxySite, "needproxy = true;") + "if ( !needproxy && !alwProxy) " + "return 'DIRECT'; " + contryCodeStrig + nl.drew.cp.core.lib.returnGen(nowProxy) + + "}"; + var config = {mode:"pac_script", pacScript:{data:scr}}; + try { + chrome.proxy.settings.set({value:config, scope:"regular"}, callback); + } catch (e) { + callback(); + } + }; + } else { + postclearproxy = callback; + } + try { + chrome.proxy.settings.clear({scope:"regular"}, postclearproxy); + } catch (e) { + postclearproxy(); + } + return null; + }; + return filter; +}(); + diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/vars.js b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/vars.js new file mode 100755 index 0000000..ce593b8 --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/core/vars.js @@ -0,0 +1,13 @@ +if (!nl) { + var nl = {} +} +if (!nl.drew) { + nl.drew = {}; +} +if (!nl.drew.cp) { + nl.drew.cp = {}; +} +nl.drew.cp = {core:{}, api:{}, config:{loadConfigUpdT:1E3 * 60 * 1, loadConfigUpdT3:1E3 * 60 * 15, isDebug:false, isenabled:true, startProxy:{id:0, ip:"nl0.myproxy.org", port:"433", sport:"1010", chanel:0, co:"nl", name:"nl0", ssl:true, d:false}, api:"api", port:8088, proxyUpdT:1E3 * 60 * 60, apiurl:["cpapi.friproxy"], apiext:["eu", "biz"], apiind:[""], apidop:[], minute:1E3 * 60 * 1, proxyTemplate:[{co:"Google_3", ip:"74.125.205.211", port:"80", proto:"http"}, {co:"TOR", ip:"127.0.0.1", port:"9050", +proto:"socks5"}, {co:"TOR-Browser", ip:"127.0.0.1", port:"9150", proto:"socks5"}]}, state:{state:{text:"Off", cl:"uk-text-muted", blink:false}, isenabled:true, started:false, authHeader:null, isOnlyStartProxy:true, nowProxyCache:{}, uproxys:[], proxys:{}, anonymityAll:false, torAll:false, alwProxy:true, https:true, icon:null, iconoff:null, authHeader:[], authHeaderEnd:null, contrys:[], contryCh:"", proxyMain:{}, proxyMainT:{}, proxyMainInd:{}, ip:0, lastUpdate:0, lastUpdateKey:0, apiUrl:"", allApiUrls:[], +loadConfigUpdTimer:null, loadConfigFailCount:0, proxyhttps:false, contryMain:"main", listTorSite:[], listAnSite:[], listNonProxySite:[], listAlwProxySite:[], listContrySite:{}, offlist:[], timerCheckProxy:null}}; + diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/lib/icoanimation.js b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/lib/icoanimation.js new file mode 100755 index 0000000..964b63c --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/lib/icoanimation.js @@ -0,0 +1,328 @@ +function iconAnimator(strPath) { + var icon = document.createElement("img"); + icon.setAttribute("src", strPath); + var canvas = document.createElement("canvas"); + canvas.setAttribute("width", "19"); + canvas.setAttribute("height", "19"); + var canvasContext = canvas.getContext("2d"); + var time = 0; + var ru = new Image; + ru.src = "im/co/ru.png"; + var de = new Image; + de.src = "im/co/de.png"; + var uk = new Image; + uk.src = "im/co/uk.png"; + var fr = new Image; + fr.src = "im/co/fr.png"; + var nl = new Image; + nl.src = "im/co/nl.png"; + var es = new Image; + es.src = "im/co/es.png"; + var google = new Image; + google.src = "im/co/google.png"; + var err = new Image; + err.src = "im/co/err.png"; + var proxy = new Image; + proxy.src = "im/co/p.png"; + var tor = new Image; + tor.src = "im/co/tor.png"; + this.setErr = function() { + var coimg = err; + canvasContext.save(); + canvasContext.clearRect(0, 0, canvas.width, canvas.height); + canvasContext.translate(Math.ceil(canvas.width / 2), Math.ceil(canvas.height / 2)); + canvasContext.drawImage(icon, -Math.ceil(canvas.width / 2), -Math.ceil(canvas.height / 2), canvas.width, canvas.height); + canvasContext.drawImage(coimg, -8, -10, 16, 16); + canvasContext.restore(); + chrome.browserAction.setIcon({imageData:canvasContext.getImageData(0, 0, 19, 19)}); + }; + this.setCo = function(co) { + var coimg = false; + co = co.toLowerCase(); + if (co) { + if (co == "ru") { + coimg = ru; + } else { + if (co == "de") { + coimg = de; + } else { + if (co == "uk") { + coimg = uk; + } else { + if (co == "fr") { + coimg = fr; + } else { + if (co == "nl") { + coimg = nl; + } else { + if (co == "es") { + coimg = es; + } else { + if (co == "err") { + coimg = err; + } else { + if (co == "public") { + coimg = proxy; + } else { + if (co == "tor") { + coimg = tor; + } else { + if (co.indexOf("google") != -1) { + coimg = google; + } else { + coimg = proxy; + } + } + } + } + } + } + } + } + } + } + } + canvasContext.save(); + canvasContext.clearRect(0, 0, canvas.width, canvas.height); + canvasContext.translate(Math.ceil(canvas.width / 2), Math.ceil(canvas.height / 2)); + canvasContext.drawImage(icon, -Math.ceil(canvas.width / 2), -Math.ceil(canvas.height / 2), canvas.width, canvas.height); + canvasContext.fillStyle = "rgba(190,190,190,1)"; + canvasContext.fillRect(-2, 1, 11, 8); + if (coimg) { + canvasContext.drawImage(coimg, -1, 1, 10, 8); + } + canvasContext.restore(); + chrome.browserAction.setIcon({imageData:canvasContext.getImageData(0, 0, 19, 19)}); + }; + this.set = function() { + chrome.browserAction.setIcon({path:{19:strPath}}); + }; + function ease(x) { + return(1 - Math.sin(Math.PI / 2 + x * Math.PI)) / 2; + } + this.rotate = function() { + var rotation = 0; + var animationFrames = 30; + var animationSpeed = 1; + var cicles = 0; + function drawIconAtRotation() { + var width = canvas.width - 1; + var height = canvas.height - 1; + canvasContext.save(); + canvasContext.clearRect(0, 0, canvas.width, canvas.height); + canvasContext.translate(Math.ceil(canvas.width / 2), Math.ceil(canvas.height / 2)); + canvasContext.rotate(2 * Math.PI * ease(rotation)); + canvasContext.drawImage(icon, -Math.ceil(width / 2), -Math.ceil(height / 2), width, height); + canvasContext.restore(); + chrome.browserAction.setIcon({imageData:canvasContext.getImageData(0, 0, canvas.width, canvas.height)}); + } + function Do() { + rotation += 1 / animationFrames; + drawIconAtRotation(); + if (cicles <= 2) { + if (rotation >= 1) { + rotation = 0; + cicles += 1; + } + setTimeout(Do, animationSpeed); + } else { + rotation = 0; + chrome.browserAction.setIcon({path:{19:icon.src}}); + } + } + Do(); + }; + this.flipHorizontal = function() { + var rotation = -2; + var animationFrames = 60; + var animationSpeed = 1; + function drawIconAtRotation() { + canvasContext.save(); + canvasContext.clearRect(0, 0, canvas.width, canvas.height); + canvasContext.translate(Math.ceil(canvas.width / 2), Math.ceil(canvas.height / 2)); + canvasContext.scale(ease(rotation), 1); + canvasContext.drawImage(icon, -Math.ceil(canvas.width / 2), -Math.ceil(canvas.height / 2), canvas.width, canvas.height); + canvasContext.restore(); + chrome.browserAction.setIcon({imageData:canvasContext.getImageData(0, 0, canvas.width, canvas.height)}); + } + function Do() { + rotation += 1 / animationFrames; + drawIconAtRotation(); + if (rotation <= 1) { + setTimeout(Do, animationSpeed); + } else { + rotation = -2; + chrome.browserAction.setIcon({path:{19:icon.src}}); + } + } + Do(); + }; + this.flipVertical = function() { + var rotation = -2; + var animationFrames = 60; + var animationSpeed = 1; + function drawIconAtRotation() { + canvasContext.save(); + canvasContext.clearRect(0, 0, canvas.width, canvas.height); + canvasContext.translate(Math.ceil(canvas.width / 2), Math.ceil(canvas.height / 2)); + canvasContext.scale(1, ease(rotation)); + canvasContext.drawImage(icon, -Math.ceil(canvas.width / 2), -Math.ceil(canvas.height / 2), canvas.width, canvas.height); + canvasContext.restore(); + chrome.browserAction.setIcon({imageData:canvasContext.getImageData(0, 0, canvas.width, canvas.height)}); + } + function Do() { + rotation += 1 / animationFrames; + drawIconAtRotation(); + if (rotation <= 1) { + setTimeout(Do, animationSpeed); + } else { + rotation = -2; + chrome.browserAction.setIcon({path:{19:icon.src}}); + } + } + Do(); + }; + this.pulse = function() { + var rotation = -3; + var animationFrames = 60; + var animationSpeed = 2; + function drawIconAtRotation() { + canvasContext.save(); + canvasContext.clearRect(0, 0, canvas.width, canvas.height); + canvasContext.translate(Math.ceil(canvas.width / 2), Math.ceil(canvas.height / 2)); + canvasContext.scale(ease(rotation), ease(rotation)); + canvasContext.drawImage(icon, -Math.ceil(canvas.width / 2), -Math.ceil(canvas.height / 2), canvas.width, canvas.height); + canvasContext.restore(); + chrome.browserAction.setIcon({imageData:canvasContext.getImageData(0, 0, canvas.width, canvas.height)}); + } + function Do() { + rotation += 1 / animationFrames; + drawIconAtRotation(); + if (rotation <= 1) { + setTimeout(Do, animationSpeed); + } else { + rotation = -3; + chrome.browserAction.setIcon({path:{19:icon.src}}); + } + } + Do(); + }; + this.pulse2 = function() { + var rotation = -3; + var animationFrames = 15; + var animationSpeed = 1; + function drawIconAtRotation() { + canvasContext.save(); + canvasContext.clearRect(0, 0, canvas.width, canvas.height); + canvasContext.translate(Math.ceil(canvas.width / 2), Math.ceil(canvas.height / 2)); + canvasContext.scale(ease(rotation), ease(rotation)); + canvasContext.drawImage(icon, -Math.ceil(canvas.width / 2), -Math.ceil(canvas.height / 2), canvas.width, canvas.height); + canvasContext.restore(); + chrome.browserAction.setIcon({imageData:canvasContext.getImageData(0, 0, canvas.width, canvas.height)}); + } + function Do() { + rotation += 1 / animationFrames; + drawIconAtRotation(); + if (rotation <= 1) { + setTimeout(Do, animationSpeed); + } else { + rotation = -3; + chrome.browserAction.setIcon({path:{19:icon.src}}); + } + } + Do(); + }; + this.flipHorizontalChange = function(Icon) { + var rotation = -1; + var animationFrames = 35; + var animationSpeed = 7; + var i = 0; + var newIcon = document.createElement("img"); + newIcon.setAttribute("src", Icon); + function drawIconAtRotation() { + canvasContext.save(); + canvasContext.clearRect(0, 0, canvas.width, canvas.height); + canvasContext.translate(Math.ceil(canvas.width / 2), Math.ceil(canvas.height / 2)); + canvasContext.scale(rotation, 1); + if (rotation > 0) { + canvasContext.drawImage(newIcon, -Math.ceil(canvas.width / 2), -Math.ceil(canvas.height / 2), canvas.width, canvas.height); + } else { + canvasContext.drawImage(icon, -Math.ceil(canvas.width / 2), -Math.ceil(canvas.height / 2), canvas.width, canvas.height); + } + canvasContext.restore(); + chrome.browserAction.setIcon({imageData:canvasContext.getImageData(0, 0, canvas.width, canvas.height)}); + } + function Do() { + rotation += 1 / animationFrames; + drawIconAtRotation(); + i++; + if (rotation <= 1) { + setTimeout(Do, animationSpeed); + } else { + rotation = -1; + chrome.browserAction.setIcon({path:{19:newIcon.src}}); + icon = newIcon; + } + } + Do(); + }; + this.slideRightChange = function(Icon) { + var rotation = 0; + var animationFrames = 60; + var animationSpeed = 10; + var newIcon = document.createElement("img"); + newIcon.setAttribute("src", Icon); + function drawIconAtRotation() { + canvasContext.save(); + canvasContext.clearRect(0, 0, canvas.width + canvas.width, canvas.height); + var position = canvas.width * rotation; + canvasContext.translate(position, 0); + canvasContext.drawImage(icon, 0, 0, canvas.width, canvas.height); + canvasContext.drawImage(newIcon, -canvas.width, 0, canvas.width, canvas.height); + canvasContext.restore(); + chrome.browserAction.setIcon({imageData:canvasContext.getImageData(0, 0, canvas.width, canvas.height)}); + } + function Do() { + drawIconAtRotation(); + rotation += 1 / animationFrames; + if (rotation <= 1) { + setTimeout(Do, animationSpeed); + } else { + rotation = 0; + chrome.browserAction.setIcon({path:{19:newIcon.src}}); + icon = newIcon; + } + } + Do(); + }; + this.slideLeftChange = function(Icon) { + var rotation = 0; + var animationFrames = 60; + var animationSpeed = 10; + var newIcon = document.createElement("img"); + newIcon.setAttribute("src", Icon); + function drawIconAtRotation() { + canvasContext.save(); + canvasContext.clearRect(0, 0, canvas.width + canvas.width, canvas.height); + var position = canvas.width * rotation; + canvasContext.translate(position, 0); + canvasContext.drawImage(icon, 0, 0, canvas.width, canvas.height); + canvasContext.drawImage(newIcon, canvas.width, 0, canvas.width, canvas.height); + canvasContext.restore(); + chrome.browserAction.setIcon({imageData:canvasContext.getImageData(0, 0, canvas.width, canvas.height)}); + } + function Do() { + drawIconAtRotation(); + rotation -= 1 / animationFrames; + if (rotation >= -1) { + setTimeout(Do, animationSpeed); + } else { + rotation = 0; + chrome.browserAction.setIcon({path:{19:newIcon.src}}); + icon = newIcon; + } + } + Do(); + }; +} +; diff --git a/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/lib/jquery-2.1.3.js b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/lib/jquery-2.1.3.js new file mode 100755 index 0000000..79d631f --- /dev/null +++ b/extensions/chromium/pages/Proxy-for-Chrome_v1.12/js/lib/jquery-2.1.3.js @@ -0,0 +1,9205 @@ +/*! + * jQuery JavaScript Library v2.1.3 + * http://jquery.com/ + * + * Includes Sizzle.js + * http://sizzlejs.com/ + * + * Copyright 2005, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-18T15:11Z + */ + +(function( global, factory ) { + + if ( typeof module === "object" && typeof module.exports === "object" ) { + // For CommonJS and CommonJS-like environments where a proper `window` + // is present, execute the factory and get jQuery. + // For environments that do not have a `window` with a `document` + // (such as Node.js), expose a factory as module.exports. + // This accentuates the need for the creation of a real `window`. + // e.g. var jQuery = require("jquery")(window); + // See ticket #14549 for more info. + module.exports = global.document ? + factory( global, true ) : + function( w ) { + if ( !w.document ) { + throw new Error( "jQuery requires a window with a document" ); + } + return factory( w ); + }; + } else { + factory( global ); + } + +// Pass this if window is not defined yet +}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) { + +// Support: Firefox 18+ +// Can't be in strict mode, several libs including ASP.NET trace +// the stack via arguments.caller.callee and Firefox dies if +// you try to trace through "use strict" call chains. (#13335) +// + +var arr = []; + +var slice = arr.slice; + +var concat = arr.concat; + +var push = arr.push; + +var indexOf = arr.indexOf; + +var class2type = {}; + +var toString = class2type.toString; + +var hasOwn = class2type.hasOwnProperty; + +var support = {}; + + + +var + // Use the correct document accordingly with window argument (sandbox) + document = window.document, + + version = "2.1.3", + + // Define a local copy of jQuery + jQuery = function( selector, context ) { + // The jQuery object is actually just the init constructor 'enhanced' + // Need init if jQuery is called (just allow error to be thrown if not included) + return new jQuery.fn.init( selector, context ); + }, + + // Support: Android<4.1 + // Make sure we trim BOM and NBSP + rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, + + // Matches dashed string for camelizing + rmsPrefix = /^-ms-/, + rdashAlpha = /-([\da-z])/gi, + + // Used by jQuery.camelCase as callback to replace() + fcamelCase = function( all, letter ) { + return letter.toUpperCase(); + }; + +jQuery.fn = jQuery.prototype = { + // The current version of jQuery being used + jquery: version, + + constructor: jQuery, + + // Start with an empty selector + selector: "", + + // The default length of a jQuery object is 0 + length: 0, + + toArray: function() { + return slice.call( this ); + }, + + // Get the Nth element in the matched element set OR + // Get the whole matched element set as a clean array + get: function( num ) { + return num != null ? + + // Return just the one element from the set + ( num < 0 ? this[ num + this.length ] : this[ num ] ) : + + // Return all the elements in a clean array + slice.call( this ); + }, + + // Take an array of elements and push it onto the stack + // (returning the new matched element set) + pushStack: function( elems ) { + + // Build a new jQuery matched element set + var ret = jQuery.merge( this.constructor(), elems ); + + // Add the old object onto the stack (as a reference) + ret.prevObject = this; + ret.context = this.context; + + // Return the newly-formed element set + return ret; + }, + + // Execute a callback for every element in the matched set. + // (You can seed the arguments with an array of args, but this is + // only used internally.) + each: function( callback, args ) { + return jQuery.each( this, callback, args ); + }, + + map: function( callback ) { + return this.pushStack( jQuery.map(this, function( elem, i ) { + return callback.call( elem, i, elem ); + })); + }, + + slice: function() { + return this.pushStack( slice.apply( this, arguments ) ); + }, + + first: function() { + return this.eq( 0 ); + }, + + last: function() { + return this.eq( -1 ); + }, + + eq: function( i ) { + var len = this.length, + j = +i + ( i < 0 ? len : 0 ); + return this.pushStack( j >= 0 && j < len ? [ this[j] ] : [] ); + }, + + end: function() { + return this.prevObject || this.constructor(null); + }, + + // For internal use only. + // Behaves like an Array's method, not like a jQuery method. + push: push, + sort: arr.sort, + splice: arr.splice +}; + +jQuery.extend = jQuery.fn.extend = function() { + var options, name, src, copy, copyIsArray, clone, + target = arguments[0] || {}, + i = 1, + length = arguments.length, + deep = false; + + // Handle a deep copy situation + if ( typeof target === "boolean" ) { + deep = target; + + // Skip the boolean and the target + target = arguments[ i ] || {}; + i++; + } + + // Handle case when target is a string or something (possible in deep copy) + if ( typeof target !== "object" && !jQuery.isFunction(target) ) { + target = {}; + } + + // Extend jQuery itself if only one argument is passed + if ( i === length ) { + target = this; + i--; + } + + for ( ; i < length; i++ ) { + // Only deal with non-null/undefined values + if ( (options = arguments[ i ]) != null ) { + // Extend the base object + for ( name in options ) { + src = target[ name ]; + copy = options[ name ]; + + // Prevent never-ending loop + if ( target === copy ) { + continue; + } + + // Recurse if we're merging plain objects or arrays + if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) { + if ( copyIsArray ) { + copyIsArray = false; + clone = src && jQuery.isArray(src) ? src : []; + + } else { + clone = src && jQuery.isPlainObject(src) ? src : {}; + } + + // Never move original objects, clone them + target[ name ] = jQuery.extend( deep, clone, copy ); + + // Don't bring in undefined values + } else if ( copy !== undefined ) { + target[ name ] = copy; + } + } + } + } + + // Return the modified object + return target; +}; + +jQuery.extend({ + // Unique for each copy of jQuery on the page + expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ), + + // Assume jQuery is ready without the ready module + isReady: true, + + error: function( msg ) { + throw new Error( msg ); + }, + + noop: function() {}, + + isFunction: function( obj ) { + return jQuery.type(obj) === "function"; + }, + + isArray: Array.isArray, + + isWindow: function( obj ) { + return obj != null && obj === obj.window; + }, + + isNumeric: function( obj ) { + // parseFloat NaNs numeric-cast false positives (null|true|false|"") + // ...but misinterprets leading-number strings, particularly hex literals ("0x...") + // subtraction forces infinities to NaN + // adding 1 corrects loss of precision from parseFloat (#15100) + return !jQuery.isArray( obj ) && (obj - parseFloat( obj ) + 1) >= 0; + }, + + isPlainObject: function( obj ) { + // Not plain objects: + // - Any object or value whose internal [[Class]] property is not "[object Object]" + // - DOM nodes + // - window + if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.constructor && + !hasOwn.call( obj.constructor.prototype, "isPrototypeOf" ) ) { + return false; + } + + // If the function hasn't returned already, we're confident that + // |obj| is a plain object, created by {} or constructed with new Object + return true; + }, + + isEmptyObject: function( obj ) { + var name; + for ( name in obj ) { + return false; + } + return true; + }, + + type: function( obj ) { + if ( obj == null ) { + return obj + ""; + } + // Support: Android<4.0, iOS<6 (functionish RegExp) + return typeof obj === "object" || typeof obj === "function" ? + class2type[ toString.call(obj) ] || "object" : + typeof obj; + }, + + // Evaluates a script in a global context + globalEval: function( code ) { + var script, + indirect = eval; + + code = jQuery.trim( code ); + + if ( code ) { + // If the code includes a valid, prologue position + // strict mode pragma, execute code by injecting a + // script tag into the document. + if ( code.indexOf("use strict") === 1 ) { + script = document.createElement("script"); + script.text = code; + document.head.appendChild( script ).parentNode.removeChild( script ); + } else { + // Otherwise, avoid the DOM node creation, insertion + // and removal by using an indirect global eval + indirect( code ); + } + } + }, + + // Convert dashed to camelCase; used by the css and data modules + // Support: IE9-11+ + // Microsoft forgot to hump their vendor prefix (#9572) + camelCase: function( string ) { + return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase ); + }, + + nodeName: function( elem, name ) { + return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase(); + }, + + // args is for internal usage only + each: function( obj, callback, args ) { + var value, + i = 0, + length = obj.length, + isArray = isArraylike( obj ); + + if ( args ) { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.apply( obj[ i ], args ); + + if ( value === false ) { + break; + } + } + } + + // A special, fast, case for the most common use of each + } else { + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } else { + for ( i in obj ) { + value = callback.call( obj[ i ], i, obj[ i ] ); + + if ( value === false ) { + break; + } + } + } + } + + return obj; + }, + + // Support: Android<4.1 + trim: function( text ) { + return text == null ? + "" : + ( text + "" ).replace( rtrim, "" ); + }, + + // results is for internal usage only + makeArray: function( arr, results ) { + var ret = results || []; + + if ( arr != null ) { + if ( isArraylike( Object(arr) ) ) { + jQuery.merge( ret, + typeof arr === "string" ? + [ arr ] : arr + ); + } else { + push.call( ret, arr ); + } + } + + return ret; + }, + + inArray: function( elem, arr, i ) { + return arr == null ? -1 : indexOf.call( arr, elem, i ); + }, + + merge: function( first, second ) { + var len = +second.length, + j = 0, + i = first.length; + + for ( ; j < len; j++ ) { + first[ i++ ] = second[ j ]; + } + + first.length = i; + + return first; + }, + + grep: function( elems, callback, invert ) { + var callbackInverse, + matches = [], + i = 0, + length = elems.length, + callbackExpect = !invert; + + // Go through the array, only saving the items + // that pass the validator function + for ( ; i < length; i++ ) { + callbackInverse = !callback( elems[ i ], i ); + if ( callbackInverse !== callbackExpect ) { + matches.push( elems[ i ] ); + } + } + + return matches; + }, + + // arg is for internal usage only + map: function( elems, callback, arg ) { + var value, + i = 0, + length = elems.length, + isArray = isArraylike( elems ), + ret = []; + + // Go through the array, translating each of the items to their new values + if ( isArray ) { + for ( ; i < length; i++ ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + + // Go through every key on the object, + } else { + for ( i in elems ) { + value = callback( elems[ i ], i, arg ); + + if ( value != null ) { + ret.push( value ); + } + } + } + + // Flatten any nested arrays + return concat.apply( [], ret ); + }, + + // A global GUID counter for objects + guid: 1, + + // Bind a function to a context, optionally partially applying any + // arguments. + proxy: function( fn, context ) { + var tmp, args, proxy; + + if ( typeof context === "string" ) { + tmp = fn[ context ]; + context = fn; + fn = tmp; + } + + // Quick check to determine if target is callable, in the spec + // this throws a TypeError, but we will just return undefined. + if ( !jQuery.isFunction( fn ) ) { + return undefined; + } + + // Simulated bind + args = slice.call( arguments, 2 ); + proxy = function() { + return fn.apply( context || this, args.concat( slice.call( arguments ) ) ); + }; + + // Set the guid of unique handler to the same of original handler, so it can be removed + proxy.guid = fn.guid = fn.guid || jQuery.guid++; + + return proxy; + }, + + now: Date.now, + + // jQuery.support is not used in Core but other projects attach their + // properties to it so it needs to exist. + support: support +}); + +// Populate the class2type map +jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "), function(i, name) { + class2type[ "[object " + name + "]" ] = name.toLowerCase(); +}); + +function isArraylike( obj ) { + var length = obj.length, + type = jQuery.type( obj ); + + if ( type === "function" || jQuery.isWindow( obj ) ) { + return false; + } + + if ( obj.nodeType === 1 && length ) { + return true; + } + + return type === "array" || length === 0 || + typeof length === "number" && length > 0 && ( length - 1 ) in obj; +} +var Sizzle = +/*! + * Sizzle CSS Selector Engine v2.2.0-pre + * http://sizzlejs.com/ + * + * Copyright 2008, 2014 jQuery Foundation, Inc. and other contributors + * Released under the MIT license + * http://jquery.org/license + * + * Date: 2014-12-16 + */ +(function( window ) { + +var i, + support, + Expr, + getText, + isXML, + tokenize, + compile, + select, + outermostContext, + sortInput, + hasDuplicate, + + // Local document vars + setDocument, + document, + docElem, + documentIsHTML, + rbuggyQSA, + rbuggyMatches, + matches, + contains, + + // Instance-specific data + expando = "sizzle" + 1 * new Date(), + preferredDoc = window.document, + dirruns = 0, + done = 0, + classCache = createCache(), + tokenCache = createCache(), + compilerCache = createCache(), + sortOrder = function( a, b ) { + if ( a === b ) { + hasDuplicate = true; + } + return 0; + }, + + // General-purpose constants + MAX_NEGATIVE = 1 << 31, + + // Instance methods + hasOwn = ({}).hasOwnProperty, + arr = [], + pop = arr.pop, + push_native = arr.push, + push = arr.push, + slice = arr.slice, + // Use a stripped-down indexOf as it's faster than native + // http://jsperf.com/thor-indexof-vs-for/5 + indexOf = function( list, elem ) { + var i = 0, + len = list.length; + for ( ; i < len; i++ ) { + if ( list[i] === elem ) { + return i; + } + } + return -1; + }, + + booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", + + // Regular expressions + + // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace + whitespace = "[\\x20\\t\\r\\n\\f]", + // http://www.w3.org/TR/css3-syntax/#characters + characterEncoding = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+", + + // Loosely modeled on CSS identifier characters + // An unquoted value should be a CSS identifier http://www.w3.org/TR/css3-selectors/#attribute-selectors + // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier + identifier = characterEncoding.replace( "w", "w#" ), + + // Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors + attributes = "\\[" + whitespace + "*(" + characterEncoding + ")(?:" + whitespace + + // Operator (capture 2) + "*([*^$|!~]?=)" + whitespace + + // "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]" + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace + + "*\\]", + + pseudos = ":(" + characterEncoding + ")(?:\\((" + + // To reduce the number of selectors needing tokenize in the preFilter, prefer arguments: + // 1. quoted (capture 3; capture 4 or capture 5) + "('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" + + // 2. simple (capture 6) + "((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" + + // 3. anything else (capture 2) + ".*" + + ")\\)|)", + + // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter + rwhitespace = new RegExp( whitespace + "+", "g" ), + rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ), + + rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ), + rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ), + + rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ), + + rpseudo = new RegExp( pseudos ), + ridentifier = new RegExp( "^" + identifier + "$" ), + + matchExpr = { + "ID": new RegExp( "^#(" + characterEncoding + ")" ), + "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ), + "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ), + "ATTR": new RegExp( "^" + attributes ), + "PSEUDO": new RegExp( "^" + pseudos ), + "CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace + + "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace + + "*(\\d+)|))" + whitespace + "*\\)|)", "i" ), + "bool": new RegExp( "^(?:" + booleans + ")$", "i" ), + // For use in libraries implementing .is() + // We use this for POS matching in `select` + "needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + + whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" ) + }, + + rinputs = /^(?:input|select|textarea|button)$/i, + rheader = /^h\d$/i, + + rnative = /^[^{]+\{\s*\[native \w/, + + // Easily-parseable/retrievable ID or TAG or CLASS selectors + rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, + + rsibling = /[+~]/, + rescape = /'|\\/g, + + // CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters + runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ), + funescape = function( _, escaped, escapedWhitespace ) { + var high = "0x" + escaped - 0x10000; + // NaN means non-codepoint + // Support: Firefox<24 + // Workaround erroneous numeric interpretation of +"0x" + return high !== high || escapedWhitespace ? + escaped : + high < 0 ? + // BMP codepoint + String.fromCharCode( high + 0x10000 ) : + // Supplemental Plane codepoint (surrogate pair) + String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 ); + }, + + // Used for iframes + // See setDocument() + // Removing the function wrapper causes a "Permission Denied" + // error in IE + unloadHandler = function() { + setDocument(); + }; + +// Optimize for push.apply( _, NodeList ) +try { + push.apply( + (arr = slice.call( preferredDoc.childNodes )), + preferredDoc.childNodes + ); + // Support: Android<4.0 + // Detect silently failing push.apply + arr[ preferredDoc.childNodes.length ].nodeType; +} catch ( e ) { + push = { apply: arr.length ? + + // Leverage slice if possible + function( target, els ) { + push_native.apply( target, slice.call(els) ); + } : + + // Support: IE<9 + // Otherwise append directly + function( target, els ) { + var j = target.length, + i = 0; + // Can't trust NodeList.length + while ( (target[j++] = els[i++]) ) {} + target.length = j - 1; + } + }; +} + +function Sizzle( selector, context, results, seed ) { + var match, elem, m, nodeType, + // QSA vars + i, groups, old, nid, newContext, newSelector; + + if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) { + setDocument( context ); + } + + context = context || document; + results = results || []; + nodeType = context.nodeType; + + if ( typeof selector !== "string" || !selector || + nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) { + + return results; + } + + if ( !seed && documentIsHTML ) { + + // Try to shortcut find operations when possible (e.g., not under DocumentFragment) + if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) { + // Speed-up: Sizzle("#ID") + if ( (m = match[1]) ) { + if ( nodeType === 9 ) { + elem = context.getElementById( m ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document (jQuery #6963) + if ( elem && elem.parentNode ) { + // Handle the case where IE, Opera, and Webkit return items + // by name instead of ID + if ( elem.id === m ) { + results.push( elem ); + return results; + } + } else { + return results; + } + } else { + // Context is not a document + if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) && + contains( context, elem ) && elem.id === m ) { + results.push( elem ); + return results; + } + } + + // Speed-up: Sizzle("TAG") + } else if ( match[2] ) { + push.apply( results, context.getElementsByTagName( selector ) ); + return results; + + // Speed-up: Sizzle(".CLASS") + } else if ( (m = match[3]) && support.getElementsByClassName ) { + push.apply( results, context.getElementsByClassName( m ) ); + return results; + } + } + + // QSA path + if ( support.qsa && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) { + nid = old = expando; + newContext = context; + newSelector = nodeType !== 1 && selector; + + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if ( nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) { + groups = tokenize( selector ); + + if ( (old = context.getAttribute("id")) ) { + nid = old.replace( rescape, "\\$&" ); + } else { + context.setAttribute( "id", nid ); + } + nid = "[id='" + nid + "'] "; + + i = groups.length; + while ( i-- ) { + groups[i] = nid + toSelector( groups[i] ); + } + newContext = rsibling.test( selector ) && testContext( context.parentNode ) || context; + newSelector = groups.join(","); + } + + if ( newSelector ) { + try { + push.apply( results, + newContext.querySelectorAll( newSelector ) + ); + return results; + } catch(qsaError) { + } finally { + if ( !old ) { + context.removeAttribute("id"); + } + } + } + } + } + + // All others + return select( selector.replace( rtrim, "$1" ), context, results, seed ); +} + +/** + * Create key-value caches of limited size + * @returns {Function(string, Object)} Returns the Object data after storing it on itself with + * property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength) + * deleting the oldest entry + */ +function createCache() { + var keys = []; + + function cache( key, value ) { + // Use (key + " ") to avoid collision with native prototype properties (see Issue #157) + if ( keys.push( key + " " ) > Expr.cacheLength ) { + // Only keep the most recent entries + delete cache[ keys.shift() ]; + } + return (cache[ key + " " ] = value); + } + return cache; +} + +/** + * Mark a function for special use by Sizzle + * @param {Function} fn The function to mark + */ +function markFunction( fn ) { + fn[ expando ] = true; + return fn; +} + +/** + * Support testing using an element + * @param {Function} fn Passed the created div and expects a boolean result + */ +function assert( fn ) { + var div = document.createElement("div"); + + try { + return !!fn( div ); + } catch (e) { + return false; + } finally { + // Remove from its parent by default + if ( div.parentNode ) { + div.parentNode.removeChild( div ); + } + // release memory in IE + div = null; + } +} + +/** + * Adds the same handler for all of the specified attrs + * @param {String} attrs Pipe-separated list of attributes + * @param {Function} handler The method that will be applied + */ +function addHandle( attrs, handler ) { + var arr = attrs.split("|"), + i = attrs.length; + + while ( i-- ) { + Expr.attrHandle[ arr[i] ] = handler; + } +} + +/** + * Checks document order of two siblings + * @param {Element} a + * @param {Element} b + * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b + */ +function siblingCheck( a, b ) { + var cur = b && a, + diff = cur && a.nodeType === 1 && b.nodeType === 1 && + ( ~b.sourceIndex || MAX_NEGATIVE ) - + ( ~a.sourceIndex || MAX_NEGATIVE ); + + // Use IE sourceIndex if available on both nodes + if ( diff ) { + return diff; + } + + // Check if b follows a + if ( cur ) { + while ( (cur = cur.nextSibling) ) { + if ( cur === b ) { + return -1; + } + } + } + + return a ? 1 : -1; +} + +/** + * Returns a function to use in pseudos for input types + * @param {String} type + */ +function createInputPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for buttons + * @param {String} type + */ +function createButtonPseudo( type ) { + return function( elem ) { + var name = elem.nodeName.toLowerCase(); + return (name === "input" || name === "button") && elem.type === type; + }; +} + +/** + * Returns a function to use in pseudos for positionals + * @param {Function} fn + */ +function createPositionalPseudo( fn ) { + return markFunction(function( argument ) { + argument = +argument; + return markFunction(function( seed, matches ) { + var j, + matchIndexes = fn( [], seed.length, argument ), + i = matchIndexes.length; + + // Match elements found at the specified indexes + while ( i-- ) { + if ( seed[ (j = matchIndexes[i]) ] ) { + seed[j] = !(matches[j] = seed[j]); + } + } + }); + }); +} + +/** + * Checks a node for validity as a Sizzle context + * @param {Element|Object=} context + * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value + */ +function testContext( context ) { + return context && typeof context.getElementsByTagName !== "undefined" && context; +} + +// Expose support vars for convenience +support = Sizzle.support = {}; + +/** + * Detects XML nodes + * @param {Element|Object} elem An element or a document + * @returns {Boolean} True iff elem is a non-HTML XML node + */ +isXML = Sizzle.isXML = function( elem ) { + // documentElement is verified for cases where it doesn't yet exist + // (such as loading iframes in IE - #4833) + var documentElement = elem && (elem.ownerDocument || elem).documentElement; + return documentElement ? documentElement.nodeName !== "HTML" : false; +}; + +/** + * Sets document-related variables once based on the current document + * @param {Element|Object} [doc] An element or document object to use to set the document + * @returns {Object} Returns the current document + */ +setDocument = Sizzle.setDocument = function( node ) { + var hasCompare, parent, + doc = node ? node.ownerDocument || node : preferredDoc; + + // If no document and documentElement is available, return + if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) { + return document; + } + + // Set our document + document = doc; + docElem = doc.documentElement; + parent = doc.defaultView; + + // Support: IE>8 + // If iframe document is assigned to "document" variable and if iframe has been reloaded, + // IE will throw "permission denied" error when accessing "document" variable, see jQuery #13936 + // IE6-8 do not support the defaultView property so parent will be undefined + if ( parent && parent !== parent.top ) { + // IE11 does not have attachEvent, so all must suffer + if ( parent.addEventListener ) { + parent.addEventListener( "unload", unloadHandler, false ); + } else if ( parent.attachEvent ) { + parent.attachEvent( "onunload", unloadHandler ); + } + } + + /* Support tests + ---------------------------------------------------------------------- */ + documentIsHTML = !isXML( doc ); + + /* Attributes + ---------------------------------------------------------------------- */ + + // Support: IE<8 + // Verify that getAttribute really returns attributes and not properties + // (excepting IE8 booleans) + support.attributes = assert(function( div ) { + div.className = "i"; + return !div.getAttribute("className"); + }); + + /* getElement(s)By* + ---------------------------------------------------------------------- */ + + // Check if getElementsByTagName("*") returns only elements + support.getElementsByTagName = assert(function( div ) { + div.appendChild( doc.createComment("") ); + return !div.getElementsByTagName("*").length; + }); + + // Support: IE<9 + support.getElementsByClassName = rnative.test( doc.getElementsByClassName ); + + // Support: IE<10 + // Check if getElementById returns elements by name + // The broken getElementById methods don't pick up programatically-set names, + // so use a roundabout getElementsByName test + support.getById = assert(function( div ) { + docElem.appendChild( div ).id = expando; + return !doc.getElementsByName || !doc.getElementsByName( expando ).length; + }); + + // ID find and filter + if ( support.getById ) { + Expr.find["ID"] = function( id, context ) { + if ( typeof context.getElementById !== "undefined" && documentIsHTML ) { + var m = context.getElementById( id ); + // Check parentNode to catch when Blackberry 4.6 returns + // nodes that are no longer in the document #6963 + return m && m.parentNode ? [ m ] : []; + } + }; + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + return elem.getAttribute("id") === attrId; + }; + }; + } else { + // Support: IE6/7 + // getElementById is not reliable as a find shortcut + delete Expr.find["ID"]; + + Expr.filter["ID"] = function( id ) { + var attrId = id.replace( runescape, funescape ); + return function( elem ) { + var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id"); + return node && node.value === attrId; + }; + }; + } + + // Tag + Expr.find["TAG"] = support.getElementsByTagName ? + function( tag, context ) { + if ( typeof context.getElementsByTagName !== "undefined" ) { + return context.getElementsByTagName( tag ); + + // DocumentFragment nodes don't have gEBTN + } else if ( support.qsa ) { + return context.querySelectorAll( tag ); + } + } : + + function( tag, context ) { + var elem, + tmp = [], + i = 0, + // By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too + results = context.getElementsByTagName( tag ); + + // Filter out possible comments + if ( tag === "*" ) { + while ( (elem = results[i++]) ) { + if ( elem.nodeType === 1 ) { + tmp.push( elem ); + } + } + + return tmp; + } + return results; + }; + + // Class + Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) { + if ( documentIsHTML ) { + return context.getElementsByClassName( className ); + } + }; + + /* QSA/matchesSelector + ---------------------------------------------------------------------- */ + + // QSA and matchesSelector support + + // matchesSelector(:active) reports false when true (IE9/Opera 11.5) + rbuggyMatches = []; + + // qSa(:focus) reports false when true (Chrome 21) + // We allow this because of a bug in IE8/9 that throws an error + // whenever `document.activeElement` is accessed on an iframe + // So, we allow :focus to pass through QSA all the time to avoid the IE error + // See http://bugs.jquery.com/ticket/13378 + rbuggyQSA = []; + + if ( (support.qsa = rnative.test( doc.querySelectorAll )) ) { + // Build QSA regex + // Regex strategy adopted from Diego Perini + assert(function( div ) { + // Select is set to empty string on purpose + // This is to test IE's treatment of not explicitly + // setting a boolean content attribute, + // since its presence should be enough + // http://bugs.jquery.com/ticket/12359 + docElem.appendChild( div ).innerHTML = "" + + ""; + + // Support: IE8, Opera 11-12.16 + // Nothing should be selected when empty strings follow ^= or $= or *= + // The test attribute must be unknown in Opera but "safe" for WinRT + // http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section + if ( div.querySelectorAll("[msallowcapture^='']").length ) { + rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" ); + } + + // Support: IE8 + // Boolean attributes and "value" are not treated correctly + if ( !div.querySelectorAll("[selected]").length ) { + rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" ); + } + + // Support: Chrome<29, Android<4.2+, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.7+ + if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) { + rbuggyQSA.push("~="); + } + + // Webkit/Opera - :checked should return selected option elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":checked").length ) { + rbuggyQSA.push(":checked"); + } + + // Support: Safari 8+, iOS 8+ + // https://bugs.webkit.org/show_bug.cgi?id=136851 + // In-page `selector#id sibing-combinator selector` fails + if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) { + rbuggyQSA.push(".#.+[+~]"); + } + }); + + assert(function( div ) { + // Support: Windows 8 Native Apps + // The type and name attributes are restricted during .innerHTML assignment + var input = doc.createElement("input"); + input.setAttribute( "type", "hidden" ); + div.appendChild( input ).setAttribute( "name", "D" ); + + // Support: IE8 + // Enforce case-sensitivity of name attribute + if ( div.querySelectorAll("[name=d]").length ) { + rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" ); + } + + // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled) + // IE8 throws error here and will not see later tests + if ( !div.querySelectorAll(":enabled").length ) { + rbuggyQSA.push( ":enabled", ":disabled" ); + } + + // Opera 10-11 does not throw on post-comma invalid pseudos + div.querySelectorAll("*,:x"); + rbuggyQSA.push(",.*:"); + }); + } + + if ( (support.matchesSelector = rnative.test( (matches = docElem.matches || + docElem.webkitMatchesSelector || + docElem.mozMatchesSelector || + docElem.oMatchesSelector || + docElem.msMatchesSelector) )) ) { + + assert(function( div ) { + // Check to see if it's possible to do matchesSelector + // on a disconnected node (IE 9) + support.disconnectedMatch = matches.call( div, "div" ); + + // This should fail with an exception + // Gecko does not error, returns false instead + matches.call( div, "[s!='']:x" ); + rbuggyMatches.push( "!=", pseudos ); + }); + } + + rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") ); + rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") ); + + /* Contains + ---------------------------------------------------------------------- */ + hasCompare = rnative.test( docElem.compareDocumentPosition ); + + // Element contains another + // Purposefully does not implement inclusive descendent + // As in, an element does not contain itself + contains = hasCompare || rnative.test( docElem.contains ) ? + function( a, b ) { + var adown = a.nodeType === 9 ? a.documentElement : a, + bup = b && b.parentNode; + return a === bup || !!( bup && bup.nodeType === 1 && ( + adown.contains ? + adown.contains( bup ) : + a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16 + )); + } : + function( a, b ) { + if ( b ) { + while ( (b = b.parentNode) ) { + if ( b === a ) { + return true; + } + } + } + return false; + }; + + /* Sorting + ---------------------------------------------------------------------- */ + + // Document order sorting + sortOrder = hasCompare ? + function( a, b ) { + + // Flag for duplicate removal + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + // Sort on method existence if only one input has compareDocumentPosition + var compare = !a.compareDocumentPosition - !b.compareDocumentPosition; + if ( compare ) { + return compare; + } + + // Calculate position if both inputs belong to the same document + compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ? + a.compareDocumentPosition( b ) : + + // Otherwise we know they are disconnected + 1; + + // Disconnected nodes + if ( compare & 1 || + (!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) { + + // Choose the first element that is related to our preferred document + if ( a === doc || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) { + return -1; + } + if ( b === doc || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) { + return 1; + } + + // Maintain original order + return sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + } + + return compare & 4 ? -1 : 1; + } : + function( a, b ) { + // Exit early if the nodes are identical + if ( a === b ) { + hasDuplicate = true; + return 0; + } + + var cur, + i = 0, + aup = a.parentNode, + bup = b.parentNode, + ap = [ a ], + bp = [ b ]; + + // Parentless nodes are either documents or disconnected + if ( !aup || !bup ) { + return a === doc ? -1 : + b === doc ? 1 : + aup ? -1 : + bup ? 1 : + sortInput ? + ( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) : + 0; + + // If the nodes are siblings, we can do a quick check + } else if ( aup === bup ) { + return siblingCheck( a, b ); + } + + // Otherwise we need full lists of their ancestors for comparison + cur = a; + while ( (cur = cur.parentNode) ) { + ap.unshift( cur ); + } + cur = b; + while ( (cur = cur.parentNode) ) { + bp.unshift( cur ); + } + + // Walk down the tree looking for a discrepancy + while ( ap[i] === bp[i] ) { + i++; + } + + return i ? + // Do a sibling check if the nodes have a common ancestor + siblingCheck( ap[i], bp[i] ) : + + // Otherwise nodes in our document sort first + ap[i] === preferredDoc ? -1 : + bp[i] === preferredDoc ? 1 : + 0; + }; + + return doc; +}; + +Sizzle.matches = function( expr, elements ) { + return Sizzle( expr, null, null, elements ); +}; + +Sizzle.matchesSelector = function( elem, expr ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + // Make sure that attribute selectors are quoted + expr = expr.replace( rattributeQuotes, "='$1']" ); + + if ( support.matchesSelector && documentIsHTML && + ( !rbuggyMatches || !rbuggyMatches.test( expr ) ) && + ( !rbuggyQSA || !rbuggyQSA.test( expr ) ) ) { + + try { + var ret = matches.call( elem, expr ); + + // IE 9's matchesSelector returns false on disconnected nodes + if ( ret || support.disconnectedMatch || + // As well, disconnected nodes are said to be in a document + // fragment in IE 9 + elem.document && elem.document.nodeType !== 11 ) { + return ret; + } + } catch (e) {} + } + + return Sizzle( expr, document, null, [ elem ] ).length > 0; +}; + +Sizzle.contains = function( context, elem ) { + // Set document vars if needed + if ( ( context.ownerDocument || context ) !== document ) { + setDocument( context ); + } + return contains( context, elem ); +}; + +Sizzle.attr = function( elem, name ) { + // Set document vars if needed + if ( ( elem.ownerDocument || elem ) !== document ) { + setDocument( elem ); + } + + var fn = Expr.attrHandle[ name.toLowerCase() ], + // Don't get fooled by Object.prototype properties (jQuery #13807) + val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ? + fn( elem, name, !documentIsHTML ) : + undefined; + + return val !== undefined ? + val : + support.attributes || !documentIsHTML ? + elem.getAttribute( name ) : + (val = elem.getAttributeNode(name)) && val.specified ? + val.value : + null; +}; + +Sizzle.error = function( msg ) { + throw new Error( "Syntax error, unrecognized expression: " + msg ); +}; + +/** + * Document sorting and removing duplicates + * @param {ArrayLike} results + */ +Sizzle.uniqueSort = function( results ) { + var elem, + duplicates = [], + j = 0, + i = 0; + + // Unless we *know* we can detect duplicates, assume their presence + hasDuplicate = !support.detectDuplicates; + sortInput = !support.sortStable && results.slice( 0 ); + results.sort( sortOrder ); + + if ( hasDuplicate ) { + while ( (elem = results[i++]) ) { + if ( elem === results[ i ] ) { + j = duplicates.push( i ); + } + } + while ( j-- ) { + results.splice( duplicates[ j ], 1 ); + } + } + + // Clear input after sorting to release objects + // See https://github.com/jquery/sizzle/pull/225 + sortInput = null; + + return results; +}; + +/** + * Utility function for retrieving the text value of an array of DOM nodes + * @param {Array|Element} elem + */ +getText = Sizzle.getText = function( elem ) { + var node, + ret = "", + i = 0, + nodeType = elem.nodeType; + + if ( !nodeType ) { + // If no nodeType, this is expected to be an array + while ( (node = elem[i++]) ) { + // Do not traverse comment nodes + ret += getText( node ); + } + } else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) { + // Use textContent for elements + // innerText usage removed for consistency of new lines (jQuery #11153) + if ( typeof elem.textContent === "string" ) { + return elem.textContent; + } else { + // Traverse its children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + ret += getText( elem ); + } + } + } else if ( nodeType === 3 || nodeType === 4 ) { + return elem.nodeValue; + } + // Do not include comment or processing instruction nodes + + return ret; +}; + +Expr = Sizzle.selectors = { + + // Can be adjusted by the user + cacheLength: 50, + + createPseudo: markFunction, + + match: matchExpr, + + attrHandle: {}, + + find: {}, + + relative: { + ">": { dir: "parentNode", first: true }, + " ": { dir: "parentNode" }, + "+": { dir: "previousSibling", first: true }, + "~": { dir: "previousSibling" } + }, + + preFilter: { + "ATTR": function( match ) { + match[1] = match[1].replace( runescape, funescape ); + + // Move the given value to match[3] whether quoted or unquoted + match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape ); + + if ( match[2] === "~=" ) { + match[3] = " " + match[3] + " "; + } + + return match.slice( 0, 4 ); + }, + + "CHILD": function( match ) { + /* matches from matchExpr["CHILD"] + 1 type (only|nth|...) + 2 what (child|of-type) + 3 argument (even|odd|\d*|\d*n([+-]\d+)?|...) + 4 xn-component of xn+y argument ([+-]?\d*n|) + 5 sign of xn-component + 6 x of xn-component + 7 sign of y-component + 8 y of y-component + */ + match[1] = match[1].toLowerCase(); + + if ( match[1].slice( 0, 3 ) === "nth" ) { + // nth-* requires argument + if ( !match[3] ) { + Sizzle.error( match[0] ); + } + + // numeric x and y parameters for Expr.filter.CHILD + // remember that false/true cast respectively to 0/1 + match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) ); + match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" ); + + // other types prohibit arguments + } else if ( match[3] ) { + Sizzle.error( match[0] ); + } + + return match; + }, + + "PSEUDO": function( match ) { + var excess, + unquoted = !match[6] && match[2]; + + if ( matchExpr["CHILD"].test( match[0] ) ) { + return null; + } + + // Accept quoted arguments as-is + if ( match[3] ) { + match[2] = match[4] || match[5] || ""; + + // Strip excess characters from unquoted arguments + } else if ( unquoted && rpseudo.test( unquoted ) && + // Get excess from tokenize (recursively) + (excess = tokenize( unquoted, true )) && + // advance to the next closing parenthesis + (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) { + + // excess is a negative index + match[0] = match[0].slice( 0, excess ); + match[2] = unquoted.slice( 0, excess ); + } + + // Return only captures needed by the pseudo filter method (type and argument) + return match.slice( 0, 3 ); + } + }, + + filter: { + + "TAG": function( nodeNameSelector ) { + var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase(); + return nodeNameSelector === "*" ? + function() { return true; } : + function( elem ) { + return elem.nodeName && elem.nodeName.toLowerCase() === nodeName; + }; + }, + + "CLASS": function( className ) { + var pattern = classCache[ className + " " ]; + + return pattern || + (pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) && + classCache( className, function( elem ) { + return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" ); + }); + }, + + "ATTR": function( name, operator, check ) { + return function( elem ) { + var result = Sizzle.attr( elem, name ); + + if ( result == null ) { + return operator === "!="; + } + if ( !operator ) { + return true; + } + + result += ""; + + return operator === "=" ? result === check : + operator === "!=" ? result !== check : + operator === "^=" ? check && result.indexOf( check ) === 0 : + operator === "*=" ? check && result.indexOf( check ) > -1 : + operator === "$=" ? check && result.slice( -check.length ) === check : + operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 : + operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" : + false; + }; + }, + + "CHILD": function( type, what, argument, first, last ) { + var simple = type.slice( 0, 3 ) !== "nth", + forward = type.slice( -4 ) !== "last", + ofType = what === "of-type"; + + return first === 1 && last === 0 ? + + // Shortcut for :nth-*(n) + function( elem ) { + return !!elem.parentNode; + } : + + function( elem, context, xml ) { + var cache, outerCache, node, diff, nodeIndex, start, + dir = simple !== forward ? "nextSibling" : "previousSibling", + parent = elem.parentNode, + name = ofType && elem.nodeName.toLowerCase(), + useCache = !xml && !ofType; + + if ( parent ) { + + // :(first|last|only)-(child|of-type) + if ( simple ) { + while ( dir ) { + node = elem; + while ( (node = node[ dir ]) ) { + if ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) { + return false; + } + } + // Reverse direction for :only-* (if we haven't yet done so) + start = dir = type === "only" && !start && "nextSibling"; + } + return true; + } + + start = [ forward ? parent.firstChild : parent.lastChild ]; + + // non-xml :nth-child(...) stores cache data on `parent` + if ( forward && useCache ) { + // Seek `elem` from a previously-cached index + outerCache = parent[ expando ] || (parent[ expando ] = {}); + cache = outerCache[ type ] || []; + nodeIndex = cache[0] === dirruns && cache[1]; + diff = cache[0] === dirruns && cache[2]; + node = nodeIndex && parent.childNodes[ nodeIndex ]; + + while ( (node = ++nodeIndex && node && node[ dir ] || + + // Fallback to seeking `elem` from the start + (diff = nodeIndex = 0) || start.pop()) ) { + + // When found, cache indexes on `parent` and break + if ( node.nodeType === 1 && ++diff && node === elem ) { + outerCache[ type ] = [ dirruns, nodeIndex, diff ]; + break; + } + } + + // Use previously-cached element index if available + } else if ( useCache && (cache = (elem[ expando ] || (elem[ expando ] = {}))[ type ]) && cache[0] === dirruns ) { + diff = cache[1]; + + // xml :nth-child(...) or :nth-last-child(...) or :nth(-last)?-of-type(...) + } else { + // Use the same loop as above to seek `elem` from the start + while ( (node = ++nodeIndex && node && node[ dir ] || + (diff = nodeIndex = 0) || start.pop()) ) { + + if ( ( ofType ? node.nodeName.toLowerCase() === name : node.nodeType === 1 ) && ++diff ) { + // Cache the index of each encountered element + if ( useCache ) { + (node[ expando ] || (node[ expando ] = {}))[ type ] = [ dirruns, diff ]; + } + + if ( node === elem ) { + break; + } + } + } + } + + // Incorporate the offset, then check against cycle size + diff -= last; + return diff === first || ( diff % first === 0 && diff / first >= 0 ); + } + }; + }, + + "PSEUDO": function( pseudo, argument ) { + // pseudo-class names are case-insensitive + // http://www.w3.org/TR/selectors/#pseudo-classes + // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters + // Remember that setFilters inherits from pseudos + var args, + fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] || + Sizzle.error( "unsupported pseudo: " + pseudo ); + + // The user may use createPseudo to indicate that + // arguments are needed to create the filter function + // just as Sizzle does + if ( fn[ expando ] ) { + return fn( argument ); + } + + // But maintain support for old signatures + if ( fn.length > 1 ) { + args = [ pseudo, pseudo, "", argument ]; + return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ? + markFunction(function( seed, matches ) { + var idx, + matched = fn( seed, argument ), + i = matched.length; + while ( i-- ) { + idx = indexOf( seed, matched[i] ); + seed[ idx ] = !( matches[ idx ] = matched[i] ); + } + }) : + function( elem ) { + return fn( elem, 0, args ); + }; + } + + return fn; + } + }, + + pseudos: { + // Potentially complex pseudos + "not": markFunction(function( selector ) { + // Trim the selector passed to compile + // to avoid treating leading and trailing + // spaces as combinators + var input = [], + results = [], + matcher = compile( selector.replace( rtrim, "$1" ) ); + + return matcher[ expando ] ? + markFunction(function( seed, matches, context, xml ) { + var elem, + unmatched = matcher( seed, null, xml, [] ), + i = seed.length; + + // Match elements unmatched by `matcher` + while ( i-- ) { + if ( (elem = unmatched[i]) ) { + seed[i] = !(matches[i] = elem); + } + } + }) : + function( elem, context, xml ) { + input[0] = elem; + matcher( input, null, xml, results ); + // Don't keep the element (issue #299) + input[0] = null; + return !results.pop(); + }; + }), + + "has": markFunction(function( selector ) { + return function( elem ) { + return Sizzle( selector, elem ).length > 0; + }; + }), + + "contains": markFunction(function( text ) { + text = text.replace( runescape, funescape ); + return function( elem ) { + return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1; + }; + }), + + // "Whether an element is represented by a :lang() selector + // is based solely on the element's language value + // being equal to the identifier C, + // or beginning with the identifier C immediately followed by "-". + // The matching of C against the element's language value is performed case-insensitively. + // The identifier C does not have to be a valid language name." + // http://www.w3.org/TR/selectors/#lang-pseudo + "lang": markFunction( function( lang ) { + // lang value must be a valid identifier + if ( !ridentifier.test(lang || "") ) { + Sizzle.error( "unsupported lang: " + lang ); + } + lang = lang.replace( runescape, funescape ).toLowerCase(); + return function( elem ) { + var elemLang; + do { + if ( (elemLang = documentIsHTML ? + elem.lang : + elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) { + + elemLang = elemLang.toLowerCase(); + return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0; + } + } while ( (elem = elem.parentNode) && elem.nodeType === 1 ); + return false; + }; + }), + + // Miscellaneous + "target": function( elem ) { + var hash = window.location && window.location.hash; + return hash && hash.slice( 1 ) === elem.id; + }, + + "root": function( elem ) { + return elem === docElem; + }, + + "focus": function( elem ) { + return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex); + }, + + // Boolean properties + "enabled": function( elem ) { + return elem.disabled === false; + }, + + "disabled": function( elem ) { + return elem.disabled === true; + }, + + "checked": function( elem ) { + // In CSS3, :checked should return both checked and selected elements + // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked + var nodeName = elem.nodeName.toLowerCase(); + return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected); + }, + + "selected": function( elem ) { + // Accessing this property makes selected-by-default + // options in Safari work properly + if ( elem.parentNode ) { + elem.parentNode.selectedIndex; + } + + return elem.selected === true; + }, + + // Contents + "empty": function( elem ) { + // http://www.w3.org/TR/selectors/#empty-pseudo + // :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5), + // but not by others (comment: 8; processing instruction: 7; etc.) + // nodeType < 6 works because attributes (2) do not appear as children + for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) { + if ( elem.nodeType < 6 ) { + return false; + } + } + return true; + }, + + "parent": function( elem ) { + return !Expr.pseudos["empty"]( elem ); + }, + + // Element/input types + "header": function( elem ) { + return rheader.test( elem.nodeName ); + }, + + "input": function( elem ) { + return rinputs.test( elem.nodeName ); + }, + + "button": function( elem ) { + var name = elem.nodeName.toLowerCase(); + return name === "input" && elem.type === "button" || name === "button"; + }, + + "text": function( elem ) { + var attr; + return elem.nodeName.toLowerCase() === "input" && + elem.type === "text" && + + // Support: IE<8 + // New HTML5 attribute values (e.g., "search") appear with elem.type === "text" + ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" ); + }, + + // Position-in-collection + "first": createPositionalPseudo(function() { + return [ 0 ]; + }), + + "last": createPositionalPseudo(function( matchIndexes, length ) { + return [ length - 1 ]; + }), + + "eq": createPositionalPseudo(function( matchIndexes, length, argument ) { + return [ argument < 0 ? argument + length : argument ]; + }), + + "even": createPositionalPseudo(function( matchIndexes, length ) { + var i = 0; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "odd": createPositionalPseudo(function( matchIndexes, length ) { + var i = 1; + for ( ; i < length; i += 2 ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "lt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; --i >= 0; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }), + + "gt": createPositionalPseudo(function( matchIndexes, length, argument ) { + var i = argument < 0 ? argument + length : argument; + for ( ; ++i < length; ) { + matchIndexes.push( i ); + } + return matchIndexes; + }) + } +}; + +Expr.pseudos["nth"] = Expr.pseudos["eq"]; + +// Add button/input type pseudos +for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) { + Expr.pseudos[ i ] = createInputPseudo( i ); +} +for ( i in { submit: true, reset: true } ) { + Expr.pseudos[ i ] = createButtonPseudo( i ); +} + +// Easy API for creating new setFilters +function setFilters() {} +setFilters.prototype = Expr.filters = Expr.pseudos; +Expr.setFilters = new setFilters(); + +tokenize = Sizzle.tokenize = function( selector, parseOnly ) { + var matched, match, tokens, type, + soFar, groups, preFilters, + cached = tokenCache[ selector + " " ]; + + if ( cached ) { + return parseOnly ? 0 : cached.slice( 0 ); + } + + soFar = selector; + groups = []; + preFilters = Expr.preFilter; + + while ( soFar ) { + + // Comma and first run + if ( !matched || (match = rcomma.exec( soFar )) ) { + if ( match ) { + // Don't consume trailing commas as valid + soFar = soFar.slice( match[0].length ) || soFar; + } + groups.push( (tokens = []) ); + } + + matched = false; + + // Combinators + if ( (match = rcombinators.exec( soFar )) ) { + matched = match.shift(); + tokens.push({ + value: matched, + // Cast descendant combinators to space + type: match[0].replace( rtrim, " " ) + }); + soFar = soFar.slice( matched.length ); + } + + // Filters + for ( type in Expr.filter ) { + if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] || + (match = preFilters[ type ]( match ))) ) { + matched = match.shift(); + tokens.push({ + value: matched, + type: type, + matches: match + }); + soFar = soFar.slice( matched.length ); + } + } + + if ( !matched ) { + break; + } + } + + // Return the length of the invalid excess + // if we're just parsing + // Otherwise, throw an error or return tokens + return parseOnly ? + soFar.length : + soFar ? + Sizzle.error( selector ) : + // Cache the tokens + tokenCache( selector, groups ).slice( 0 ); +}; + +function toSelector( tokens ) { + var i = 0, + len = tokens.length, + selector = ""; + for ( ; i < len; i++ ) { + selector += tokens[i].value; + } + return selector; +} + +function addCombinator( matcher, combinator, base ) { + var dir = combinator.dir, + checkNonElements = base && dir === "parentNode", + doneName = done++; + + return combinator.first ? + // Check against closest ancestor/preceding element + function( elem, context, xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + return matcher( elem, context, xml ); + } + } + } : + + // Check against all ancestor/preceding elements + function( elem, context, xml ) { + var oldCache, outerCache, + newCache = [ dirruns, doneName ]; + + // We can't set arbitrary data on XML nodes, so they don't benefit from dir caching + if ( xml ) { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + if ( matcher( elem, context, xml ) ) { + return true; + } + } + } + } else { + while ( (elem = elem[ dir ]) ) { + if ( elem.nodeType === 1 || checkNonElements ) { + outerCache = elem[ expando ] || (elem[ expando ] = {}); + if ( (oldCache = outerCache[ dir ]) && + oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) { + + // Assign to newCache so results back-propagate to previous elements + return (newCache[ 2 ] = oldCache[ 2 ]); + } else { + // Reuse newcache so results back-propagate to previous elements + outerCache[ dir ] = newCache; + + // A match means we're done; a fail means we have to keep checking + if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) { + return true; + } + } + } + } + } + }; +} + +function elementMatcher( matchers ) { + return matchers.length > 1 ? + function( elem, context, xml ) { + var i = matchers.length; + while ( i-- ) { + if ( !matchers[i]( elem, context, xml ) ) { + return false; + } + } + return true; + } : + matchers[0]; +} + +function multipleContexts( selector, contexts, results ) { + var i = 0, + len = contexts.length; + for ( ; i < len; i++ ) { + Sizzle( selector, contexts[i], results ); + } + return results; +} + +function condense( unmatched, map, filter, context, xml ) { + var elem, + newUnmatched = [], + i = 0, + len = unmatched.length, + mapped = map != null; + + for ( ; i < len; i++ ) { + if ( (elem = unmatched[i]) ) { + if ( !filter || filter( elem, context, xml ) ) { + newUnmatched.push( elem ); + if ( mapped ) { + map.push( i ); + } + } + } + } + + return newUnmatched; +} + +function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) { + if ( postFilter && !postFilter[ expando ] ) { + postFilter = setMatcher( postFilter ); + } + if ( postFinder && !postFinder[ expando ] ) { + postFinder = setMatcher( postFinder, postSelector ); + } + return markFunction(function( seed, results, context, xml ) { + var temp, i, elem, + preMap = [], + postMap = [], + preexisting = results.length, + + // Get initial elements from seed or context + elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ), + + // Prefilter to get matcher input, preserving a map for seed-results synchronization + matcherIn = preFilter && ( seed || !selector ) ? + condense( elems, preMap, preFilter, context, xml ) : + elems, + + matcherOut = matcher ? + // If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results, + postFinder || ( seed ? preFilter : preexisting || postFilter ) ? + + // ...intermediate processing is necessary + [] : + + // ...otherwise use results directly + results : + matcherIn; + + // Find primary matches + if ( matcher ) { + matcher( matcherIn, matcherOut, context, xml ); + } + + // Apply postFilter + if ( postFilter ) { + temp = condense( matcherOut, postMap ); + postFilter( temp, [], context, xml ); + + // Un-match failing elements by moving them back to matcherIn + i = temp.length; + while ( i-- ) { + if ( (elem = temp[i]) ) { + matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem); + } + } + } + + if ( seed ) { + if ( postFinder || preFilter ) { + if ( postFinder ) { + // Get the final matcherOut by condensing this intermediate into postFinder contexts + temp = []; + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) ) { + // Restore matcherIn since elem is not yet a final match + temp.push( (matcherIn[i] = elem) ); + } + } + postFinder( null, (matcherOut = []), temp, xml ); + } + + // Move matched elements from seed to results to keep them synchronized + i = matcherOut.length; + while ( i-- ) { + if ( (elem = matcherOut[i]) && + (temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) { + + seed[temp] = !(results[temp] = elem); + } + } + } + + // Add elements to results, through postFinder if defined + } else { + matcherOut = condense( + matcherOut === results ? + matcherOut.splice( preexisting, matcherOut.length ) : + matcherOut + ); + if ( postFinder ) { + postFinder( null, results, matcherOut, xml ); + } else { + push.apply( results, matcherOut ); + } + } + }); +} + +function matcherFromTokens( tokens ) { + var checkContext, matcher, j, + len = tokens.length, + leadingRelative = Expr.relative[ tokens[0].type ], + implicitRelative = leadingRelative || Expr.relative[" "], + i = leadingRelative ? 1 : 0, + + // The foundational matcher ensures that elements are reachable from top-level context(s) + matchContext = addCombinator( function( elem ) { + return elem === checkContext; + }, implicitRelative, true ), + matchAnyContext = addCombinator( function( elem ) { + return indexOf( checkContext, elem ) > -1; + }, implicitRelative, true ), + matchers = [ function( elem, context, xml ) { + var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || ( + (checkContext = context).nodeType ? + matchContext( elem, context, xml ) : + matchAnyContext( elem, context, xml ) ); + // Avoid hanging onto element (issue #299) + checkContext = null; + return ret; + } ]; + + for ( ; i < len; i++ ) { + if ( (matcher = Expr.relative[ tokens[i].type ]) ) { + matchers = [ addCombinator(elementMatcher( matchers ), matcher) ]; + } else { + matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches ); + + // Return special upon seeing a positional matcher + if ( matcher[ expando ] ) { + // Find the next relative operator (if any) for proper handling + j = ++i; + for ( ; j < len; j++ ) { + if ( Expr.relative[ tokens[j].type ] ) { + break; + } + } + return setMatcher( + i > 1 && elementMatcher( matchers ), + i > 1 && toSelector( + // If the preceding token was a descendant combinator, insert an implicit any-element `*` + tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" }) + ).replace( rtrim, "$1" ), + matcher, + i < j && matcherFromTokens( tokens.slice( i, j ) ), + j < len && matcherFromTokens( (tokens = tokens.slice( j )) ), + j < len && toSelector( tokens ) + ); + } + matchers.push( matcher ); + } + } + + return elementMatcher( matchers ); +} + +function matcherFromGroupMatchers( elementMatchers, setMatchers ) { + var bySet = setMatchers.length > 0, + byElement = elementMatchers.length > 0, + superMatcher = function( seed, context, xml, results, outermost ) { + var elem, j, matcher, + matchedCount = 0, + i = "0", + unmatched = seed && [], + setMatched = [], + contextBackup = outermostContext, + // We must always have either seed elements or outermost context + elems = seed || byElement && Expr.find["TAG"]( "*", outermost ), + // Use integer dirruns iff this is the outermost matcher + dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1), + len = elems.length; + + if ( outermost ) { + outermostContext = context !== document && context; + } + + // Add elements passing elementMatchers directly to results + // Keep `i` a string if there are no elements so `matchedCount` will be "00" below + // Support: IE<9, Safari + // Tolerate NodeList properties (IE: "length"; Safari: