From fcfc7fe214ff116ebdae2daf61e107884497266f Mon Sep 17 00:00:00 2001 From: Vrushank Brahmakshatriya Date: Thu, 30 May 2024 18:25:06 +0530 Subject: [PATCH] add(plugin): Added dashboard plus chrome plugin files Added dashboard plus chrome plugin files to this repo in order to receive bunny cdn url and make the plugin work on our systems --- dashboard-plus-chrome-plugin/README.md | 22 + dashboard-plus-chrome-plugin/bootstrap.js | 476 +++ dashboard-plus-chrome-plugin/changelog.txt | 64 + .../css/envato-style.css | 10 + .../css/jquery.wysiwyg.css | 10 + .../css/replypantry.css | 233 ++ .../css/statement_merge.css | 4 + .../css/statementer.css | 396 +++ dashboard-plus-chrome-plugin/icon.png | Bin 0 -> 1181 bytes .../img/replypantry-can.png | Bin 0 -> 1028 bytes .../img/replypantry-edit.png | Bin 0 -> 702 bytes dashboard-plus-chrome-plugin/index.html | 1 + dashboard-plus-chrome-plugin/inject.js | 2 + dashboard-plus-chrome-plugin/manifest.json | 52 + .../plugins/chaching.js | 72 + .../plugins/compare_earnings.js | 119 + .../plugins/editinline.js | 3109 +++++++++++++++++ .../plugins/envatitor.js | 384 ++ .../plugins/gotolivepreview.js | 74 + .../plugins/notification.js | 224 ++ .../plugins/progressbar.js | 22 + .../plugins/quickcollection.js | 216 ++ .../plugins/reminder.js | 97 + .../plugins/replypantry.js | 381 ++ .../plugins/salesrefresher.js | 48 + .../plugins/statement_merge.js | 84 + .../plugins/statementer.js | 1130 ++++++ .../plugins/verify.js | 83 + dashboard-plus-chrome-plugin/screenshot.png | Bin 0 -> 63827 bytes dashboard-plus-chrome-plugin/script.js | 51 + 30 files changed, 7364 insertions(+) create mode 100644 dashboard-plus-chrome-plugin/README.md create mode 100644 dashboard-plus-chrome-plugin/bootstrap.js create mode 100644 dashboard-plus-chrome-plugin/changelog.txt create mode 100644 dashboard-plus-chrome-plugin/css/envato-style.css create mode 100644 dashboard-plus-chrome-plugin/css/jquery.wysiwyg.css create mode 100644 dashboard-plus-chrome-plugin/css/replypantry.css create mode 100644 dashboard-plus-chrome-plugin/css/statement_merge.css create mode 100644 dashboard-plus-chrome-plugin/css/statementer.css create mode 100644 dashboard-plus-chrome-plugin/icon.png create mode 100644 dashboard-plus-chrome-plugin/img/replypantry-can.png create mode 100644 dashboard-plus-chrome-plugin/img/replypantry-edit.png create mode 100644 dashboard-plus-chrome-plugin/index.html create mode 100644 dashboard-plus-chrome-plugin/inject.js create mode 100644 dashboard-plus-chrome-plugin/manifest.json create mode 100644 dashboard-plus-chrome-plugin/plugins/chaching.js create mode 100644 dashboard-plus-chrome-plugin/plugins/compare_earnings.js create mode 100644 dashboard-plus-chrome-plugin/plugins/editinline.js create mode 100644 dashboard-plus-chrome-plugin/plugins/envatitor.js create mode 100644 dashboard-plus-chrome-plugin/plugins/gotolivepreview.js create mode 100644 dashboard-plus-chrome-plugin/plugins/notification.js create mode 100644 dashboard-plus-chrome-plugin/plugins/progressbar.js create mode 100644 dashboard-plus-chrome-plugin/plugins/quickcollection.js create mode 100644 dashboard-plus-chrome-plugin/plugins/reminder.js create mode 100644 dashboard-plus-chrome-plugin/plugins/replypantry.js create mode 100644 dashboard-plus-chrome-plugin/plugins/salesrefresher.js create mode 100644 dashboard-plus-chrome-plugin/plugins/statement_merge.js create mode 100644 dashboard-plus-chrome-plugin/plugins/statementer.js create mode 100644 dashboard-plus-chrome-plugin/plugins/verify.js create mode 100644 dashboard-plus-chrome-plugin/screenshot.png create mode 100644 dashboard-plus-chrome-plugin/script.js diff --git a/dashboard-plus-chrome-plugin/README.md b/dashboard-plus-chrome-plugin/README.md new file mode 100644 index 0000000..4112b3a --- /dev/null +++ b/dashboard-plus-chrome-plugin/README.md @@ -0,0 +1,22 @@ +Dashboard Plus for the Envato Market +============== + +Dashboard Plus created by @revaxarts + +More details here: http://themeforest.net/forums/thread/introducing-dashboard-plus/71870 + +Install from the Webstore: https://chrome.google.com/webstore/detail/dashboard-plus-for-envato/gcbcdaghonmljaplbpbbimmmfhmhcheh + +Development Howto: +------------- + +1. Fork a copy of this repo +2. Checkout your copy of the repo to your local computer +3. Uncomment the `//var dashboardplus_base_uri = chrome.extension.getURL('');` code in `script.js` so files are loaded locally. +3. Disable the real Dashboard Plus extension in Google Chrome +4. Click "Developer Mode" at the top of the Google Chrome extension page +5. Click "Load Unpacked Extension" and select the git checkout folder +6. This should load your own local copy of the extension into Google Chrome +7. Edit the files and use the "Reload" button on the Extension page to test the changes. +8. Once happy with changes, commit them back to your git repo, then do a pull request so I can merge those changes into this repo for everyone. + diff --git a/dashboard-plus-chrome-plugin/bootstrap.js b/dashboard-plus-chrome-plugin/bootstrap.js new file mode 100644 index 0000000..1606f66 --- /dev/null +++ b/dashboard-plus-chrome-plugin/bootstrap.js @@ -0,0 +1,476 @@ +/* + * Copyright (c) 2014 + * ================================== + * powered by revaxarts.com (http://revaxarts.com) + * original filename: bootstrap.js + * filesize: 12643 Bytes + * last modified: Thu, 12 Jun 2014 09:12:30 +0200 + * + */ +(function () { + + //"use strict" + + var version = '1.5', + cookiePrefix = 'dbp_'; + + if( typeof jQuery != 'undefined' ){ + go(); + return; + } + + yepnope({ + load: [ + "http://0.envato-static.com/assets/application/vendor-2b538c3f97134712a085fc58f4c396f5.js" + ], + complete: go + }); + + function go(){ + + var username = $('.global-header-menu__link-text').html(); + var loadit = []; + var storage; + if(!username) return false; + window.dashboardplus = window.dashboardplus || {}; + window.dashboardplus['base'] = window.dashboardplus['base'] || '//dtbaker.github.io/dashboard-plus/'; + window.dashboardplus['user'] = username; + + try{ + window.dashboardplus['storage'] = $.parseJSON(localStorage.getItem('dashboardplus')); + + if(!window.dashboardplus['storage']) { + window.dashboardplus['storage'] = {}; + + save('firstvisit', true); + if(confirm('Welcome to Dashboard Plus!\nYou have to enable plugins at the settings page!\n\nGo there?')){ + location.href = '/user/'+username+'/edit#dashboard_plus'; + } + } + + }catch (e) { + window.dashboardplus['storage'] = {}; + } + + window.dashboardplus.set = function(extension, name, value){ + var obj = localStorage[extension] ? $.parseJSON(localStorage[extension]) : {}; + + obj[name] = value; + localStorage.setItem(extension, JSON.stringify(obj)); + + }; + + window.dashboardplus.get = function(extension, name){ + var obj = localStorage[extension] || false; + + if(!obj) return ''; + + obj = $.parseJSON(obj); + + return (obj[name]) ? obj[name] : ''; + }; + + window.dashboardplus.delete = function(extension, name){ + if(!name){ + localStorage.removeItem(extension); + }else{ + var obj = localStorage[extension] ? $.parseJSON(localStorage[extension]) : {}; + if(obj[name]){ + delete(obj[name]); + localStorage.setItem(extension, JSON.stringify(obj)); + } + } + + }; + + window.dashboardplus.setCookie = function(cookieName, value, daysToExpire, path, domain, secure) { + var expiryDate; + + cookieName = cookiePrefix + cookieName; + + if (daysToExpire) { + expiryDate = new Date(); + expiryDate.setTime(expiryDate.getTime() + (daysToExpire * 8.64e7)); + } + + document.cookie = cookieName + '=' + (value.toString()) + + (daysToExpire ? ';expires=' + expiryDate.toGMTString() : '') + + ';path=' + (path ? path : '/') + + (domain ? ';domain=' + domain : '') + + (secure ? ';secure' : ''); + return window.dashboardplus.getCookie(cookieName); + }; + + window.dashboardplus.getCookie = function(cookieName) { + + cookieName = cookiePrefix + cookieName; + + var cookiePattern = new RegExp('(^|;)[ ]*' + cookieName + '=([^;]*)'), + cookieMatch = cookiePattern.exec(document.cookie); + if(cookieMatch){ + return cookieMatch[2]; + } + return 0; + }; + + window.dashboardplus.deleteCookie = function(cookieName) { + return window.dashboardplus.setCookie(cookieName, 0, -1); + }; + + var fontawesome = $(''); + + var active_plugins = get('active', {}); + + var $content = $('#content'); + + var plugins = { + 'statementer': { + 'name': 'Statementer', + 'desc': 'Advanced Statement Section (graphs etc..)' + }, + 'statement_merge': { + 'name': 'Statement Merge', + 'desc': 'Merge author fees into a single row on the statement page' + }, + 'notification': { + 'name': 'Notifications', + 'desc': 'Display count of unread item comments' + }, + 'reminder': { + 'name': 'Withdrawal reminder', + 'desc': 'never forget to withdraw your earned money!', + 'settings':[ + { + 'id': 'hours', + 'label': 'define the hours you would like to get reminded before deadline', + 'placeholder': '1, 3, 24, 48, 72' + } + ] + }, + 'editinline': { + 'name': 'Edit Inline (currenlty disabled)', + 'desc': 'Edit your items directly on the item description page' + }, + 'envatitor': { + 'name': 'Envatitor Embedded', + 'desc': 'Advanced editor for the forums', + 'font': true + }, + 'verify': { + 'name': 'Purchase Verification', + 'desc': 'verify purchasecodes right on your dashboards sidebar' + }, + 'progressbar': { + 'name': 'Upload Progressbar', + 'desc': 'Show the progressbar on uploads' + }, + 'quickcollection': { + 'name': 'Quickcollection', + 'desc': 'Add items to your bookmarks from the item thumbnail' + }, + 'gotolivepreview': { + 'name': 'GoToLivepreview', + 'desc': 'open livepreview right from the item thumbnail (only CC, TF, AD)' + }, + 'chaching': { + 'name': 'Cha-Ching for Envato Authors', + 'desc': 'Sales Notification with sound!', + 'settings':[ + { + 'id': 'playsound', + 'type': 'checkbox', + 'label': 'play sound' + } + ] + }, + // 'salesrefresher': { + // 'name': 'Sales Refresher', + // 'desc': 'Refresh your salescount without reloading the site (click on your balance to reload)', + // 'settings':[ + // { + // 'id': 'autoreload', + // 'type': 'checkbox', + // 'label': 'autoreload every 5 minutes' + // } + // ] + // }, + 'replypantry': { + 'name': 'Reply Pantry', + 'desc': 'Store canned text for use in forums and item comments' + }, + 'compare_earnings': { + 'name': 'Compare Earnings', + 'desc': 'allows you to compare your earnings with a previous month/year' + }, + '_localdevelopment': { + 'beta': true, + 'name': 'Local Development', + 'desc': 'development only' + } + }; + + //Dashboard Page + if (location.href.match(/^https?:\/\/([\.a-z3]+)\.(net)\/author_dashboard/)) { + + enque('envatitor'); + enque('verify'); + enque('progressbar'); + enque('replypantry'); + + //Earnings Page + }else if (location.href.match(/^https?:\/\/([\.a-z3]+)\.(net)\/user\/(\w+)\/earnings\/(total_sales|item_sales|referrals|support_sales)\/(.*)/)) { + + enque('compare_earnings'); + + //Settings Page + }else if (window.location.href.match(/^https?:\/\/[\.a-z3]+\.net\/user\/.*\/statement/) || location.href.match(/^https?:\/\/([\.a-z3]+)\.(net)\/statement/)) { + + enque('statementer'); + enque('statement_merge'); + + //Forums Page + }else if (location.href.match(/^https?:\/\/([\.a-z3]+)\.(net)\/user\/([\w-]+)\/(\w+)/)) { + + settingspage(); + + //Statement Page + }else if (location.href.match(/^https?:\/\/([\.a-z3]+)\.(net)\/forums\//)) { + + enque('envatitor'); + enque('replypantry'); + //Upload Page + }else if (location.href.match(/^https?:\/\/([\.a-z3]+)\.(net)\/upload\//)) { + + enque('envatitor'); + + //item edit page + }else if (location.href.match(/^https?:\/\/([\.a-z3]+)\.(net)\/item\/([a-z0-9-]+)\/edit/)) { + + enque('envatitor'); + + //item discussion page + }else if (location.href.match(/^https?:\/\/([\.a-z3]+)\.(net)\/item\/([a-z0-9-]+)\/discussion/)) { + + enque('envatitor'); + enque('replypantry'); + + //item discussion page + }else if (location.href.match(/^https?:\/\/([\.a-z3]+)\.(net)\/item\/([a-z0-9-]+)\/([0-9]+)\/comments/)) { + + enque('envatitor'); + enque('replypantry'); + + //item faq page + }else if (location.href.match(/^https?:\/\/([\.a-z3]+)\.(net)\/item\/([a-z0-9-]+)\/([0-9]+)\/faqs/)) { + + enque('envatitor'); + + //item discussion page + } + + if (location.href.match(/^https?:\/\/(themeforest|codecanyon|activeden)\.net/)) { + + enque('gotolivepreview'); + + } + + if (location.href.match(/^https?:\/\/([\.a-z3]+)\.(net)\/item\/([a-z0-9-]+)/)) { + + //enque('editinline'); + + } + //everywhere; + enque('notification'); + enque('quickcollection'); + enque('chaching'); + // enque('salesrefresher'); + enque('reminder'); + + enque('_localdevelopment'); + + + load(function(){ + console.log('Thanks for using Dashboard Plus!'); + }); + + + function enque(plugin){ + + if(!plugin || !active_plugins[plugin] || !plugins[plugin]) return false; + + loadit.push(plugin); + if(plugins[plugin].font || plugin == '_localdevelopment'){ + fontawesome.appendTo('head'); + } + + delete active_plugins[plugin]; + + } + + function load(callback){ + + if(!loadit.length) return false; + + loadit.sort(); + var url = window.dashboardplus['base']+'plugins/'; + + var script_count = 0; + for(var item in loadit){ + script_count++; + console.log(plugins[loadit[item]].name+' loaded!'); + var plugin_url = url + loadit[item] + '.js?v=' + version; + + console.log("Loading script: "+script_count + " url: " + plugin_url); + $.ajax({ + url: plugin_url, + dataType: "script", + success: function(){ + script_count--; + console.log("Left to load: "+script_count); + if(script_count<=0){ + // we've loaded all scripts completely... run our callback + callback(); + } + }, + cache: true + }); + } + + + } + + + function settingspage(){ + + var active = (location.hash == '#dashboard_plus') ? ' active' : ''; + + $content.find('.side-tabs').append('
  • Dashboard Plus
  • '); + + var boxhtml = '

    Dashboard Plus

    Select all features you would like to activate. Please check out the forum thread if you have questions

    Available Plugins

    '; + + $.each(plugins, function(id, data){ + + if(!(typeof data.beta != 'undefined' && !(username == 'revaxarts'))){ + + boxhtml += '
    '; + + if(data.settings){ + $.each(data.settings, function (i, setting){ + if(!setting.type) setting.type = 'textfield'; + if(!setting.placeholder) setting.placeholder = ''; + + boxhtml += '
    '; + switch(setting.type){ + case 'checkbox': + boxhtml += ''; + break; + case 'textfield': + default: + boxhtml += ''+setting.label+' '; + break; + + } + boxhtml += '
    '; + + }); + } + + boxhtml += '
    '; + } + + }); + + boxhtml += '
    buy me a beer
    '; + + $('#dashboard_plus_link').click(function(){ + + $content.find('.content-s').html(boxhtml); + + $content.find('.layout__sidebar').find('a').removeClass('active'); + + $(this).addClass('active'); + + $('#dashboardplus_form').on('submit', function(){ + + var data = {}; + var setting = {}; + $.each($('.dbp_plugins'), function(){ + + if($(this).is(':checked')) data[$(this).val()] = true; + + }); + $.each($('.dbp_setting'), function(){ + var id = $(this).data('id'); + if(!setting[id]) setting[id] = {}; + + setting[id][$(this).data('name')] = ($(this).is(':checkbox') ? $(this).is(':checked') : $(this).val()); + + }); + + $.each(setting, function(extension, data){ + savesettings(extension, data); + }); + + if(save('active', data)) location.reload(); + + return false; + + }); + + $('#dbp_reset_button').on('click', function(){ + if(confirm('Do you really like ti reset all Dashboard Plus settings?\n\n This is only for the current marketplace!')){ + var storage = ['apikey', 'chaching', 'dashboardplus', 'quickcollection', 'ratings__', 'reminder', 'salesrefresher', 'statementer']; + var cookies = ['envatitor_badges', 'envatitor_thumb', 'notification_count', 'notification_lastcheck', 'quickcollection_lastcheck', 'statementer_lastbalance']; + + $.each(storage, function(i,e){ + console.log(e, i); + localStorage.removeItem(e); + }); + $.each(cookies, function(i,e){ + console.log(e, i); + window.dashboardplus.deleteCookie(e); + }); + + location.reload(); + + } + return false; + }); + + return false; + + + }); + + if(active == ' active') $('#dashboard_plus_link').trigger('click'); + + + } + + function savesettings(extension, data){ + $.each(data, function(name, value){ + window.dashboardplus.set(extension, name, value); + }); + } + + + function save(setting, value){ + var settings = window.dashboardplus.storage || {}; + + settings[setting] = value; + + localStorage.setItem('dashboardplus', JSON.stringify(settings)); + + window.dashboardplus.storage = settings; + + return window.dashboardplus.storage[setting] == value; + + } + + function get(setting, fallback){ + return window.dashboardplus.storage[setting] ? window.dashboardplus.storage[setting] : fallback; + } + + } + +})(); diff --git a/dashboard-plus-chrome-plugin/changelog.txt b/dashboard-plus-chrome-plugin/changelog.txt new file mode 100644 index 0000000..696a8da --- /dev/null +++ b/dashboard-plus-chrome-plugin/changelog.txt @@ -0,0 +1,64 @@ + + +2019.06.28 - version 1.4.9 + * Source files from local plugin install + * Statement CSV change (Thanks Ataurr) + +2017.07.02 - version 1.4.8 + * Statement CSV change (AU GST Added) + +2017.01.26 - version 1.4.7 + * Statement CSV change + +2016.09.13 - version 1.4.6 + * Statement CSV change + +2016.07.07 - version 1.4.4 + * SSL fixes + +2016.01.06 - version 1.4.3 + * Merge statement rows + +2016.01.04 - version 1.4.2 + * Fix for new US tax + +2015.09.09 - version 1.4.1 + * Fix for duplicate extended support sales + +2015.09.04 - version 1.4.0 + * Fix for new statement CSV format and extended support stats + +2015.04.16 - version 1.3.9 + * URL Change in Profile Page + +2015.03.27 - version 1.3.8 + * URL Change in Profile Page + +2015.03.18 - version 1.3.7 + * Sales Location Map Added To Statementer + +2015.03.18 - version 1.3.6 + * Statement CSV fix + +2014.12.19 - version 1.3.5 + * Statement CSV fix + +2014.08.28 - version 1.3.4 + * Progress bar on uploads + +2014.08.27 - version 1.3.3 + * Reply Pantry added + * Fix for author names with -_ chars in them + +2014.08.27 - version 1.3.2 + * Added top secret progress bar plugin + +2014.08.26 - version 1.3.1 + * Fix in manifest.json for Chrome Webstore + +2014.08.26 - version 1.3.0 + * Changing script sources to host js files from Github pages instead of @revaxarts hosting + * Adjust manifest.json to support Chrome Webstore submission + +2014.08.26 - version 1.2.0 + * Initial import of plugin from @revaxarts \ No newline at end of file diff --git a/dashboard-plus-chrome-plugin/css/envato-style.css b/dashboard-plus-chrome-plugin/css/envato-style.css new file mode 100644 index 0000000..9360a53 --- /dev/null +++ b/dashboard-plus-chrome-plugin/css/envato-style.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2014 + * ================================== + * powered by revaxarts.com (http://revaxarts.com) + * original filename: envato-style.css + * filesize: 4061 Bytes + * last modified: Tue, 07 May 2013 16:16:10 +0200 + * + */ +html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,font,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td { margin:0; padding:0; border:0; outline:0; font-weight:inherit; font-style:inherit; font-size:100%; font-family:inherit; vertical-align:baseline; } :focus { outline:0; } body { overflow:hidden; font-family:Tahoma,Geneva,sans-serif; font-size:13px; line-height:18px; background:#D2D1D0; color:#444; border:0 !important; padding: 0 0 0 20px; } a,a:visited { color:#8A6741; cursor:pointer; text-decoration:none; } a:hover { text-decoration:underline; } body.activeden a { color:#B85D04!important; } body.audiojungle a { color:#547F23!important; } body.themeforest a { color:#8A6741!important; } body.videohive a { color:#B27723!important; } body.graphicriver a { color:#006AB7!important; } body.threedocean a { color:#990D2c!important; } body.codecanyon a { color:#BC3415!important; } body.tutorials a { color:#B85D04!important; } body.photodune a { color:#20929A!important; } h1 { display:none; } h2,h3,h4,h5,h6 { padding-left:1px; padding:20px 0 15px; color:#191919; line-height:normal; } h2 { color:#000; margin-top:20px; padding-bottom:10px; margin-bottom:15px; border-bottom:1px solid #bfbebe; box-shadow:0 2px 0 -1px #ededed; font-size:20px; font-size: 27px; line-height:35px; } h3 { margin-top:20px; padding-bottom:10px; margin-bottom:15px; border-bottom:1px solid #bfbebe; box-shadow:0 2px 0 -1px #ededed; font-size:18px; font-size:24px; line-height: normal; color:#605d57; } h4 { color:#000; font-family:sans-serif; font-size:16px; font-weight:700; text-transform:uppercase; margin-top:15px; } h5 { font-size:17px; } h6 { } hr { display:block; background-color:#bfbebe; border-color:#ededed; border-style:solid; border-width:0 0 1px; height:1px; margin-top:15px; margin-bottom:15px; } p { margin-bottom:20px; padding:0; } p:last-child { margin-bottom:0; } small { color:#909090; font-size:11px; } ol,ul { margin-bottom:20px; padding-left:25px; } ol { list-style-type:decimal; } ul { list-style:disc; } table { margin-bottom:20px; max-width:100%; max-width: 616px; overflow:auto; } img { max-width:100%; } blockquote { border-left:1px solid #423021; color:#777; font-family:"Helvetica Neue",Helvetica,Arial,sans-serif; font-style:italic; margin-bottom:20px; padding-left:20px; } body.activeden blockquote { border-left-color:#B85D04!important; } body.audiojungle blockquote { border-left-color:#547F23!important; } body.themeforest blockquote { border-left-color:#8A6741!important; } body.videohive blockquote { border-left-color:#B27723!important; } body.graphicriver blockquote { border-left-color:#006AB7!important; } body.threedocean blockquote { border-left-color:#990D2c!important; } body.codecanyon blockquote { border-left-color:#BC3415!important; } body.tutorials blockquote { border-left-color:#B85D04!important; } body.photodune blockquote { border-left-color:#20929A!important; } pre { margin-bottom:20px; } h2,h3,h4,h5,h6 { margin:30px 0 20px; padding:0; } h2:first-child,h3:first-child,h4:first-child,h5:first-child,h6:first-child { margin-top:0; } h1 { display:none; } h2 { border-bottom:1px solid #bfbebe; box-shadow:0 2px 0 -1px #ededed; font-size:20px; line-height:30px; padding-bottom:10px; } h3 { border-bottom:1px solid #bfbebe; box-shadow:0 2px 0 -1px #ededed; font-size:18px; line-height:27px; color:#605d57; padding-bottom:10px; } h4 { font-size:16px; line-height:24px; font-weight:700; text-transform:uppercase; } em{ font-style: italic; } strong{ font-weight: 700; } body table:hover td,body table:hover th,body ul:hover,body ol:hover,body p:hover,body dl:hover,body img:hover,body h2:hover,body h3:hover,body h4:hover,body h5:hover { border-raduis:3px; box-shadow:0 0 3px rgba(0,0,0,0.3); } \ No newline at end of file diff --git a/dashboard-plus-chrome-plugin/css/jquery.wysiwyg.css b/dashboard-plus-chrome-plugin/css/jquery.wysiwyg.css new file mode 100644 index 0000000..5dbc2e7 --- /dev/null +++ b/dashboard-plus-chrome-plugin/css/jquery.wysiwyg.css @@ -0,0 +1,10 @@ +/* + * Copyright (c) 2014 + * ================================== + * powered by revaxarts.com (http://revaxarts.com) + * original filename: jquery.wysiwyg.css + * filesize: 7243 Bytes + * last modified: Thu, 16 May 2013 17:59:28 +0200 + * + */ +#overlay{ position: fixed; top: 0; right: 0; left: 0; bottom: 0; background: #000; z-index: 10; } #info_box{ position: absolute; z-index: 15; background:#F4F4F4; border: 1px solid #BBB; padding: 20px; } #info_box.fixed{ position: fixed; } #item_description_content{ position: relative; z-index: 11; margin: 0 -20px; resize:vertical; } div.wysiwyg { position: relative; z-index: 15; margin: 0 -20px; min-width: 654px; } div.wysiwyg * { margin:0; padding:0; } div.wysiwyg ul.toolbar li.jwysiwyg-custom-command { overflow:hidden; } div.wysiwyg ul.toolbar { float:left; margin-top: 20px; background:#F4F4F4; width: 648px; z-index: 2; border: 1px solid #BBB; padding: 2px; } div.wysiwyg ul.toolbar.fixed { position: fixed; top: 20px; } div.wysiwyg ul.toolbar li { list-style:none; float:left; margin:4px 2px 4px 0; background:#f0f0f0; -moz-user-select:none; -webkit-user-select:none; user-select:none; clear:none; padding:0; } div.wysiwyg ul.toolbar li:hover { } div.wysiwyg ul.toolbar li.separator { background:none; width:1px; height:26px; margin:0 4px 0 5px; border:none; border-left:1px solid #ccc; } div.wysiwyg ul.toolbar li { text-indent:-5000px; display:block; width:18px; height:18px; background:url(http://i.imgur.com/cNKL9uV.gif) no-repeat -640px -800px; border:1px solid transparent; cursor:pointer; margin:0 2px; } div.wysiwyg ul.toolbar li.wysiwyg-button-hover,div.wysiwyg ul.toolbar li.active { background-color: #c1c1c1; border:1px solid transparent; } div.wysiwyg ul.toolbar li.active { background-color: #c1c1c1; } div.wysiwyg ul.toolbar li.disabled,div.wysiwyg ul.toolbar li.wysiwyg-button-hover.disabled,div.wysiwyg ul.toolbar li.active.disabled { opacity:.5; filter:alpha(opacity=50); cursor:auto; } div.wysiwyg ul.toolbar li.bold { background-position: -1px -15px; } div.wysiwyg ul.toolbar li.italic { background-position: -18px -15px; } div.wysiwyg ul.toolbar li.strikeThrough { background-position: -36px -15px; } div.wysiwyg ul.toolbar li.underline { background-position: -55px -15px; } div.wysiwyg ul.toolbar li.highlight { background-position: -48px -96px; } div.wysiwyg ul.toolbar li.justifyLeft { background-position: 0 2px; } div.wysiwyg ul.toolbar li.justifyCenter { background-position: -18px 2px; } div.wysiwyg ul.toolbar li.justifyRight { background-position: -36px 2px; } div.wysiwyg ul.toolbar li.justifyFull { background-position: -55px 2px; } div.wysiwyg ul.toolbar li.indent { background-position: -74px 1px; } div.wysiwyg ul.toolbar li.outdent { background-position: -92px 1px; } div.wysiwyg ul.toolbar li.subscript { background-position: -74px -15px; } div.wysiwyg ul.toolbar li.superscript { background-position: -92px -15px; } div.wysiwyg ul.toolbar li.undo { background-position: 0px -68px; } div.wysiwyg ul.toolbar li.redo { background-position: -18px -69px; } div.wysiwyg ul.toolbar li.insertOrderedList { background-position: -36px -49px; } div.wysiwyg ul.toolbar li.insertUnorderedList { background-position: -19px -49px; } div.wysiwyg ul.toolbar li.insertHorizontalRule { background-position: 0 -49px; } div.wysiwyg ul.toolbar li.h1 { background-position: 0px -31px; } div.wysiwyg ul.toolbar li.h2 { background-position: -18px -31px; } div.wysiwyg ul.toolbar li.h3 { background-position: -36px -31px; } div.wysiwyg ul.toolbar li.h4 { background-position: -55px -31px; } div.wysiwyg ul.toolbar li.h5 { background-position: -74px -31px; } div.wysiwyg ul.toolbar li.h6 { background-position: -92px -31px; } div.wysiwyg ul.toolbar li.paragraph { background-position: 0px -106px; } div.wysiwyg ul.toolbar li.colorpicker { background-position: -18px -106px; } div.wysiwyg ul.toolbar li.fullscreen { background-position: -36px -106px; } div.wysiwyg ul.toolbar li.cut { background-position: -36px -68px; } div.wysiwyg ul.toolbar li.copy { background-position: -55px -68px; } div.wysiwyg ul.toolbar li.paste { background-position: -74px -68px; } div.wysiwyg ul.toolbar li.insertTable { background-position: -74px -49px; } div.wysiwyg ul.toolbar li.increaseFontSize { background-position: -18px -87px; } div.wysiwyg ul.toolbar li.decreaseFontSize { background-position: -36px -87px; } div.wysiwyg ul.toolbar li.createLink { background-position: -92px -48px; } div.wysiwyg ul.toolbar li.unLink { background-position: -74px -87px; } div.wysiwyg ul.toolbar li.insertImage { background-position: -92px -87px; } div.wysiwyg ul.toolbar li.html { background-position: -55px -49px; } div.wysiwyg ul.toolbar li.removeFormat { background-position: -92px -68px; } div.wysiwyg ul.toolbar li.empty { background-position: -73px -86px; } div.wysiwyg ul.toolbar li.code { background-position: -74px -106px; } div.wysiwyg ul.toolbar li.cssWrap { background-position: -92px -106px; } div.wysiwyg-dialogRow { float:left; width:100%; font-size:16px; } div.wysiwyg iframe { clear:left; background-color:#fff; padding:0; margin:0; display:block; width:100%; min-width: 654px; } .wysiwyg-dialog { position:fixed; top:50px; left:50px; width:450px; height:300px; background:transparent; font:14px "Helvetic Neue",Helvetica,Arial,sans-serif; } .wysiwyg-dialog .wysiwyg-dialog-topbar { background:#333; border:1px #111 solid; color:#fff; padding:10px; position:relative; } .wysiwyg-dialog .wysiwyg-dialog-topbar .wysiwyg-dialog-close-wrapper .wysiwyg-dialog-close-button { color:#fff; text-decoration:none; display:block; padding:6px 10px; position:absolute; right:12px; top:50%; height:14px; margin-top:-12px; } .wysiwyg-dialog .wysiwyg-dialog-topbar .wysiwyg-dialog-close-wrapper a.wysiwyg-dialog-close-button:hover { background:#666; } .wysiwyg-dialog .wysiwyg-dialog-topbar .wysiwyg-dialog-title { font-size:20px; font-weight:700; padding:5px; } .wysiwyg-dialog .wysiwyg-dialog-content { border:1px #ccc solid; border-top:0; padding:15px; background:#fff; } .wysiwyg-dialog-modal-div { position:absolute; top:0; left:0; width:100%; height:100%; background-color:#fff; background-color:rgba(0,0,0,0.5); filter:progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000,endColorstr=#99000000); -ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorstr=#99000000,endColorstr=#99000000)"; } .wysiwyg-dialog-content form.wysiwyg fieldset { border:1px #ccc solid; } .wysiwyg-dialog-content form.wysiwyg legend { padding:7px; } .wysiwyg-dialog-content form.wysiwyg .form-row { clear:both; padding:4px 0; } .wysiwyg-dialog-content form.wysiwyg .form-row label,.wysiwyg-dialog form.wysiwyg .form-row .form-row-key { display:block; float:left; width:35%; text-align:right; padding:4px 5px; } .wysiwyg-dialog-content form.wysiwyg .form-row .form-row-value { display:block; float:left; width:55%; } .wysiwyg-dialog-content form.wysiwyg .form-row input.width-auto { width:auto; } .wysiwyg-dialog-content form.wysiwyg input.width-small { width:50px; min-width:50px; max-width:50px; } .wysiwyg-dialog-content form.wysiwyg input,.wysiwyg-dialog form.wysiwyg select { padding:2px; width:100%; margin:2px; } .wysiwyg-dialog-content form.wysiwyg input[type=submit],.wysiwyg-dialog form.wysiwyg input[type=reset] { padding:2px 7px; width:auto; } \ No newline at end of file diff --git a/dashboard-plus-chrome-plugin/css/replypantry.css b/dashboard-plus-chrome-plugin/css/replypantry.css new file mode 100644 index 0000000..57fd4c5 --- /dev/null +++ b/dashboard-plus-chrome-plugin/css/replypantry.css @@ -0,0 +1,233 @@ +#cancontainer{ + position:relative; + width:200px; + z-index:100; +} +#cancontents{ + + width:200px; + + -webkit-border-radius:2px; + border:1px solid #fff; + + z-index:10; +} +#cancontainer #cancontents ul li{ + padding:7px 10px; + margin:0 !important; + position:relative; + border-top:1px solid #191919; + box-shadow:inset 0px 1px 1px rgba(255, 255, 255, .1); + + background:#222; + background:#bbb -webkit-linear-gradient(bottom, rgba(0,0,0,.87) 50%, rgba(0,0,0, .85)); +} +#cancontainer #cancontents ul li:first-child{ + border-radius:2px 2px 0 0 ; +} +#cancontainer #cancontents ul li:last-child{ + border-radius:0 0 2px 2px; +} +#cancontainer #cancontents ul li:hover{ + background:#bbb -webkit-linear-gradient(bottom, rgba(0,0,0,.97) 50%, rgba(0,0,0, .95)); +} +#cancontainer #cancontents ul li a{ + color:#f5f5f5; + text-shadow:0px -1px 1px #000; + display:block; + margin:0 !important; + text-transform:none; + font-size:12px; +} +#cancontainer #cancontents ul li a:hover{ + text-decoration:none; +} +#cancontainer #cancontents ul li a img{ + padding:0; +} +#cancontainer.item-comments{ + position: absolute; + width: 200px; + z-index: 100; + bottom: 40px; +} +#canbutton{ + position:relative; + margin:0; +} +#canbutton img{ + padding:0; +} +.cantip{ + width: 0; + height: 0; + border-left: 10px solid transparent; + border-right: 10px solid transparent; + + border-top: 10px solid #191919; + + position:absolute; + top:98%; + left:14px; + + z-index:20; +} + +.cankey-edit{ + position:absolute; + right:8px; + top:8px; + +} + +.cankey-editor{ + position:absolute; + left:100%; + bottom:1px; + display:none; + + padding:7px 10px; + border-top:1px solid #191919; + box-shadow:inset 0px 1px 1px rgba(255, 255, 255, .1); + + background:#222; + background:#bbb -webkit-linear-gradient(bottom, rgba(0,0,0,.87) 50%, rgba(0,0,0, .85)); + + border-top:1px solid #191919; + box-shadow:inset 0px 1px 1px rgba(255, 255, 255, .1); + + border-radius:2px; +} + +.cankey-editor textarea{ + padding:8px !important; + width:300px !important; + max-height:100px; + display:block; + border-radius:0; + margin-bottom:10px; +} +.cankey-editor input[type='text']{ + padding:8px !important; + width:280px !important; + -webkit-transition: all .2s ease-in-out; + border-radius:0; + + float:left; + margin-bottom:5px; +} +.cankey-editor input[type='text']:not(:focus){ + background: transparent; + border: none; + padding-left: 0px !important; + margin-top:0px; + /*padding-top: 0px !important;*/ + color: white; + font-style: normal; + font-weight: bold; +} + +.cankey-editor select#cankey-editor-cat{ + width:auto !important; + display:block; + float:left; + border-radius:0; +} +.cankey-editor input[type="submit"]{ + float:right; + margin-right:0; + background-color: #EF452C; + background-image: -webkit-linear-gradient(top, rgba(255, 255, 255, .2) 0%,rgba(0, 0, 0, .2) 100%), url('http://0.envato-static.com/images/buttons-8a861acb09.png'); + background-position: top left, 93% -735px; + background-repeat: repeat, no-repeat; + box-shadow:inset 0px 1px 1px rgba(255,255,255,.3); + text-shadow:0px -1px 1px rgba(0, 0, 0, .2); + border: 1px solid #901B09; + border-top-color: #B23D2B; + border-left-color: #B23D2B; + margin-top:3px; +} + +#can-close-editor{ + color:#fff; + text-decoration:none; + /*position: absolute; + right: 5px; + bottom: 5px;*/ + float:right; +} + +.cankey-remove{ + position:absolute; + top:3px; + right:25px; + padding:5px; +} + +#canpanel{ + display:none; + position:absolute; + bottom:125%; + left:-12px; +} + +.can-buttons{ + +} +.can-buttons a{ + display:inline-block; + margin:0px 2px 2px 1px !important; + padding:3px 5px; + border:1px solid #999; + border-radius:2px; + box-shadow:inset 0px 1px 1px rgba(255, 255, 255, .3); + + background:#666; + background:#aaa -webkit-linear-gradient(bottom, rgba(200,200,200,1) 50%, rgba(180,180,180, .5)); + + color:#222; + text-shadow:0px 1px 1px #eee; + font-size:10px; + text-transform:none; +} + +.can-buttons a:hover{ + text-decoration:none !important; +} + +#can-new{ + float:right; + background:#ef452c -webkit-linear-gradient(top, rgba(255,255,255,.2) 0%,rgba(0,0,0,.2) 100%); /* Chrome10+,Safari5.1+ */ + border:1px solid #901B09; + border-top-color:#B23D2B; + border-left-color:#B23D2B; + + box-shadow:inset 0px 1px 1px rgba(255,255,255,.3); + text-shadow:0px -1px 1px rgba(0, 0, 0, .2); + color:#fff; +} + +.can-keyname{ + padding-right:40px; +} + +#canlist{ + max-height: 300px; + overflow-y: auto; + overflow-x: hidden; + margin:0px !important; +} + +.cankey-op .cantext{ + display:none; +} + +#can_previewbox{ + display:none; + width:200px; +} +#can_previewbox textarea{ + border:none; + font-family:Arial, Helvetica, sans-serif; +} + diff --git a/dashboard-plus-chrome-plugin/css/statement_merge.css b/dashboard-plus-chrome-plugin/css/statement_merge.css new file mode 100644 index 0000000..71c8478 --- /dev/null +++ b/dashboard-plus-chrome-plugin/css/statement_merge.css @@ -0,0 +1,4 @@ + +.statement_row_hidden td{ + background-color:#FFCECE !important; +} \ No newline at end of file diff --git a/dashboard-plus-chrome-plugin/css/statementer.css b/dashboard-plus-chrome-plugin/css/statementer.css new file mode 100644 index 0000000..2277dc4 --- /dev/null +++ b/dashboard-plus-chrome-plugin/css/statementer.css @@ -0,0 +1,396 @@ +/* + * Copyright (c) 2014 + * ================================== + * powered by revaxarts.com (http://revaxarts.com) + * original filename: statementer-2.1.css + * filesize: 7638 Bytes + * last modified: Thu, 11 Dec 2014 17:26:11 +0100 + * + */ +#statementer { + min-height: 20px; + margin-top: 50px; +} + +#statementer .right { + float: right !important; +} + +#statementer #statementer_summary { + overflow: hidden; +} + +#statementer #statementer_summary ul { +} + +#statementer #statementer_summary ul li { + color: #FFF; + background-repeat: repeat-x; + background-position: top; + background-color: #333; + border-radius: 5px; + height: 160px; + text-align: center; + float: left; + list-style: none; + margin-left: 1.33%; + margin-bottom: 2%; + line-height: 40px; + padding-top: 10px; + overflow: hidden; + width: 18.65%; +} + +#statementer #statementer_summary ul li .statementer_currency { + font-size: 9px; + margin-right: -4px; +} + +#statementer #statementer_summary ul li:first-child { + margin-left: 0; +} + +#statementer h2 span.sortby { + font-size: 12px; +} + +#statementer h2 span a { + cursor: pointer; +} + +#statementer h2 span.sortorder { + float: right; + font-size: 15px; + padding-top: 4px; +} + +#statementer h2 span a.active { + color: #383838; +} + +#statementer #statementer_summary ul li h4 { + color: #FFF; + display: block; + white-space: nowrap; + height: 20px; + font-size: 30px; + line-height: 17px; + padding: 0; + font-weight: bold; +} + +#accordion .tab { + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +.accordion-label { + border-radius: 4px; +} + +.accordion-label, img, #statementer #statementer_summary ul li { + -moz-transition-property: all; + -webkit-transition-property: all; + -o-transition-property: all; + transition-property: all; + -moz-transition-duration: 0.2s; + -webkit-transition-duration: 0.2s; + -o-transition-duration: 0.2s; + transition-duration: 0.2s; +} + +#statementer .accordion-label { + background: #F5F5F5; + color: #444; + cursor: pointer; + display: block; + line-height: 13px; + margin-bottom: 1px; + padding: 13px 13px 14px 13px; + position: relative; + outline: 0; +} + +#statementer .accordion-label .marketplace-icon { + display: inline; + padding: 13px 15px; + margin-right: 4px; +} + +#statementer .accordion-label.ui-state-active { + margin-bottom: 0px; + border-top-left-radius: 4px; + border-top-right-radius: 4px; + border-bottom-left-radius: 0px; + border-bottom-right-radius: 0px; +} + +#statementer .accordion-label:hover { + color: white; + background: #444; +} + +#statementer .accordion-label a { + color: #383838; +} + +#statementer .accordion-label.ui-state-active { + font-weight: 700; + color: white; + background: #444; +} + +#statementer .accordion-label.ui-state-active a { + color: #383838 !important; +} + +#statementer div.tabs ul li.ui-state-active a { + color: #444; + font-weight: 700; + background: #f5f5f5; + border-top-left-radius: 4px; + border-top-right-radius: 4px; +} + +#statementer div.tabs ul li a { + color: white; +} + +#statementer div.tabs { + max-height: 416px !important; + width: 984px !important; + background: #bbb; + padding: 10px 8px 16px; + border-bottom-left-radius: 4px; + border-bottom-right-radius: 4px; +} + +#statementer div.tab { + clear: both; + width: 952px !important; + height: 348px !important; + display: block; + padding: 18px 8px 0 8px !important; + overflow: hidden; + margin-bottom: 1px; + background: url(../img/loading.gif) no-repeat center #f5f5f5 !important; +} + +#content #statementer_copyright { + font-size: 10px !important; + text-align: right; + width: 100%; +} + +.percentage { + float: right; + line-height: 30px; +} + +.percentage input { + padding: 0 3px; + width: 32px; + text-align: right; + float: left; + border: 0; + background: 0; + line-height: 1em; + color: #444; + border-radius: 0; +} + +.percentage input:focus { + background: #eee; + font-weight: 700; +} + +#statementer_daterange { + text-align: center; + width: 100%; + margin: 0 0 10px; +} + +#statementer_date_from { +} + +#statementer_fetch_area { + width: 100%; + height: 400px; + font-family: "Courier New", Courier, monospace; + font-size: 10px; + resize: none; +} + +#statementer_dateslider { + margin: 0 10px 20px; + background: #D4D4D4; + border-radius: 4px; +} + +#statementer_dateslider a { + border-radius: 4px; + cursor: pointer !important; +} + +.statementer_menu { + /*float: right;*/ +} + +.statementer_menu a { + cursor: pointer; +} + +#statementer a.statementer_itemlink { + font-weight: 900 !important; + color: #444; +} + +#statementer a.statementer_itemlink:hover { + text-decoration: none; + color: #000; +} + +#statementer .ui-state-active a.statementer_itemlink { + color: #fff; +} + +#statementer .ui-state-active a.statementer_itemlink:hover { + text-decoration: none; + color: #ddd; +} + +#statementer .table-general { + margin-top: 10px; +} + +.table-general td { + white-space: nowrap; +} + +#statementer .ui-tabs { + position: relative; + padding: 0; + zoom: 1; +} + +#statementer .ui-tabs .ui-tabs-nav { + margin: 0; + padding: 0; +} + +#statementer .ui-tabs .ui-tabs-nav li { + list-style: none; + float: left; + position: relative; + top: 1px; + margin: 0 2px 1px 0; + border-bottom: 0 !important; + padding: 0; + white-space: nowrap; +} + +#statementer .ui-tabs .ui-tabs-nav li a { + float: left; + padding: .5em 1em; + text-decoration: none; +} + +#statementer .ui-tabs .ui-tabs-nav li.ui-tabs-selected { + margin-bottom: 0; + padding-bottom: 2px; +} + +#statementer .ui-tabs .ui-tabs-nav li.ui-tabs-selected a, .ui-tabs .ui-tabs-nav li.ui-state-disabled a, .ui-tabs .ui-tabs-nav li.ui-state-processing a { + cursor: text; +} + +#statementer .ui-tabs .ui-tabs-nav li a, .ui-tabs.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-selected a { + cursor: pointer; +} + +#statementer .ui-tabs .ui-tabs-panel { + display: block; + border-width: 0; + padding: 1em 1.4em; + background: none; +} + +#statementer .ui-tabs .ui-tabs-hide { + display: none !important; +} + +#statementer #statementer_dateslider.ui-slider { + position: relative; + text-align: left; +} + +#statementer #statementer_dateslider.ui-slider .ui-slider-handle { + position: absolute; + z-index: 2; + width: 1.4em; + height: 1.4em; + cursor: default; +} + +#statementer #statementer_dateslider.ui-slider .ui-slider-range { + position: absolute; + z-index: 1; + font-size: .7em; + display: block; + border: 0; + background-position: 0 0; +} + +#statementer #statementer_dateslider.ui-slider-horizontal { + height: .8em; +} + +#statementer #statementer_dateslider.ui-slider-horizontal .ui-slider-handle { + top: -.3em; + margin-left: -.6em; +} + +#statementer #statementer_dateslider.ui-slider-horizontal .ui-slider-range { + top: 0; + height: 100%; + background-color: #F5F5F5 !important; +} + +#statementer #statementer_dateslider.ui-slider-horizontal .ui-slider-range-min { + left: 0; +} + +#statementer #statementer_dateslider.ui-slider-horizontal .ui-slider-range-max { + right: 0; +} + +#statementer #statementer_dateslider.ui-slider-vertical { + width: .8em; + height: 100px; +} + +#statementer #statementer_dateslider.ui-slider-vertical .ui-slider-handle { + left: -.3em; + margin-left: 0; + margin-bottom: -.6em; +} + +#statementer #statementer_dateslider.ui-slider-vertical .ui-slider-range { + left: 0; + width: 100%; +} + +#statementer #statementer_dateslider.ui-slider-vertical .ui-slider-range-min { + bottom: 0; +} + +#statementer #statementer_dateslider.ui-slider-vertical .ui-slider-range-max { + top: 0; +} + +#sales_world_map_holder{ + display: none; +} +#sales_world_map{ + height:400px; +} \ No newline at end of file diff --git a/dashboard-plus-chrome-plugin/icon.png b/dashboard-plus-chrome-plugin/icon.png new file mode 100644 index 0000000000000000000000000000000000000000..60c0fa2753290138914938a5fa4d6081cab7e08e GIT binary patch literal 1181 zcma)5T}TvB7`>)}DM}QDM!__aD75pl>#{q8o2@(AZa60Ef<72D&RpF=XYMp}b=Q4J zQAnbfUZOyYAR;PIddQ5zAn3uDdg;Y53!;(;3W|uJpF6s{`rt+bckU18obPU~F2kSf1hBlyX2>{x{Sx@@NOg;fCKWg`LER1=%=s(2%W?i|ea#Ls??P zh6+Y@0-?cN6+4m$BPWS0DiWdUx^z=RDW`r7F3V!fbg*KoFeZg)BEaanCN@U`fk3k) zcqKl-^DPa*urJc$4G2MB&?oqKKF5`iI%Gf-=eXJiH(ZeGc7kD%$P%>mVW_p*$e`9T z7WKkj0tNN5T&=K|U_mZR%&_jgZo22(5osQGneSS%$@e`pNweFet7q;{4FXWKD<*{# z>6f2gc`7Hksxjqw^umuTy;qB^@dLw^6R#_*uhGPV@YCqR#V?QM&VE~*tZ%CSu)I2Y zZ;m{tB0vF9;y%-z0Bi$C0Vv(-aJA>;uS@gKW}keV8!f-{T<43n#DbDH3pXy$)}C2; z`);oGedAKe{Pv=paNYd1o7X3QE3@*Z2roKr|2dIa*}bwv>Xn5ru-SM8SZYE(90dxTzbd!Bt%< zwmTKHD5A9`;=@3Lf~-*eXQ#L2S9FDyl~Bs5inrfEo1?m*8^L_VlU00}(2*z2R}2AHYc#cb(M z*gnu=YZ@_yz)*obCd1KQj+D;vY2ZakwZEpRm_RBP;#hb1uYB0G7p!9s^!e)m03iUv zqkn`p00CiFBP+qKle*EGy*CoouOeUkx&CR+0)QbGB51cq*o>6{(J1P6`>>V1S z`ws3`jm{)=vl9>kt;QEnr469&9Q=Od^q79_@pJv<>?zY8k+(#nT(!FrFJH% zojDdOjipuhxPss*iSrH)KoF_k67qxlzH##x)^p9{N>So`saC5k&CJYrn*sn}czD>5 zBq{C7u`Zc=U4kekC!tOSkvI_{6_QH?YXnrY)SzWqmbLU~d)fjX#>mJ>oO5mnp&0@7 yV^SzlqEnv(ErU|0UavQExtzbz{!Ib@HU0(&y{HYL!CTM(00001y&;R@5_cvjkoD~Gz@_JvL z6h*(Ara!!2TwD)XPDRaOyggX);4VNO+wJ6?Bn@>20?y40^M3;UYh&r)_iv=_%1v?` zAP)tBG`n1+Pm=agsTulT@aN}eKqaQyyd$;PdDMx@kr}`#;#Vkysc5w1ZwFH*_;k%q z1dr@`8vWV3JE4T2jX!}!8-V+AJBXr9y!q5q)uXBa0BSXyEwG3UUfmm;>Tg#Th5Tl52jaeJ99AIRbL+&?S5n! z3M@hqlJYPZp$PiYFqvP7W*63mvP z;Wh9IL7~qHjTQ>nqHEAt5e$" + ] + } + ], + "icons": { + "16": "icon.png", + "48": "icon.png", + "64": "icon.png", + "128": "icon.png" + } + } + \ No newline at end of file diff --git a/dashboard-plus-chrome-plugin/plugins/chaching.js b/dashboard-plus-chrome-plugin/plugins/chaching.js new file mode 100644 index 0000000..30f869f --- /dev/null +++ b/dashboard-plus-chrome-plugin/plugins/chaching.js @@ -0,0 +1,72 @@ +/* + * Copyright (c) 2014 + * ================================== + * powered by revaxarts.com (http://revaxarts.com) + * original filename: chaching.js + * filesize: 2095 Bytes + * last modified: Thu, 12 Jun 2014 09:09:28 +0200 + * + */ +(function () { + + //"use strict" + + var username = $('#user_username').html(); + if (!username) return false; + + var interval = 5, + now = new Date().getTime(), + lastcheck = window.dashboardplus.getCookie('cha-ching_lastcheck'), + lastsales = window.dashboardplus.getCookie('cha-ching_lastsales'), + mp3 = 'https://dl.dropbox.com/u/9916342/cha-ching/cha-ching.mp3', + ogg = 'https://dl.dropbox.com/u/9916342/cha-ching/cha-ching.ogg', + $userbalance = $('.header-logo-account__balance'); + + setTimeout(start, Math.max(0, interval * 60000 - (now - lastcheck))); + + + function chachingIT() { + if(!window.dashboardplus.get('chaching', 'playsound')) return false; + if ($('#dbp-cha-ching').length) $('#cha-ching').remove(); + $('').appendTo('body'); + } + + function start() { + checkForSales(); + setInterval(function () { + checkForSales(); + }, interval * 60000); + } + + function checkForSales() { + $.get('/user/' + username, function (data) { + + //get current sales + var sales = data.match(/([^<]+)<\/strong>/); + //if we have last sales and lastcheck is set or the balance isn't equal the current balance + if (lastsales && !lastcheck || $userbalance.html() != balance[1]) { + $userbalance.html('New Sale! ' + balance[1]); + chachingIT(); + } + //our new lastsales + lastsales = sales[1]; + //} + + + //lastcheck was now + lastcheck = new Date().getTime(); + //save lastcheck but remove it if browser is closed (force check on restart) + window.dashboardplus.setCookie('cha-ching_lastcheck', lastcheck); + }); + } + +})(); diff --git a/dashboard-plus-chrome-plugin/plugins/compare_earnings.js b/dashboard-plus-chrome-plugin/plugins/compare_earnings.js new file mode 100644 index 0000000..d581ef8 --- /dev/null +++ b/dashboard-plus-chrome-plugin/plugins/compare_earnings.js @@ -0,0 +1,119 @@ +(function () { + + + var options = Chart.instances['chart-0'].options; + + var path,type,year,month,day,dropdown, + chart = Chart.instances['chart-0'], + nativedata, + externalAjax = true; + + $( document ).ajaxSuccess(function(response) { + if(externalAjax) init(); + }); + + $( window ).on('hashchange', function() { + update(); + }); + + init(); + update(); + + function init(){ + + path = location.pathname.replace(/\/user\/(.*)\/earnings\//, '').split('/'); + type = path[0]; + year = path[1] ? parseInt(path[1], 10) : null; + month = path[2] ? parseInt(path[2], 10) : null; + day = path[3] ? parseInt(path[3], 10) : null; + nativedata = $.parseJSON($('#graphdata').html()); + + if(dropdown) dropdown.remove(); + dropdown = ''; + dropdown = $(dropdown); + + $('.earning__breadcrumb').append(dropdown); + + dropdown.on('change', function(){ + location.hash = '/'+$(this).val(); + }); + + + } + + function update(){ + var _path = location.hash.substring(1).split('/'); + var _year = _path[1] && year ? parseInt(_path[1], 10) : null; + var _month = _path[2] && month ? parseInt(_path[2], 10) : null; + var _day = _path[3] && day ? parseInt(_path[3], 10) : null; + + if(!_year) return; + + externalAjax = false; + get_data(_year, _month, _day, function(data){ + externalAjax = true; + data.datasets[0].fillColor = "rgba(151,187,205,0.2)"; + data.datasets[0].strokeColor = "rgba(151,187,205,0.4)"; + data.datasets[0].pointColor = "rgba(151,187,205,0.4)"; + data.datasets[0].pointStrokeColor = "#fff"; + data.datasets[0].pointHighlightFill = "#fff"; + data.datasets[0].pointHighlightStroke = "rgba(151,187,205,0.5)"; + + nativedata.datasets[1] = data.datasets[0]; + chart.datasets = nativedata.datasets; + chart.chart.Line(nativedata, options); + //chart.update(); + + }); + } + + function get_data(year, month, day, callback){ + var time = (year ? '/'+year+(month ? '/'+month+(day ? '/'+day : '') : '') : ''); + var url = location.pathname.replace(/\/earnings\/(.*)$/, '')+'/earnings/'+type+time+'?_pjax=.js-pjax-container'; + $.ajax({ + url: url, + headers: { 'X-PJAX': true, 'X-PJAX-Container': '.js-pjax-container' }, + success: function(response){ + var data = $.parseJSON($('
    ').html(response).find('#graphdata').html()); + callback && callback(data); + } + + }); + } + + + +})(); diff --git a/dashboard-plus-chrome-plugin/plugins/editinline.js b/dashboard-plus-chrome-plugin/plugins/editinline.js new file mode 100644 index 0000000..d8276be --- /dev/null +++ b/dashboard-plus-chrome-plugin/plugins/editinline.js @@ -0,0 +1,3109 @@ +/* + * Copyright (c) 2014 + * ================================== + * powered by revaxarts.com (http://revaxarts.com) + * original filename: editinline.js + * filesize: 81841 Bytes + * last modified: Thu, 23 May 2013 10:33:00 +0200 + * + */ +(function () { + + var pagetabs = $('#page-tabs').find('li'), + itemlink = pagetabs.first().find('a').attr('href'); + + if(pagetabs.length < 4) return false; + + addCSS(window.dashboardplus['base']+'/css/jquery.wysiwyg.css', '', function(){ + + if (location.href.match(/^http:\/\/([\.a-z3]+)\.(net|com)\/item\/([a-z0-9-]+)\/(edit)\/([a-z0-9-]+)/)) { + $('h2').first().append(' or edit inline'); + } + + if (location.href.match(/^http:\/\/([\.a-z3]+)\.(net|com)\/item\/([a-z0-9-]+)\/([a-z0-9-]+)/)) { + if (location.hash == '#edit_inline') { + init(); + } + + itemlink = location.href; + } + + $('
  • Edit Inline
  • ').insertBefore(pagetabs.last()); + + + $('#edit_inline_btn').click(init); + + function init(){ + + var content = $('.item-description'), + contentpos = content.position(), + textarea = $('').insertAfter(textarea); + + textarea.wysiwyg({ + 'css': envatostyle, + 'autoGrow': true, + 'html': 'INITIAL_CONTENT', + }); + content.hide(); + + var toolbar = $('.toolbar'), + toolbarfixed = false; + + + overlay.show().fadeTo(200,0.5); + + $(window).on('scroll', function(){ + if(window.scrollY+20 > contentpos.top){ + if(!toolbarfixed){ + toolbar.addClass('fixed'); + infobox.addClass('fixed').css({ + 'top': 70 + }); + toolbarfixed = true; + } + }else{ + if(toolbarfixed){ + toolbar.removeClass('fixed'); + infobox.removeClass('fixed').css({ + 'top': contentpos.top+70 + }); + toolbarfixed = false; + } + } + //console.log(window); + }).trigger('scroll'); + + infobox.removeClass('fixed').css({ + 'top': contentpos.top+70, + 'left': contentpos.left+650 + }); + + + $('#inline-description-save').click(function(){ + + var html = textarea.val(), + posturl = pagetabs.eq(3).find('a').attr('href'); + + html = html + .replace(/<\/?tbody>/g,'') + .replace(//g,'') + .replace(/<\/b>/g,'') + .replace(//g,'') + .replace(/<\/i>/g,'') + .replace(//g,'') + .replace(/<\/strike>/g,'') + ; + $('#item_description_form').find('textarea').val($.trim(html)); + $('#item_description_form').submit(); + + + }); + $('#inline-description-cancel').click(function(){ + + textarea.wysiwyg("destroy"); + content.show(); + overlay.remove(); + infobox.remove(); + textarea.remove(); + $('#edit_inline_btn').parent().removeClass('selected'); + $('#item_description_form').remove(); + return false; + + }); + } + + return false; + + }); + + + + + + function addCSS(url, ID, callback){ + var d = document; + var head = d.getElementsByTagName('head')[0]; + var link = d.createElement('link'); + if(ID) link.id = ID; + link.rel = 'stylesheet'; + link.type = 'text/css'; + link.href = url+'?c='+new Date().getTime();; + link.media = 'all'; + link.onload = function(){ + callback && callback(); + }; + head.appendChild(link); + } + +})(); + +/** + * WYSIWYG - jQuery plugin 0.97 + * (0.97.2 - From infinity) + * + * Copyright (c) 2008-2009 Juan M Martinez, 2010-2011 Akzhan Abdulin and all contributors + * https://github.com/akzhan/jwysiwyg + * + * Dual licensed under the MIT and GPL licenses: + * http://www.opensource.org/licenses/mit-license.php + * http://www.gnu.org/licenses/gpl.html + * + */ + +/*jslint browser: true, forin: true */ + +(function ($) { + "use strict"; + /* Wysiwyg namespace: private properties and methods */ + + var console = window.console ? window.console : { + log: $.noop, + error: function (msg) { + $.error(msg); + } + }; + + var is_opera = /opera/i.test(window.navigator.userAgent); + var is_webkit = /webkit/i.test(window.navigator.userAgent); + var is_firefox = /firefox/i.test(window.navigator.userAgent); + var is_msie = /msie/i.test(window.navigator.userAgent); + var is_mozilla = /mozilla/i.test(window.navigator.userAgent); + + + var supportsProp = (('prop' in $.fn) && ('removeProp' in $.fn)); + + function Wysiwyg() { + // - the item is added by this.ui.appendControls and then appendItem + // - click triggers this.triggerControl + // cmd or[key] - designMode exec function name + // tags - activates control for these tags (@see checkTargets) + // css - activates control if one of css is applied + this.controls = { + + copy: { + groupIndex: 8, + visible: false, + tooltip: "Copy" + }, + + createLink: { + groupIndex: 6, + visible: true, + exec: function () { + var self = this; + if ($.wysiwyg.controls && $.wysiwyg.controls.link) { + $.wysiwyg.controls.link.init(this); + } else if ($.wysiwyg.autoload) { + $.wysiwyg.autoload.control("wysiwyg.link.js", function () { + self.controls.createLink.exec.apply(self); + }); + } else { + console.error("$.wysiwyg.controls.link not defined. You need to include wysiwyg.link.js file"); + } + }, + tags: ["a"], + tooltip: "Create link" + }, + + unLink : { + groupIndex: 6, + visible: true, + exec : function() { + this.editorDoc.execCommand("unlink", false, null); + }, + tooltip: "Remove link" + }, + + cut: { + groupIndex: 8, + visible: false, + tooltip: "Cut" + }, + + decreaseFontSize: { + groupIndex: 9, + visible: false, + tags: ["small"], + tooltip: "Decrease font size", + exec: function () { + this.decreaseFontSize(); + } + }, + + h1: { + groupIndex: 0, + visible: false, + className: "h1", + command: (is_msie || is_webkit) ? "FormatBlock" : "heading", + "arguments": (is_msie || is_webkit) ? "

    " : "h1", + tags: ["h1"], + tooltip: "Header 1" + }, + + h2: { + groupIndex: 0, + visible: true, + className: "h2", + command: (is_msie || is_webkit) ? "FormatBlock" : "heading", + "arguments": (is_msie || is_webkit) ? "

    " : "h2", + tags: ["h2"], + tooltip: "Header 2" + }, + + h3: { + groupIndex: 0, + visible: true, + className: "h3", + command: (is_msie || is_webkit) ? "FormatBlock" : "heading", + "arguments": (is_msie || is_webkit) ? "

    " : "h3", + tags: ["h3"], + tooltip: "Header 3" + }, + + h4: { + groupIndex: 0, + visible: true, + className: "h4", + command: (is_msie || is_webkit) ? "FormatBlock" : "heading", + "arguments": (is_msie || is_webkit) ? "

    " : "h4", + tags: ["h4"], + tooltip: "Header 4" + }, + + h5: { + groupIndex: 0, + visible: true, + className: "h5", + command: (is_msie || is_webkit) ? "FormatBlock" : "heading", + "arguments": (is_msie || is_webkit) ? "

    " : "h5", + tags: ["h5"], + tooltip: "Header 5" + }, + + h6: { + groupIndex: 0, + visible: true, + className: "h6", + command: (is_msie || is_webkit) ? "FormatBlock" : "heading", + "arguments": (is_msie || is_webkit) ? "
    " : "h6", + tags: ["h6"], + tooltip: "Header 6" + }, + + highlight: { + tooltip: "Highlight", + className: "highlight", + groupIndex: 1, + visible: false, + css: { + backgroundColor: "rgb(255, 255, 102)" + }, + exec: function () { + var command, node, selection, args; + + if (is_msie || is_webkit) { + command = "backcolor"; + } else { + command = "hilitecolor"; + } + + if (is_msie) { + node = this.getInternalRange().parentElement(); + } else { + selection = this.getInternalSelection(); + node = selection.extentNode || selection.focusNode; + + while (node.style === undefined) { + node = node.parentNode; + if (node.tagName && node.tagName.toLowerCase() === "body") { + return; + } + } + } + + if (node.style.backgroundColor === "rgb(255, 255, 102)" || + node.style.backgroundColor === "#ffff66") { + args = "#ffffff"; + } else { + args = "#ffff66"; + } + + this.editorDoc.execCommand(command, false, args); + } + }, + + html: { + groupIndex: 10, + visible: true, + exec: function () { + var elementHeight; + + if (this.options.resizeOptions && $.fn.resizable) { + elementHeight = this.element.height(); + } + + if (this.viewHTML) { //textarea is shown + this.setContent(this.original.value); + + $(this.original).hide(); + this.editor.show(); + + if (this.options.resizeOptions && $.fn.resizable) { + // if element.height still the same after frame was shown + if (elementHeight === this.element.height()) { + this.element.height(elementHeight + this.editor.height()); + } + + this.element.resizable($.extend(true, { + alsoResize: this.editor + }, this.options.resizeOptions)); + } + + this.ui.toolbar.find("li").each(function () { + var li = $(this); + + if (li.hasClass("html")) { + li.removeClass("active"); + } else { + li.removeClass('disabled'); + } + }); + } else { //wysiwyg is shown + this.saveContent(); + + $(this.original).css({ + width: this.element.outerWidth() - 6, + height: this.element.height() - this.ui.toolbar.height() - 6, + resize: "none" + }).show(); + this.editor.hide(); + + if (this.options.resizeOptions && $.fn.resizable) { + // if element.height still the same after frame was hidden + if (elementHeight === this.element.height()) { + this.element.height(this.ui.toolbar.height()); + } + + this.element.resizable("destroy"); + } + + this.ui.toolbar.find("li").each(function () { + var li = $(this); + + if (li.hasClass("html")) { + li.addClass("active"); + } else { + if (false === li.hasClass("fullscreen")) { + li.removeClass("active").addClass('disabled'); + } + } + }); + } + + this.viewHTML = !(this.viewHTML); + }, + tooltip: "View source code" + }, + + increaseFontSize: { + groupIndex: 9, + visible: false, + tags: ["big"], + tooltip: "Increase font size", + exec: function () { + this.increaseFontSize(); + } + }, + + indent: { + groupIndex: 2, + visible: false, + tooltip: "Indent" + }, + + insertHorizontalRule: { + groupIndex: 6, + visible: true, + tags: ["hr"], + tooltip: "Insert Horizontal Rule" + }, + + insertImage: { + groupIndex: 6, + visible: true, + exec: function () { + var url; + var self = this; + if(url = prompt('Insert a valid image URL', '')){ + var image = ""; + self.insertHtml(image); + } + + }, + tags: ["img"], + tooltip: "Insert image" + }, + + insertOrderedList: { + groupIndex: 5, + visible: true, + tags: ["ol"], + tooltip: "Insert Ordered List" + }, + + insertTable: { + groupIndex: 6, + visible: true, + exec: function () { + var self = this; + + if ($.wysiwyg.controls && $.wysiwyg.controls.table) { + $.wysiwyg.controls.table(this); + } else if ($.wysiwyg.autoload) { + $.wysiwyg.autoload.control("wysiwyg.table.js", function () { + self.controls.insertTable.exec.apply(self); + }); + } else { + console.error("$.wysiwyg.controls.table not defined. You need to include wysiwyg.table.js file"); + } + }, + tags: ["table"], + tooltip: "Insert table" + }, + + insertUnorderedList: { + groupIndex: 5, + visible: true, + tags: ["ul"], + tooltip: "Insert Unordered List" + }, + + bold: { + groupIndex: 0, + visible: true, + tags: ["strong", "b"], + css: { + fontWeight: "bold" + }, + tooltip: "Bold", + hotkey: {"ctrl": 1, "key": 66} + }, + italic: { + groupIndex: 0, + visible: true, + tags: ["i", "em"], + css: { + fontStyle: "italic" + }, + tooltip: "Italic", + hotkey: {"ctrl": 1, "key": 73} + }, + + justifyCenter: { + groupIndex: 1, + visible: false, + tags: ["center"], + css: { + textAlign: "center" + }, + tooltip: "Justify Center" + }, + + justifyFull: { + groupIndex: 1, + visible: false, + css: { + textAlign: "justify" + }, + tooltip: "Justify Full" + }, + + justifyLeft: { + visible: false, + groupIndex: 1, + css: { + textAlign: "left" + }, + tooltip: "Justify Left" + }, + + justifyRight: { + groupIndex: 1, + visible: false, + css: { + textAlign: "right" + }, + tooltip: "Justify Right" + }, + + ltr: { + groupIndex: 10, + visible: false, + exec: function () { + var p = this.dom.getElement("p"); + + if (!p) { + return false; + } + + $(p).attr("dir", "ltr"); + return true; + }, + tooltip : "Left to Right" + }, + + outdent: { + groupIndex: 2, + visible: false, + tooltip: "Outdent" + }, + + paragraph: { + groupIndex: 0, + visible: true, + className: "paragraph", + command: "FormatBlock", + "arguments": (is_msie || is_webkit) ? "

    " : "p", + tags: ["p"], + tooltip: "Paragraph" + }, + + paste: { + groupIndex: 8, + visible: false, + tooltip: "Paste" + }, + + undo: { + groupIndex: 4, + visible: true, + tooltip: "Undo" + }, + + redo: { + groupIndex: 4, + visible: true, + tooltip: "Redo" + }, + + removeFormat: { + groupIndex: 10, + visible: true, + exec: function () { + this.removeFormat(); + }, + tooltip: "Remove formatting" + }, + + rtl: { + groupIndex: 10, + visible: false, + exec: function () { + var p = this.dom.getElement("p"); + + if (!p) { + return false; + } + + $(p).attr("dir", "rtl"); + return true; + }, + tooltip : "Right to Left" + }, + + strikeThrough: { + groupIndex: 0, + visible: true, + tags: ["s", "strike"], + css: { + textDecoration: "line-through" + }, + tooltip: "Strike-through" + }, + + subscript: { + groupIndex: 3, + visible: false, + tags: ["sub"], + tooltip: "Subscript" + }, + + superscript: { + groupIndex: 3, + visible: false, + tags: ["sup"], + tooltip: "Superscript" + }, + + underline: { + groupIndex: 0, + visible: true, + tags: ["u"], + css: { + textDecoration: "underline" + }, + tooltip: "Underline", + hotkey: {"ctrl": 1, "key": 85} + }, + + pre: { + visible : true, + groupIndex: 6, + tooltip: "Code Block", + command: "FormatBlock", + "arguments": (is_msie || is_webkit) ? "

    " : "pre",
    +				tags: ["pre"],
    +			},
    +			
    +			code: {
    +				visible : true,
    +				groupIndex: 6,
    +				tooltip: "Code snippet",
    +				exec: function () {
    +					var range	= this.getInternalRange(),
    +						common	= $(range.commonAncestorContainer),
    +						$nodeName = range.commonAncestorContainer.nodeName.toLowerCase();
    +					if (common.parent("code").length) {
    +						common.unwrap();
    +					} else {
    +						if ($nodeName !== "body") {
    +							common.wrap("");
    +						}
    +					}
    +				}
    +			},
    +			
    +			cssWrap: {
    +				visible : false,
    +				groupIndex: 6,
    +				tooltip: "CSS Wrapper",
    +				exec: function () { 
    +					$.wysiwyg.controls.cssWrap.init(this);
    +				}
    +			}
    +			
    +		};
    +
    +		this.defaults = {
    +html: 'INITIAL_CONTENT',
    +			debug: false,
    +			controls: {},
    +			css: {},
    +			events: {},
    +			autoGrow: false,
    +			autoSave: true,
    +			brIE: true,					// http://code.google.com/p/jwysiwyg/issues/detail?id=15
    +			formHeight: 270,
    +			formWidth: 440,
    +			iFrameClass: null,
    +			initialContent: "

    Initial content

    ", + maxHeight: 10000, // see autoGrow + maxLength: 0, + messages: { + nonSelection: "Select the text you wish to link" + }, + toolbarHtml: '', + removeHeadings: false, + replaceDivWithP: false, + resizeOptions: false, + rmUnusedControls: false, // https://github.com/akzhan/jwysiwyg/issues/52 + rmUnwantedBr: true, // http://code.google.com/p/jwysiwyg/issues/detail?id=11 + tableFiller: "Lorem ipsum", + initialMinHeight: null, + + controlImage: { + forceRelativeUrls: false + }, + + controlLink: { + forceRelativeUrls: false + }, + + plugins: { // placeholder for plugins settings + autoload: false, + i18n: false, + rmFormat: { + rmMsWordMarkup: false + } + }, + + dialog : "default" + }; + + //these properties are set from control hashes + this.availableControlProperties = [ + "arguments", + "callback", + "className", + "command", + "css", + "custom", + "exec", + "groupIndex", + "hotkey", + "icon", + "tags", + "tooltip", + "visible" + ]; + + this.editor = null; //jquery iframe holder + this.editorDoc = null; + this.element = null; + this.options = {}; + this.original = null; + this.savedRange = null; + this.timers = []; + this.validKeyCodes = [8, 9, 13, 16, 17, 18, 19, 20, 27, 33, 34, 35, 36, 37, 38, 39, 40, 45, 46]; + + this.isDestroyed = false; + + this.dom = { // DOM related properties and methods + ie: { + parent: null // link to dom + }, + w3c: { + parent: null // link to dom + } + }; + this.dom.parent = this; + this.dom.ie.parent = this.dom; + this.dom.w3c.parent = this.dom; + + this.ui = {}; // UI related properties and methods + this.ui.self = this; + this.ui.toolbar = null; + this.ui.initialHeight = null; // ui.grow + + this.dom.getAncestor = function (element, filterTagName) { + filterTagName = filterTagName.toLowerCase(); + + while (element && typeof element.tagName != "undefined" && "body" !== element.tagName.toLowerCase()) { + if (filterTagName === element.tagName.toLowerCase()) { + return element; + } + + element = element.parentNode; + } + if(!element.tagName && (element.previousSibling || element.nextSibling)) { + if(element.previousSibling) { + if(element.previousSibling.tagName.toLowerCase() == filterTagName) { + return element.previousSibling; + } + } + if(element.nextSibling) { + if(element.nextSibling.tagName.toLowerCase() == filterTagName) { + return element.nextSibling; + } + } + } + + return null; + }; + + this.dom.getElement = function (filterTagName) { + var dom = this; + + filterTagName = filterTagName.toLowerCase(); + + if (window.getSelection) { + return dom.w3c.getElement(filterTagName); + } else { + return dom.ie.getElement(filterTagName); + } + }; + + this.dom.ie.getElement = function (filterTagName) { + var dom = this.parent, + selection = dom.parent.getInternalSelection(), + range = selection.createRange(), + element; + + if ("Control" === selection.type) { + // control selection + if (1 === range.length) { + element = range.item(0); + } else { + // multiple control selection + return null; + } + } else { + element = range.parentElement(); + } + + return dom.getAncestor(element, filterTagName); + }; + + this.dom.w3c.getElement = function (filterTagName) { + var dom = this.parent, + range = dom.parent.getInternalRange(), + element; + + if (!range) { + return null; + } + + element = range.commonAncestorContainer; + + if (3 === element.nodeType) { + element = element.parentNode; + } + + // if startContainer not Text, Comment, or CDATASection element then + // startOffset is the number of child nodes between the start of the + // startContainer and the boundary point of the Range + if (element === range.startContainer) { + element = element.childNodes[range.startOffset]; + } + + if(!element.tagName && (element.previousSibling || element.nextSibling)) { + if(element.previousSibling) { + if(element.previousSibling.tagName.toLowerCase() == filterTagName) { + return element.previousSibling; + } + } + if(element.nextSibling) { + if(element.nextSibling.tagName.toLowerCase() == filterTagName) { + return element.nextSibling; + } + } + } + + return dom.getAncestor(element, filterTagName); + }; + + this.ui.addHoverClass = function () { + $(this).addClass("wysiwyg-button-hover"); + }; + + this.ui.appendControls = function () { + var ui = this, + self = this.self, + controls = self.parseControls(), + hasVisibleControls = true, // to prevent separator before first item + groups = [], + controlsByGroup = {}, + i, + currentGroupIndex, // jslint wants all vars at top of function + iterateGroup = function (controlName, control) { //called for every group when adding + if (control.groupIndex && currentGroupIndex !== control.groupIndex) { + currentGroupIndex = control.groupIndex; + hasVisibleControls = false; + } + + if (!control.visible) { + return; + } + + if (!hasVisibleControls) { + ui.appendItemSeparator(); + hasVisibleControls = true; + } + + if (control.custom) { + ui.appendItemCustom(controlName, control); + } else { + ui.appendItem(controlName, control); + } + }; + + $.each(controls, function (name, c) { //sort by groupIndex + var index = "empty"; + + if (undefined !== c.groupIndex) { + if ("" === c.groupIndex) { + index = "empty"; + } else { + index = c.groupIndex; + } + } + + if (undefined === controlsByGroup[index]) { + groups.push(index); + controlsByGroup[index] = {}; + } + controlsByGroup[index][name] = c; + }); + + groups.sort(function (a, b) { //just sort group indexes by + if ("number" === typeof (a) && typeof (a) === typeof (b)) { + return (a - b); + } else { + a = a.toString(); + b = b.toString(); + + if (a > b) { + return 1; + } + + if (a === b) { + return 0; + } + + return -1; + } + }); + + if (0 < groups.length) { + // set to first index in groups to proper placement of separator + currentGroupIndex = groups[0]; + } + + for (i = 0; i < groups.length; i += 1) { + $.each(controlsByGroup[groups[i]], iterateGroup); + } + }; + + this.ui.appendItem = function (name, control) { + var self = this.self, + className = control.className || control.command || name || "empty", + tooltip = control.tooltip || control.command || name || ""; + + return $('
  • ' + (className) + "
  • ") + .addClass(className) + .attr("title", tooltip) + .hover(this.addHoverClass, this.removeHoverClass) + .click(function (event) { + if ($(this).hasClass("disabled")) { + return false; + } + + self.triggerControl.apply(self, [name, control]); + + /** + * @link https://github.com/akzhan/jwysiwyg/issues/219 + */ + var $target = $(event.target); + for (var controlName in self.controls) { + if ($target.hasClass(controlName)) { + self.ui.toolbar.find("." + controlName).toggleClass("active"); + self.editorDoc.rememberCommand = true; + break; + } + } + + this.blur(); + self.ui.returnRange(); + self.ui.focus(); + return true; + }) + .appendTo(self.ui.toolbar); + }; + + this.ui.appendItemCustom = function (name, control) { + var self = this.self, + tooltip = control.tooltip || control.command || name || ""; + + if (control.callback) { + $(window).bind("trigger-" + name + ".wysiwyg", control.callback); + } + + return $('
  • ') + .addClass("custom-command-" + name) + .addClass("wysiwyg-custom-command") + .addClass(name) + .attr("title", tooltip) + .hover(this.addHoverClass, this.removeHoverClass) + .click(function () { + if ($(this).hasClass("disabled")) { + return false; + } + + self.triggerControl.apply(self, [name, control]); + + this.blur(); + self.ui.returnRange(); + self.ui.focus(); + + self.triggerControlCallback(name); + return true; + }) + .appendTo(self.ui.toolbar); + }; + + this.ui.appendItemSeparator = function () { + var self = this.self; + return $('').appendTo(self.ui.toolbar); + }; + + this.autoSaveFunction = function () { + this.saveContent(); + }; + + //called after click in wysiwyg "textarea" + this.ui.checkTargets = function (element) { + var self = this.self; + + //activate controls + $.each(self.options.controls, function (name, control) { + var className = control.className || control.command || name || "empty", + tags, + elm, + css, + el, + checkActiveStatus = function (cssProperty, cssValue) { + var handler; + + if ("function" === typeof (cssValue)) { + handler = cssValue; + if (handler(el.css(cssProperty).toString().toLowerCase(), self)) { + self.ui.toolbar.find("." + className).addClass("active"); + } + } else { + if (el.css(cssProperty).toString().toLowerCase() === cssValue) { + self.ui.toolbar.find("." + className).addClass("active"); + } + } + }; + + if ("fullscreen" !== className) { + self.ui.toolbar.find("." + className).removeClass("active"); + } + + //activate by allowed tags + if (control.tags || (control.options && control.options.tags)) { + tags = control.tags || (control.options && control.options.tags); + + elm = element; + while (elm) { + if (elm.nodeType !== 1) { + break; + } + + if ($.inArray(elm.tagName.toLowerCase(), tags) !== -1) { + self.ui.toolbar.find("." + className).addClass("active"); + } + + elm = elm.parentNode; + } + } + + //activate by supposed css + if (control.css || (control.options && control.options.css)) { + css = control.css || (control.options && control.options.css); + el = $(element); + + while (el) { + if (el[0].nodeType !== 1) { + break; + } + $.each(css, checkActiveStatus); + + el = el.parent(); + } + } + }); + }; + + this.ui.designMode = function () { + var attempts = 3, + self = this.self, + runner; + runner = function (attempts) { + if ("on" === self.editorDoc.designMode) { + if (self.timers.designMode) { + window.clearTimeout(self.timers.designMode); + } + + // IE needs to reget the document element (this.editorDoc) after designMode was set + if (self.innerDocument() !== self.editorDoc) { + self.ui.initFrame(); + } + + return; + } + + try { + self.editorDoc.designMode = "on"; + } catch (e) { + } + + attempts -= 1; + if (attempts > 0) { + self.timers.designMode = window.setTimeout(function () { runner(attempts); }, 100); + } + }; + + runner(attempts); + }; + + this.destroy = function () { + this.isDestroyed = true; + + var i, $form = this.element.closest("form"); + + for (i = 0; i < this.timers.length; i += 1) { + window.clearTimeout(this.timers[i]); + } + + // Remove bindings + $form.unbind(".wysiwyg"); + this.element.remove(); + $.removeData(this.original, "wysiwyg"); + $(this.original).show(); + return this; + }; + + this.getRangeText = function () { + var r = this.getInternalRange(); + + if (r.toString) { + r = r.toString(); + } else if (r.text) { // IE + r = r.text; + } + + return r; + }; + //not used? + this.execute = function (command, arg) { + if (typeof (arg) === "undefined") { + arg = null; + } + this.editorDoc.execCommand(command, false, arg); + }; + + this.extendOptions = function (options) { + var controls = {}; + + /** + * If the user set custom controls, we catch it, and merge with the + * defaults controls later. + */ + if ("object" === typeof options.controls) { + controls = options.controls; + delete options.controls; + } + + options = $.extend(true, {}, this.defaults, options); + options.controls = $.extend(true, {}, controls, this.controls, controls); + + if (options.rmUnusedControls) { + $.each(options.controls, function (controlName) { + if (!controls[controlName]) { + delete options.controls[controlName]; + } + }); + } + + return options; + }; + + this.ui.focus = function () { + var self = this.self; + + self.editor.get(0).contentWindow.focus(); + return self; + }; + + this.ui.returnRange = function () { + var self = this.self, sel; + + if (self.savedRange !== null) { + if (window.getSelection) { //non IE and there is already a selection + sel = window.getSelection(); + if (sel.rangeCount > 0) { + sel.removeAllRanges(); + } + try { + sel.addRange(self.savedRange); + } catch (e) { + console.error(e); + } + } else if (window.document.createRange) { // non IE and no selection + window.getSelection().addRange(self.savedRange); + } else if (window.document.selection) { //IE + self.savedRange.select(); + } + + self.savedRange = null; + } + }; + + this.increaseFontSize = function () { + if (is_mozilla || is_opera) { + this.editorDoc.execCommand("increaseFontSize", false, null); + } else if (is_webkit) { + var Range = this.getInternalRange(), + Selection = this.getInternalSelection(), + newNode = this.editorDoc.createElement("big"); + + // If cursor placed on text node + if (true === Range.collapsed && 3 === Range.commonAncestorContainer.nodeType) { + var text = Range.commonAncestorContainer.nodeValue.toString(), + start = text.lastIndexOf(" ", Range.startOffset) + 1, + end = (-1 === text.indexOf(" ", Range.startOffset)) ? text : text.indexOf(" ", Range.startOffset); + + Range.setStart(Range.commonAncestorContainer, start); + Range.setEnd(Range.commonAncestorContainer, end); + + Range.surroundContents(newNode); + Selection.addRange(Range); + } else { + Range.surroundContents(newNode); + Selection.removeAllRanges(); + Selection.addRange(Range); + } + } else { + console.error("Internet Explorer?"); + } + }; + + this.decreaseFontSize = function () { + if (is_mozilla || is_opera) { + this.editorDoc.execCommand("decreaseFontSize", false, null); + } else if (is_webkit) { + var Range = this.getInternalRange(), + Selection = this.getInternalSelection(), + newNode = this.editorDoc.createElement("small"); + + // If cursor placed on text node + if (true === Range.collapsed && 3 === Range.commonAncestorContainer.nodeType) { + var text = Range.commonAncestorContainer.nodeValue.toString(), + start = text.lastIndexOf(" ", Range.startOffset) + 1, + end = (-1 === text.indexOf(" ", Range.startOffset)) ? text : text.indexOf(" ", Range.startOffset); + + Range.setStart(Range.commonAncestorContainer, start); + Range.setEnd(Range.commonAncestorContainer, end); + + Range.surroundContents(newNode); + Selection.addRange(Range); + } else { + Range.surroundContents(newNode); + Selection.removeAllRanges(); + Selection.addRange(Range); + } + } else { + console.error("Internet Explorer?"); + } + }; + + this.getContent = function () { + if (this.viewHTML) { + this.setContent(this.original.value); + } + return this.events.filter('getContent', this.editorDoc.body.innerHTML); + }; + + /** + * A jWysiwyg specific event system. + * + * Example: + * + * $("#editor").getWysiwyg().events.bind("getContent", function (orig) { + * return "
    "+orgi+"
    "; + * }); + * + * This makes it so that when ever getContent is called, it is wrapped in a div#content. + */ + this.events = { + _events : {}, + + /** + * Similar to jQuery's bind, but for jWysiwyg only. + */ + bind : function (eventName, callback) { + if (typeof (this._events.eventName) !== "object") { + this._events[eventName] = []; + } + this._events[eventName].push(callback); + }, + + /** + * Similar to jQuery's trigger, but for jWysiwyg only. + */ + trigger : function (eventName, args) { + if (typeof (this._events.eventName) === "object") { + var editor = this.editor; + $.each(this._events[eventName], function (k, v) { + if (typeof (v) === "function") { + v.apply(editor, args); + } + }); + } + }, + + /** + * This "filters" `originalText` by passing it as the first argument to every callback + * with the name `eventName` and taking the return value and passing it to the next function. + * + * This function returns the result after all the callbacks have been applied to `originalText`. + */ + filter : function (eventName, originalText) { + if (typeof (this._events[eventName]) === "object") { + var editor = this.editor, + args = Array.prototype.slice.call(arguments, 1); + + $.each(this._events[eventName], function (k, v) { + if (typeof (v) === "function") { + originalText = v.apply(editor, args); + } + }); + } + return originalText; + } + }; + + this.getElementByAttributeValue = function (tagName, attributeName, attributeValue) { + var i, value, elements = this.editorDoc.getElementsByTagName(tagName); + + for (i = 0; i < elements.length; i += 1) { + value = elements[i].getAttribute(attributeName); + + if (is_msie) { + /** IE add full path, so I check by the last chars. */ + value = value.substr(value.length - attributeValue.length); + } + + if (value === attributeValue) { + return elements[i]; + } + } + + return false; + }; + + this.getInternalRange = function () { + var selection = this.getInternalSelection(); + + if (!selection) { + return null; + } + + if (selection.rangeCount && selection.rangeCount > 0) { // w3c + return selection.getRangeAt(0); + } else if (selection.createRange) { // ie + return selection.createRange(); + } + + return null; + }; + + this.getInternalSelection = function () { + // firefox: document.getSelection is deprecated + if (this.editor.get(0).contentWindow) { + if (this.editor.get(0).contentWindow.getSelection) { + return this.editor.get(0).contentWindow.getSelection(); + } + if (this.editor.get(0).contentWindow.selection) { + return this.editor.get(0).contentWindow.selection; + } + } + if (this.editorDoc.getSelection) { + return this.editorDoc.getSelection(); + } + if (this.editorDoc.selection) { + return this.editorDoc.selection; + } + + return null; + }; + + this.getRange = function () { + var selection = this.getSelection(); + + if (!selection) { + return null; + } + + if (selection.rangeCount && selection.rangeCount > 0) { // w3c + selection.getRangeAt(0); + } else if (selection.createRange) { // ie + return selection.createRange(); + } + + return null; + }; + + this.getSelection = function () { + return (window.getSelection) ? window.getSelection() : window.document.selection; + }; + + // :TODO: you can type long string and letters will be hidden because of overflow + this.ui.grow = function () { + var self = this.self, + innerBody = $(self.editorDoc.body), + innerHeight = is_msie ? innerBody[0].scrollHeight : innerBody.height() + 2 + 20, // 2 - borders, 20 - to prevent content jumping on grow + minHeight = self.ui.initialHeight, + height = Math.max(innerHeight, minHeight); + + height = Math.min(height, self.options.maxHeight); + + self.editor.attr("scrolling", height < self.options.maxHeight ? "no" : "auto"); // hide scrollbar firefox + innerBody.css("overflow", height < self.options.maxHeight ? "hidden" : ""); // hide scrollbar chrome + + self.editor.get(0).height = height; + + return self; + }; + + this.init = function (element, options) { + var self = this, + $form = $(element).closest("form"), + newX = (element.width || element.clientWidth || 0), + newY = (element.height || element.clientHeight || 0) + ; + + this.options = this.extendOptions(options); + this.original = element; + this.ui.toolbar = $(this.options.toolbarHtml); + + if (is_msie && parseInt(is_version, 10) < 8) { + this.options.autoGrow = false; + } + + if (newX === 0 && element.cols) { + newX = (element.cols * 8) + 21; + } + if (newY === 0 && element.rows) { + newY = (element.rows * 16) + 16; + } + + this.editor = $(window.location.protocol === "https:" ? '' : "").attr("frameborder", "0"); + + if (this.options.iFrameClass) { + this.editor.addClass(this.options.iFrameClass); + } else { + this.editor.css({ + minHeight: (newY - 6).toString() + "px", + // fix for issue 12 ( http://github.com/akzhan/jwysiwyg/issues/issue/12 ) + width: (newX > 50) ? newX.toString() + "px" : "" + }); + if (is_msie && parseInt(is_version, 10) < 7) { + this.editor.css("height", newY.toString() + "px"); + } + } + /** + * Automagically add id to iframe if textarea has its own when possible + * ( http://github.com/akzhan/jwysiwyg/issues/245 ) + */ + if (element.id) { + var proposedId = element.id + '-wysiwyg-iframe'; + if (! document.getElementById(proposedId)) { + this.editor.attr('id', proposedId); + } + } + + /** + * http://code.google.com/p/jwysiwyg/issues/detail?id=96 + */ + this.editor.attr("tabindex", $(element).attr("tabindex")); + + this.element = $("
    ").addClass("wysiwyg"); + + if (!this.options.iFrameClass) { + this.element.css({ + width: (newX > 0) ? newX.toString() + "px" : "100%" + }); + } + + $(element).hide().before(this.element); + + this.viewHTML = false; + + /** + * @link http://code.google.com/p/jwysiwyg/issues/detail?id=52 + */ + this.initialContent = $(element).val(); + this.ui.initFrame(); + + if (this.options.resizeOptions && $.fn.resizable) { + this.element.resizable($.extend(true, { + alsoResize: this.editor + }, this.options.resizeOptions)); + } + + if (this.options.autoSave) { + $form.bind("submit.wysiwyg", function () { self.autoSaveFunction(); }); + } + + $form.bind("reset.wysiwyg", function () { self.resetFunction(); }); + }; + + this.ui.initFrame = function () { + var self = this.self, + stylesheet, + growHandler, + saveHandler; + + self.ui.appendControls(); + self.element.append(self.ui.toolbar) + .append($("
    ") + .css({ + clear: "both" + })) + .append(self.editor); + + self.editorDoc = self.innerDocument(); + + if (self.isDestroyed) { + return null; + } + + self.ui.designMode(); + self.editorDoc.open(); + self.editorDoc.write( + self.options.html + /** + * @link http://code.google.com/p/jwysiwyg/issues/detail?id=144 + */ + .replace(/INITIAL_CONTENT/, function () { return self.wrapInitialContent(); }) + ); + self.editorDoc.close(); + + $.wysiwyg.plugin.bind(self); + + $(self.editorDoc).trigger("initFrame.wysiwyg"); + + $(self.editorDoc).bind("click.wysiwyg", function (event) { + self.ui.checkTargets(event.target ? event.target : event.srcElement); + }); + + /** + * @link https://github.com/akzhan/jwysiwyg/issues/251 + */ + setInterval(function () { + var offset = null; + + try { + var range = self.getInternalRange(); + if (range) { + offset = { + range: range, + parent: is_msie ? range.parentElement() : range.endContainer.parentNode, + width: (is_msie ? range.boundingWidth : range.startOffset - range.endOffset) || 0 + }; + } + } + catch (e) { console.error(e); } + + if (offset && offset.width == 0 && !self.editorDoc.rememberCommand) { + self.ui.checkTargets(offset.parent); + } + }, 400); + + /** + * @link http://code.google.com/p/jwysiwyg/issues/detail?id=20 + * @link https://github.com/akzhan/jwysiwyg/issues/330 + */ + $(self.original).focus(function () { + if ($(this).filter(":visible").length === 0 || is_opera) { + return; + } + self.ui.focus(); + }); + + $(self.editorDoc).keydown(function (event) { + var emptyContentRegex; + if (event.keyCode === 8) { // backspace + emptyContentRegex = /^<([\w]+)[^>]*>()?<\/\1>$/; + if (emptyContentRegex.test(self.getContent())) { // if content is empty + event.stopPropagation(); // prevent remove single empty tag + return false; + } + } + + self.editorDoc.rememberCommand = false; + return true; + }); + + if (!is_msie) { + $(self.editorDoc).keydown(function (event) { + var controlName; + var control; + + /* Meta for Macs. tom@punkave.com */ + if (event.ctrlKey || event.metaKey) { + for (controlName in self.options.controls) { + control = self.options.controls[controlName]; + if (control.hotkey && control.hotkey.ctrl) { + if (event.keyCode === control.hotkey.key) { + self.triggerControl.apply(self, [controlName, control]); + + return false; + } + } + } + } + return true; + }); + } else if (self.options.brIE) { + $(self.editorDoc).keydown(function (event) { + if (event.keyCode === 13) { + var rng = self.getRange(); + rng.pasteHTML("
    "); + rng.collapse(false); + rng.select(); + + return false; + } + + return true; + }); + } + + if (self.options.plugins.rmFormat.rmMsWordMarkup) { + $(self.editorDoc).bind("keyup.wysiwyg", function (event) { + if (event.ctrlKey || event.metaKey) { + // CTRL + V (paste) + if (86 === event.keyCode) { + if ($.wysiwyg.rmFormat) { + if ("object" === typeof (self.options.plugins.rmFormat.rmMsWordMarkup)) { + $.wysiwyg.rmFormat.run(self, {rules: { msWordMarkup: self.options.plugins.rmFormat.rmMsWordMarkup }}); + } else { + $.wysiwyg.rmFormat.run(self, {rules: { msWordMarkup: { enabled: true }}}); + } + } + } + } + }); + } + + if (self.options.autoSave) { + $(self.editorDoc).keydown(function () { self.autoSaveFunction(); }) + .keyup(function () { self.autoSaveFunction(); }) + .mousedown(function () { self.autoSaveFunction(); }) + .bind($.support.noCloneEvent ? "input.wysiwyg" : "paste.wysiwyg", function () { self.autoSaveFunction(); }); + } + + if (self.options.autoGrow) { + if (self.options.initialMinHeight !== null) { + self.ui.initialHeight = self.options.initialMinHeight; + } else { + self.ui.initialHeight = $(self.editorDoc).height(); + } + $(self.editorDoc.body).css("border", "1px solid white"); // cancel margin collapsing + + growHandler = function () { + self.ui.grow(); + }; + + $(self.editorDoc).keyup(growHandler); + $(self.editorDoc).bind("editorRefresh.wysiwyg", growHandler); + + // fix when content height > textarea height + self.ui.grow(); + } + + if (self.options.css) { + if (String === self.options.css.constructor) { + if (is_msie) { + stylesheet = self.editorDoc.createStyleSheet(self.options.css); + $(stylesheet).attr({ + "media": "all" + }); + } else { + stylesheet = $("").attr({ + "href": self.options.css, + "media": "all", + "rel": "stylesheet", + "type": "text/css" + }); + + $(self.editorDoc).find("head").append(stylesheet); + } + } else { + self.timers.initFrame_Css = window.setTimeout(function () { + $(self.editorDoc.body).css(self.options.css); + }, 0); + } + } + + if (self.initialContent.length === 0) { + if ("function" === typeof (self.options.initialContent)) { + self.setContent(self.options.initialContent()); + } else { + self.setContent(self.options.initialContent); + } + } + + if (self.options.maxLength > 0) { + $(self.editorDoc).keydown(function (event) { + if ($(self.editorDoc).text().length >= self.options.maxLength && $.inArray(event.which, self.validKeyCodes) === -1) { + event.preventDefault(); + } + }); + } + + // Support event callbacks + $.each(self.options.events, function (key, handler) { + $(self.editorDoc).bind(key + ".wysiwyg", function (event) { + // Trigger event handler, providing the event and api to + // support additional functionality. + handler.apply(self.editorDoc, [event, self]); + }); + }); + + // restores selection properly on focus + if (is_msie) { + // Event chain: beforedeactivate => focusout => blur. + // Focusout & blur fired too late to handle internalRange() in dialogs. + // When clicked on input boxes both got range = null + $(self.editorDoc).bind("beforedeactivate.wysiwyg", function () { + self.savedRange = self.getInternalRange(); + }); + } else { + $(self.editorDoc).bind("blur.wysiwyg", function () { + self.savedRange = self.getInternalRange(); + }); + } + + $(self.editorDoc.body).addClass("wysiwyg"); + if (self.options.events && self.options.events.save) { + saveHandler = self.options.events.save; + + $(self.editorDoc).bind("keyup.wysiwyg", saveHandler); + $(self.editorDoc).bind("change.wysiwyg", saveHandler); + + if ($.support.noCloneEvent) { + $(self.editorDoc).bind("input.wysiwyg", saveHandler); + } else { + $(self.editorDoc).bind("paste.wysiwyg", saveHandler); + $(self.editorDoc).bind("cut.wysiwyg", saveHandler); + } + } + + /** + * XHTML5 {@link https://github.com/akzhan/jwysiwyg/issues/152} + */ + if (self.options.xhtml5 && self.options.unicode) { + var replacements = {ne:8800,le:8804,para:182,xi:958,darr:8595,nu:957,oacute:243,Uacute:218,omega:969,prime:8242,pound:163,igrave:236,thorn:254,forall:8704,emsp:8195,lowast:8727,brvbar:166,alefsym:8501,nbsp:160,delta:948,clubs:9827,lArr:8656,Omega:937,Auml:196,cedil:184,and:8743,plusmn:177,ge:8805,raquo:187,uml:168,equiv:8801,laquo:171,rdquo:8221,Epsilon:917,divide:247,fnof:402,chi:967,Dagger:8225,iacute:237,rceil:8969,sigma:963,Oslash:216,acute:180,frac34:190,lrm:8206,upsih:978,Scaron:352,part:8706,exist:8707,nabla:8711,image:8465,prop:8733,zwj:8205,omicron:959,aacute:225,Yuml:376,Yacute:221,weierp:8472,rsquo:8217,otimes:8855,kappa:954,thetasym:977,harr:8596,Ouml:214,Iota:921,ograve:242,sdot:8901,copy:169,oplus:8853,acirc:226,sup:8835,zeta:950,Iacute:205,Oacute:211,crarr:8629,Nu:925,bdquo:8222,lsquo:8216,apos:39,Beta:914,eacute:233,egrave:232,lceil:8968,Kappa:922,piv:982,Ccedil:199,ldquo:8220,Xi:926,cent:162,uarr:8593,hellip:8230,Aacute:193,ensp:8194,sect:167,Ugrave:217,aelig:230,ordf:170,curren:164,sbquo:8218,macr:175,Phi:934,Eta:919,rho:961,Omicron:927,sup2:178,euro:8364,aring:229,Theta:920,mdash:8212,uuml:252,otilde:245,eta:951,uacute:250,rArr:8658,nsub:8836,agrave:224,notin:8713,ndash:8211,Psi:936,Ocirc:212,sube:8838,szlig:223,micro:181,not:172,sup1:185,middot:183,iota:953,ecirc:234,lsaquo:8249,thinsp:8201,sum:8721,ntilde:241,scaron:353,cap:8745,atilde:227,lang:10216,__replacement:65533,isin:8712,gamma:947,Euml:203,ang:8736,upsilon:965,Ntilde:209,hearts:9829,Alpha:913,Tau:932,spades:9824,dagger:8224,THORN:222,"int":8747,lambda:955,Eacute:201,Uuml:220,infin:8734,rlm:8207,Aring:197,ugrave:249,Egrave:200,Acirc:194,rsaquo:8250,ETH:208,oslash:248,alpha:945,Ograve:210,Prime:8243,mu:956,ni:8715,real:8476,bull:8226,beta:946,icirc:238,eth:240,prod:8719,larr:8592,ordm:186,perp:8869,Gamma:915,reg:174,ucirc:251,Pi:928,psi:968,tilde:732,asymp:8776,zwnj:8204,Agrave:192,deg:176,AElig:198,times:215,Delta:916,sim:8764,Otilde:213,Mu:924,uArr:8657,circ:710,theta:952,Rho:929,sup3:179,diams:9830,tau:964,Chi:935,frac14:188,oelig:339,shy:173,or:8744,dArr:8659,phi:966,iuml:239,Lambda:923,rfloor:8971,iexcl:161,cong:8773,ccedil:231,Icirc:206,frac12:189,loz:9674,rarr:8594,cup:8746,radic:8730,frasl:8260,euml:235,OElig:338,hArr:8660,Atilde:195,Upsilon:933,there4:8756,ouml:246,oline:8254,Ecirc:202,yacute:253,auml:228,permil:8240,sigmaf:962,iquest:191,empty:8709,pi:960,Ucirc:219,supe:8839,Igrave:204,yen:165,rang:10217,trade:8482,lfloor:8970,minus:8722,Zeta:918,sub:8834,epsilon:949,yuml:255,Sigma:931,Iuml:207,ocirc:244}; + self.events.bind("getContent", function (text) { + return text.replace(/&(?:amp;)?(?!amp|lt|gt|quot)([a-z][a-z0-9]*);/gi, function (str, p1) { + if (!replacements[p1]) { + p1 = p1.toLowerCase(); + if (!replacements[p1]) { + p1 = "__replacement"; + } + } + + var num = replacements[p1]; + /* Numeric return if ever wanted: return replacements[p1] ? "&#"+num+";" : ""; */ + return String.fromCharCode(num); + }); + }); + } + $(self.original).trigger('ready.jwysiwyg', [self.editorDoc, self]); + }; + + this.innerDocument = function () { + var element = this.editor.get(0); + + if (element.nodeName.toLowerCase() === "iframe") { + if (element.contentDocument) { // Gecko + return element.contentDocument; + } else if (element.contentWindow) { // IE + return element.contentWindow.document; + } + + if (this.isDestroyed) { + return null; + } + + console.error("Unexpected error in innerDocument"); + + /* + return ( is_msie ) + ? document.frames[element.id].document + : element.contentWindow.document // contentDocument; + */ + } + + return element; + }; + + this.insertHtml = function (szHTML) { + var img, range; + + if (!szHTML || szHTML.length === 0) { + return this; + } + + if (is_msie) { + this.ui.focus(); + this.editorDoc.execCommand("insertImage", false, "#jwysiwyg#"); + img = this.getElementByAttributeValue("img", "src", "#jwysiwyg#"); + if (img) { + $(img).replaceWith(szHTML); + } + } else { + if (is_mozilla) { // @link https://github.com/akzhan/jwysiwyg/issues/50 + if (1 === $(szHTML).length) { + range = this.getInternalRange(); + range.deleteContents(); + range.insertNode($(szHTML).get(0)); + } else { + this.editorDoc.execCommand("insertHTML", false, szHTML); + } + } else { + if (!this.editorDoc.execCommand("insertHTML", false, szHTML)) { + this.editor.focus(); + /* :TODO: place caret at the end + if (window.getSelection) { + } else { + } + this.editor.focus(); + */ + this.editorDoc.execCommand("insertHTML", false, szHTML); + } + } + } + + this.saveContent(); + + return this; + }; + + //check allowed properties + this.parseControls = function () { + var self = this; + + $.each(this.options.controls, function (controlName, control) { + $.each(control, function (propertyName) { + if (-1 === $.inArray(propertyName, self.availableControlProperties)) { + throw controlName + '["' + propertyName + '"]: property "' + propertyName + '" not exists in Wysiwyg.availableControlProperties'; + } + }); + }); + + if (this.options.parseControls) { //user callback + return this.options.parseControls.call(this); + } + + return this.options.controls; + }; + + this.removeFormat = function () { + if (is_msie) { + this.ui.focus(); + } + + if (this.options.removeHeadings) { + this.editorDoc.execCommand("formatBlock", false, "

    "); // remove headings + } + + this.editorDoc.execCommand("removeFormat", false, null); + this.editorDoc.execCommand("unlink", false, null); + + if ($.wysiwyg.rmFormat && $.wysiwyg.rmFormat.enabled) { + if ("object" === typeof (this.options.plugins.rmFormat.rmMsWordMarkup)) { + $.wysiwyg.rmFormat.run(this, {rules: { msWordMarkup: this.options.plugins.rmFormat.rmMsWordMarkup }}); + } else { + $.wysiwyg.rmFormat.run(this, {rules: { msWordMarkup: { enabled: true }}}); + } + } + + return this; + }; + + this.ui.removeHoverClass = function () { + $(this).removeClass("wysiwyg-button-hover"); + }; + + this.resetFunction = function () { + this.setContent(this.initialContent); + }; + + this.saveContent = function () { + if (this.viewHTML) + { + return; // no need + } + if (this.original) { + var content, newContent; + + content = this.getContent(); + + if (this.options.rmUnwantedBr) { + content = content.replace(/$/, ""); + } + + if (this.options.replaceDivWithP) { + newContent = $("

    ").addClass("temp").append(content); + + newContent.children("div").each(function () { + var element = $(this), p = element.find("p"), i; + + if (0 === p.length) { + p = $("

    "); + + if (this.attributes.length > 0) { + for (i = 0; i < this.attributes.length; i += 1) { + p.attr(this.attributes[i].name, element.attr(this.attributes[i].name)); + } + } + + p.append(element.html()); + + element.replaceWith(p); + } + }); + + content = newContent.html(); + } + + $(this.original).val(content).change(); + + if (this.options.events && this.options.events.save) { + this.options.events.save.call(this); + } + } + + return this; + }; + + this.setContent = function (newContent) { + this.editorDoc.body.innerHTML = cleanHTML(newContent); + this.saveContent(); + + return this; + }; + + this.triggerControl = function (name, control) { + var cmd = control.command || name, //command directly for designMode=on iframe (this.editorDoc) + args = control["arguments"] || []; + + if (control.exec) { + control.exec.apply(this); //custom exec function in control, allows DOM changing + } else { + this.ui.focus(); + this.ui.withoutCss(); //disable style="" attr inserting in mozzila's designMode + // when click , or got "Access to XPConnect service denied" code: "1011" + // in Firefox untrusted JavaScript is not allowed to access the clipboard + try { + this.editorDoc.execCommand(cmd, false, args); + } catch (e) { + console.error(e); + } + } + + if (this.options.autoSave) { + this.autoSaveFunction(); + } + }; + + this.triggerControlCallback = function (name) { + $(window).trigger("trigger-" + name + ".wysiwyg", [this]); + }; + + this.ui.withoutCss = function () { + var self = this.self; + + if (is_mozilla) { + try { + self.editorDoc.execCommand("styleWithCSS", false, false); + } catch (e) { + try { + self.editorDoc.execCommand("useCSS", false, true); + } catch (e2) { + } + } + } + + return self; + }; + + this.wrapInitialContent = function () { + var content = this.initialContent, + found = content.match(/<\/?p>/gi); + + if (!found) { + return "

    " + content + "

    "; + } else { + // :TODO: checking/replacing + } + + return content; + }; + } + + /* + * Wysiwyg namespace: public properties and methods + */ + $.wysiwyg = { + messages: { + noObject: "Something goes wrong, check object" + }, + + /** + * Custom control support by Alec Gorge ( http://github.com/alecgorge ) + */ + addControl: function (object, name, settings) { + return object.each(function () { + var oWysiwyg = $(this).data("wysiwyg"), + customControl = {}, + toolbar; + + if (!oWysiwyg) { + return this; + } + + customControl[name] = $.extend(true, {visible: true, custom: true}, settings); + $.extend(true, oWysiwyg.options.controls, customControl); + + // render new toolbar + toolbar = $(oWysiwyg.options.toolbarHtml); + oWysiwyg.ui.toolbar.replaceWith(toolbar); + oWysiwyg.ui.toolbar = toolbar; + oWysiwyg.ui.appendControls(); + }); + }, + + clear: function (object) { + return object.each(function () { + var oWysiwyg = $(this).data("wysiwyg"); + + if (!oWysiwyg) { + return this; + } + + oWysiwyg.setContent(""); + }); + }, + + console: console, // let our console be available for extensions + + destroy: function (object) { + return object.each(function () { + var oWysiwyg = $(this).data("wysiwyg"); + + if (!oWysiwyg) { + return this; + } + + oWysiwyg.destroy(); + }); + }, + + "document": function (object) { + // no chains because of return + var oWysiwyg = object.data("wysiwyg"); + + if (!oWysiwyg) { + return undefined; + } + + return $(oWysiwyg.editorDoc); + }, + + getContent: function (object) { + // no chains because of return + var oWysiwyg = object.data("wysiwyg"); + + if (!oWysiwyg) { + return undefined; + } + + return oWysiwyg.getContent(); + }, + + getSelection: function (object) { + // no chains because of return + var oWysiwyg = object.data("wysiwyg"); + + if (!oWysiwyg) { + return undefined; + } + + return oWysiwyg.getRangeText(); + }, + + init: function (object, options) { + return object.each(function () { + var opts = $.extend(true, {}, options), + obj; + + // :4fun: + // remove this textarea validation and change line in this.saveContent function + // $(this.original).val(content); to $(this.original).html(content); + // now you can make WYSIWYG editor on h1, p, and many more tags + if (("textarea" !== this.nodeName.toLowerCase()) || $(this).data("wysiwyg")) { + return; + } + + obj = new Wysiwyg(); + obj.init(this, opts); + $.data(this, "wysiwyg", obj); + + $(obj.editorDoc).trigger("afterInit.wysiwyg"); + }); + }, + + insertHtml: function (object, szHTML) { + return object.each(function () { + var oWysiwyg = $(this).data("wysiwyg"); + + if (!oWysiwyg) { + return this; + } + + oWysiwyg.insertHtml(szHTML); + }); + }, + + plugin: { + listeners: {}, + + bind: function (Wysiwyg) { + var self = this; + + $.each(this.listeners, function (action, handlers) { + var i, plugin; + + for (i = 0; i < handlers.length; i += 1) { + plugin = self.parseName(handlers[i]); + + $(Wysiwyg.editorDoc).bind(action + ".wysiwyg", {plugin: plugin}, function (event) { + $.wysiwyg[event.data.plugin.name][event.data.plugin.method].apply($.wysiwyg[event.data.plugin.name], [Wysiwyg]); + }); + } + }); + }, + + exists: function (name) { + var plugin; + + if ("string" !== typeof (name)) { + return false; + } + + plugin = this.parseName(name); + + if (!$.wysiwyg[plugin.name] || !$.wysiwyg[plugin.name][plugin.method]) { + return false; + } + + return true; + }, + + listen: function (action, handler) { + var plugin; + + plugin = this.parseName(handler); + + if (!$.wysiwyg[plugin.name] || !$.wysiwyg[plugin.name][plugin.method]) { + return false; + } + + if (!this.listeners[action]) { + this.listeners[action] = []; + } + + this.listeners[action].push(handler); + + return true; + }, + + parseName: function (name) { + var elements; + + if ("string" !== typeof (name)) { + return false; + } + + elements = name.split("."); + + if (2 > elements.length) { + return false; + } + + return {name: elements[0], method: elements[1]}; + }, + + register: function (data) { + if (!data.name) { + console.error("Plugin name missing"); + } + + $.each($.wysiwyg, function (pluginName) { + if (pluginName === data.name) { + console.error("Plugin with name '" + data.name + "' was already registered"); + } + }); + + $.wysiwyg[data.name] = data; + + return true; + } + }, + + removeFormat: function (object) { + return object.each(function () { + var oWysiwyg = $(this).data("wysiwyg"); + + if (!oWysiwyg) { + return this; + } + + oWysiwyg.removeFormat(); + }); + }, + + save: function (object) { + return object.each(function () { + var oWysiwyg = $(this).data("wysiwyg"); + + if (!oWysiwyg) { + return this; + } + + oWysiwyg.saveContent(); + }); + }, + + selectAll: function (object) { + var oWysiwyg = object.data("wysiwyg"), oBody, oRange, selection; + + if (!oWysiwyg) { + return this; + } + + oBody = oWysiwyg.editorDoc.body; + if (window.getSelection) { + selection = oWysiwyg.getInternalSelection(); + selection.selectAllChildren(oBody); + } else { + oRange = oBody.createTextRange(); + oRange.moveToElementText(oBody); + oRange.select(); + } + }, + + setContent: function (object, newContent) { + return object.each(function () { + var oWysiwyg = $(this).data("wysiwyg"); + + if (!oWysiwyg) { + return this; + } + + oWysiwyg.setContent(newContent); + }); + }, + + triggerControl: function (object, controlName) { + return object.each(function () { + var oWysiwyg = $(this).data("wysiwyg"); + + if (!oWysiwyg) { + return this; + } + + if (!oWysiwyg.controls[controlName]) { + console.error("Control '" + controlName + "' not exists"); + } + + oWysiwyg.triggerControl.apply(oWysiwyg, [controlName, oWysiwyg.controls[controlName]]); + }); + }, + + support: { + prop: supportsProp + }, + + utils: { + extraSafeEntities: [["<", ">", "'", '"', " "], [32]], + + encodeEntities: function (str) { + var self = this, aStr, aRet = []; + + if (this.extraSafeEntities[1].length === 0) { + $.each(this.extraSafeEntities[0], function (i, ch) { + self.extraSafeEntities[1].push(ch.charCodeAt(0)); + }); + } + aStr = str.split(""); + $.each(aStr, function (i) { + var iC = aStr[i].charCodeAt(0); + if ($.inArray(iC, self.extraSafeEntities[1]) && (iC < 65 || iC > 127 || (iC > 90 && iC < 97))) { + aRet.push('&#' + iC + ';'); + } else { + aRet.push(aStr[i]); + } + }); + + return aRet.join(''); + } + } + }; + + /** + * Unifies dialog methods to allow custom implementations + * + * Events: + * * afterOpen + * * beforeShow + * * afterShow + * * beforeHide + * * afterHide + * * beforeClose + * * afterClose + * + * Example: + * var dialog = new ($.wysiwyg.dialog)($('#idToTextArea').data('wysiwyg'), {"title": "Test", "content": "form data, etc."}); + * + * dialog.bind("afterOpen", function () { alert('you should see a dialog behind this one!'); }); + * + * dialog.open(); + * + * + */ + $.wysiwyg.dialog = function (jWysiwyg, opts) { + + var theme = (jWysiwyg && jWysiwyg.options && jWysiwyg.options.dialog) ? jWysiwyg.options.dialog : (opts.theme ? opts.theme : "default"), + obj = new $.wysiwyg.dialog.createDialog(theme), + that = this, + $that = $(that); + + this.options = { + "modal": true, + "draggable": true, + "title": "Title", + "content": "Content", + "width": "auto", + "height": "auto", + "zIndex": 2000, + "open": false, + "close": false + }; + + this.isOpen = false; + + $.extend(this.options, opts); + + this.object = obj; + + // Opens a dialog with the specified content + this.open = function () { + this.isOpen = true; + + obj.init.apply(that, []); + var $dialog = obj.show.apply(that, []); + + $that.trigger("afterOpen", [$dialog]); + + }; + + this.show = function () { + this.isOpen = true; + + $that.trigger("beforeShow"); + + var $dialog = obj.show.apply(that, []); + + $that.trigger("afterShow"); + }; + + this.hide = function () { + this.isOpen = false; + + $that.trigger("beforeHide"); + + var $dialog = obj.hide.apply(that, []); + + $that.trigger("afterHide", [$dialog]); + }; + + // Closes the dialog window. + this.close = function () { + this.isOpen = false; + + var $dialog = obj.hide.apply(that, []); + + $that.trigger("beforeClose", [$dialog]); + + obj.destroy.apply(that, []); + + $that.trigger("afterClose", [$dialog]); + + jWysiwyg.ui.focus(); + }; + + if (this.options.open) { + $that.bind("afterOpen", this.options.open); + } + if (this.options.close) { + $that.bind("afterClose", this.options.close); + } + + return this; + }; + + // "Static" Dialog methods. + $.extend(true, $.wysiwyg.dialog, { + _themes : {}, // sample {"Theme Name": object} + _theme : "", // the current theme + + register : function(name, obj) { + $.wysiwyg.dialog._themes[name] = obj; + }, + + deregister : function (name) { + delete $.wysiwyg.dialog._themes[name]; + }, + + createDialog : function (name) { + return new ($.wysiwyg.dialog._themes[name]); + }, + + getDimensions : function () { + var width = document.body.scrollWidth, + height = document.body.scrollHeight; + + if (is_opera) { + height = Math.max( + $(document).height(), + $(window).height(), + document.documentElement.clientHeight); + } + + return [width, height]; + } + }); + + $(function () { // need access to jQuery UI stuff. + if (jQuery.ui) { + $.wysiwyg.dialog.register("jqueryui", function () { + var that = this; + + this._$dialog = null; + + this.init = function() { + var abstractDialog = this, + content = this.options.content; + + if (typeof content === 'object') { + if (typeof content.html === 'function') { + content = content.html(); + } else if(typeof content.toString === 'function') { + content = content.toString(); + } + } + + that._$dialog = $('
    ').attr('title', this.options.title).html(content); + + var dialogHeight = this.options.height == 'auto' ? 300 : this.options.height, + dialogWidth = this.options.width == 'auto' ? 450 : this.options.width; + + // console.log(that._$dialog); + + that._$dialog.dialog({ + modal: this.options.modal, + draggable: this.options.draggable, + height: dialogHeight, + width: dialogWidth + }); + + return that._$dialog; + }; + + this.show = function () { + that._$dialog.dialog("open"); + return that._$dialog; + }; + + this.hide = function () { + that._$dialog.dialog("close"); + return that._$dialog; + }; + + this.destroy = function() { + that._$dialog.dialog("destroy"); + return that._$dialog; + }; + }); + } + + $.wysiwyg.dialog.register("default", function () { + var that = this; + + this._$dialog = null; + + this.init = function() { + var abstractDialog = this, + content = this.options.content; + + if (typeof content === 'object') { + if(typeof content.html === 'function') { + content = content.html(); + } + else if(typeof content.toString === 'function') { + content = content.toString(); + } + } + + that._$dialog = $('
    ').css({"z-index": this.options.zIndex}); + + var $topbar = $('
    '+this.options.title+'
    '); + var $link = $('X'); + + $link.click(function () { + abstractDialog.close(); // this is important it makes sure that is close from the abstract $.wysiwyg.dialog instace, not just locally + return false; + }); + + $topbar.find('.wysiwyg-dialog-close-wrapper').prepend($link); + + var $dcontent = $('
    '+content+'
    '); + + that._$dialog.append($topbar).append($dcontent); + + // Set dialog's height & width, and position it correctly: + var dialogHeight = this.options.height == 'auto' ? 300 : this.options.height, + dialogWidth = this.options.width == 'auto' ? 450 : this.options.width; + that._$dialog.hide().css({ + "width": dialogWidth, + "height": dialogHeight, + "left": (($(window).width() - dialogWidth) / 2), + "top": (($(window).height() - dialogHeight) / 3) + }); + + $("body").append(that._$dialog); + + return that._$dialog; + }; + + this.show = function () { + + // Modal feature: + if (this.options.modal) { + var dimensions = $.wysiwyg.dialog.getDimensions(), + wrapper = $('
    ') + .css({"width": dimensions[0], "height": dimensions[1]}); + that._$dialog.wrap(wrapper); + } + + // Draggable feature: + if (this.options.draggable) { + + var mouseDown = false; + + that._$dialog.find("div.wysiwyg-dialog-topbar").bind("mousedown", function (e) { + e.preventDefault(); + $(this).css({ "cursor": "move" }); + var $topbar = $(this), + _dialog = $(this).parents(".wysiwyg-dialog"), + offsetX = (e.pageX - parseInt(_dialog.css("left"), 10)), + offsetY = (e.pageY - parseInt(_dialog.css("top"), 10)); + mouseDown = true; + $(this).css({ "cursor": "move" }); + + $(document).bind("mousemove", function (e) { + e.preventDefault(); + if (mouseDown) { + _dialog.css({ + "top": (e.pageY - offsetY), + "left": (e.pageX - offsetX) + }); + } + }).bind("mouseup", function (e) { + e.preventDefault(); + mouseDown = false; + $topbar.css({ "cursor": "auto" }); + $(document).unbind("mousemove").unbind("mouseup"); + }); + + }); + } + + that._$dialog.show(); + return that._$dialog; + + }; + + this.hide = function () { + that._$dialog.hide(); + return that._$dialog; + }; + + this.destroy = function() { + + // Modal feature: + if (this.options.modal) { + that._$dialog.unwrap(); + } + + // Draggable feature: + if (this.options.draggable) { + that._$dialog.find("div.wysiwyg-dialog-topbar").unbind("mousedown"); + } + + that._$dialog.remove(); + return that._$dialog; + }; + }); + }); + // end Dialog + + $.fn.wysiwyg = function (method) { + var args = arguments, plugin; + + if ("undefined" !== typeof $.wysiwyg[method]) { + // set argument object to undefined + args = Array.prototype.concat.call([args[0]], [this], Array.prototype.slice.call(args, 1)); + return $.wysiwyg[method].apply($.wysiwyg, Array.prototype.slice.call(args, 1)); + } else if ("object" === typeof method || !method) { + Array.prototype.unshift.call(args, this); + return $.wysiwyg.init.apply($.wysiwyg, args); + } else if ($.wysiwyg.plugin.exists(method)) { + plugin = $.wysiwyg.plugin.parseName(method); + args = Array.prototype.concat.call([args[0]], [this], Array.prototype.slice.call(args, 1)); + return $.wysiwyg[plugin.name][plugin.method].apply($.wysiwyg[plugin.name], Array.prototype.slice.call(args, 1)); + } else { + console.error("Method '" + method + "' does not exist on jQuery.wysiwyg.\nTry to include some extra controls or plugins"); + } + }; + + $.fn.getWysiwyg = function () { + return this.data("wysiwyg"); + }; + + function cleanHTML(html, striptags){ + if(striptags) html = html.replace(/(<([^>]+)>)/ig,""); + var pres = html.match(/]*>([\s\S]*?)<\/pre>/gi); + if(pres){ + for(i=0;i"']))+.)["']?/gi); + if(att){ + $.each(att, function(i,e){ +/* + if(!/(href|src|colspan|rowspan)/.test(e)){ + html = html.replace(e,''); + } +*/ + if(!/(href|src)/.test(e)){ + html = html.replace(e,''); + } + }); + } + //html = html.replace(/\n\n+/g,'

    '); + //html = html.replace(/\s+/g,' '); + html = html.replace(/

    <\/p>/g,' '); + if(pres){ + for(i=0;i']; + + colCount = parseInt(colCount, 10); + rowCount = parseInt(rowCount, 10); + + if (filler === null) { + filler = " "; + } + filler = "" + filler + ""; + + for (i = rowCount; i > 0; i -= 1) { + html.push(""); + for (j = colCount; j > 0; j -= 1) { + html.push(filler); + } + html.push(""); + } + html.push(""); + + return this.insertHtml(html.join("")); + }; + + /* + * Wysiwyg namespace: public properties and methods + */ + $.wysiwyg.controls.table = function (Wysiwyg) { + var adialog, dialog, colCount, rowCount, formTableHtml, dialogReplacements, key, translation, regexp; + + dialogReplacements = { + legend: "Insert table", + cols : "Count of columns", + rows : "Count of rows", + submit: "Insert table", + reset: "Cancel" + }; + + formTableHtml = '

    {legend}' + + '
    ' + + '
    ' + + ' ' + + '
    '; + + for (key in dialogReplacements) { + if ($.wysiwyg.i18n) { + translation = $.wysiwyg.i18n.t(dialogReplacements[key], "dialogs.table"); + + if (translation === dialogReplacements[key]) { // if not translated search in dialogs + translation = $.wysiwyg.i18n.t(dialogReplacements[key], "dialogs"); + } + + dialogReplacements[key] = translation; + } + + regexp = new RegExp("{" + key + "}", "g"); + formTableHtml = formTableHtml.replace(regexp, dialogReplacements[key]); + } + + if (!Wysiwyg.insertTable) { + Wysiwyg.insertTable = insertTable; + } + + adialog = new $.wysiwyg.dialog(Wysiwyg, { + "title" : dialogReplacements.legend, + "content" : formTableHtml, + "open" : function (e, dialog) { + dialog.find("form#wysiwyg-tableInsert").submit(function (e) { + e.preventDefault(); + rowCount = dialog.find("input[name=rowCount]").val(); + colCount = dialog.find("input[name=colCount]").val(); + + Wysiwyg.insertTable(colCount, rowCount, Wysiwyg.defaults.tableFiller); + + adialog.close(); + return false; + }); + + dialog.find("input:reset").click(function (e) { + e.preventDefault(); + adialog.close(); + return false; + }); + } + }); + + adialog.open(); + + $(Wysiwyg.editorDoc).trigger("editorRefresh.wysiwyg"); + }; + + $.wysiwyg.insertTable = function (object, colCount, rowCount, filler) { + return object.each(function () { + var Wysiwyg = $(this).data("wysiwyg"); + + if (!Wysiwyg.insertTable) { + Wysiwyg.insertTable = insertTable; + } + + if (!Wysiwyg) { + return this; + } + + Wysiwyg.insertTable(colCount, rowCount, filler); + $(Wysiwyg.editorDoc).trigger("editorRefresh.wysiwyg"); + + return this; + }); + }; +})(jQuery); + +/** + * Controls: Link plugin + * + * Depends on jWYSIWYG + * + * By: Esteban Beltran (academo) + */ +(function ($) { + "use strict"; + + if (undefined === $.wysiwyg) { + throw "wysiwyg.link.js depends on $.wysiwyg"; + } + + if (!$.wysiwyg.controls) { + $.wysiwyg.controls = {}; + } + + /* + * Wysiwyg namespace: public properties and methods + */ + $.wysiwyg.controls.link = { + init: function (Wysiwyg) { + var self = this, elements, dialog, url, a, selection, + formLinkHtml, dialogReplacements, key, translation, regexp, + baseUrl, img; + + dialogReplacements = { + legend: "Insert Link", + url : "Link URL", + title : "Link Title", + target: "Link Target", + submit: "Insert Link", + reset: "Cancel" + }; + + formLinkHtml = '
    {legend}' + + '' + + '' + + '' + + ' ' + + '
    '; + + for (key in dialogReplacements) { + if ($.wysiwyg.i18n) { + translation = $.wysiwyg.i18n.t(dialogReplacements[key], "dialogs.link"); + + if (translation === dialogReplacements[key]) { // if not translated search in dialogs + translation = $.wysiwyg.i18n.t(dialogReplacements[key], "dialogs"); + } + + dialogReplacements[key] = translation; + } + + regexp = new RegExp("{" + key + "}", "g"); + formLinkHtml = formLinkHtml.replace(regexp, dialogReplacements[key]); + } + + a = { + self: Wysiwyg.dom.getElement("a"), // link to element node + href: "http://", + title: "", + target: "" + }; + + if (a.self) { + a.href = a.self.href ? a.self.href : a.href; + a.title = a.self.title ? a.self.title : ""; + a.target = a.self.target ? a.self.target : ""; + } + + if ($.fn.dialog) { + elements = $(formLinkHtml); + elements.find("input[name=linkhref]").val(a.href); + elements.find("input[name=linktitle]").val(a.title); + elements.find("input[name=linktarget]").val(a.target); + + if (is_msie) { + try { + dialog = elements.appendTo(Wysiwyg.editorDoc.body); + } catch (err) { + dialog = elements.appendTo("body"); + } + } else { + dialog = elements.appendTo("body"); + } + + dialog.dialog({ + modal: true, + open: function (ev, ui) { + $("input:submit", dialog).click(function (e) { + e.preventDefault(); + + var url = $('input[name="linkhref"]', dialog).val(), + title = $('input[name="linktitle"]', dialog).val(), + target = $('input[name="linktarget"]', dialog).val(), + baseUrl, + img; + + if (Wysiwyg.options.controlLink.forceRelativeUrls) { + baseUrl = window.location.protocol + "//" + window.location.hostname; + if (0 === url.indexOf(baseUrl)) { + url = url.substr(baseUrl.length); + } + } + + if (a.self) { + if ("string" === typeof (url)) { + if (url.length > 0) { + // to preserve all link attributes + $(a.self).attr("href", url).attr("title", title).attr("target", target); + } else { + $(a.self).replaceWith(a.self.innerHTML); + } + } + } else { + if (is_msie) { + Wysiwyg.ui.returnRange(); + } + + //Do new link element + selection = Wysiwyg.getRangeText(); + img = Wysiwyg.dom.getElement("img"); + + if ((selection && selection.length > 0) || img) { + if (is_msie) { + Wysiwyg.ui.focus(); + } + + if ("string" === typeof (url)) { + if (url.length > 0) { + Wysiwyg.editorDoc.execCommand("createLink", false, url); + } else { + Wysiwyg.editorDoc.execCommand("unlink", false, null); + } + } + + a.self = Wysiwyg.dom.getElement("a"); + + $(a.self).attr("href", url).attr("title", title); + + /** + * @url https://github.com/akzhan/jwysiwyg/issues/16 + */ + $(a.self).attr("target", target); + } else if (Wysiwyg.options.messages.nonSelection) { + window.alert(Wysiwyg.options.messages.nonSelection); + } + } + + Wysiwyg.saveContent(); + + $(dialog).dialog("close"); + + Wysiwyg.ui.focus(); + return false; + }); + $("input:reset", dialog).click(function (e) { + e.preventDefault(); + $(dialog).dialog("close"); + Wysiwyg.ui.focus(); + }); + }, + close: function (ev, ui) { + dialog.dialog("destroy"); + dialog.remove(); + Wysiwyg.ui.focus(); + return false; + } + }); + } else { + if (a.self) { + url = window.prompt("URL", a.href); + + if (Wysiwyg.options.controlLink.forceRelativeUrls) { + baseUrl = window.location.protocol + "//" + window.location.hostname; + if (0 === url.indexOf(baseUrl)) { + url = url.substr(baseUrl.length); + } + } + + if ("string" === typeof (url)) { + if (url.length > 0) { + $(a.self).attr("href", url); + } else { + $(a.self).replaceWith(a.self.innerHTML); + } + } + } else { + //Do new link element + selection = Wysiwyg.getRangeText(); + img = Wysiwyg.dom.getElement("img"); + + if ((selection && selection.length > 0) || img) { + if (is_msie) { + Wysiwyg.ui.focus(); + Wysiwyg.editorDoc.execCommand("createLink", true, null); + } else { + url = window.prompt(dialogReplacements.url, a.href); + + if (Wysiwyg.options.controlLink.forceRelativeUrls) { + baseUrl = window.location.protocol + "//" + window.location.hostname; + if (0 === url.indexOf(baseUrl)) { + url = url.substr(baseUrl.length); + } + } + + if ("string" === typeof (url)) { + if (url.length > 0) { + Wysiwyg.editorDoc.execCommand("createLink", false, url); + } else { + Wysiwyg.editorDoc.execCommand("unlink", false, null); + } + } + } + } else if (Wysiwyg.options.messages.nonSelection) { + window.alert(Wysiwyg.options.messages.nonSelection); + } + } + + Wysiwyg.saveContent(); + } + + $(Wysiwyg.editorDoc).trigger("editorRefresh.wysiwyg"); + } + }; + + $.wysiwyg.createLink = function (object, url, title) { + return object.each(function () { + var oWysiwyg = $(this).data("wysiwyg"), + selection; + + if (!oWysiwyg) { + return this; + } + + if (!url || url.length === 0) { + return this; + } + + selection = oWysiwyg.getRangeText(); + // ability to link selected img - just hack + var internalRange = oWysiwyg.getInternalRange(); + var isNodeSelected = false; + if (internalRange && internalRange.extractContents) { + var rangeContents = internalRange.cloneContents(); + if (rangeContents!=null && rangeContents.childNodes && rangeContents.childNodes.length>0) + isNodeSelected = true; + } + + if ( (selection && selection.length > 0) || isNodeSelected ) { + if (is_msie) { + oWysiwyg.ui.focus(); + } + oWysiwyg.editorDoc.execCommand("unlink", false, null); + oWysiwyg.editorDoc.execCommand("createLink", false, url); + } else { + if (title) { + oWysiwyg.insertHtml(''+title+''); + } else { + if (oWysiwyg.options.messages.nonSelection) + window.alert(oWysiwyg.options.messages.nonSelection); + } + } + return this; + }); + }; +})(jQuery); \ No newline at end of file diff --git a/dashboard-plus-chrome-plugin/plugins/envatitor.js b/dashboard-plus-chrome-plugin/plugins/envatitor.js new file mode 100644 index 0000000..f0786fb --- /dev/null +++ b/dashboard-plus-chrome-plugin/plugins/envatitor.js @@ -0,0 +1,384 @@ +/* + * Copyright (c) 2014 + * ================================== + * powered by revaxarts.com (http://revaxarts.com) + * original filename: envatitor.js + * filesize: 14935 Bytes + * last modified: Mon, 17 Feb 2014 09:54:26 +0100 + * + */ +(function () { + + var textarea, + username = $('#user_username').text(), + $preview, interval, livepreview = (window.dashboardplus.getCookie('envatitor_livepreview') == 'false') ? false : true, + smileys = { + 'happy': ':)', + 'sad': ':(', + 'tongue': ':P', + 'wink': ';)', + 'angry': ':x', + 'expressionless': ':|', + 'laugh': ':D', + 'puzzled': ':S', + 'cool': '8-)', + 'surprised': ':O', + 'asleep': ':asleep:', + 'bashful': ':bashful:', + 'bashfulcute': ':bashfulcute:', + 'bigevilgrin': ':bigevilgrin:', + 'bigsmile': ':bigsmile:', + 'bigwink': ':bigwink:', + 'chuckle': ':chuckle:', + 'crying': ':crying:', + 'confused': ':confused:', + 'confusedsad': ':confusedsad:', + 'dead': ':dead:', + 'delicious': ':delicious:', + 'depressed': ':depressed:', + 'evil': ':evil:', + 'evilgrin': ':evilgrin:', + 'grin': ':grin:', + 'impatient': ':impatient:', + 'inlove': ':inlove:', + 'kiss': ':kiss:', + 'mad': ':mad:', + 'nerdy': ':nerdy:', + 'notfunny': ':notfunny:', + 'ohrly': ':ohrly:', + 'reallyevil': ':reallyevil:', + 'sarcasm': ':sarcasm:', + 'shocked': ':shocked:', + 'sick': ':sick:', + 'silly': ':silly:', + 'sing': ':sing:', + 'smitten': ':smitten:', + 'smug': ':smug:', + 'stress': ':stress:', + 'sunglasses': ':sunglasses:', + 'sunglasses2': ':sunglasses2:', + 'superbashfulcute': ':superbashfulcute:', + 'tired': ':tired:', + 'whistle': ':whistle:', + 'winktongue': ':winktongue:', + 'yawn': ':yawn:', + 'zipped': ':zipped:' + }, + type; + + init(); + + + function init() { + type = getType(); + + var dofocus = false; + + var style = $(''); + style.appendTo('head'); + + if (type) { + switch (type) { + case 'newThread': + textarea = $('#thread_message_content'); + break; + case 'postReply': + textarea = $('textarea[name=content]'); + break; + case 'comment': + textarea = $('textarea#reply_text'); + dofocus = true; + break; + case 'item': + textarea = $('textarea#description'); + break; + case 'itemcomment': + textarea = $('textarea#item_comment_content'); + break; + case 'faq': + textarea = $('textarea#item_faq_answer'); + break; + default: + return false; + } + + //$(window).on('load', function(){ + UI(); + preview(); + //}); + + $('body') + .on('click', '.js-comment-new-reply-field', function(){ + textarea = $(this); + UI(); + textarea.focus(); + + }) + .on('focus', 'textarea.has-envatitor', function(){ + $('.envatitor_embeded_dropdown').slideUp(200); + $(document).bind('keyup', updatePreview); + }) + .on('blur', 'textarea.has-envatitor', function(){ + $(document).unbind('keyup', updatePreview); + }) + .on('keydown', 'textarea.has-envatitor', function(e){ + if (e.which == 13 && e.shiftKey) { + insert('', '
    \n', []); + return false; + } + }) + .on('click', '.envatitor_embeded_bar > a', function () { + var button_id = $(this).data("id"); + var start = '<' + button_id + '>'; + var end = ''; + var replaceArray = []; + + var param = ""; + if (button_id == 'a') { + param = prompt("Enter URL", "http://"); + if (param) { + start = ''; + } else { + return false; + } + } else if (button_id == 'smiley') { + $('.envatitor_embeded_smileys').show(); + $('.envatitor_embeded_uploadform').hide(); + return false; + } else if (button_id == 'img') { + $('.envatitor_embeded_uploadform').show(); + $('.envatitor_embeded_smileys').hide(); + $('#envatitor_image_url').focus(); + return false; + } + insert(start, end, replaceArray); + return false; + }) + .on('click', '.envatitor_embeded_smileys img', function () { + var code = $(this).attr('alt'); + insert(code, '', []); + $('.envatitor_embeded_dropdown').hide(); + updatePreview(); + }) + .on('click', '#envatitor_embeded_livepreview', function () { + livepreview = !livepreview; + $(this).html('livepreview is ' + (livepreview ? 'ON' : 'OFF')); + window.dashboardplus.setCookie('envatitor_livepreview', livepreview); + updatePreview(); + return false; + }); + + + if(textarea){ + if(dofocus) textarea.focus(); + } + + if (type == 'newThread') { + $('#thread_subject').on('keyup', function () { + var val = $(this).val(); + if (val != '') { + $('h1').first().text($(this).val()); + } else { + $('h1').first().text('Start new thread'); + } + }).trigger('keyup'); + } + + updatePreview(); + + } + + } + + function insert(start, end, replaceArray) { + element = textarea[0]; + if (document.selection) { + element.focus(); + sel = document.selection.createRange(); + newT = sel.text; + if (start == '
    '); + output = output.replace(/⦿/g, '\n'); + $preview.html(output); + }, 200); + } + + function getType() { + if ($('#thread_message_content').length) { + return 'newThread'; + } else if ($('#thread_reply_content').length) { + return 'postReply'; + } else if ($('textarea#reply_text').length) { + return 'comment'; + } else if ($('textarea#item_comment_content').length) { + return 'itemcomment'; + } else if ($('.js-comment-new-reply-field').length) { + return 'itemcomment'; + } else if ($('textarea#item_faq_answer').length) { + return 'faq'; + } else if ($('textarea#description').length) { + return 'item'; + } + return false; + } + + + +})(); diff --git a/dashboard-plus-chrome-plugin/plugins/gotolivepreview.js b/dashboard-plus-chrome-plugin/plugins/gotolivepreview.js new file mode 100644 index 0000000..9e52970 --- /dev/null +++ b/dashboard-plus-chrome-plugin/plugins/gotolivepreview.js @@ -0,0 +1,74 @@ +/* + * Copyright (c) 2014 + * ================================== + * powered by revaxarts.com (http://revaxarts.com) + * original filename: gotolivepreview.js + * filesize: 1710 Bytes + * last modified: Thu, 16 May 2013 09:20:29 +0200 + * + */ +// ==UserScript== +// @name GoToLivepreview for Envato's marketplaces +// @creator userscripts@revaxarts.com +// @namespace revaxarts.com +// @description Envato Livepreviews for Thumbs +// @date 2011-11-10 +// @version 0.5 +// @include http://activeden.net/* +// @include http://themeforest.net/* +// @include http://codecanyon.net/* +// ==/UserScript== +(function () { + + + + var marketplace = location.hostname.split('.').shift(); + + $('img[data-preview-url]').each(function () { + var _this = $(this), + itemname = _this.data('itemName'); + wrapper = _this.parent().parent(); + if (!wrapper.is('.thumbnail')) return false; + + var href = wrapper.find('a').attr('href').split('?')[0], + id = href.split('/').pop(), + livepreview = href.replace(id, 'full_screen_preview/' + id); + wrapper.hover(function () { + $(this).find('a.gotolivepreview').fadeIn(100); + }, function () { + $(this).find('a.gotolivepreview').fadeOut(100); + }); + + $('', { + "class": "gotolivepreview", + title: 'Livepreview of ' + itemname, + href: livepreview + }).css({ + "position": "absolute", + "display": "block", + "border": "0 !important", + "padding": "2px 4px" + }).html('').hide().prependTo(wrapper); + + }); + + $('body').delegate('a.gotolivepreview', 'click', function (event) { + event.stopPropagation(); + event.preventDefault(); + window.open(this.href); + }); + + + + if (location.href.match(/full_screen_preview/)) { + if($.trim($('h1').html()) == 'Page Not Found'){ + location.href = location.href.replace('full_screen_preview/',''); + } + } + + + + + + +})(); \ No newline at end of file diff --git a/dashboard-plus-chrome-plugin/plugins/notification.js b/dashboard-plus-chrome-plugin/plugins/notification.js new file mode 100644 index 0000000..47869e0 --- /dev/null +++ b/dashboard-plus-chrome-plugin/plugins/notification.js @@ -0,0 +1,224 @@ +(function () { + + //"use strict" + + var notifications, + interval = 5, //check interval in minutes + $badge; + +/* + var color = {}; + var marketplace = location.hostname.split('.').shift(); + color['activeden'] = 'e86223'; + color['audiojungle'] = '65992e'; + color['themeforest'] = '69472a'; + color['videohive'] = 'f4950c'; + color['graphicriver'] = '0568b3'; + color['3docean'] = '802836'; + color['codecanyon'] = 'db592b'; + color['photodune'] = '499ba1'; + + color = color[marketplace] || '333333'; +*/ + + var color = '0084B4'; + + var init = function(){ + + var now = new Date().getTime(), + lastcheck = window.dashboardplus.getCookie('notification_lastcheck'); + + + //get saved notifications + notifications = window.dashboardplus.getCookie('notification_count'); + + //print them if some exists + if(notifications) printNotifications(); + + //clear notifications if the mark all as unread button is pressed + if(/author_dashboard/.test(location.pathname)){ + + lastcheck = 0; + + var button = $('.content-s').find('.comments-search-controls__mark-all-read').find('button'); + + if(button.length) { + + button.bind('click',function(){ + window.dashboardplus.setCookie('notification_count',0); + window.dashboardplus.setCookie('notification_lastcheck',0); + printNotifications(); + }); + +/* + $.ajax({ + url: 'https://ajax.googleapis.com/ajax/libs/jqueryui/1.9.2/jquery-ui.min.js', + dataType: "script", + cache: true, + success: function () { + var plt = $('#page_load_time'), + slider = $('
    ').appendTo($('.comments-controls').eq(0)), + value = $('
    use the slider to define the time you would like to mark comments as read
    ').appendTo($('.comments-controls').eq(0)), + d = new Date(), + time = parseInt(plt.val(), 10)*1000, + mintime = time-(3.156e+10), + output = time; + + d.setTime(time); + + slider.css({ + 'border': '1px solid #ccc', + 'height': 5, + 'margin-top': 20, + 'margin-left': 8, + 'margin-right': 8 + }).slider({ + min: mintime, + max: time, + step: 3156, + value: time, + slide: function (event, ui) { + var x = (time-ui.value)/(time-mintime); + x = (Math.exp(2.77258872 * x) - 1) / 15; + + output = time-(time-mintime)*x; + + button.html((time != ui.value) ? 'Mark older than '+human_time_diff(time, output)+' as read' : 'Mark all as read'); + d.setTime(Math.round(output)); + value.html(d+''); + }, + change: function (event, ui) { + d.setTime(Math.round(output)); + plt.val(Math.round(output/1000)); + + } + }).find('a').css({ + 'border': '1px solid black', + 'height': 12, + 'width': 12, + 'top': -5, + 'margin-left': -5, + 'background-color': '#'+color, + 'display': 'block', + 'position': 'relative' + }); + value.css({ + 'font-size': 12, + 'margin-top': 10, + 'color': '#aaa', + 'text-align': 'right' + }); + + + function human_time_diff(from, to){ + var diff = ((from - to)/1000); + var str = ''; + if(diff < 60){ + return (diff)+' sec.'; + }else if(diff < 3600){ + return (diff/60).toFixed(2)+' min.'; + }else if(diff < 86400){ + return (diff/3600).toFixed(2)+' hours'; + }else if(diff < 2.63e+6){ + return (diff/86400).toFixed(2)+' days'; + } + return (diff/2.63e+6).toFixed(2)+' month'; + } + } + }); +*/ + + } //end if + + + } + + setTimeout(start,Math.max(0,interval*60000-(now-lastcheck))); + + }; + + var start = function() { + checkForNotifications(1); + setInterval(function(){ + checkForNotifications(1); + }, interval*60000); + }; + + var checkForNotifications = function(page) { + + //get the Url + $.get(getURL(page), function(response){ + + //count unread posts on the dashboard + var comment = response.match(/

    (\d+) comments? found/); + notifications = comment ? parseInt(comment[1], 10) : 0; + + //we made a check, lets save it + window.dashboardplus.setCookie('notification_lastcheck',new Date().getTime()); + + //save notifications for later + window.dashboardplus.setCookie('notification_count',notifications,365); + + //print + printNotifications(); + + }); + }; + + var printNotifications = function() { + + //badge element must be made + if(!$badge){ + $badge = $('',{ + id: 'notification_badge' + }).css({ + 'display': 'block', + 'position': 'absolute', + 'left': '8px', + 'top': '9px', + 'font-size': '10px', + 'line-height': '10px', + 'font-weight': '700', + 'padding': '4px 4px 5px', + 'text-align': 'center', + 'min-width': '10px', + 'border': '0', + 'cursor': 'pointer', + 'border-radius': '4px', + 'background-color': ' #'+color, + 'color': '#fff', + 'z-index': '5000', + 'text-decoration': 'none' + }) + .hide() + .bind('click', function(){ + location.href="/author_dashboard"; + return false; + }) + .prependTo('span.global-header-menu__link-text:last'); + + } + + //remove any (XX) from the title + document.title = document.title.replace(/^\(\d+\+?\)/,''); + + //we have notifications + if(parseInt(notifications, 10)){ + $badge.html(notifications).show(); + //prepend it to the titel + document.title = '('+notifications+') '+document.title; + }else{ + //hide badge + $badge.html(notifications).hide(); + } + + }; + + var getURL = function(page) { + return 'https://'+location.hostname+'/author_dashboard?page='+page; + }; + + init(); + + +})(); diff --git a/dashboard-plus-chrome-plugin/plugins/progressbar.js b/dashboard-plus-chrome-plugin/plugins/progressbar.js new file mode 100644 index 0000000..5cfb9fd --- /dev/null +++ b/dashboard-plus-chrome-plugin/plugins/progressbar.js @@ -0,0 +1,22 @@ +// old progres bar css incase they remove it from envato stylesheet: +// [role=progressbar]{background:#1a1a1a;border-radius:5px;display:block;height:10px;margin:5px 0;padding:3px} +// .progressbar-value{background:green;background-image:-webkit-gradient(linear, 0% 50%, 290 50%, color-stop(0%, #ff9f16), color-stop(68.96552%, #ffec16), color-stop(100%, #00af15));background-image:-webkit-linear-gradient(left, #ff9f16,#ffec16 200px,#00af15 290px);background-image:-webkit-gradient(linear, left top, right top, from(#ff9f16), color-stop(200px, #ffec16), color-stop(290px, #00af15));background-image:-webkit-linear-gradient(left, #ff9f16, #ffec16 200px, #00af15 290px);background-image:linear-gradient(left, #ff9f16,#ffec16 200px,#00af15 290px);border-radius:2px;-webkit-box-shadow:0 0 5px #fff inset;box-shadow:0 0 5px #fff inset;display:block;height:10px;text-indent:-9999px;-webkit-transition:"width",0.5s;transition:"width",0.5s}.progressbar-value.loadup{-ms-animation:loadUp 1s ease-in-out;-webkit-animation:loadUp 1s ease-in-out;animation:loadUp 1s ease-in-out;-webkit-transition:"width",0s;transition:"width",0s} + + +(function () { + + init(); + + function init(){ + + // start super secret ninja progress bar code!!! + // shhhh!!! - don't tell anyone how I figured it out. + // I think this is more accurate than the old progress bar :) + eval(function(p,a,c,k,e,d){e=function(c){return(c35?String.fromCharCode(c+29):c.toString(36))};if(!''.replace(/^/,String)){while(c--){d[e(c)]=k[c]||e(c)}k=[function(e){return d[e]}];e=function(){return'\\w+'};c=1};while(c--){if(k[c]){p=p.replace(new RegExp('\\b'+e(c)+'\\b','g'),k[c])}}return p}('c 4=$(\'.n-q\').m(\'.k-l-z-x\').h();e(!4||!4.f){4=$("a[v^=\'/t/u\']").h()}e(4.f>0){c 6=4.r().A(/(\\d+)\\s(\\w+)\\p/);c 3=o;y(6[2]){7"P":7"O":8;7"N":3+=g(6[1]);8;7"B":3+=g(6[1]*R);8;Q:3=b;8}e(3>b)3=b;$(\'<5 i="L-M" F="j"> <5 i="j-E" 9-D="\'+3+\'" 9-C="0" 9-G="H" K="J: \'+3+\'%;"> \'+3+\'% \').I(4)}',54,54,'|||percentage|progresstarget|div|history|case|break|aria||90|var||if|length|parseInt|parent|class|progressbar|item|update|find|sidebar|10|sago|right|text||upload|delete_from_|href||link|switch|deletion|match|days|valuemin|valuenow|value|role|valuemax|100|insertBefore|width|style|progress|bar|hours|minutes|minute|default|12'.split('|'),0,{})); + + + } + + + +})(); \ No newline at end of file diff --git a/dashboard-plus-chrome-plugin/plugins/quickcollection.js b/dashboard-plus-chrome-plugin/plugins/quickcollection.js new file mode 100644 index 0000000..c6a6a2d --- /dev/null +++ b/dashboard-plus-chrome-plugin/plugins/quickcollection.js @@ -0,0 +1,216 @@ +/* + * Copyright (c) 2014 + * ================================== + * powered by revaxarts.com (http://revaxarts.com) + * original filename: quickcollection.js + * filesize: 5608 Bytes + * last modified: Tue, 28 Jan 2014 11:15:03 +0100 + * + */ +(function () { + + //"use strict" + + var username = $('#user_username').text(); + + if (!username || !JSON) return false; + + var refreshindays = 1, + cont, now = new Date().getTime(), + lastcheck = window.dashboardplus.getCookie('quickcollection_lastcheck'); + + var currentid = 0; + $('#new_collection, #bookmark_form').submit(function () { + localStorage.removeItem('quickcollection'); + }); + + if (!lastcheck) { + localStorage.removeItem('quickcollection'); + window.dashboardplus.setCookie('quickcollection_lastcheck', now, refreshindays); + } + if (location.hash == '#bookmark_form') { + $('#collection_create_link').find('a').trigger('click'); + $('#name').focus(); + } + + getCollections(function (collections) { + + + var html = getHTML(collections); + + cont = $('

    ', { + 'id': 'quickcollection' + }).css({ + "position": "absolute", + "zIndex": "2000", + "background-color": '#F4F4F4', + "border": "1px solid #BBBBBB", + "text-align": "left", + "-webkit-box-shadow": "4px 4px 0 0 rgba(35, 35, 35, 0.1)", + "-moz-box-shadow": "4px 4px 0 0 rgba(35, 35, 35, 0.1)", + "box-shadow": "4px 4px 0 0 rgba(35, 35, 35, 0.1)", + "font-size": "10px", + "display": "block", + "padding": "10px", + "background": "#F4F4F4 no-repeat 95% 98%" + }).html('' + html + '').hide().appendTo('body').bind('mouseleave', function () { + $(this).stop().fadeTo(50, 0, function () { + cont.css({ + 'left': -300 + }); + }); + }).delegate('a', 'click', function () { + var _this = $(this), + collectionid = _this.data('id'); + if (collectionid) { + add(currentid, collectionid, '', function () { + //alert('Item successfully added to "'+_this.text()+'"'); + }, function () { + alert('Couldn\'t save item to "' + _this.text() + '"'); + localStorage.removeItem('quickcollection'); + _this.remove(); + }); + + } else if (_this.is('.quickcollection_new')) { + + if (name = prompt('New Collection', 'Enter Collection Name')) { + add(currentid, collectionid, name, function () { + alert('Item successfully added to new collection "' + name + '"'); + refreshcollection(); + }, function () { + alert('Couldn\'t save item to "' + name + '"'); + localStorage.removeItem('quickcollection'); + }); + } + return false + + } else if (_this.is('.quickcollection_refresh')) { + + refreshcollection(); + + } + return false; + }); + + var h = cont.height(); + + $('img[data-preview-url], .audio-container').each(function () { + var _this = $(this), + itemname = _this.data('itemName'); + wrapper = _this.parent().parent().css('position', 'relative'); + if (!wrapper.is('.thumbnail')) { + wrapper = _this.parent(); + if (!wrapper.is('.thumbnail')) { + return false; + } + } + if (wrapper.find('a').eq(0).is('.quickcollection')) return false; + var href = wrapper.find('a').attr('href').split('?')[0], + id = href.split('/').pop(); + + wrapper.hover(function () { + $(this).find('a.quickcollection').fadeIn(100); + }, function () { + $(this).find('a.quickcollection').fadeOut(100); + }); + + $('', { + "class": "quickcollection", + title: 'Bookmark "' + itemname + '"', + href: '#' + }).data('id', id).css({ + "position": "absolute", + "display": "block", + "border": "0 !important", + "background": "url(http://1.envato-static.com/assets/sprites/common-sb6532a3078-a35a2455e60b2c49e07795c07a741576.png) no-repeat -6px -2632px", + "width": 10, + "height": 16, + "zIndex": 1, + "margin-left": "16px", + "padding": "0" + }).html('').hide().prependTo(wrapper).click(function () { + var _this = $(this), + _o = _this.offset(); + currentid = _this.data('id'); + cont.css({ + 'top': _o.top - (h / 4) + 'px', + 'left': (_o.left) + 'px' + }).stop().fadeTo(200, 1); + return false; + }); + + }); + + }); + + function getHTML(collections) { + var html = 'Quickcollection | new Collection | '; + + for (name in collections) { + html += '
    ' + name + ''; + } + + return html; + + } + + + function refreshcollection() { + localStorage.removeItem('quickcollection'); + getCollections(function (collections) { + html = getHTML(collections); + cont.html(html); + }) + } + + + function getCollections(callback) { + var collections = $.parseJSON(localStorage.getItem('quickcollection')); + if (!collections) { + $.get(getURL(), function (data) { + + collections = {}; + + data = data.match(/([^<]+)/g) || []; + var count = data.length; + for (var i = 0; i < count; i++) { + collections[data[i].substr(data[i].lastIndexOf('>') + 1)] = data[i].match(/\d+/)[0]; + } + localStorage.setItem('quickcollection', JSON.stringify(collections)); + callback(collections); + + }); + } + callback(collections); + } + + function add(itemid, collectionid, collectionname, success, error) { + cont.css('background-image','url(http://2.envato-static.com/assets/common/pagination_loader-a367a90aff9ad10425e524a1867d0709.gif)'); + $.ajax('/bookmarks', { + data: { + name: collectionname, + item_id:itemid, + collection_id: collectionid + }, + type: 'POST', + cache: false, + success: function (d) { + success(d); + }, + complete: function () { + cont.css('background-image','none'); + }, + error: function (d) { + error(d); + } + + }); + }; + + function getURL() { + return '/user/' + username + '/bookmarks'; + }; + + + +})(); \ No newline at end of file diff --git a/dashboard-plus-chrome-plugin/plugins/reminder.js b/dashboard-plus-chrome-plugin/plugins/reminder.js new file mode 100644 index 0000000..617eb1b --- /dev/null +++ b/dashboard-plus-chrome-plugin/plugins/reminder.js @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2014 + * ================================== + * powered by revaxarts.com (http://revaxarts.com) + * original filename: reminder.js + * filesize: 3052 Bytes + * last modified: Thu, 12 Jun 2014 07:45:22 +0200 + * + */ +(function () { + + //"use strict" + + var d = new Date(), + currentYear = d.getFullYear(), + currentMonth = d.getMonth(), + melborntimeoffset = d.getTimezoneOffset()/60+11, + lastday = new Date(currentYear, currentMonth + 1, 0, 24-melborntimeoffset), + banner = false, + remindersat = window.dashboardplus.get('reminder','hours'), + past = window.dashboardplus.getCookie('reminder'), + timeleft = null; + + + remindersat = remindersat ? remindersat.split(',') : []; + past = past ? past.split('|') : []; + + if(!remindersat.length){ + alert('Please define at least one hour for the reminder!'); + return; + } + + remindersat.sort(function(a,b){return a-b}); + past.sort(function(a,b){return b-a}); + + var highest = past[0] ? parseInt(past[0], 10) : 0; + + check(); + + function check(){ + timeleft = (lastday.getTime()-new Date().getTime())/3600000; + + if(highest && timeleft > highest){ + window.dashboardplus.setCookie('reminder', 1, -1); + } + + var val; + + for(var i in remindersat){ + val = parseFloat(remindersat[i]); + if(timeleft < val){ + addbanner(val); + } + } + } + + function addbanner(id){ + if(banner || $.inArray(''+id, past) != -1){ + if($.inArray(''+id, past) == -1){ + past.push(id); + window.dashboardplus.setCookie('reminder', past.join('|'), Math.ceil(timeleft/24)); + } + return; + } + + banner = $('').hide().prependTo('body').slideDown(); + $('body').animate({'padding-top':40}); + + banner.delegate('a.dbp-closebanner' ,'click', function(){ + past.push($(this).data('id')); + window.dashboardplus.setCookie('reminder', past.join('|'), Math.ceil(timeleft/24)); + banner.slideUp(); + $('body').animate({'padding-top':0}); + if(!$(this).attr('href')) return false; + }); + var timeelement = banner.find('strong'); + setInterval(function(){ + timeleft = (lastday.getTime()-new Date().getTime())/3600000; + timeelement.html(totime(timeleft)); + }, 1000); + } + + function totime(timeleft){ + sec_numb = Math.max(0, parseInt(timeleft * 3600, 10)); + var days = Math.floor(sec_numb / 86400); + var hours = Math.floor(sec_numb / 3600 - days * 24); + var minutes = Math.floor((sec_numb - (Math.floor(sec_numb / 3600) * 3600)) / 60); + var seconds = sec_numb - (Math.floor(sec_numb / 3600) * 3600) - (minutes * 60); + + if (hours < 10) {hours = "0"+hours;} + if (minutes < 10) {minutes = "0"+minutes;} + if (seconds < 10) {seconds = "0"+seconds;} + var time = (days ? days+(days == 1 ? ' day ' : ' days ') : '')+hours+':'+minutes+':'+seconds; + return time; + } + +})(); \ No newline at end of file diff --git a/dashboard-plus-chrome-plugin/plugins/replypantry.js b/dashboard-plus-chrome-plugin/plugins/replypantry.js new file mode 100644 index 0000000..13ca0d9 --- /dev/null +++ b/dashboard-plus-chrome-plugin/plugins/replypantry.js @@ -0,0 +1,381 @@ + +/*********************************************************************** + + ReplyPantry - Text in a Can + Canned reply text for Envato comments and forums + + By Chris Mavricos - SevenSpark + chris@sevenspark.com + http://sevenspark.com + + 2011-12-20 + v1.0 + +*************************************************************************/ + + +(function () { + + // Store item in local storage: + function setItem(key, value) { + try { + log("Storing [" + key + ":" + value + "]"); + window.localStorage.removeItem(key); // <-- Local storage! + window.localStorage.setItem(key, value); // <-- Local storage! + } catch(e) { + log("Error inside setItem"); + log(e); + } + log("Return from setItem" + key + ":" + value); + } + + // Gets item from local storage with specified key. + function getItem(key) { + var value; + log('Retrieving key [' + key + ']'); + try { + value = window.localStorage.getItem(key); // <-- Local storage! + }catch(e) { + log("Error inside getItem() for key:" + key); + log(e); + value = "null"; + } + log("Returning value: " + value); + return value; + } + + // Clears all key/value pairs in local storage. + function clearStrg() { + log('about to clear local storage'); + window.localStorage.clear(); // <-- Local storage! + log('cleared'); + } + + function log(txt) { + if(logging) { + console.log(txt); + } + } + + + function canEntry(key, val, cat){ + return $('
  • '+ + ''+key+' '+ + ''+val+' '+ + '× '+ + 'edit '+ + '
  • '); + } + + function saveCans(){ + localStorage.setItem('cans', JSON.stringify(cans)); + } + + + // Load up saved Cans - Retrieve the object from storage + var canObject = localStorage.getItem('cans'); + + var cans; + + var canKey = ''; + + var typeCat = ''; + + //Load default cans if none exist + if(canObject === null || canObject === '{}' || canObject == '' ){ + cans = { + 'Missing Stylesheet / Broken Theme' : { + 'text' : 'Hi! You need to unzip the file you downloaded and upload the theme inside it. Please see Solving broken theme issues', + 'cat' : 'forum' + }, + 'Contact the Author' : { + 'text' : 'Hi! This is a general ThemeForest forum. For product-specific support, please contact the author of that theme through their profile page. You can find the profile page by clicking the author avatar '+ + 'on the product page.', + 'cat' : 'forum' + }, + 'Support Forums' : { + 'text' : 'Hi, thanks for purchasing my product! All support is given through my Support Forum. Please create a support request there, and I\'ll get back to you as soon as possible. Thanks!', + 'cat' : 'comments' + } + }; + } + //Parse the cans into a JSON object + else cans = JSON.parse(canObject); + + //Grab the existing reply box + + //Forums + //var $replyBox = $('#items textarea[name="content"]'); //old + var $replyBox = $('#post_reply textarea[name="content"]'); + + //In the comments + if($replyBox.size() == 0){ + + var $commentReply = $('a.fancy-comment'); + if($commentReply.size() > 0){ + + $commentReply.click(function(){ + + setTimeout( function(){ + findReplyText(); + },500); + + }); + } + } + //In the forums + else{ + typeCat = 'forum'; + construct(); + } + //console.log('replyBoxCount: ' + $replyBox.size() ); + + function findReplyText(){ + + $replyBox = $('#reply_text'); + + //Box has loaded + if($replyBox.size() > 0){ + typeCat = 'comments'; + construct(); + } + else{ + setTimeout( function(){ + findReplyText(); + },500); + } + } + + function construct(){ + + //Setup Main Can Button + var $canbutton = $(''); + + /*$canbutton.click(function(e){ + e.preventDefault(); + $('#canpanel').fadeToggle('normal', function(){ + $('html').click(function(){ + $('#canpanel').fadeOut(); + }); + }); + });*/ + + $canbutton.on('click', function(e){ + + e.preventDefault(); + + //Close it + if( $canbutton.hasClass('can-lid-open') ){ + $canbutton.removeClass('can-lid-open'); + $('#canpanel').fadeOut(); + $('html').off('click.canclose'); + } + //Open it + else{ + $canbutton.addClass('can-lid-open'); + $('#canpanel').fadeIn(); + + $('html').on('click.canclose', function(e){ + + //Don't close if the can container was clicked. + if( $(e.target).parents('#cancontainer').size() > 0 ){ + return; + } + + $canbutton.removeClass('can-lid-open'); + $('#canpanel').fadeOut(); + $('html').off('click.canclose'); + }); + } + + return false; + }); + + //Build the can dialog + var $cancontainer = $('
    '); + var $canpanel = $('
    '); + var $cancontents = $('
    '); + $cancontents.append($('
    ')); + + //Build the list of cans + var $canlist = $('
      '); + + $.each(cans, function(key, data){ + $canlist.append(canEntry(key, data.text, data.cat)); + }); + + $cancontents.append($canlist); + $cancontainer.append($canpanel); + $cancontainer.append($canbutton); + + if(typeCat == 'comments'){ + $cancontainer.addClass('item-comments').insertBefore($replyBox); + } + else $cancontainer.insertAfter($replyBox); + + //Build the Editor + var $canEditor = $('
      '+ + '
      '+ + '× '+ + ' '+ + ''+ + ' '+ + '
      '+ + '
      '); + + //Build the Preview Box + //var $previewBox = $('
      '); + + + //Build List Buttons + var $canbuttons = $('
      '); + + //New Can Button + var $canNewButton = $('New Can'); + $canNewButton.click(function(e){ + e.preventDefault(); + + $canEditor.find('#cankey-editor-key').val(''); + $canEditor.find('#cankey-editor-val').val('New can text.'); + $canEditor.find('#cankey-editor-cat').val(''); + $canEditor.show('normal'); + + return false; + }); + $canbuttons.append($canNewButton); + + //Show All Button + var $canAllButton = $('All'); + $canAllButton.click(function(e){ + e.preventDefault(); + $cancontents.find('li').slideDown(); + }); + $canbuttons.append($canAllButton); + + //Forum Only Buttons + var $canForumButton = $('Forum'); + $canForumButton.click(function(e){ + e.preventDefault(); + $cancontents.find('li').slideUp(); + $cancontents.find('li[data-cat="forum"]').stop().slideDown(); + }); + $canbuttons.append($canForumButton); + + //Comment Only Button + var $canCommentButton = $('Comments'); + $canCommentButton.click(function(e){ + e.preventDefault(); + $cancontents.find('li').slideUp(); + $cancontents.find('li[data-cat="comments"]').stop().slideDown(); + }); + $canbuttons.append($canCommentButton); + + //Add Buttons + $canpanel.append($canbuttons); + $canpanel.append($cancontents); + $canpanel.append($canEditor); + //$canpanel.append($previewBox); + + //Insert Text Function + /*$('.cankey-op').live( 'click', function(e){ + console.log('click cankey op'); + e.preventDefault(); + var key = $(this).attr('data-key'); + $replyBox.val( $replyBox.val() + cans[key]['text'] ); + return false; + + });*/ + $(document).delegate('.cankey-op', 'click', function(e){ + e.preventDefault(); + var key = $(this).attr('data-key'); + $replyBox.val( $replyBox.val() + cans[key]['text'] ); + return false; + }); + + /*$(document).delegate('.cankey-op', 'hover', function(e){ + if( e.type === 'mouseenter' ) { + var content = $(this).find('span.cantext').html(); + $previewBox.stop().fadeIn().find('textarea').val(content); + } + else{ + $previewBox.fadeOut(); + } + });*/ + + + //Close Editor Function + $('#can-close-editor').click(function(e){ + + e.preventDefault(); + $canEditor.hide('normal'); + + return false; + }); + + //Edit Can Function + $('body').delegate('.cankey-edit','click', function(e){ + + e.preventDefault(); + canKey = $(this).attr('data-key'); + $canEditor.find('#cankey-editor-key').val(canKey); + $canEditor.find('#cankey-editor-val').val(cans[canKey]['text']); + $canEditor.find('#cankey-editor-cat').val(cans[canKey]['cat']); + $canEditor.show('normal'); + + return false; + + }).delegate('.cankey-remove', 'click', function(e){ + e.preventDefault(); + var key = $(this).parent().attr('data-key'); + + var answer = confirm("Really delete can '"+key+"'?") + if (answer){ + delete cans[key]; + $(this).parent().remove(); + saveCans(); + } + + return false; + + }); + + //Save Can Function + $('#cankey-editor-save').click(function(e){ + e.preventDefault(); + var key = $('#cankey-editor-key').val(); + var val = $('#cankey-editor-val').val(); + var cat = $('#cankey-editor-cat').val(); + + if(!key || key == ''){ + alert('You must enter a name for your can'); + return false; + } + + if(!val || val == ''){ + alert('Please enter some text to save'); + return false; + } + + //If new, add it + if( !(key in cans) ){ + $canlist.append( canEntry(key, val, cat ) ); + } + + cans[key] = { + 'text' : val, + 'cat' : cat + }; + saveCans(); + $canEditor.toggle('normal'); + + return false; + }); + } + + //Load styles + $('head').append(''); + +})(); diff --git a/dashboard-plus-chrome-plugin/plugins/salesrefresher.js b/dashboard-plus-chrome-plugin/plugins/salesrefresher.js new file mode 100644 index 0000000..67c7a6e --- /dev/null +++ b/dashboard-plus-chrome-plugin/plugins/salesrefresher.js @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2014 + * ================================== + * powered by revaxarts.com (http://revaxarts.com) + * original filename: salesrefresher.js + * filesize: 905 Bytes + * last modified: Sun, 26 Jan 2014 02:00:17 +0100 + * + */ +(function () { + + var useraccountnav = $('.header-logo-account__user-nav-item'); + // var user_balance = $('.header-logo-account__balance').attr('title', 'Click to reload'); + var user_balance = $('.global-header-menu__link-text').attr('title', 'Click to reload'); + + user_balance.on('click', function(){ + update(); + event.preventDefault(); + return false; + }); + + if(window.dashboardplus.get('salesrefresher', 'autoreload')){ + setInterval(function(){ + update(); + }, 300000); + } + + function update(){ + var old = user_balance.html(); + var count = old.length; + var temp = '$'; + var li = useraccountnav.find('li').eq(0); + + for(count; count > 4; count--){ + temp += '–'; + } + temp += '.––'; + li.css({width:li.width()}); + user_balance.html(temp); + + $.get(location.href, function(data){ + li.css({width:'auto'}); + var balance = data.match(/
      '); + return false; + } + + var url = 'https://marketplace.envato.com/api/edge/'+username+'/'+apikey+'/verify-purchase:'+code+'.json'; + + $.get(url, function(response){ + + var html = ''; + + if(response['verify-purchase'].created_at){ + var p = response['verify-purchase']; + var d = new Date(p.created_at); + html += ''+p.buyer+' purchased a '+p.licence+' of '+p.item_name+'on '+d.toLocaleString()+''; + $('#dpb_verify_purchase_result').html(html); + + }else{ + $('#dpb_verify_purchase_result').html('invalid purchasecode!'); + } + + }, "JSON"); + } + + +})(); \ No newline at end of file diff --git a/dashboard-plus-chrome-plugin/screenshot.png b/dashboard-plus-chrome-plugin/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..3573a19360accd4558fcc05a66295b3ca6cc848d GIT binary patch literal 63827 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%0D$-z7ZhBi$;g;*FfF}-(1p=_| zZo9IBNSjN^u`KrxFNmG0?C%4^rj##VxSvE&X*0z|&_E;)2T3B7sx&t@CvbUIhLW#I z$>SaR1nF0$!d3g}7^N&Gf4%Q~_C0@L_xNpSC{S4T<}+@bYt%h8j`P|L?p&J?U~g<< z0_g{pubrE_j*>ch&G_{v>xxINe4$^Rl>iMPnU6(XL*ol<2UzR-acsxFAh4ri#*@@j z5eEFq;p0H60ix5svH1CD{5zSJWhe_+~+l;4?)SwWxxRB6XX;Inoe4Wer z?yW<@h6$v`pm%hjT-(#Na$tW)UIvi1`dfrfknZd|q_o-r0hjOH+3p*)*iuhB zIbkn&qO)c8t1jC+jvzFtJKBID{+qiIqlB@XB{%{fKYn}zbsDmdw?y2D;lWRE)Z81r zp;CkM4kgABY3-_i9=U#5YL8>*0y5R`HQTL>JK(N%e*D-pGb3}~|}$P$!|2iy`D_6oEOr{w`!Cuir7h)`PC z(1nHiP^ikxmD5->)YQ~|K^+ea41`$N-?5OT@QiNvz7#>Ib#K}Ah06IkKo4{K+R>q^ zu5MFhUH1st=?FiE~u!8g-`vThX^Y{&%_iAssK!|$bee_ zef7r=r-rEv2b=M#2SLUv+S-A{7}ev7OMR)|dwZd^QxORpl;Fk}1VI87-b?CmWAbxe zo(%)>J?MX!?~`L5%%4C*WKPO`{~=WooB{BIz0Fhnz#m~{O%4bq0*Rpa*6V(w)hb&8 zDo)=YKjf;Oo6Q{_3pO5FR>&#PIgj(fLdt9oCxXBS4qOC?WOZ)qp~e)$!!=r!o;RU# zF4y(VhzA^5w&R=}uJ$iJNEXbtH*^*O9YcVMC@VYrbAGT*P=?o=Pp@v^xCyf z_lk7xWm5`C;#^zYn)RwOGvjs`cnlfY?GrDCubo4glCPYcoG3Um#Omyb@vz3eytuk> z^CqM;qkrZSj#t?}9pXLN+felKY7h*1i-!x70#s_bdeSyFY#$H^7#9KC<(7aE8Z01K ziZk1uvTv0$z!u*Bo3^yDFvyrgsM^QubhwslD~EE(^YicXnW3ITG3J9tR`3Cy^KA9= zJqX(qt&f9m4p}}-0f()-iMre?u~Q*=-(`MRTAPPLe4Br$#88aSt|!Ci(i>nv2uL)j z?F$N~TYc)fu-n}?8HUX~Z$l!u)T&T57@`3|1h*74H26LsKI{oL@^=-*C^~LzyB|3& z$j!~qsgkw=J_41(92B#=MguM4fV#ebk_cHhdRkgPm?8lO9na!6i|ua*IC7xOK8a`7 zAE-bB6Q2(DIcPK7&=?@IC2gsF%l3Cgu4cah_va=lI_wO{-iXz{PyRmWR?%Qf8}{tz z)of?g$D+k|tPLfmm6O9Y5w5A?%69Vykiznq?I1rM!n{URIlZ_ylHwt%A$%!6)v#Fg zs<7EnZP%-zSz2CHjhh2r6!pUI&#boGMV9L#hE`%@Xn`0!%^bvE*g7+8{#YqNCzxX| z71s0J<%`2G;vZ{}y^3Xo(9ar3zmePvLn-leDs-Pu#X$>Y+QdZ>lCy?se&A2u3;)e; zy+6CSg7o5cf#~6X(>jv)(AEF_1(K=%krRezX#Y_Qu%-C5ZpY5skOYyir9P(!(k5;6 zVEPdPUK{EskEOZVu#Jvbvz12f>`s&(y5<$;-OaFMVEmT-*2wR0{?mId|MTw^;PiqlQ|#IHbDuTX1TuCe#rcv&F9SPW7Oi*H}-eBh^(Ai11u%CR<+#JUw<~+0}gh z6L#BU^3Pe!P%J6XNFA8%@UI*?hdTqA?Qc1U3X!Whb-6*e!AL}UFAo^QJyo(2 z?How4stX!lk9!&M@56nHMtevQpriZ%wmxZm>~%bgTf(!(ZtS<=yj`}&+Q&3uQh+>qPDfkM1o8^;g1b1%@x7BI$CUfu>Ze>-XEMhQIjA6 z9Rk!QU*kCa9nVG(HYe@)vAeq<))YM39`rsYwH<25_a8q{wuy$UY;0^ChJQ~{;&Pq% zr-(bt1DTkRNGjB>k1N)%i~5ino@)t3;Ai%$mu@dM=~!q(&iuVj4%P#5SMbnvxvQNn zCu-G^!zu`ES*!7?ty! zB%`EMY~DNUnz}JrM^75K`y^GqvLHw?G1+lsI3w>qeb6=3QQi}tCosv%{#9?!QCnLN z+TzT+CiAFr;rOF5ft_nhL$r;U!9>(^z#8`c{)!0=#V4W?`6_6h9@t^E5KQCq`0nyl z5hZjbkl9PE_U{Y5+)#)w)+d%IbzRj64Gmi!%cKW{WITD2{?=GIpg7Gjk2`%D}}RMTSBe{pl{ z`~F^C1Cg~NBthb}x9y}}@L|MybndOgK#8GGpWu>B)5Rj?8WFD2rx@?^lcD>9iGVmb zQ6nREJuPVPznSFCrfh_h^}|OsSzH+_fZNy4Rx*QSoo?TBN>tz8x@FuB83eSF#tR&`;Kspe>4K|u+t?2q3^)v5 z@AG2f5@rFGNtu`gmhp49!hiw;axLE=9W85Vd8_`*mtRe`l!o5>yj`}xRrJ(*AU}Ld z)C;SG-HXutIl~>HiltK;@5gwpQLT~`qFw@FWIm6*Brx*xxs6)x($Qx_6MS;8KHcdT z5G=4-Sbn@$ei?13^4;h1R1o?~dB14#0;`5E@#U`hV;IT--xB6?Qd5d#uNpb0RMi#F zx*@OQVfi!ZB4BtEqf*NTj~1*U5M&`qZ^O5GX_i)@1+mDxVE)1gulJebJ=1R~olNOo zp~%%)V7Fi;LS9a|C8M+yuN|+Bu1JG5luoPK?oM5?s)~wlF(tS^xk`;V`bdSV5^glHAC@g8zRFWG9lNiDcqIGYM70`Fl39iGc3xBjkN zRV59SjbR-8toF3r7IJR=l{yGSU>38>#zdm7U1Ar^RRQ2Md_-QFyYh~LD+NBQzjL1; zB`g4#wvO|C=525O5f(pR=#Wp5t{|$n-+4Kqge;y!&76R>_ighKxv!}xCFS5vAj!XU z0Ct7x(U$Q$8Zqkn$*DpQ{8U4+liwiwhk|H?)?h%Rs`{R=Sbw-)w2|F`i8-$s1>#XI zGGJ+ECCS&fo|L|h?7aF|F}&MGES5~>UxV!`33ISE3L8ZWVzbV_{d@#t=>M|-A`c*9 z`s|rMF)f#I1~Y!XmH06Y5*-JVCyvW;4hu@uyY^Wlz_bu(KnVcb-{~W_ht-t9822XQ zFld`<^jMp$Cnw%p9t=RK9L4(eKuyR1f&Qw0Nkgtrs#h=;_2vzhiAmP+lGtV7&iefc*1?2kb!|=_(}^}k{MTrBIpic=M{b^CXA>=&0rBo!g{GAPy!qbL*XJ2E5o1Z z_3K<_L4S#gih2wP9N?rn{Zp?ypQ?VkMs?Y|zeU`UhxpCSn>U&9%Pjv^b?q#4vpjgP(9O~O@#Ut0 z6rJZFTNkPUGWx5cuGf6VDb+m(7 zV0`ExoQgN9b=x_6&PSIXcaz`;Lf96Plx?$|;0mn@QTI3Lp2JuXq;SX1R{NJutI7qo z0ugd@q0f~9VQqTR9BkXsN(;}Pu6Ewa^)n5SN3gK4b_@_EJ(MkZogT30MpHWRLzxim zn)d^%%kzyq#=gUb1Ib-SqIUDk7HikUDjIwoBJ;Zr-*<%vssvi5i4J$<(3nxn{`p2< z)1_4~H(Ro<^ZZPPKvZn(yBE^s@}WCdM|_;UXYBj>Q~LWo`q2$e%VN%Ei7<#fy!&Rg zX=qVTroT;u{W4GdBL@D_Yl9Y6N(3G}JSRXa$%pzzLI&PK!0x35;*pK%VB;=Y=GTN1w=U&t@tFMIcO(+7U($ zlr0#uZ?mX+I@3|-c9*OyZX*>G_lBc6hg`+jluNRg73ZJJN{b#c}&VLd+%NVCrGQRB-yb1_F1Yf{>9E$ z`k|6U@LJ>7Ky1cT^5*@}wxjL&w~>)c5bT_XK18%5U?e-~N%-wDD2R|;7GqLAx-C>+hx{ZX_?9=i!GNG?+F{`GlBB^V6@ zYar1`!py+R3nb{{M+OwpoeSv{-0k5>d9at6JiWvG|9#*?4(LQ<7YXK_ifW zIT#>=QJCVH;`)ngibFLs{#Q}Kaf;oQd5Om!DnC_z;iY z?@1R+hhI|Rn`=oZ^t5KuE)B$0@5|F^X9&yA?Rt0|{8~ayzC$SdDjEz+!eA8TpM?cg zm|si3^x~oMKB5KoQlzhpf_acXS_hD8}RKmRq8cOebC!XV|FagQ_2$_$zjO{G~%HHn}6*CNw!4 zA;lroev4sL{I`J3sjY8G=qWgjV2b9L0RZka?g|j{5|rEC2-{ z-2+ORG_+Mms#nc3M?Tq4X7hV1j$eCkG#(nTH}3t!G$**msnZJ+PJ)LM&Rr1RydDw- z%Hp)Q`TF7i(e;*LS?$r*H;RBX0@8>`cb7;Dh>{}GU7~b{fYObCG^ii~BGS?!Ez%&} zCEYFc%(c%s-`@AbzV@}*GIN0MY1`G6c^}-(4l-pbbI1Xd9(t*wr zpG>mmXj2#pf>)Fwf656Rj%1(ND#0zI_8P`HX=i6MgT)J>V5+ZzZt@SOFaHxVU7EWv zHc@4c&=6&;xc*ENqmS-Zx$Rhlxwi06?FP}fw2ci^>)@4t53bIg%B;tDJ^S)-Z_xc% zh$)>pax&?)nUK5IltHk&>mXc?8|800;m$8KdU&sG{Mf7R!|2s#sVYC?l?Ug2{_uSz zYx7y|!5|F!9QU;jCYZFT(G$RzeihnS|UJw5Gxa%KGM9qr`avPA3AY*?71 zkK1zz;MsQEc~1vF+Rh&t`+m`W&IgSs6*#pBZtk>_8gjq-ivy}XI7u}Pe3rbnQ39Hc z;rwbGR1xbS2g$R2f!23U`j6+~mFvbNIkw_$hLp`$0ITKG1=>t3F8$@bNVP*odi^dS z!#BgT?vbP8-Zef)l)TI~TX|nYQK|0DwtQTEeNIwqa|aRwt9z1A7D$bZWQJ$Hd$f+HT13>d)cSTW<73MK%P2|<{#fZiGm=Gb$z z{VMO#P2zn0&XT20xPQ*P6Gj#qX_hUUNDYhZ=cMm=9NcP)O#PYNo%)rTOa2;&g}-OE zD&s_)miN}!3V9voAKv*l(!d?*UH48!yq(4cvq;Ymk#$C4rbbZ@3?xG?SZjdKSFFb74Fbn9~4 z{Nu+N1WxSE7X>*Yl)UR2Wi}HD?-$Jqs`prj?X-F~#+-INA0XE)cmlRZ@CM4+fpml3 zOWbJewyYW$(jhpefZt~Py{pXxk7W;4x%G5Y-SIgQn0gX9(-lIZm;bE?7db4*!DFup z7z9~n;!K${Jbs%LsfW>hFm1h#7%e=^ECeHc>TOI{&_U%z(8kZ1wQ0$v7RBcKBmg2i z_Kzx?e4e~(GnW19R`Z#61i6@xXEL6`SvKq+3)Wo5BIGC-Z4UY_9Qb9dTE^!DTXi&iA zeS;T!jTnra0kPK}utI5`ZT0l|b7cz)brE#wD2({sJFggo3zsD&e54_W7H zrfk#39q}**ZK1^moh8BCI0Zd#Ei57B)4diPxLQ!_nxRKSlWHMH=q?pVb z2uTd~dmTANV5fvz6bRF^>7TZ}AEww1>k&T{xIs;9{D@^^j8sDmC$6a;S*b^p3ckPkC6-8~hnYbD|2)%XU)Vv@Kk>Q7+5oa%=CnvGZkHQRHP(O`cIN&j!^yQXOqfcSFFIvXs;{nc(T4z{M*z z_;~Mncq8^doVqzrc(%Ile|LKkn-G+jHz|C8K3u39ohPTMpkWM!F+7MVqbHgJxazau z(gq|R<(aIpnvZxmDTm2&LHfDNDEIv`yIvqKkT#So-*~P`7WpAiD2!E^V(3=be$Fj= z2TJ2pZS4+F310NqRz=*rizjv&_YDJjANi+sHSy#14&1)~UQgP(<>vxHEOM_xYJrFl z3V$M~q&QQaG#A^z#hI5!*iQ%DDiua7ArWS9^ACs5`{{=oH_>0+40d_>QW}S>uc0v) zHEN-+3@*L#GFm3l)Xb)Pa&^1tr25XZ)Z-P+4tI(1fK^r15D=6g4oop3&~WMh;zVjq zeoONF-dQQX1oCxrSE1(^psbuPx|xa!Ru`z>&W$p!^=rJFmq$QDsyQLIy_5DHKD1xm z9b;TYrR?GPUF_vHQ*zUoOhxV;gq*cIeyBaoXUV=TvH4 z-<>}`6FJ+s)|D#svENiKE+Ii#*;d)QUWt#-;gyc{=Q68_pt``o2y)Sc9{u~k#Y+}` z5YztQDd6)F9Ii^B88q8AM8Yv>tW6?T?UpzlIG?+Jc9A7ywO4v90AG5;+Di1Aq=vt+ zthR2^UnX2MOI<;)qpjAGP1KK$?_Y3DWs@t_yNNfL(Y`=i`h@YO&<>PEV&Z%TVjRNU zuXEL}FiihY&KiV#bjqL${Dd_AN)jTdxvZ>_gA`Y@-<4%GM4l57_Rt=cTf>oAZnH4J zpCZ&7JF9|p+YRX`1h-!sY}?t&R886Hl)bq2u=EproX}O-plBuH$B{hz@4p%hFsQJ4 zM1F?LJ6@y8I`~d7GsOhQLC9yRc%{3@xj=jE6T$q8*n^MAFK&niexk0zU~lQq{GCVQxL~HVm0iV59yrW;XrHQ4JOCanllLd}@rCZ102XbO>6wZ6W^iUR zox5}Vw&YC*MP80@$xqc%-&K^H9NN8AOhnHT-;~%;YG~k}99N_4Jt|?xPV5}oA=nl! zmOPZ~JPQBl_cC!?wY>M(#*Vf{rPL5*<=&1lv5TMPVpNmrT^aU5hg0^rSwu!bKpVTijkB8nMJuF zV4V&-C@Z@dF0=(L;P1NCpm3cE4ORQxf{OUkc;iS5Z)w!#Y|&K-XecHqWT6kEPHul| zZ{`vtP9td7JIP^gX+6ca@>SJmjec;>43BpA2NdBXToByUW8Qv5eXub^)b3zHeh-R= z++3sKE^R&c{=nk6?+e0}dIc-XY(J#ZGBcSUZ`8RozOhQdEm6YFZk$`S{IIm;yMY~R zJuxk`?fJI1xJ$bE`4mWB?aT5)_i%idd~wbfWV3P@g_2ySYfl%=EK9k4X-V~8-va4O zO|22?KY(IJ%avfz68ThJ>TR9Z(fq8cme#}1a*;1S#0MHv{CPH_s`pg!sR<#}0)TD- z8pOj9H<_lVIB2#%%yCi&_>b=OBCq2+dEZdA5`JvIDX{8F77Z>vJI=AGDHo1vE=aG@ zsy9IchZ>z2M|ygVTc*4-z!Ts@hG_ygtt|`sM~H+c(cc<#Fe>}k9fJw{@SZT9>+h-37opFigxPFWn`yq zHRm%DSF$bKmD?FikL+UGKCyA;l$7L21+hu^(jvJY*rZ%-o32DS!{EWSi;YcFR8k_C zfR;V70&u;JvAR@XDkG*u-3IB!(&O2l$2Qp0$_C2T?r(W9Ge@|4(|`G5{@`qKAIJn_ z3P$+Cms{t!Vh9o?0n~Yt$YHvarvXA3m{+0;D2szc%WVepwfV#^57eO`_s^4SPmZ!c zr+avCGr=n6-MgRP3L}56@6HPMV_${+#;Q-+VSuXYwV)>sXdMw0hZ4^Vb(*0V0v=&5 zDWP?x-xTr@`c2zZiE|HAIYXQIM_^ex1yMw0F(>}O0-ywv&Ym(gPG zRk3li95@>;g(bkQ@2l`w(PH9g6L}8!&fOzfTqatMHkG<;8ea@hemDZok2%EK23ZIo z0VSO*(YtOVl~1&J&!k67d+Yw>K9^BSHr3sL6Bcqw5I5+=zVmF3moLT0)4&*P3yH>K zE2L_H7G!m7|5+aDP%dZu`FWt?N5S;xJ&{IN9O%c=(lJD(@LNA%%;k{VF;yjw4j z9dWtivm$lJXHo6aeU;&0dn6j_Er`V-hCaLvS4ginOCe6X{xyTwG08xKonb-MU)HV4 z{VVsyxnShp0T3CVPCjxzn=%**$fl{Q+F)o(5WZ~d-`R{+%Gg2DboOnHp)|2i635e5 zT(;D%q!Vsivr)#r8Ckpmd0RE2CMk@N=aGaCr|xaG=OAr9SH8bW4dL!PEGr+-4jpb6J10f!{Av zyOj5FXJ_Vwl+cU*5;XAaz&#KKtpr?ilHfku#oR6K+8(?37x(^MOA^mVuLXx^hrV&1ZgEE``JpM63jdR%9aj!N|mfG2!s&i3$@L*4**gua54>ADucS z&MZR$0T;t~FL zG|EYF`^>gN?x`c|@r)Cx??r=GhuEfy=vv$@}~)Tc^jiuaamapVX~_X3gU@t zTSb|5GVbqsE2`Nvryj`ojX@x+{xX)rIzd0X9vNf0v>%ZHT(%TU_XCk zNC7~rxgc}C#n`f(uJr))5IwOo(3T8nzl=OAU}9UA_d%U~%uQz9Ctm1d-&bNT2-y^R zz83_}`Y7?XT%mzfkBIZYsUxvz66bUHpbhK3NNIz3G^_qh zG!G9CtpugxEin{e2#}lxm-XS8loYrLid|o4Tfs5mm&pt+0g}QI6=?8ZzVrhrnx=3B zA~U|I=R_fcVZhY@(>9TJ0jL-Zpx1&ex=Vib_FDFRdW%S}g$*Ab3sYHul5oS{7;=)J z?g1gfXkalEF1)vxM2rNaq$&yuJkUlp@<)!kJs)AK<`lMp`*EQ?nodY4x~b`&=iyqY zZBnsfmbo^6=WmnWn(Bzt6gcwSyx(Wr4M>0ih{_1yxn4-qL}^#s(G(bNU-b;0)2qYZ z*$@XPa(8Y|OY4+(S^R$A0UbGRbKmMzju5EfIne&F>s5wGT<%5#%NzWoGmn3zkt0CZ zK2}A$)WXHz)X~GERc+mP1z-}9fo;^m!RL#Q@_C_&}|wm=GnD<+?nt_tK|M8J-zFk8jX(DID_=6YCYPPM{NtcDE+QZccPhG zYx!|dp^H*ddiVP`7Ese*=j;DjS-u~U$^7u%EznyYso42t=2q&x%rA{FPJ(}L)cmkX z1-g@}J)@)qtGUl=QW!V!$(Q_ms`g@qM~_|e;RJ!CagXCW4-y1GEG+$aoKP+Rgbckd4-Q>jj0R|NZ)7rq zfdVs_?gx`6(L_0noI6Wko(V&Bal^87t&6zIJk}Q}sjAG+CXyxFH;4NUU!;~lqQCy; zzj+mOxP7=p-Cs;5@L+EDh~Cd1#^iK_q5Me|6AQFjL`W9XBl?ID%Jg2fuLA%03S++I zUB@kXl(%+|hiC57#CusU(TSOw0*pb*>Md@nbmgz!1%KAn^pEdj9FqTVGs8a_b178Q zR9>q2>L+6`QoYBHQSo|4|D*RHmAiPmOraxf)D(*SVP4QRqgEA66l&{<=r&eb6*5hPCAI=6ie6@>B(BMFVnjHkr zs1r;NKyQ#dGPu|;@-}EVypA@$6cw$6Seijk4E^b>RIyDe9E0!_x3Y?Kpvuk1p*oVZ zK3L&-z29B&3`{nVS^)WbzhKmOvbBQglKcx5El=X$T=MpUfYQQ`5jlv-W}Wuh_J*LY zS6(vXXHz97TW9#?*Du~C{P6i?IUyJr=*7ax8EYKMi@jR6I4(s15_JSq!n&8Q@bGC4@|M98|iR=Z7 z28_ckfk=X6O;CiiO0(a9F-!bpRt9uaF7QmfSBQh8Cq|fnFM^$jfefd_tm7%z$SuGr zBVT6xqYRe_-g*lc70Q}t09<42oj~WkpPwHX-G|GunU|nqLAbc!VrJ?1OpO>S3VCK? zlaAO{NRYs=9xFl9A8|-~fzEYbt2!EPyn=NY=@Q||t7-&7$Ca7KO2njW)*OU;HWmAW zJscPXb$#l^*e9IEhigL+l~IEXv>(w+Lm&iTC6izW0s%RqC%pzb;}#iwv96=d37Dec z!3V(OwxtL2#Ab+jf-MD%1i8?%K1cZ>hV>aW-wmo1_5H!;F7P`{b$C@yMd)TS`2YVO}vsc5!5Pu~D z&o$jTMYCp)uX$ioC>hTzBLSllc<^EALL!g-tmJ*?7Y#F?)*yjI5NvJj+sCD59fSpS zuG~3kj#y!t1bFgrRnR^-nQcfC^TGoTABWPF^6I4hY8M_jpfA|aPQUEAzwQQ^8<8;X zoO7*VVP}s(OAaHXw#wM*uXLaQXTysWIc~D|hPlWYfLCMc`src216bM?@=JT>!Bo^( z!Vdj38UG6-_EBdl%4Ti|AX)-WkO}e%4P?FP1S73dfXa-91p)z}I)fwI!-J{F&Fr`jAR9Ebkq$Dde#f0 zfhHWRaog6ip9C8oWS_wr3I@8*K;B`dxsF@G(t>7C2@Xf_L#O7^gO$_o^TJ35oJ-dz z1YWiP;K|bP6y!N+s^_?CDEB2>rT$#Q36usX!`BXf{NUh)#>w`+`WgxpXzdH3w@Zgy z>dJR)$UrgLuz(q7l<&Drdr)sy0|L5RHj|=$3*!| zUW8RIs?DG40KS+#f3df|q0)T-^dT7pFgf8i`Z@NA zJpY7+?|Zc)(un8m5ZcGk%T~k8ho2m=0Yx-YBpTqF}+9)O3_?S%&WG zEPS#{<7+?N6D=PtF;|M$$to%sWZUV+6*ZUs^tvQ`uJXY+AWigVpTB;Gs3JS~DukuU&-aZZ1-n1{r9C-l3o4@(Z zuu0`?%POb#d=^XUimKru?F-tdG3uvkj}&60```~p<^Qux4yt%VjS)!0y!V=nPL(`V zDa2FLENcIvc^&!T!Ak+3|6rpmWziuoZg*Xi>u;RF&;R**dH#Ek|N9b68vMWHJyj=q zkNdx`-6xV*)@lbz&0(9-E;P+4_Bxo_H(-rt)OIw|660)Y)^u&}!&h(i4a!-=Y(KY{+>e<#MM^LU|MrcJ*ZeyxFEQKcIvi~);y->+q_V&_k4cy1KwX$2M zq93#?=!>@fHXAEff@V4|GZsqp-tA_7C79lXhDSGVx?asLlLaZLIo#6jPN6<@$v^vk zo&>=^syff*M!@^QzZt@%36sU@>J)GZwxDB=mRjP2j8{A}y}M>qQAHr%No$Vs>ZRYa z=V-{xGLIDi$b*^Kfs*Fwua%b?CsNDDmpOg948PIL&9@oIT+t zYbm!;Y&QG-zEDyPBt8+hiv?S8O0l4@-@pCGdtc_gLP-*GyEFG_QL{qHZHtAma4K~1 zhiHszdi6lLIw?uPw4{QSh)m(7sdcra#v7sO*Ws9kK8+IFb%|DkIiH!a*q#?aHs0%P zhi_ZkFqlBYCgDFhQxW03?AxdDjMjB>nz_KI;vOxO_y{;tmv-r|&h86^eIV8}hyzRZ z9HC<*5{=T$ZmrxUf-KJS{SRK0?ECnfagIslQ^sKzsEaO@D*KrpD zuAYJ=_-oFG-+z@-A^IP}GEFt7iO_={nJ&Apt}{fX>Y-1<=jEuKt^! ztaLWaa+tB;{7hM+cwo@WbLG9k!YN-t1rUuxjTmwM%&!Z4u}0LZ+Bo5g$8vJ_QDW?G z4Dyn{?iM(p>H7!-P=B?{t7o!bpn-xM<~W5oCfGee;pkY3Pp*w*`Uq9VO;7oqWt?w=V*xyn|k(ZS!OCo*n8J-_ak80Ddy&L$EP6w z0a(s!H9!wfN%>U4@5#JNY`;5y7gLLp+<118?Bgjn{#X~+-l!U@2CW0l5q-*wV|Ms12_PM9CQ92gh`#KIT`(TZvO$x4($F=?@i z2DY403!kd>p!G8r6~rc4B+AW$j1>Q|(&hhZ%}#hr>}>#rgH}}n8Wg{h>0VX`#FBvZ z!?fK^LnB$p?vB%Px2c^mEz{x>qGCZ{7!Eu!#>-ef`idvOpDTvSh`%DWBaYFOjIle_ zlE=7-6j5VN_x~;&xAU0))_jJR2Z~b$BtyaM#0(av@OS@0A-3rL&|Q0qJz8!>ar z>||IaR{IuBF-7NuEe;*Do}xm~9|GKO_0ewOD^fGYkJ1^*04Rd-lBT!;IS%Dy(3jgxi*{R}9wW zT&9PG?U{O}>X6h5?s3>wo(f_;dF-(<(>qYL5bC@(8E7wjo^E9W`5WczJ;E2xpjCIn z+$4167NbgX)9kClIe^b4M_m5)q{{D;bXPg7sJ2C?5{Nw)0Z6BEKCJV!nTGQ(L?6>K zFeD?H1pgBXTGX}j-9tk|yUK*YHafM@zmS$gEHadcsUHlo1yJ7@czM$=-ClxG3WOD4 z-pE4;J5bbf7*)GDDkhu2QVcoTvQ9Oyk%J)eW$-0bEI7Wa4Cr{(e)ZnH^ZUK+1IPKL zE0bS{Q2!mzBwpa6k3nCIl3HP%om-i79vJ@OeQc8wSlCA$769yiEn-EOE-KH}GUIWq z4>TJ-;%o{GCyg6=5RS;!Z!Rx9PM0+MT+(k9Mla^EVGLAkYoB@37FDV&-kop7x$_$Lqt6jJ=ny35n-DV2ppbLd~ahL3>$Mcm>vuTO3vadM)j=sD@b;k872T1gG>USZ%{93=5T({Is}BAcU} zzB2xu4V*i-NA#Qo!07%^L&Lz^=0>949tOIBgUILh*UHcn9Oez_iJnj#ZA^6*Ow}Od zO&A*|q(6x=$^kw*-{0~@hW-fNmvguwdv)#N(PKpu@DuAf9cr*^SHFj-`vACVGIFtqm{jJ9 z+waiw&>}<@!bg;NV6y=Y3H|A$XQ!e2w*PUJ&o6=?{40D|sk0eD{@`k|6y?Ej6SkS< zGLoIx?R!b|(MK=^?er8p)&9QI7x?o;Fc2>g&#thNH5bstqiBIEziPA4P0hfd4ZBxN z$x8Oc%&yYdRk$iK!?<$65vwqyI51sZ5O0oGEcxwoweWK2RM-OdmnEbS{R8tG(9m7W zrV3A9Day*CVTNKZnk^SOukzNP>^*^~wZ@f3ok6W176Qv@-atkSR;e@n?fM`ScfgpN z_ZSAdpx%#fj~I^$im8ZWwihFaC0WFgnV=G1xj6JC&Rc&lqbFn>9eLw_bYEK=54y7> zui443bl-I=Brlhqo)He2bWxW~@RES_@%>4qFfeeE^n|oxVv#UE<8>OgrVz44Qjh`O zTFSaJ1&>4KAMLZ-w$s%|f5TwMVk;I%SS(ullFy&><-PJ%fo77CjgLsy!DNDs3}@JN z-hoHL_u5poE9CXU+Mdn`^3uwad29!&V09G{FdS#TwE@6KU`U`pUl37>jJN}A#^51H zRoE^AKIkHLgmeOXH$0r-ONDu7B!#U1TH2%@biY<|=m2;92*va#5_O*aaf@ygeCD7h z#!S8?Y|uj)oz2mlSULKn{2dUlD)5UXQ}6EKN<1|OqUnOpw3tP9Tt zJip;j%bysYvUV4&tHKQ*CnwX;aTf!H*OF^L7Hw0nw2;w!l)Sq1)~6+y`Q#OV~j&hg_N{bQS@DO0hfeOAEVTfO@R=8l+M98msSo#g((M?rbWzAZAV=Mkw z!#K@-JUDzuVxv)!He0&W)xI2^_aNF1bQG<#PMGOP{~({roHudYcckoTFFEeUpd_|` zDf(E%rEthKXn;Sm^U|FK&^*H zgn707(PbK`=QSK<89=*^jf;KhyJJok6guMMK5@eT^8MrJEivJ`<5ieOUpDUDX49^E zc^gjFYj-M0RbLin9lM}}9)*;t!4{P4TX}U@J)NDc{7R0FTucli$z^42P+de8=BSwN z2#h?!w{V!`Rf-d@^V)A|_?U$(TwD7S3RraZ z>y*uZnd919R98U;m*W+7ZX4)tQlwowacb`fsWbV8Wmbm-xRhIuD=v(0L_PJIL~ID1 ziClC%JfWA~z4ti9@tV2q?U6~-&0r)FX1vT6w8pvC#7h}jSrJQoVMD;t~T-l+rW&*<{O)plip*rNdkQZUw?u z^n-t7U%#@H-Osq4ZQfQA2^s@hAV@g?eXBS&ACANUz7HEB_Z*#0kKR8LpqBU`f5$rl?0L!?eHl{O0%SOutgHaXEoaEznTrj-`YF0y zAD&kYp8=o~O2zq5-X}eGPL^r(7NF$l%+xIW5J9$kf1i~7=lZ^5w}$5a?{9^(`=?NP zXULo#;V!G!Y&9AYq^)e)y(B_&k+Rp<9YYRRU$K+B4wu59*|uqW`v%*t6ibekuzP;+ zWWDlPV=2)s&nhd!fw{*>k3RkG-6+TM3=^qHFfH=gjPw7)U+I0%V(75x;-4($ zBnXphaKG}|p5M5ZsTgX9lRD8SA@ ze%K(i0)s9v8d;8RR_y&|D}<;Z8Lcw+TbmQ*@-AN^s17B7BL=q-gQ|wYWs@wBv()Xb zl`xxv)kG>tU!cU7>UbEh`Bd*IQW2y5#2vw>qCFImN;KCHiNH6lc=_+P~yeCy9B)|9Q=|hDV7A z9Dy#MQceQgVI~c0I|zEk_i+-ejCB}+n}gqggDNAm^UvE|?8B%{=Pf#eWGg`#-5$9h41CkO zr1v2co7vgf=)edox!@{v^an^^^hQ8JE2EZw`(`KyK%=zKZ6>{w6h@>wc~n^qSq%-v z!Io`sK(dicp1p?q8A=0i2o&}{anW#Lw~r1FKbt=NQE zT;|J)w?PGz?hkC)*;2BKI4HZn8z(cCZ^B!dsh6hu;nbUf{s!*9y|BlVDM836*p@=z zv6O~SE%j6*`Wpg{S88qq5EbxH;~7>s7LT+4;(Igr+do%W9Bni%?1DE4{%3@KmCa;X z^85GnCAt>sYT61QoJLZ7fwo))a(1e1-+lNHG_oFV=r6o={bx0i;}l0$wRZ*Qg6V{- z|A#FsEIj26F_)`hyX$JlSN{&T)=Ji0d<)m#tGekHbD}+S)7`Dv&z1PNK)YZ}VbMI{ z__*wKSmqraO3QYKlbz4eWFQwv=!mMR5n~OLsDio<<&-(bEomy8_n3PGud3V?A}2MTY%pX zYToLjI5ibwXqsUILi$~l2aBk4y*McNa?a0CL6u{vWceRSajoCyI~(KX>3`xQo+8!^ z=Kq)M_`gzL$bx!4(Ifqfg3kj){o)51g#jl5u@_Px)yF(@%n^Jgszi(k62=i>wO4H0>Ht`nV(L41}v}BVm3bFx&)nb2l9QjrV3x`u`(8;U2Z zDfGQ_=^hmxY^2_(vLzG7d!~VAvaP9cyWJI*wUGl(4{-ZSKPh6_&>lL%v5Gz{AQ-Ju ziceFrSsKAx53d1Jf(3O&7_U0Rlmb0r(`bSO;0|FtjiGD&-H|Yunw%E-LDw8I*{)$uRb_!9rfK>9&!Wb@&iu-3{i5te{dyKT2Yp;_s=V+533 zkg2HkbV+hTw{DT+A#0GH8#PzM9xLpVfU>oqevK8OQX-Q1uC0uJS+B?aVr8~$RtlX2 z+;=dB<3peqn8V+0FGkwzMx%EUSF0*rm%c|^q7U*|?PgDo6TYqn1kk@H@KllXB*hLH z6(xDtT3%o>rl~oiuivTT#xb#>FU5j&owY9PfFgii@;c+YcjAY`$I%@Tn4j*=kM}Hl z?9nGzElu*dZC#{$Y8K4SHabG^d@C#i83k(Q@bGZb`9J%6NU1Wx4Jm>ELuC|Z1wumJ z#&<#40-MLAH*dsbJyOznDlMILZ|BA{cW(`y-|{rwK)@iYMKfE&lbol1fHvZ_t;8TC zlz6svK?lz(%cJ(v(CBbFy3c4M`d-v;KYjeFE)fz`h@w>vMH%mia&6FUHck6AmYjF- z@g3`cVI*+qp1wYOdFeb;cf)VMiofOmSO6&!4!wiOxAqmb`sAX2aUdxXjtXr(=l;Nr zv6{rgbs>`p?$@LCoOO$YmwP|`9~{j3FZx#b@9klMM%PNW18?ev)XCC~Hz;^Hj~_b{ z9v+HcZ#0TKp5!DA4aHxiJ;qEyY5RCkP!uLJ+|JbX zUpj`NNY}T#x-2ZRPURZTZ!EWQ9RE8zVW?92{{18LZ>*1IU2AS)G|xv6A+K_d>A3C; z8%h&>#}#SZ;wqb=@!;?aN>e>sl|Y3pGyRS5f-n(wuAhv9}#j=rUyD zVS`^kP>cq?3rf$1q-+ZfYA@ST5xe5zVi`DvUhJHD8_7H_C3b*J zUu=!ofQd~K@?Aa??HIot8-E+!UnO1Vt!!0WQD;?`dEwE_=RSkW{~E|n7&`ZkS)D(G z@XO{j-~Z55z^*X!Dt8utEb;Em8Ap!M5)bt_I}IhJZa0Iw(1(}gQB-sWjx1cmJa4?K z!>su7W$Cuw%#w4)>Nt;g#%J}PR6c3~NJ$i^9{mP1%Z> zlL{*x<}fPJVXd-BZpX^qSHas%DfKJ7{j8 z&R2NBsQM$mr9xA&v4y!`zcsHq``ehJx*Uq%xjgeF6UmZryRxI z+EEHx({qSzCS@1gH^|G|n|{xd#$$m437j)kwN@$r8=VAOZeeaQI{Is%SO`5iy93hb zRi9xbMmOLLo^LhP!b%n@JP@rf{Q}cOjv`Da63uyCem|qv{u|cGC6Voo>1Q7i_-#SE zqueHzhzOXvaHX%Y1f;Oy<{Y!3kNS?aY-#{L{vrS=`c#=0D4!+zHy@6OjUQ27CD5C6 z_XHcBWPbh-eKaWS9XVo^#waBmL##cQ?lx^cUbc$l2Y^!1cD-qvHAKMY3Nnyx$Ve$R zFG7Gky3xfyT&CK;D~Ug8{;Y_;Agh9~A-5d@bR5dI--o&ov9jNuK5jNP070Z4hZ#|RIRyuJMO)svM?Ow&K$55|3nvluGNn0#ZyntM_##?c_ z^2fKPqS!l=9U+p+Y^bgpE5#vXI^?*+28zabO@p5IU)8HN2A;&cJ83WNeX6e! zII)mXU;jbW_M;**naOZFjXEr-1ZvN>dfNaX``wt(lr_wwvI3Ov6RE7u-_FxuLMF9BjNq@_k>Tajh=fR_>aSR_+b zyZsUl zUE_jD2SP%MZr7qtl<#6(|1&hSJ8G)JZ8FLYF$E{sB^Q~>AZQZgbh0Wq%Rj&{W%3)Fn;4)s2wkN7dH-ISV`{PL+n~bkpA2b zTfcw{lbE?;0;CA4u=nxQFdupDyNk9tzQnzCTmfOx?f-DswJUtYrmCG8IKGRxO^PQo zee?{2d_`{a-_JnPqovC8_w$n$zgSdgPh;}ZURg!*tqs*4KJGj{ednR(>5`6 zE#;+;?>a{@e`|Yd|Ghf2E4O3)0Dof`H8)@QR!75#y2SRv6M2*`c2vwcc)8DaFo}Fs zv4aJ#LB`x>J4XM~{$OC9^kQ@E^!ek%F2@$IHYzAS%Brpo)3rMj!|23o%Vxw5lqSoT zf{h<>1vLqvzSe9j%@sF@{RUVS2l~Qu>eB~1KR*`Rg#Ytws0_K;piuJbIuu6OC#Wzs z_RF|iLeJy4c#~1jg<)*W24-zA&;SV~Nz{$A&huz-Z#R+d2_b}rZhvE{u;gls5J`uK zmU)Mo)$~NLxazqq#Y5gU?`6po1Y>2yU;g$JYIWowvgL(LE%P1_YD-pX{i)or;? z3e!MYt#XQ;-e7DtNM#apkH6mMWfpoO$a8~ z+`>TzGv&#NJFGZg*d^FG!$kLIPilAri|#@`hhKq~lx$c}D8H)t z<&k8A&qd0{H=fQCu%tDDJ_q5*Kuc`8nx-&9u&MFhrrXZs{#DcZE!3j_y|>LK1mTq$ zLAJrc#u(o~Vtz)IrUo^Tz}gFK#YS_|tlwCRZBDj*uVnrw;A113ULco<-3D0?|b zF<27iPVwU40gp4Pf~|AUBg5!75(^RiuzuyC@*R=A5Gf@TK)vtzw&TH{5%}@L?8i&; zG0o;v8j!|q^f{D+_eC*ybrNJ@TF+H?a-Fcq=FHXM)-9j7heSnp&#{2x16t>vy2UTv zhw@JZaiS<-17*dOVDh?M5{!dxb5;a*b+P~T-eak%^PD^MWMSc?{h`fDK#rNuj5VY& z1iV_*=EUA=@7hB4;7Tj-m&& z3~a4o!`$74m3L251wP9kZ{=&%`{~-H!oJe`b!Urn&iBc=U);R_^^S!F6EORLZ%hLX zhK4CZD&aUdR%GYU)q__>55}_RyVGY7ww!8L9}2BcBCMxEeMAVnsUR%Jo-JH?t@ae3L1 z$kChXfb$uX#VBlmJKP^O+7w%X=6P$mv&v&pI6sj1^;CoW%qi4EcTemBN=+g*H36aj0gB3Rj*P_SZ()@==_S2RXEO z;RP>LW-AfGNfd^nO5ihqvJ<>ju`AAyMfdWEf@?oDg;e#PAcoOGt)yNFG~n^VnV2WO z4sR=pTWj6@c8EmJ&)mu^rrJ8sv+E08`RT>a1rYVY3MDBi>E!bWirmLv zHTLnjX5{T%_u@K9z*WY_JWMU5rQakR{CTs9>w$YdFhHQrK*tY7SN#tZQmjDXXWAZJ z6I`5}w!9;0^biC4{H0ZvU^h;~&dw@*h2P z)b(X9k2dAeLkD8^|8W@sfk~Sek{`ZNiZXgNqzS1L@lb*xS3G3# zLIsI4SSD=#rvqZqi_BJef8*cDD$B>wj)iy8ao+oPA#z{3IjjGh_*Gii9u{EakPCw55R=5moww`B4D}sPQ?`z)o z^BPo*I4JrfRREc=h}yr=_$CfXX^u?LX?l|(?F;kA4}l08UviFt!G2tSOQ;}# z4klSnhc(7$kB=Y%PZ-jQv}#;AS{YgaSSw8%D(WiS+_i^Kqd_ne9j=Et_RjgHaL%8b zj0)0`ax3a|Rz(v3SPC*Z+WuP2kY=gkm zwbLFD@SD&4XLvYvuzFJSFR@O&KuOr+n97e&yAmVALv z<0cB4)QK7c6VrmL$2;@Tr@vGF{G`5A)a;CS;E@TJN!NcSBxIgpqVgT8n>&q?pXOL_ zV{#aw46>e(gT*$T_XGsud(!U%RzsuM{3)**21Fx}8`f<4qb0-wE}{P_>(B4rfdq1X zvE6(332&YZkPAJaEuca%ViHIGDkaE98<}4Nhh}W*)Vb}`4ns>1i16BVuQRK#Y6g6- ziLY0@{TvM&f*VZ_RtBv;q(BDO9!fHKGV~|!8vQ+Bw5$ztlt#%nn2`3OqoZS%+@)A1 z7rp=AJrQ&qO?1jEJW&oLPGwrbXmfY;-?J{%mHo5Ny7Do%AKdA!;Pfr3O#|9{rb-|D zvm@&^j`=V^**}F8`=8~T3%`S9;^V<1C>KuhC^n#XIeb$-!5m0v+lsTwa+?&!#vm4v z%n4#T4qr6GCK_S%^<%Pj|G&Q!Obw5I2V_&Eu@r*eqedHV~*&KA9IKX z)Y{wHO03t`y#M?ePA|fn6%^#E-MQzq+-2U=?xbDpcsneUzsf<*SN_UpX-TtzhdZp^ zb^`c0PU*oi#?Isfq{owvW%zKl+>o-dumiXI=#He*8z_;AUY~{qF&6zIrtW;6pH*3T z1CzNh7c#xbi=C+iA|K6Ea($d>Z>Q-s24C)rlpg3Er3W#FJNMM~|L#1v{*FQWMsx$= zTgguy(dOEq0PYxYKd=1H?sM}7YNfvIL6FY<&XPW7+~DT7B*XU#lS%M27zl2fXp>YI zd}d_@iJN3JP@0xlLu%weYkz01^Cog^sI(8=u%2+GSG5YEVIRz_?~&)Gy4SNVr4~<= z@bkGg2keN%l+40>1%@~zqHX&dvhvl;yxa^7$8Tg|9u9j9aQx4yMOTJOnSQvq1o+WT z-XVo_6WN5@p36)9b@D_2SF1fd5-n?Ry+`w!JF>GqI;WsM z3Q$Afh`jeaiH4hA7)OH9OkE3}l>7W)N5n|41FAM2^?f64lJ2J|F%zQr(Vc;jvj5RC z-@mB0NBtQdLfnly`~1*~wG2ZP&wV=7>($3AjR?&V9i5}u`+^;Wb@4JAtV9saWab3TwA8MF` zr3*%S_ShO~;7N0W#*XXKrF2LSd_L~y=k;(P-7h2X4saJC5JNeh1I#^IiZhpF51r1` z`mA2QB5|c(E5DIxG zqi!60l>{RdAdBpwll7tl1YhJ#GW_n?E?mYrx{tQG2j)_JeJzt9W?1=0WW~RH85;N` zC#1do;n#(nwAQ4)Y}ijveIw#ChxGNo3uBBq7*!C-f`|%k|CcOFhjvXCL5C0Ce-LzT z_3~L8(r|FNDhi%B75n}e7>92T9qs>J86jiq?}Vbay54iB*qsuelx6a#j%JI%<<9|# z{R*f_V0J|!bEBesV7u#<>#(d!tPTEmG>GWnGPrA~haf&d*NKE_lRjfSI~$H34)=!i z)y||o5jAI@pA8m$oF;K?T?gBYxx4!aIRXcCPe}=?yM-oTS|R~4QPn6P2yWI7k3f{Y zaZ*mkEp=B37_ECW$ZzADYp45-Gg4`q))J8utdS%xDk?FqKjhYKyVs7sI4hN#SJ*0~ z(Qve>2H`w+zOY7~SLthrDCJc)EpuKD&zNe8fF2E-)6<-(gmSx%nT15zx#QglEtxR;OWT1kv2tD{<~1$@gUlf3RP&C3ku$ha80xV*9>_8 zgDt3TW7Y`1?K^o~0z3uqeSj8hW{gJ%$VLdYt$IuLs|d+rkhiss^+m$-XHpUj4d=r< z+Nan-<7qAs$%_FdUAXT=%D1Gx9BhuSD_jy!%lZT>921-7GKy?rbOaA`4_N!$(=mFX zBO}Dh!6T%H$c{L;UZdi_jjYv0qwW9BkEhLk>`K0|WCc_$Ahgw|{+#1@k~vA9`3GhW z$kZ>M16yjNR^zqM3H?h;Z>ECbaSJWTsi(IN=_M@BS*$E+?oEZq9`{L%+IAmZNE~_m zOvC>H>cYvtJ&V{Zz6LJvus(ju2YC>EMBX<+pW{PW?3XHI&8%p}#5he8@{cWL0wk2h z+6*YO8yX4;HqdGUz0M%v8HXxN`JiWqCxJLq>>#&_o*w*qfi*0d1{=sM?l1+5Q5Lba zda-8>L0Xr&xN=m7A(3frtEGazt1|n=6PG$U!vuJCz(OgXKtzLRqyn%dbm8<;u}!!g z^Pw*uvOKgPi4eY*O@HB>n}i9QVk}RMTm+QzO3UJUikTIKv0-6hgAcW*xQ-}JzSx`p z`$UHa@|5yYCYtwj?!Ba*NqXA2cI`ocw>YNM@^J!(@ibFr}u7dnkt9WjKJczd1ezmr8e7De=)QgQ|pxAMrr0H#=Q z#C;|IIzcux%YTFazsuA6qLz~!-V4VI=aH-R;%yvmMM5+2?-du%y!&@hJz+b0 z^WRJUE8PFR3aRmsSA|h7Mf%}PPfy3~tFpDJ#d9!eMzjaXKV+M=p@M%6O-XS>!-+B( z4p0_R=;tZvY$8;VK;mfG{dbEjoV}?UAAH1cGx#V7Itd;eiuk_*n-}iuY3jhBH z22bniW#-k~w+=&&Pk8N~hB3EI@{5!$iLDqfn+Bb#T8Me}-I!}jpDTYIA=06s zs6E)|Du=dbDM=fH3?I;67@6wnL8wH8jbVw+9W_j^_pvg;Rp+G;`rKh&qXs5J*&U-O z4pmT}ZLzjF%M7`A4OT+4!w z!(Ho=3-&EZWHX97x?sI|;&qy#tv8djD;9J>40tmB`lIjKxEW3K;g97e+bW!Fdk*ND z1cLkb{c`gXR_hP@Zd8(0ALGRjxZ*5r5`EmouUh{UQ zf1_+#$$n-MoUSS7LihLgVK9i)c~Dd;kM_p-yp|iDh~O`3CnS^ETo)_!EI89r!cUgb zc}S(G9c!>Vavb5G^_KTWi+lQ%&WwA4U}Gvji0BbO>gfX|u* zl9i*{nJm1Uw0Se01L|SGo&&|D)O_k2dv}IaM_lelor#=^LYk4%{XbZ(xCLRS)WjDd zA<}lFr5qteJtYOpkQ|`5%s2c(Zjx4*@#q$lzWZn^y0Gvhk^;@4#?i_ZSoEW*QYojD z>6!-oYB*Hos@}f`P!pPZ%x9XYlw z4}aBAYvu_1j2|AKp`iE;v6G=;*eO6)|MsZ9uy>pbpqNas6agL{^qf$IX5PKP7;VlL z`T_>)a7dvSkidl{NmvmBRu%x~@GNXi9}A!pdL#f`d-((#n233Md&47zO0QMOSvMl8 zXAZ*EnRLwet@<I zq{j$BWW_!e^~x;75JCU>0iY=eRjW#TjeLMV5&L}c?niOmugDn=u`RtMPmz609w}e# zUkb#JEI?;@xWk9OH1$7PfR$9)1CjnuCUG_?#(pi-FoF|Wd#weG&uG57P%z=((C|Kh z=lA3@TC?BFWvzmCtI|#w%k`IE|LiOR7yxcc*(A{y!mTl1mo_#*odSh=XbcIbb(u&o0t2~bhYQJ&}hDf;;CQ?2`#(MB>9Pk4L6V{Mcc_WNp@GaoY62oNzjwCHrfZmBJ8jg&PK3((J(P#rcX|e zk+D*@CN*}dW8sI9VW3C=jm-xerabZH$X87;GGRg6yU!+DsjA+w?S_~fCdu2Cg(fAu zuQgIC-C(QP2d4Ao@IwO&ZE|=PzFjq`1$Vn^-3BN8UL83#t+!^c|HC-8H65;neBsH7 z`3(l~o8ICu`P5{V+T5SZrx)_NaD2GkRLVOZe8^0y$6|S8lc;T^gITQ)02!i`gmYQ- z-*`1-=m=p^xup28FQbYZdC|6HzbB%&zMEeN_F3F>XXU+`zC8Rpy^Ei_^(*6Lm}>m( zp~pf%*TsBOjD|H2?8c7XIWwTY&UP7DdNL<0kF@EV1zovw?HhkTR2zF9bDG@@VzGb! zdbP&NJiWB<8`jE-BZl9({?o!EQad#cXSKu7j~D&jlR7O2}y6@+D2=PFnMXjUAIGVf?pm=I75JVGGAuB$R4oP^94sw33uCM_-!OfF3vJi7vts;Ju=H_!Q zbqh*9%X)(F#MnuN~Q% zvjy&UNWlDW%4r1TTm{$Kp82qdF&~#y!x2Rew&Ufcr*QpzS9l8#-zTrwm5Y7GBw_8S zSy;WZXmH64>%}L18i>e!si)hZDGuw=@9D@^67rmlfYBOH<(LoSTHPTF1kzH`P`i(P z9(egCHO6Ir)cw$U-2X7mKtH+|?Y@&dEe=bIn8v?C9EP@&p=Z<^Rz$&vr(_|2$$nwM z*!$O8r;(bs@j+Kg&L$Twfg~y-n!oC${8N0Psl01`OP_qJc2JI0u*^-m;Yfo*Yn$kF zF;{BYjvaVg+t~>()Ho)~I!lU-R)R>yXrK@x5A`5E<}9XyPVPhqR&8GWz=MX{0JMIF z2|QP?-Xd~bzREqhNT3hmoM%02bKO!db7Q^}3VN62|N6~kV44Z^L2D)r0wkP}hEpwY zZaxn(Te14_ehIk--~v%pRVBDVqVeVO-r@D1IHJ1D$`11!SFKd(M-o~QBCLRly88PXG-|JEkMnZ?unA#8 z4;HPg6G^PZt-jf~p9_!r0RF!$nn9doVA;oXcgNuIBN`ic6Ke>RzBX2Um_c ziW44?O#;YNOhkhi`$c~(8)!aq_AkQMm-Nim*dbVXX|hG2y|eQ+R>YVj=r5HbWDqlv zQjb&^Le>G9++Tfb)o*jVWgfq-j-Q${K=1$q3lbGg>poE*(k!AO>O2}YGCg~+#8o0A zmjOI@F?&(0$P2w|`tA!?64_KK%4~aDS3LSYS}7~V$)>r9tAnCgF#y;bz2>X?)Aev@ z+%?c`hh=f%O}2KB8(`W2mfstKgY0S`)*%OS#CBGOk2(Av7|qRP5%F6hkU{UB~Q0lXq8c7IFY+{d-z60#20rfh` z`%SqE3<=IqUEKJ5gX0P(7(nU+=71YXUaPbXVPrt}>O*TV@-@s~p6yIl3k*C9>d|^5 zvBky3*n&&Hyu0O20Y&P34|Jb2aMr*^``$eY#HjgRHV8(Ce`aSkTcEgD?meTY{q>Ay z1SNq%vD>9&Lqnj`#+Md-pYJVUuW-)HyV|9r^Xf`6vstj}Oy*TMKb1h12*9*K68Ytq zmlQ6~)nZzR_#4`ZgkCmz1$#t%3bv$}Fb`ErOE4hUSwJ*rco$uG9Y z+B%KQLVTCyVDF^@<82ARRspQnb32S+bgM0(1B01{0T&L^i zE1RoVzq{9@mVDcr3W`p3p(TxA_t0^#ePx{tL*93ecs2L6l$4?eOMl(?C8FgVYmY)g zQ{8i)yl;NbDaJA;FbJ`HHHCtKgLeVMsF1QOT4Jk&6)CxX%?Fn>{Kkq;dk#UHx(G zX{%Vt9&eZOU1+9MV3{7<9k-hK{uVieu_CXo&|}J9UXj?D*N7Wvg0iHgI8(uDDJLff zjO~0d|C;=ArsSQrw>T0f3eHHna8RC|V{mwK^IK^_wolu0w6+*=>4>e4iOGwst57cg z;H)KqMGUUgJvy;Z?fY*1Lw4GAl}WIG&gS-beJ5;Q78Epqw($g>_p9XOuURc>4BMFK zKla>IztiQ$yTFv+b-l4R8S3qq`Gqy{hij+8G68=fq@_Z+Yj?hcJ1?qm393}+PS;7d zgTYg_bliKl$A)r&^a@5O9IbrT$g%^D5qJ)0z!C zKipYso8EBS-@^WORyFGOs+l32nv)^XsI)$itfFdM>Q0F&g_$f+i6 z-Dg^|`)|wzRN&Zy(Dg2;K?X~v)nMM$1#*kp@CQjM*S|m!(OTgwYql)`P|Jb>VxSfp z^I|E!W~^r;5Jm6&`+=e%XRMSmx?$ifpb?!~A@OtI@UHcawNCDh?BMm}Fw)#h0A+{!&ii!&4w5&cWqtqjf zn1$N|B7pbN($plC+Vn;2Ikr8?O&}PCTtX@P1$$7mLCaX|oC4)7#72Y{+CxkuGTa)P zKitrn&|)gp@JaDv%KP4F?`lr>YVy-0CJo4ft%N!7!~zxEYgpBNUGNeLIk^RQ=%bzL zImp_hhLk_eG^zN+6wIHIH8!A5Vua#yHE`)f9$gIao0RXCJ>-S*4|D_pCF;?bB05%r zcZ@FNKjzTWLRA2c%Cr+lge zzUxFYcY35r+7CH-eV&LGR=JYdnzE1+-f=n>B!;#T+*l+qNKgz4l0o2madI0RW3}E_ z_>08YVD~8>bxsBZRS-!IsE!^aogGA1Dgcmtt|WpgWWVJ8i&}p@5ub%aP>>wXYk;}c zI{Un4`!3KKeniZECfr^K-m3K8Km>sKp|tuT{mF0nxHUumwRWK>OtV|B71g%_yh%jl zsS>Po@JN{2LxB1VqE_gjD#s53;CO8P0pi7RasH(NSM!mIl^BK_Q9wGy|22ig630jc zc@-qf+*_iPAuH!J%t%SZOlwJZz(&z>?v0IN#RR`tT;uVIyO5C4MdD}0&QhWWLn7CC zF)r!AN%lQSgM{>v{r`q3o3*m3%CVbADA`QD>=@h3gM(JLK?i7sGsVW z&weu_w8zY9Xvls-p-^kYe-?ve7ngzp>yxMsMd4-zD`$guP$Kpj+Hu0r<0XUS&vXeN zUMTVLSpy^SS@wjHQ7OPTro0p#gb@ETR_in^;`D&+%HghO@iI>R;a_NMGG@CwD%8Xte*%7|x zG*N@7YOp#iU+0^O!n8qc0$VA>FA2AMragn|^XFd6gRh`myLY!LMYi5^VW7AA{>50I zbQs_>`>I0HqAlbi!NaMk)M>RU$fL>YB4(({o)Q*F@8RUr)gO2{AVn)vAne>q3=z6e zlv%^j4fgI=;Qrd&U;G98wP$`A!Qol$$Uj8#!o8Qoz)RH%I<1WsTF3UKG|YGEd^$l7 zad6Be3)@m$zyqWjWws_uN1k5(V8!(e8v5(vj-$ySK9r#-$4NBt;enIOZgtd8oat(! zaiAdB8eoxy^!odo)WBhgh1(90GRIUi>z7(*q85BUZ*L%5UIUE%9gdn9Yv9UKi-BOD zWRD@DK(C}gMc5vZr@4zQWYCe^Bf;K$MXjrNg^qOU?k~>c9nk)Kguhx|e&OX$ep`b$ z%o+oCt=@kQS|@H3Y78TX$OPLhP(X)5j=CIj1AOjPY>l&2~0|n9-&wV4qBF zR1utu4K@a&AgtK23tt4(!IE^HQU(u76U`dq)xkMf+C@?98!LXAERx27k%V{}Da=$( zzzknRixCnee%;(0MoEG5y|fdoLK2Rn;xJ3EI_(LWT0K3)9ogD~HN{-Hb~ZQnRSt+% zn#(w)B|F`gkJ??!sdLA9bhuJ7-RJcJ8Wzu1NKCEhIte;-50D1<4e)~(0`9Sbb}zO* zV7Ir-j^E#Ftu;}~H$I_1m1nJff&*u?GDMCm&5L5i!(*`APZ-#Bkh#Y99;oV6R5TRp z_y~helm^DAVMKgYlXh~)&(<--I93`r!@t6jqI&4FBEC|tqw1V%f3ZOhD-@UdKvBD) zWPc^`D(p=moUfZnO7y-b2kh6LdSErgWPA6X-BoCO>zeJz@YRhDD`2Jfov-q>n?c*s zM&OclITDU^5E3||Q39L4;o%26t3zt=o&b_(3s*JxhVPk~wLw_=#vv|T;-nDI+T9)d zzGa3(_7V%h^Zri{#1^*h-hZIf(GUdc)t7JL)gNrlB2bdC+Fc0F;ryqac_c8hRapil zudZUI9wq^<@g=9VZU2RlN`A<9wH@hqM!?gMCS3;2KPdN=EN@+g-6KfMBtQ&J2dTo^ zb14*I^VKIoTvjLOvpTToweK%LNKSGKD#K=yhVfR|yNV(2&899W=U`RmG}CTR>0S(u z-c6tWc&3~e>VAg;r7PBYdaCM?a_F0L29BWKsieS3k7W3_=@7r)rgt66rLL6d*(?9; zIm|BiDRKO_Ao<_7A^&74|982IY%<_K|8K2wgok@m)w=HAzx}2)6Z!m|3EzOPEWw|M zdsOFhusj}S7a1aRLXjUKXOBZi8WHjr=dLuN=EVk1RSK3kG5Jyc27Byjmv zUfw<6UL2l2f>}7Cr9z_T&_Q#XX!}yT9v1QMM^12Wl<=0>`>Wlt3>g?00FrWS4Ww5E z-yKgvcMN+kH4j}wKG3&Q1e@6F4RqFClH)M^P;fqh?)_Y7(BZByOmLyUs&EcjQ}wh_ zoUNWa?EtL-H#e{4Yy>L^AY&O`DgurHneVx@$ljT(2nvt|1>I@XW#r*s=Dj2evvMPN zg>T;~`x9Bi1i!sk%7Pk8bejXR4h;~j1KGWrkIZ@gy%E;3w`UoPAty|)=$Me7y{ zej79T4+r@0BNS#plwZ9%jEu6Dl5Yfv0;e@fff@&%y_36#JlCW^q)g2fNB6u?*?|*o zW6k^bIT1d;VPi1vAP6=6@kr-;wg*fwn={wAuMT%1MzLR%oNg;OD8Y^kb5B63S6Tev zKvoZV`T324RUVRQ$ZQml@^HS%4y=UV^Nw) z8!2?bvSKz{pe>B1Ek&(SA+ zgBmL`ReT_BGC(hAd5*6#Usb@bt2rN1a>`!5eB}F`3WlR9Wj}RAOmg&#Od%yb7FHIS zlDg_xKnwGg$|%gi#=&Z+)CM+&PMFz;dZ7t6uM$(#!1Eo?ap@W%)G#>@eaSs%yRS${ zKrrGDeW8oQz13=V0DUvq-gm$wV`-*^EDW@_<6_V@av-b5LyD2lG|UUwFA1K3Tlw0x zY#_Qr(h|}P40}8JL1V?fK>0c3iQ6{`X3~lfLvEp4$k9d+ls!=0kn|X2a3JWiMTB8 z<%!0)ilL!5!GJmn{o&258gJ0(f-AA&K_}(I3u2ZDlxdRyFu|pubiSEz1)c~Cef9XX zCXX&52Fc`PdXlfD&v-Eq2M#4LyK;;d+Inx&bE8$lV^;9*lDyQBRXd%y+GxQ@(DlNE9g7 z`uT54VG&o}eVv3E*U^Z;LD>d-Akw85FX>MQ1!g$6#wtj<+wW!W^Q!(3n_a7Xp03=t zwYcugva;YQRs@+-hdWR2H0Mz& zCKNjpD8ACRo>8v8X%BkD5x8jAGZps1mW1mzUOo46xPbn~jT=aM1PpgKKcsuOiV0f!<{Ma6qM3Nor>;w*srU(+7{^g<0qjh$;sv|j6 zV;H4GD^k}P2_G=5{fr9PJwFPg6jG*pR3AD-Nl#DPHcwZ^d;_VxPueyHI-NAu z2rhACDqK+Ee`0c*oa&6s)bjY+vTsFMWm(4Ymoi_)wPq%&1M6?$H?l5&PS-drIFSG!Ler00}+Ivw4eq-#%EwP;6a>1SS4+6g zDJc8ubwoO(cs`Ogg~*ENrqw?Xz%DVFRADa)`!q&UCotF-k06EA7EPxz77m)rP$`#= z*s<1mau5R6#_mh#nIyETLJ&Ko2@E=k)_AYnxn+44$YOC?axB$|hU#){J<4Q^0MI^`<9JhK=E;RZz&pGFSr0mo5;O2xn}?OQA7yqhi*~ zW#E@FbK#OCcc#v-=WgWGa;xW985skbx!#-Kof~mIRj{(c4Q|W;Po==}8;c~{+&4oa z8oG)zkks?drE+@1|G8VOs)p)RL0QkYUhg;PxgjS})1Vb^00-Q05@nPvN~AaIu^z1| ziI83pGt;F~BnVL^`^8?re{N#bqF`UfC;?_=>X5{`1!9~j&)$=sLmsE$2RD0UkMG`~ zPC;9gIgSPoC^(JRyv`S?yM6n1*vL^o2%0Dr_j+-8P0Pc;ZEjgPqHrkm^9P;=_MsE;GaW_kFK1K6!gKl*Zil73 zE6mO#6iq?&UwL`waKH9eW2U|c#H^qE6nO#se&D=6fBu|1>Xub@#QeO<6ZzxNo-OkX zg{>O+>!>C0+Q1BR$`jp$*o+{uF1&5&1Mp0t=EHHR+Ti5W@+bIUzia?%{jE=xHH`8> z|Dy$vSox^~(pLDpS(Xh!Bn4bf5X+-!r}LWSnr_z2w!eFIY7!b&RN!CzEJ?H0FlU+CT zQdpd-1{N~kVXk@haqmOA>rF4lT;_HM%zCczH+Hs?Fv3I{9OumI5@BkDMs@r-nCCWz zdx5f-FJI=q$_uFokxP5?cynVhC z-3O+#KOY)3fBO!Ys;R4spt_WTOql!n`lg@)?9a-|dg%1+BhLR*$9ztX`0Q!D8&9&wcmYQ-d%U zQ^HN6_J@g&yKJ*FGtcBSbwHdLj9?>d9-P}|^Qn~y?Bi|cXS>AnDmPaJE;E-($mUr0 zuYaNgYE}bbNxTafUKjf80DXP(C ze`Ekd|ND}@Cg#eC?_h`I;p4FYJvnTM+%Otq9=kGRFH!Ngz`gifE7A_2kMlK%EBk8< zy_xV%mLSpy&!vYv9_QN5(wWl)N0u3v1`I{8fDVBdD>yqdTk$hAv4;e|NpY=t^$ENV z40vGfCi|r_kLNoUBDdf?j0DpnLuZ~GQY#?91j=|qE|mKZRT+9vSZ~etOg|-);}8`M z$MDw@!~7MOOty0-@i-whm5G6Y5!j$opuSR16?j~P)@qyE2GBcg8RW*%@EhJ@o1CjK za<$R#;G5+)R)G;;PO4B0glj^xSUoeF0_)my@9OH#nhf~;d8JGr4B)XjTDMbNGRrc1 z>61Y#Cs5@e=?xk>^s+}xnk>@X#(b55Eq6e31&04Q5K_zn*577r+yg}P@F*VjYg+*x zuApf~9O5{(Y?df6D4~Ec_2Fu*o9Hv(!p(unx_a#dAEfd++`N32FquU#`xEuM9*4}n zo0W-NI{Nx;f9ZwAKicuzo*Yg9_#K2h!2Jy%lk!>pgJyL7GUElt&C9ZXgpvI zAhG>Mr=7n&$1|t9@nESWnT8^At4CI>;4X?9xZM4C|tSVTCbsK za~|7>l2`OQzt*s8TJ>fME{)$G5>E&X0*^Ylpsz{?>-{EVAqZ?uOceWJX!7#&{0{hg zDCo&MuszbAH+fD4i9+SmZul)#A3l!Q_c&mf&5#+x+RXTA(qh-Yo{Vmv(3hQSb(gSAc`->*r zdKbkorSrp|i6CnJ?BvMlQAAQM-R5S$d&^9s=W3*ux8D+M zuORh8@6TE%*)QT>{r6zxwwt>8DV7{liV%H4v4RC$CSc2u8{ZQ;V9GeTaQkq+VF*Z{ zew)ZeNlEz>Jp}A+$hSwqoemx8RiSuMdq`cF#08-_Ir!7Ix}_ky+;V7hMtWneky4x`P>-h=i=MvyMoXL6`zb&Ss0%B@pKmKFdhCw*f{(`xY&H=VD9HX( zF%8(J2KG2CM(Jw0t4geZi)r&H1&hTtU3m+2*Wn%ereC!T=~f}W|fv$K~Z#{LIv%I`$^GHa*Y;WR* zT>YBwq4*dU(Y1 zJ%)Da9Z_$uX;YuaJV{D=2s$LSN|!NYN?m*B4%qklI@6>wY7YD%ps#%){i!`&K}XNr zlfG;N07TTP`H)l7cXU5VLq=S0fO$VBHGBATnn=KF{v#66JuvPcaUt=wV^KBgJF0ay zQ$~TdFWwRnb4;w|zzPjkG(@41krx2qz2a3WEXSJBqh(`r#n2G(0D&0f>QzFMfs!H8 zvDTg$4?(vtHv#b7^j$9>3R2i^&-OsVqai>=0jg}0c|5uO>KC7|@iq#wk72d~aeN^s z@LAtECKkR2Ct%3Q7BlQ3EkN8g#qe@7%Hw{a!SgKcze@vgoj%D1G=W=dA;>vuSnqHH zAeObCwqG=ixv&df5;V3n*4KwikTb#NnN;5yASq35??*m=-ZJphuxD+n(xKbx0nN!x zoLXCUc)+%|tK9K<+nX5_0H4Z*Oiu@b$srawoZMk`+M~v;dThS6!NCzIQ^o6tfm5Li zyNB+|RghSJ&N~gtOGL+$(rP;<7ixr7WxHtJ*3JB=&Xk7NAk+p0#V@2i5@`IIg>I`! z#I1Vt@YnCKTOWE@hr?&5Z*Yq4ycE`MX={VQWXX`z?W(bPd3L5Mz|+DJWBop-%pP+e zey5U>3}e0SgUqnO-dM;vH6JXt$UJsnu9@wghKK}FywE4#ZV3(Bg6R-Be)daea9|P& zc9}>ZldfSwy%cE53X@&0wE+7nTTbE2AEB4C72%gX<;X+F zqo^2JM#lt*J!*W(Dl?7BY)MRNdL?Frt8Ew2otGOr8#tG5=OG|A^IB$Uj(u)bPJIOW|AL3 z`vX8+JVGKO!&2)7dDOH)E{fr#;4}q};esv`CK)hmbLFc}!W31d zl0eMV$4oR;I15VjGt_%voD7rvAmR_{>Ti;MwMu8aGMjQJ*DmuZJ0mPH$e1ogcAJdBs8+ifkbnMO`MpMzC-KM-VjN&@n#( zZMWalheSGfm_Q{8GDx>J=8)e-ueq|h9r9T!1qB5^;RadW5?8SRMQ0X}=72AQL|Xyb zpAOjY7Az170H7$h!Ii+hDdnSu!diOo6C{gQ)nRdJ-b=E2DtyUrHrZ|;JLX&Fu+0Fr zet@Znr}4oG7H-nqyw>WuSo7iXqNEJBfx5*PXyx1;^xh@=|N z%Qs0suO2DhzKy7hg;y{|y&}|=BQLsK$n;6V^FnXH%_6iKGAS?WI>f|xJ|-?&K~F)9 zrK`!grKJUuIX+0Q_ckGk$T4)XOkK8)dE>;Nu$O;c%JduUpPdw#`l06cx1@$ znKO!2>~QA&S?82T&^eg(ltHHbnU{oQDT zCb+q^HQe{sy?d7pGAWFVqABi;3DAl8@cNDgk-_np8DwqyO=KjX~HPW*i2{oUEx|>~A zmJ}AfdBlEncb_m$vpL;65ma~C@;3{oTd3qdwfM2{vROxE1mcQzVA$WRNKE!P*PVX zhJ+lDYy+Q1-9JTiiW1Ph-r^h}7gBX6xZ(Y|yr-L!lQaCuw{N{;CFixZUqSvDEHY~f zb?#Rr`m6{cn(^;Ii^jMqS3OMZi4kGot!-?doM*{MOq%bVoFO40fhD#% z56wy$q)Lu~Q#$j8Nu8RSnyQ)_d+yR3Dr%jH!JA4-MvzYq`R{C^qBO9ifQSU}DYiLB zzNs1Z|Gu;8eDy8CTid*-TTV_Q_RjZ=NQkmNUX@p9Lk|gfJ(W87%XK2^NAVS%2SsW{ zxJ6h%dIi&}?I{bkE5va>HR04{NDAaH;C#IX32&YEe|a6s$%%yQHS|%S0-Qy6C!I{w z(e@g@epIYaz zU3)R=kwW&F-^jFWr=ILe-S}*G2uj0I@Av0Z{|5~XGgZM|OAh1V2_wH84DaXC25-%k zxw4jzS6&ZjUOR0-nGHzaYsrkwo*k$->fDt}N7WyWAHq+GkgeAujN|AVZ8E_ATo2qv z4qpI=rHW z9m&eEgSPt`hVUAr)uP$sp`%@JPp@wen0YRJ3i%>(B}4^>>bD&W&Tix6=NcRy!dVO6 zU6qIj_CvFa;KP`G6~S`!HE-yt^K{8LI{Q>w{I80$T(JZMfjsQ9)U;=KGM57-g$iJM zd=8)Y5oqb@ZT5eH>_duDAz=tb2<>%&}-n-xYM&a5Nzt` zcl^@xh=1+Tu>|Y%=CM!T&h(Kap<#MY%O5;BY_HM_zdAC~z=# zwgqkfV}9cz@j16zcDEX)-0vm)x}zbo*o4>8Vp@4)9-2RFujd5q3wpkUXgT}d%ma+@t22f2QMhqGd>A$CX5h46hkO4ccZ7^Y1@fkwi#TyC<=HM0C)OAy zz<4>rN*e7fFMp||PY{U^*VEIc2Ds=|rL+)PTs-1Q)(p)Lt`iMV)W)ZbSeX%IoNc*s z#en7rLN71#aV8`U(t+~=Ouc}?KhxXW8)`v^1M65Iu!Dpd4w+}Hw8(F4?~26cRdZ^1 zTVLO4Dk$JaWlefXDqIO|<34wl8?p`F3in7qg-`V?&*5h7_W@Xecu9gIZ|YXtalY>j zJ)5a4#rHXt7VDE==WDv__P4;+ep^X#^SHnel=QD^4kVS*eOXTTSEUd$;DnKUtq(oS zGUH!kL6R_|LXLcF{&4?4{JPJd$9`KV$Gu2C1%3r)EX7SdosYS>UlzOo5w2`H{(wsF z18lFfa)MjibYy468mq%@vbpsRIHFoxHBz8*zz{!c`kiH&$_He-cT0Fr@yOn@HD1J& zuK%lYvI-j#{#H1{AR{_V?%&_^H(=}gYXa{|!ho`5YM)c0m5O7{#Zg!!z zOLLAd4YE53oJY`D;Yxh>k`lnqoKYB%m`k0yN6q_>-2Endb>SWNcXxU`$WCoITn#|t zoRB#?@-3h%1ld7?4LLLAi!NJmssVl+kQ`9E-p4%TtFMLXB3Z_c52T0h-=l$B^Wcd* zWG;xoyX#mOPb;$Pwr-#N3N;%=TpP4;QVW9r{Y;L3`!Ajx*ncU%{d4~8nY=v5$mg*z z5d2+iI_)J+a1K|Ft{4`IkkL0k|F9hWqvhbh9~Ldp@<8zukzu5-A6JO)E}nK}(x(hX4Tq}vnwBUuAXi8Yg>rMh$MM~8N?$CUkqn-%zIZiRm+HKtHpmIY)4H2X zUAKg&6eZ9rnMQm?e#}6<;W~sEWxIzbduY~wr&O@}W5oe)Ku&M?*TDu$QL!a1J)y*} zpbLC2(6L^;z$Acynd>pRvlU=F;CFe#i@rZvZqK;i5|Eo~|E?7MI0}Vld;LN8vLdF+ z_IK6&rrXyIieHk+?!D|e-ImziCc!_KS1Mxz0Mf=^R`^6_*H?z>BR*yvQ^Gky^$a96 ztU_O)QVBh~HP@AsnfdrfsSr!hU%_z*+ybxxC)0hh&!(`~sIwR5z6;h!pgRYTQ44^|ZOM{Q`z@QEA56j7Sj{&R=`I1ncCTUp3z;)I~nGliHXrd z)7M#K=P~3Of`N`J4D{QX+|aTSR4(l+<2Vy(MrxI+j@~K6$86Z=n}luI*i2Q%A4Z2^J;cSE;N2>#m7j3)E!* z0D|Sv!YpNtO9=97ctpY;R7QqbQ9DUw-v(6TgUJ~^Ez@n}^yCDDy83!saUXTSU4X8t z3WKS0Y)-}rk>St~sNB|TCyq%IvGjym=#IUOY2@z<<{#pWxW?098YC&u#TUd=l7xgG zY;5XIzvA!J$rjce+=+^cPTu*INGum1&Z@B=8Nm|x62d4c85z~Atk@IHg6SbZ?h=&F z@bcC;)`-F-?cq-2P-4{*#zH+yGG!$-- z@DhaHdiPF*I_+q0tqG26%G;ZqE2+%*mFlxOTicdOv$yaBhQ}A4X%*6 z*b!HDNlDZ`5pDdNmyw0|^rB9{(A}pRS}6m;0<>%Z_1PvNv9`0>7~SG`!*q#}UpTk# zwW!<8=+4I)v`5|u_7+NXgmZlx_ynbaC2>`;rPiRqgW9Ss2F)M4#esuE7o&PxUbnP6 zdf3ZFg!t)ry;fF3W_kzzDG64jdZ}Bg`lMzF@*)Ucq$_O_5w>?NJRY;PJNb70Z)ew) zOP3xW9i4@;JG-zU{ncEWGFZ`ST$YKpLoMdL*80=Z_NBC`sga3^^R>z`|7&?!>%a`~ zXaN_xfo}6!VSNHDpx`DzhPZptZIqPMFJM@-ziERwYd!uT@H&`lv)n-aa=c#_xKHTP zu&)F+)_`dM$+!|f_;HXqFxc+JWjs9g91e(S_)Vk6EarfbuAogd9=P;rUHuLihfpX6 z2gfBOnRWmCez~f~2S`+(VtfPQA8R{#Ss=sOt_({TRviiH>dkD6jbGpgn(9tMqUQ{C zA{O|1JIg#DYS2*tc?Oy_<_!<4CyeW-tolJ~_wg$1%kvBCD8N|MmXm>msq--ihj*t* zX&V}Xh5?EzFNH+P7Z*>j<7~d}d}7h3o6esRy7x;8f7fJw2GWYr%69 z#y((TaYnWo#(es@QP^SqTMHhN?&7yTh|xQb#3v+xaW_dRH_sJD!XQN34zp){nA|HW zm2!>qBz#~ZIO9xEfZ*&mLEV8HCrJ_&|kPUmPrd>W3O68}BpQ+<}r_=D9MD`Io!x&JYBN+FF9wiun@D>VQa#+e**c>3lSHO+Vdd!w)K z)s#;L3T=tHpKq8UqQNe8E&6;k&5v4N*Z!GLR{P)Irb=78<==CnlL&F*>q(7z@ok9!(+3qPF=PAY)_xLApLgTBOm5kwI-Q!BF`{;dwc6vw<3ey zlf1hqXQldF6{d_84%0Stcz3X;*D>GFLx}quAXqTxJdYqj%7*B~TzJ7yNd1wA2Y^^5 zeoOssUmluT0doL%fiD8}32O*cJBLJOC;bmv|sJrr{l@e?c@w(Ib#Uw3ddH*Gwa$8*={;aLnqsg2RKWQF%WO-^;?%g}sj7TSjF< zHt1u1zRl#jGq^5S5D62zv&z&#bJoGx#V; z=)#Uw9?OZCQ1yr$k}W@I zJYa-74%V$O0!%+RzyrHv?7-Rwu%g1W-)f~s8jp+#td#u?6ha#8S0xGI?-#MN;$CZl ztY=3@jp1m#BX4mAge@)5YLe4;!1Nw+CMlhN3{QGU{GZmYGpMO{>(YBK(m~~=$QwW* zbR^PIiXc@$rI*m9gA|bxK$;Y(p=p4CNJpA90WmbCOGl(PrAi6k6aC(q@6Vn4-I<$T znK_e_lbq+-XYak%+N%?P?mH0A>jUrSdnTai-k9$R#wl0Y^|OD%U;yX$ia75xSMbvu zeq3c({07n<6flK@N=jA%y*^-Ps`(gQ0=Xm*QA!w=e7${plBF07)dBUSV{VSNfdSK+ z%M{RRaZ`kdNP&}q8p$4rf`C0+L|>m4*#FxV$)Ld{;y>LO#DPniKo=T^-6^yLio4A| z0c{#qj{*0qS9yU8vh`{FR`y7#0I($h_9n@b21@Yy$<@!iQJ|4o=R9*~a2g4)G(9t8 z&C9HpMMQLTB$R5Je=fawFua}ySuMGVb;0AJ*|*q5aJ;Adp-CC)<4dKk&*oe|Re~<( z=a*$Ci=$+rBI&%4q#^{)1)U3R-yefVDoud(^3mzKnw$f>+dx&B zdv77ABpF}!Ig5l#!~4afaJ8tv^g&k*!b_$RiKTbQ-Nn<_AqR2%5PJXnQ5Zd@&=!ovF@V=Qp0MV zu?;GH`~KEBH@(z1x`|S>$}l6Ki<2`7ZW2uqqWB)cF;VN!_Fa`jPa-aKPWf{q@#FC5 zZ`@cgsi?anBG%-cJ3Sy4C=?96CiT|Z*bP_)HXdMvrqqQ6nKO6F$?)BxPoXQ(0JY)y6 z5)j6SA$fG8Yj~%{Mg=OoCv_M~4YG8p5Cu>^6r;b6a7c#+B+3Lbt6Bn6Vc_aBwSa6D z&IN-`BVBhtr(6S-@_kUENy-Jc!sLgeP>w*FcgeFpa=Br&X6RN=q-);B$=!RI*TU&q zjnqd-bZL)&NEk#dV~q^L6nL0b%}fs8j;{u7+x}Iv<=3~&7?03KxzsD#EM@nV_hSSx zkJMGnDK=Vj!wSASyp&7XOxCgPZNUU?&@8YhfTEjl&X3q*ZOIKthg)6BmiI6HHZLfVefqNJ{U`re0(e|(y+uJ={(T} zI2$D;<(BOo#7}PSafpeDUH8ff+-ZrL^jy9UO7MV#_1osooInNF$wTHo^(MqwA~+KT zXGOKQ;S)|Yi09I9ecjt14#C+tQ}?f&d@A(|QUFg9zoo$h1{MwsFwVp=h*qcSX>q2V zZY>8Qsj19@=nj|q*-tp&4}jCSLCzqwg6wgQXdZ~HQR+JJ&)I~+=>+cJl|d%E(HT2d z>#}(k8H$kMyh=OTQoCl=msbiMrry9Ldn&Vnd&H<2ro8z=MtyCTs4Ux5L-NYY5)Y~s z_$8W18{a1B2cP1hxG%HrT6s3I2CUsQNOQIwJRHTVfvtI+Bs9h|4?oOzI458)J-U9p zC|4r*RpWExFRx8l*a%Ha@oaVSn^;uRmwbUVNB1w2#(55sMj)5Ae|XL+NZ~)HEtB^b zs=$v@tu4xSGwbdo{Kq2*VXT)MLpf1{ju8Q_3pjPr#Kj6oq zw4gp&0YK6%J*G>-rhVW({5qgLG!d6dv_ zh%U_lHSU1ik-2Nb8vl04t|IOMIAi$@35Y?5n=*Y_Fdjoa4GqLfnwhKJ`p6*80={=E zN!ivm^*Ph!aJrt}q|wTB{&W%)_XlX0$@2RK0m6r(-hrC&mVr&nvDqIhLf zF@91ZVQd3&@gx!3*g7@Y+d3^qLtg+}VNaX;&v{_+fQaipcHbT_V?ja+=+IWy)}S?x z!>Zw<@U*ukidm9tz>(w`NDWhqi-+VZ8_R)$Z=%{>itDTIWmYO6z618iG{&Rw%MgwEW#1j|g2!G5D9Ld3_|*#|3RY>9#F6UW zXu7oI1qvcu$5!Fj(#~{nPwuXyHitks-69cr=;v!}OWBf0!Sq{JM!szwW{*^(-gn9zrQIG$ zV_9@6a|wFt+;}}BE!wVHKP^{1U>v(CJRNH1JEZ$S%}R|0?z8i1uwk4oBPF=aN7_8e z;N>#mkZuEqQ)`2ic4wZ;QTt!^-fo}MXFIlI3M$JPRI3+C-drf$b5-v z1lz@hV?hcAa!+7*Y6l1b0sEUzC-)x!k7oe2AOn7q2g`X7Xr_szKKuYWw%MF|%#vWw*jWpN#lhXvFpQsPjaQt3lJVW;fUeePhL!ioCab*A=a`W%gkH z?DjU$Aa(O+aL?;2=TV5e8=-Ri_z+@a8_rAf2t5JWDaOf}a8ZmrBSF~Ik0 zI9~iQebM#|h`zCa9I!CJ{rdH5Dww@=Qc@D|PSN2O3%A9jdGvO%fJts4D0^300Cnr) zG`U?ZM{_Jl@v$lhuE{u&PdHWYwz8m(1y&y%YDl>-;jB7nkUbN~8#|%^fw9xlt=1JZ z)O*HmWRTmqwX1EGlP%s8qjlPB;t^*=pd$hfOoy1tA-YTu;A-On9RJocO5xfqzJ`!t zs*Cu7@D)y%;GBYDlQg!I){;Vpx*;bf;%fhfg%GC&hM3)r%-O=x0*?T{AYotE;l0k5 z2t#HFBNH=bNDumERP4jsLnl82@uw5crpK(ERo64)uK~5K0rPN`(#2SfyCV`E8Q&k& zQ_o-;&U}(dY(lwW!4n31o;+x?#5{c`JCV?2OW zp#6k(nCsL~!{h-Tu)qpPZ(*u*nGY&@PG6MFhfDkXh7pe|<9lzJ#T0zBc#8wf=vq;D zf&g70y8>u4IGBM9w7!1h3OFPIyaCPb|9co=y&9Tv3j#^`cC#RM6q;W4oKWz?Q${r$ zL;>^0^HS;Nxu`X@sBf~}p`^#^eC$sIN$G_p-dV4R%HtMB+!>E^6D9v&IOo5CLI1_! zv+G%#1h`*vCT~(j8IQR72R()H08 zdBexL8+P>pOS}as!>;7wo@5=x;Gb*r=qO?xuBm{O)W|cS9JzGeh5lTNKro^*cm`j0 zcvFyq6V8&33SK?;OzZ&}{qOI$ldw%!{?5_VscQaMHrS1@Hq}<}lW1vvUIE;T$6XS6 z!p?ASswzZTLz%WpE`-sx%Z!$tfVK{dDfshw-(mna8a6EF*H2VD;hs4`cKqCdS&wdp zM1&<5gcd+mKN2eE+hz)`N6(e(Rzl8ZNqk&Qb)MWYGteex3d0vQGZMXA>g1M9uP2yE z&C5FP&XD&9iO$}IU}P`%u&O0uixMo``${0`SP^m9llX}xuajIENS5>(wVy`1AN>XUR?Po>%d&06y!o2(sC;0wR$7niQ6x^OB~ky zJ>Fts^=~qwusnEK#sxpi!z25;vh2>UeAR2dp9Gtc0aZP7RA zDCv~y!hqPHmG>joy+Y@5WcjfDd5HW`;<3i693wQg!`$XZYuj_OKGUC{)3lYjoH zg#@6)Ei7hF(xW$tjCwb*I`k})QS*q7i|gr^eNzLF6|L_61k2TeI65wtJmM9jU!o&M z%tO6vsAbNP=xmmdAP+Se9evm4G%}SmhzI>oNKjs;jU$>75~{-+CC*sn&Bp#A&{I~u%swwBxDk-F$m9PaDUAx=}x7%nZ3{uAW>O}PH= p9R3%P_BZkj_RN2F*nTUAG;T*)Hre*nx~y(j