(function webpackUniversalModuleDefinition(root, factory) {
	if(typeof exports === 'object' && typeof module === 'object')
		module.exports = factory();
	else if(typeof define === 'function' && define.amd)
		define([], factory);
	else {
		var a = factory();
		for(var i in a) (typeof exports === 'object' ? exports : root)[i] = a[i];
	}
})(this, function() {
return /******/ (function(modules) { // webpackBootstrap
/******/ 	// The module cache
/******/ 	var installedModules = {};
/******/
/******/ 	// The require function
/******/ 	function __webpack_require__(moduleId) {
/******/
/******/ 		// Check if module is in cache
/******/ 		if(installedModules[moduleId])
/******/ 			return installedModules[moduleId].exports;
/******/
/******/ 		// Create a new module (and put it into the cache)
/******/ 		var module = installedModules[moduleId] = {
/******/ 			exports: {},
/******/ 			id: moduleId,
/******/ 			loaded: false
/******/ 		};
/******/
/******/ 		// Execute the module function
/******/ 		modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
/******/
/******/ 		// Flag the module as loaded
/******/ 		module.loaded = true;
/******/
/******/ 		// Return the exports of the module
/******/ 		return module.exports;
/******/ 	}
/******/
/******/
/******/ 	// expose the modules object (__webpack_modules__)
/******/ 	__webpack_require__.m = modules;
/******/
/******/ 	// expose the module cache
/******/ 	__webpack_require__.c = installedModules;
/******/
/******/ 	// __webpack_public_path__
/******/ 	__webpack_require__.p = "/";
/******/
/******/ 	// Load entry module and return exports
/******/ 	return __webpack_require__(0);
/******/ })
/************************************************************************/
/******/ ({

/***/ 0:
/***/ function(module, exports, __webpack_require__) {

	__webpack_require__(343);
	__webpack_require__(338);
	__webpack_require__(327);
	__webpack_require__(335);
	__webpack_require__(333);
	__webpack_require__(334);
	__webpack_require__(356);
	__webpack_require__(353);
	__webpack_require__(355);
	__webpack_require__(354);
	__webpack_require__(352);
	__webpack_require__(351);
	__webpack_require__(348);
	__webpack_require__(349);
	__webpack_require__(350);
	__webpack_require__(342);
	__webpack_require__(336);
	__webpack_require__(344);
	__webpack_require__(337);
	__webpack_require__(340);
	__webpack_require__(341);
	__webpack_require__(326);
	__webpack_require__(43);
	__webpack_require__(330);
	__webpack_require__(345);
	__webpack_require__(331);
	__webpack_require__(328);
	__webpack_require__(42);
	__webpack_require__(329);
	__webpack_require__(347);
	__webpack_require__(346);
	__webpack_require__(332);
	__webpack_require__(339);
	__webpack_require__(659);


/***/ },

/***/ 1:
/***/ function(module, exports) {

	/*
		MIT License http://www.opensource.org/licenses/mit-license.php
		Author Tobias Koppers @sokra
	*/
	// css base code, injected by the css-loader
	module.exports = function() {
		var list = [];
	
		// return the list of modules as css string
		list.toString = function toString() {
			var result = [];
			for(var i = 0; i < this.length; i++) {
				var item = this[i];
				if(item[2]) {
					result.push("@media " + item[2] + "{" + item[1] + "}");
				} else {
					result.push(item[1]);
				}
			}
			return result.join("");
		};
	
		// import a list of modules into the list
		list.i = function(modules, mediaQuery) {
			if(typeof modules === "string")
				modules = [[null, modules, ""]];
			var alreadyImportedModules = {};
			for(var i = 0; i < this.length; i++) {
				var id = this[i][0];
				if(typeof id === "number")
					alreadyImportedModules[id] = true;
			}
			for(i = 0; i < modules.length; i++) {
				var item = modules[i];
				// skip already imported module
				// this implementation is not 100% perfect for weird media query combinations
				//  when a module is imported multiple times with different media queries.
				//  I hope this will never occur (Hey this way we have smaller bundles)
				if(typeof item[0] !== "number" || !alreadyImportedModules[item[0]]) {
					if(mediaQuery && !item[2]) {
						item[2] = mediaQuery;
					} else if(mediaQuery) {
						item[2] = "(" + item[2] + ") and (" + mediaQuery + ")";
					}
					list.push(item);
				}
			}
		};
		return list;
	};


/***/ },

/***/ 2:
/***/ function(module, exports, __webpack_require__) {

	/*
		MIT License http://www.opensource.org/licenses/mit-license.php
		Author Tobias Koppers @sokra
	*/
	var stylesInDom = {},
		memoize = function(fn) {
			var memo;
			return function () {
				if (typeof memo === "undefined") memo = fn.apply(this, arguments);
				return memo;
			};
		},
		isOldIE = memoize(function() {
			return /msie [6-9]\b/.test(self.navigator.userAgent.toLowerCase());
		}),
		getHeadElement = memoize(function () {
			return document.head || document.getElementsByTagName("head")[0];
		}),
		singletonElement = null,
		singletonCounter = 0,
		styleElementsInsertedAtTop = [];
	
	module.exports = function(list, options) {
		if(false) {
			if(typeof document !== "object") throw new Error("The style-loader cannot be used in a non-browser environment");
		}
	
		options = options || {};
		// Force single-tag solution on IE6-9, which has a hard limit on the # of <style>
		// tags it will allow on a page
		if (typeof options.singleton === "undefined") options.singleton = isOldIE();
	
		// By default, add <style> tags to the bottom of <head>.
		if (typeof options.insertAt === "undefined") options.insertAt = "bottom";
	
		var styles = listToStyles(list);
		addStylesToDom(styles, options);
	
		return function update(newList) {
			var mayRemove = [];
			for(var i = 0; i < styles.length; i++) {
				var item = styles[i];
				var domStyle = stylesInDom[item.id];
				domStyle.refs--;
				mayRemove.push(domStyle);
			}
			if(newList) {
				var newStyles = listToStyles(newList);
				addStylesToDom(newStyles, options);
			}
			for(var i = 0; i < mayRemove.length; i++) {
				var domStyle = mayRemove[i];
				if(domStyle.refs === 0) {
					for(var j = 0; j < domStyle.parts.length; j++)
						domStyle.parts[j]();
					delete stylesInDom[domStyle.id];
				}
			}
		};
	}
	
	function addStylesToDom(styles, options) {
		for(var i = 0; i < styles.length; i++) {
			var item = styles[i];
			var domStyle = stylesInDom[item.id];
			if(domStyle) {
				domStyle.refs++;
				for(var j = 0; j < domStyle.parts.length; j++) {
					domStyle.parts[j](item.parts[j]);
				}
				for(; j < item.parts.length; j++) {
					domStyle.parts.push(addStyle(item.parts[j], options));
				}
			} else {
				var parts = [];
				for(var j = 0; j < item.parts.length; j++) {
					parts.push(addStyle(item.parts[j], options));
				}
				stylesInDom[item.id] = {id: item.id, refs: 1, parts: parts};
			}
		}
	}
	
	function listToStyles(list) {
		var styles = [];
		var newStyles = {};
		for(var i = 0; i < list.length; i++) {
			var item = list[i];
			var id = item[0];
			var css = item[1];
			var media = item[2];
			var sourceMap = item[3];
			var part = {css: css, media: media, sourceMap: sourceMap};
			if(!newStyles[id])
				styles.push(newStyles[id] = {id: id, parts: [part]});
			else
				newStyles[id].parts.push(part);
		}
		return styles;
	}
	
	function insertStyleElement(options, styleElement) {
		var head = getHeadElement();
		var lastStyleElementInsertedAtTop = styleElementsInsertedAtTop[styleElementsInsertedAtTop.length - 1];
		if (options.insertAt === "top") {
			if(!lastStyleElementInsertedAtTop) {
				head.insertBefore(styleElement, head.firstChild);
			} else if(lastStyleElementInsertedAtTop.nextSibling) {
				head.insertBefore(styleElement, lastStyleElementInsertedAtTop.nextSibling);
			} else {
				head.appendChild(styleElement);
			}
			styleElementsInsertedAtTop.push(styleElement);
		} else if (options.insertAt === "bottom") {
			head.appendChild(styleElement);
		} else {
			throw new Error("Invalid value for parameter 'insertAt'. Must be 'top' or 'bottom'.");
		}
	}
	
	function removeStyleElement(styleElement) {
		styleElement.parentNode.removeChild(styleElement);
		var idx = styleElementsInsertedAtTop.indexOf(styleElement);
		if(idx >= 0) {
			styleElementsInsertedAtTop.splice(idx, 1);
		}
	}
	
	function createStyleElement(options) {
		var styleElement = document.createElement("style");
		styleElement.type = "text/css";
		insertStyleElement(options, styleElement);
		return styleElement;
	}
	
	function createLinkElement(options) {
		var linkElement = document.createElement("link");
		linkElement.rel = "stylesheet";
		insertStyleElement(options, linkElement);
		return linkElement;
	}
	
	function addStyle(obj, options) {
		var styleElement, update, remove;
	
		if (options.singleton) {
			var styleIndex = singletonCounter++;
			styleElement = singletonElement || (singletonElement = createStyleElement(options));
			update = applyToSingletonTag.bind(null, styleElement, styleIndex, false);
			remove = applyToSingletonTag.bind(null, styleElement, styleIndex, true);
		} else if(obj.sourceMap &&
			typeof URL === "function" &&
			typeof URL.createObjectURL === "function" &&
			typeof URL.revokeObjectURL === "function" &&
			typeof Blob === "function" &&
			typeof btoa === "function") {
			styleElement = createLinkElement(options);
			update = updateLink.bind(null, styleElement);
			remove = function() {
				removeStyleElement(styleElement);
				if(styleElement.href)
					URL.revokeObjectURL(styleElement.href);
			};
		} else {
			styleElement = createStyleElement(options);
			update = applyToTag.bind(null, styleElement);
			remove = function() {
				removeStyleElement(styleElement);
			};
		}
	
		update(obj);
	
		return function updateStyle(newObj) {
			if(newObj) {
				if(newObj.css === obj.css && newObj.media === obj.media && newObj.sourceMap === obj.sourceMap)
					return;
				update(obj = newObj);
			} else {
				remove();
			}
		};
	}
	
	var replaceText = (function () {
		var textStore = [];
	
		return function (index, replacement) {
			textStore[index] = replacement;
			return textStore.filter(Boolean).join('\n');
		};
	})();
	
	function applyToSingletonTag(styleElement, index, remove, obj) {
		var css = remove ? "" : obj.css;
	
		if (styleElement.styleSheet) {
			styleElement.styleSheet.cssText = replaceText(index, css);
		} else {
			var cssNode = document.createTextNode(css);
			var childNodes = styleElement.childNodes;
			if (childNodes[index]) styleElement.removeChild(childNodes[index]);
			if (childNodes.length) {
				styleElement.insertBefore(cssNode, childNodes[index]);
			} else {
				styleElement.appendChild(cssNode);
			}
		}
	}
	
	function applyToTag(styleElement, obj) {
		var css = obj.css;
		var media = obj.media;
	
		if(media) {
			styleElement.setAttribute("media", media)
		}
	
		if(styleElement.styleSheet) {
			styleElement.styleSheet.cssText = css;
		} else {
			while(styleElement.firstChild) {
				styleElement.removeChild(styleElement.firstChild);
			}
			styleElement.appendChild(document.createTextNode(css));
		}
	}
	
	function updateLink(linkElement, obj) {
		var css = obj.css;
		var sourceMap = obj.sourceMap;
	
		if(sourceMap) {
			// http://stackoverflow.com/a/26603875
			css += "\n/*# sourceMappingURL=data:application/json;base64," + btoa(unescape(encodeURIComponent(JSON.stringify(sourceMap)))) + " */";
		}
	
		var blob = new Blob([css], { type: "text/css" });
	
		var oldSrc = linkElement.href;
	
		linkElement.href = URL.createObjectURL(blob);
	
		if(oldSrc)
			URL.revokeObjectURL(oldSrc);
	}


/***/ },

/***/ 8:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHqSURBVDiNpdOxquJAFAbgf5JsoriiRsTKwkqshGy5r5Bub2XnC9zOV1CwWgRfwmJbsRVEBReERbAVUSJa2EWdOXO2mly9brcDw8mEzJ/vDIlgZvzPcD7fCIIgdl3XAoBer+d6nodcLofD4cCLxUIzczwajTwhxJ/JZPLN+hxARCkhhMvMLgBkMhn4vo84jsVyubS11l+Z+QszB/8UaK1NEAAgnU4jlUrB931Uq1UwM7TWEEJ8tBAEQex5ngUAg8EAhr3f7zEcDqG1xng8hud5LwGWYQNwieiJfbvdsFwuE9n1ekWj0UCtVkuk1iPbVMMuFAqoVqvQWiczDEO0Wq3kWcdsZGbYto1+v49sNgvbtmFZFogIq9UqYZdKJURR9BzAzKjX6/B9P+mNmSGEADMjn8/jfD5js9lgu93CsiyY7ycRdLtdXC4XSCmhlIKUEkSUVCEE2u02isUiTqfTawtaa5TL5WSzqebasM36JUBKiePxiNvtBiJ6UiilEvZut4PjOAjD8DWgVCo9vf1RYdjz+fyX1lpNp9PfnU7nI0Aphfv9/kI31bD7/f6Pl5/p7e0NUkpEUYT7/f50gEopENET+3EIZkalUnlvNpvfpZQOETnM7BCRTUSWOSxmlrPZbLVer38CuAKImVn9BQ7ZlX92J+HcAAAAAElFTkSuQmCC"

/***/ },

/***/ 10:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAM7SURBVDiNlZSxSytZGMV/N3MnkxlRV5M8NUFB5MESTWEgliJYuHX+BQurXf0DtlvwT9DK1lJs11IbBTcoCjYbMKgpnhYSTDRm7r1bbOa+iQZ234XDzdz55sw55/smwhjDx1Uqlb75vv9Tp9N5E0Kwvr7uFwoF6fs+qVSKZDLJ09OTrlarYS6Xk9VqtX58fJwRQgTGmJ2Tk5PfEp9YAa11Vgjhaq2He5BCCHzfZ3R0lLGxMZrNZmJ/fz9Zr9cT7+/vs8aYYWOMI4T4FUAOIo5cGGMskskkqVSKIAhwXRfXdTHG4DgOWms+Oh9IHBVqrRFC/FsoJa7r2t1xHEscvTwuSgIsLS394XnelzAMOwDLy8vk83lc1yWRSCCl5Pr6GoAwDHl9faVWq1Eul1FKUavVrAgrBKDb7f7uui6dTgchBPPz8ywsLDA8PMzIyAie53FxccH29jaVSoXHx0fOz88RQnB5eWmfi69EZD2eaWQ9CAKGhoYIggDP8zDGIKVEa20BUC6XKRaLNj6r2BiDEKIvJ9d1SSaTFlGTHMdBKdXXrK2tLcIwZGdnh7Ozs++Ko6JIRavV+tSs2dlZNjY2KBQKtNvtvomp1+t0u13ryirWWtNsNgmCAGMMh4eHHB0dkUgkbEPiCp+fnwHsvYmJCZRSffHYKJRSvLy82OJWq2V/R42JX8ebFYahJe5TbIyhVCqxublpH9Ba9xXHG6a1ptPpsLe3x8PDA3d3d2QymT5iOxWLi4sUi0WCICCVSuF5nv1fkFIipcRxHBzHQQjBzMwMc3NzaK3JZrOW9JPiyFI+n0cpZRHZHHQWkcWvo4ztVGitCcPwhxAR39/f0+12yWazrK6u9k9FpOT29ta+/aPS+Fkmk7HWM5kMSina7TaNRqM/ikjx1NTUf0YRnUfWDw4O/uwpf2o0Gn/1Ecez+hFiYwy7u7u/8GFJgHQ6jRCCMAyp1+t9oxZvTHxPp9NIKRkfH//I+Z24UqmQTqdRSjE5Ofm/VEex5XK5gcTCGMP09PTN2trazysrKwM/hvgoRfeVUpyennJzc/P31dXV14HEQggH8AAfSPXgxxD0dgd4B96ANvDaw1tvj866/wAZT/Bx7BH3JQAAAABJRU5ErkJggg=="

/***/ },

/***/ 12:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAOCSURBVFiFxZW9T+tIFMXPHY8/8BrRJSAgDc2TKCMhpIiW4klP2pZiS2okGio6CuhoaFyy/Am8pdliEatEoBR0r4psPgoiIZIKIxJ7tiAzcsw4Thae3kijGY89d84992ebhBD4lY390tMB8KIHqtXqDyHEF8/znp+fn2MiwtTUFO3t7XkAYJomTNOE67owDAMA0G63k263KwCQ53lsf3//zyiKficiE0BfCPHt4uLin7EExHH8hYgAwE2SBEQEWTYigm3bcF0Xtm3DNE0wxuD7Pms0GlheXsbGxgZM0/wjiiIIIUBEIKLvAH4bS0CWESHE0BrnHI7jwHVdcP4WjjGmnuGcI0mSoT1E5Kr9kwiQczk6jgPbtmFZFjjnICIwxpRLRKQVkG6FAnQHy5ExBs45DMMAY0yN6TIZhoE4jpWgrJCxHUhvTgc0DEPV3rIsAMDKygqmp6dRLpchhEC/3y92II/2o6MjAHraHx4ecH9/DwDwPA8nJycIgkCJq1araDQaiKIIA5DzBfxP2pGmvd1uo9/vqz1XV1d4eXkZ6bAS8JNoz7V+pIDPpH1ra0slc3p6ijAM9QJ0B38G7aurq0iSBHEcw3VdHBwcjHbgs2m/vb0FAJTL5XeJagUIITAzM6PsPD4+RqVSUfAZhqGyjeMYtm3j8fERvu9raZ+dnVUO6Er0TsDT05MKQkRoNptoNpvyGz50T47p9WyTB0sRhQImaeNQns5ed86QACJCrVbD+vq6NpAOUl1P095qtQAA8/PzQ0xpBQBvr83S0hKAYfvSmRTN07QvLi5OxgDnHEII3N3dodfrDW3MCsp24D3tco/MvlCA3CTpTasfx5FspnnruQImtTtvnhUgO2NstAD5fo9zUN69dLwgCEBEmJubQ5IkODw8xOXlZXEJWq0WXl9f39VfNxdCqIOztC8sLAwl5Ps+Op0OdnZ2RjtQqVQmtl5X63q9ruDrdru4vr4G5/zvkQxMAl1e/WW83d1d/SeyqAQfhXHcL6sSIP/xHwUwj/ZCAZubm6jVagqoIAgUhLIXwTiK9rxG0qq1tTVRKpWwvb2NUqn0IQBvbm5wfn6OTqeDs7Oz8RgIw/CvMAy/1ut1OI6jMtP19D3dc5J2xti/RDQHoA+glxp7QohEOUBvvyc2EGQNRnPQrcFoD+ZWZh0A4kHw10Hvpebyupda7wGIhRDJf87CAqpgeW6iAAAAAElFTkSuQmCC"

/***/ },

/***/ 15:
/***/ function(module, exports) {

	module.exports = "data:image/gif;base64,R0lGODlhEgASAMQaAHl5d66urMXFw3l5dpSUk5WVlKOjoq+vrsbGw6Sko7u7uaWlpbm5t3h4doiIhtLSz4aGhJaWlsbGxNHRzrCwr5SUkqKiobq6uNHRz4eHhf///wAAAAAAAAAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAAAaACwAAAAAEgASAAAFaaAmjmRplstyrkmbrCNFaUZtaFF0HvyhWRZNYVgwBY4BEmFJOB1NlYpJoYBpHI7RZXtZZb4ZEbd7AodFDIYVAjFJJCYA4ISoI0hyuUnAF2geDxoDgwMnfBoYiRgaDQ1WiIqPJBMTkpYaIQAh+QQFAAAaACwBAAEAEAAQAAAFY6AmjhpFkSh5rEc6KooWzIG2LOilX3Kd/AnSjjcyGA0oBiNlsZAkEtcoEtEgrghpYVsQeAVSgpig8UpFlQrp8Ug5HCiMHEPK2DOkOR0A0NzxJBMTGnx8GhAQZwOLA2ckDQ0uIQAh+QQFAAAaACwBAAEAEAAQAAAFZKAmjpqikCh5rVc6SpLGthSFIjiiMYx2/AeSYCggBY4B1DB1JD0ertFiocFYMdGENnHFugxgg2YyiYosFhIAkIpEUOs1qUAvkAb4gcbh0BD+BCgNDRoZhhkaFRVmh4hmIxAQLiEAIfkEBQAAGgAsAQABABAAEAAABWOgJo6aJJEoiaxIOj6PJsyCpigopmNyff0X0o43AgZJk0mKwSABAK4RhaJ5PqOH7GHAHUQD4ICm0YiKwCSHI7VYoDLwDClBT5Di8khEY+gbUBAQGgWEBRoWFmYEiwRmJBUVLiEAIfkEBQAAGgAsAQABABAAEAAABWSgJo7a85Aoia1YOgKAxraShMKwNk0a4iOkgXBAEhgFqEYjZSQ5HK6RQqHJWDPRi/Zyxbq2Fw0EEhUxGKRIJEWhoArwAulAP5AIeIJmsdAE/gEoFRUaCYYJfoFRBowGZSQWFi4hACH5BAUAABoALAEAAQAQABAAAAVloCaOGgCQKGma6eg42iAP2vOgWZ5pTaNhQAxJtxsFhSQIJDWZkCKR1kgi0RSuBSliiyB4CVKBWKCpVKQiMWmxSCkUqIQ8QbrYLySD3qChUDR3eCQWFhoHhwcaDAxoAY4BaCSOLSEAIfkEBQAAGgAsAQABABAAEAAABWOgJo6a45Aoma1ZOkaRxrYAgBZ4oUGQVtckgpBAGhgHqEol1WiQFgvX6PHQJK4JKWaLMXgNWq7GYpGKJhMShZKSSFCH+IGEqCNIgXxAo1BoBIACKHkaF4YXf4JSh4hmIwwMLiEAIfkEBQAAGgAsAQABABAAEAAABWSgJo5aFJEoWaxFOi6LRsyE5jhooidaVWmZYIZkKBpIwiHJYklBICQKxTUCADSH7IFqtQa+AepgPNB8qaJGg6RQpB4P1GV+IWHuGBK9LpFo8HkkDAwaCIYIGhMTaAKNAmgkjS4hADs="

/***/ },

/***/ 18:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGwSURBVHjapZM/SMNAGMVfoth0q9rBOtZVxM1BEP/QrUWh4iSujurgIMVNsOisuLuouNnBQWc3BcdCwQ7WUkHNNX+atpd4XyLhQh0Kfbl8l8C93z2+XBTP8zCIhqnkstnvVstJ7OztQ5aiUlWhqgoUBVAQ3KcnRWha7OeuVBr1AZZpJSZSE1hYXIInA4DAKApBxPDn25srVCqVRJjAdV1oMQ3ayBAuH16jKfxCI0ixlZkB59z3hAAuXrrdrqADmyvTtD5MQj1yvb9ZPJhOh9b6nkgCojbtNplDeQGBBlwCBJDeBC7nPtUQgOv7J8gKvxKlEFc+M0drydObgBk2MvOzshueZCZW03T+SeBycEE93N1GnyKP1EQeNLF/BZ5oDzodkI6Kx4jH42F8OgMkir2RX/fnqXQ62oOO2N1pt0Eql8u4ODuHZVs4KBQgKzU5idpHjT4heSSA2N1xHJAYYzBNE4ZhQNd1yPKE0RXRk8kk3qrVSBO/GNPH6DQyncG2bUrUAyAwbWZbFricQOF8mTWbj7rOxhufDeTWVkGq1+uQ9V6rUQ48v7xAHVJ/IDTw7/wL+9Ie9hdQT1wAAAAASUVORK5CYII="

/***/ },

/***/ 41:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAIRQTFRF////AAAAAAAAAAAAQYfbAAAAAAAAAAAASYzcQojbRInbhrPnQojbQYfbQYfbQofbRInbRorcSIzdSo3dTI7eT5DfUZHfU5PgVZTgaaDndanqgrHtjrrwmb7vmb/vmsDvm8LznMHwoMbzpsn1p8r2rs73r8vusMzuttX5wdjxw9nyxNry3mvlKAAAAA50Uk5TAAQJHyI8Pj/L+vv7/P70ZqA0AAAAXklEQVQYGV3BMRIBQRRF0Xt/PwEBC2D/+xJJ1YRqTEtGdXMO/PF4AF7ryi7tWvR7ndjF9wY3vh5e+BXPzJbYV4YYS4YylgxlVAaNhkFjyaCxMTM+mWkrkV3vm8qsfwDirhBpHkLSTAAAAABJRU5ErkJggg=="

/***/ },

/***/ 42:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2007-2013 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Addressbook');
	
	/**
	 * Contact grid panel
	 * 
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.ContactGridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 * 
	 * <p>Contact Grid Panel</p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Addressbook.ContactGridPanel
	 */
	Tine.Addressbook.ContactGridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	    /**
	     * record class
	     * @cfg {Tine.Addressbook.Model.Contact} recordClass
	     */
	    recordClass: Tine.Addressbook.Model.Contact,
	    
	    /**
	     * grid specific
	     * @private
	     */ 
	    defaultSortInfo: {field: 'n_fileas', direction: 'ASC'},
	    gridConfig: {
	        autoExpandColumn: 'n_fileas',
	        enableDragDrop: true,
	        ddGroup: 'containerDDGroup'
	    },
	    copyEditAction: true,
	    felamimail: false,
	    multipleEdit: true,
	    duplicateResolvable: true,
	    
	    /**
	     * @cfg {Bool} hasDetailsPanel 
	     */
	    hasDetailsPanel: true,
	    
	    /**
	     * inits this cmp
	     * @private
	     */
	    initComponent: function() {
	        this.recordProxy = Tine.Addressbook.contactBackend;
	        
	        // check if felamimail is installed and user has run right and wants to use felamimail in adb
	        if (Tine.Felamimail && Tine.Tinebase.common.hasRight('run', 'Felamimail') && Tine.Felamimail.registry.get('preferences').get('useInAdb')) {
	            this.felamimail = (Tine.Felamimail.registry.get('preferences').get('useInAdb') == 1);
	        }
	        this.gridConfig.cm = this.getColumnModel();
	
	        if (this.hasDetailsPanel) {
	            this.detailsPanel = this.getDetailsPanel();
	        }
	
	        Tine.Addressbook.ContactGridPanel.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * returns column model
	     * 
	     * @return Ext.grid.ColumnModel
	     * @private
	     */
	    getColumnModel: function() {
	        return new Ext.grid.ColumnModel({
	            defaults: {
	                sortable: true,
	                hidden: true,
	                resizable: true
	            },
	            columns: this.getColumns()
	        });
	    },
	    
	    /**
	     * returns array with columns
	     * 
	     * @return {Array}
	     */
	    getColumns: function() {
	        return Tine.Addressbook.ContactGridPanel.getBaseColumns(this.app.i18n)
	            .concat(this.getModlogColumns().concat(this.getCustomfieldColumns()));
	    },
	    
	    /**
	     * @private
	     */
	    initActions: function() {
	        this.actions_import = new Ext.Action({
	            //requiredGrant: 'addGrant',
	            text: this.app.i18n._('Import contacts'),
	            disabled: false,
	            handler: this.onImport,
	            iconCls: 'action_import',
	            scope: this,
	            allowMultiple: true
	        });
	        
	        // register actions in updater
	        this.actionUpdater.addActions([
	            this.actions_import
	        ]);
	        
	        Tine.Addressbook.ContactGridPanel.superclass.initActions.call(this);
	    },
	
	    /**
	     * get default / selected addressbook container
	     *
	     * @returns {Object|Tine.Tinebase.Model.Container}
	     */
	    getDefaultContainer: function() {
	        return this.app.getMainScreen().getWestPanel().getContainerTreePanel().getDefaultContainer('defaultAddressbook');
	    },
	    
	    /**
	     * returns details panel
	     * 
	     * @private
	     * @return {Tine.Addressbook.ContactGridDetailsPanel}
	     */
	    getDetailsPanel: function() {
	        return new Tine.Addressbook.ContactGridDetailsPanel({
	            gridpanel: this,
	            il8n: this.app.i18n,
	            felamimail: this.felamimail
	        });
	    }
	});
	
	// Static Methods
	
	/**
	 * tid renderer
	 * 
	 * @private
	 * @return {String} HTML
	 */
	Tine.Addressbook.ContactGridPanel.contactTypeRenderer = function(data, cell, record) {
	    var i18n = Tine.Tinebase.appMgr.get('Addressbook').i18n,
	        hasAccount = ((record.get && record.get('account_id')) || record.account_id),
	        cssClass = hasAccount ? 'renderer_typeAccountIcon' : 'renderer_typeContactIcon',
	        qtipText = Tine.Tinebase.common.doubleEncode(hasAccount ? i18n._('Contact of a user account') : i18n._('Contact'));
	    
	    return '<div ext:qtip="' + qtipText + '" style="background-position:0px;" class="' + cssClass + '">&#160</div>';
	};
	
	Tine.Addressbook.ContactGridPanel.displayNameRenderer = function(data) {
	    var i18n = Tine.Tinebase.appMgr.get('Addressbook').i18n;
	    return data ?  Tine.Tinebase.EncodingHelper.encode(data) : ('<div class="renderer_displayNameRenderer_noName">' + i18n._('No name') + '</div>');
	};
	
	Tine.Addressbook.ContactGridPanel.countryRenderer = function(data) {
	    data = Locale.getTranslationData('CountryList', data);
	    return data;
	};
	
	/**
	 * Column renderer adb preferred_address field
	 * @param value
	 * @return {*}
	 */
	Tine.Addressbook.ContactGridPanel.preferredAddressRenderer = function(value) {
	    var i18n = Tine.Tinebase.appMgr.get('Addressbook').i18n;
	
	    switch (value) {
	        case '0':
	            return i18n._('Business');
	        case '1':
	            return i18n._('Private');
	        default:
	            return i18n._('Not set');
	    }
	};
	
	/**
	 * Statically constructs the columns used to represent a contact. Reused by ListMemberGridPanel + ListMemberRoleGridPanel
	 */
	Tine.Addressbook.ContactGridPanel.getBaseColumns = function(i18n) {
	    var columns = [
	        { id: 'type', header: i18n._('Type'), dataIndex: 'type', width: 30, renderer: Tine.Addressbook.ContactGridPanel.contactTypeRenderer.createDelegate(this), hidden: false },
	        { id: 'tags', header: i18n._('Tags'), dataIndex: 'tags', width: 50, renderer: Tine.Tinebase.common.tagsRenderer, sortable: false, hidden: false  },
	        { id: 'salutation', header: i18n._('Salutation'), dataIndex: 'salutation', renderer: Tine.Tinebase.widgets.keyfield.Renderer.get('Addressbook', 'contactSalutation') },
	        {
	            id: 'container_id',
	            dataIndex: 'container_id',
	            header: Tine.Addressbook.Model.Contact.getContainerName(),
	            width: 150,
	            renderer: Tine.Tinebase.common.containerRenderer
	        },
	        { id: 'n_prefix', header: i18n._('Title'), dataIndex: 'n_prefix', width: 80 },
	        { id: 'n_middle', header: i18n._('Middle Name'), dataIndex: 'n_middle', width: 80 },
	        { id: 'n_family', header: i18n._('Last Name'), dataIndex: 'n_family' },
	        { id: 'n_given', header: i18n._('First Name'), dataIndex: 'n_given', width: 80 },
	        { id: 'n_fn', header: i18n._('Full Name'), dataIndex: 'n_fn', renderer: Tine.Addressbook.ContactGridPanel.displayNameRenderer },
	        { id: 'n_fileas', header: i18n._('Display Name'), dataIndex: 'n_fileas', hidden: false, renderer: Tine.Addressbook.ContactGridPanel.displayNameRenderer},
	        { id: 'org_name', header: i18n._('Company'), dataIndex: 'org_name', width: 120, hidden: false },
	        { id: 'org_unit', header: i18n._('Unit'), dataIndex: 'org_unit'  },
	        { id: 'title', header: i18n._('Job Title'), dataIndex: 'title' },
	//            { id: 'role', header: i18n._('Job Role'), dataIndex: 'role' },
	//            { id: 'room', header: i18n._('Room'), dataIndex: 'room' },
	        { id: 'adr_one_street', header: i18n._('Street'), dataIndex: 'adr_one_street' },
	        { id: 'adr_one_locality', header: i18n._('City'), dataIndex: 'adr_one_locality', width: 150, hidden: false },
	        { id: 'adr_one_region', header: i18n._('Region'), dataIndex: 'adr_one_region' },
	        { id: 'adr_one_postalcode', header: i18n._('Postalcode'), dataIndex: 'adr_one_postalcode' },
	        { id: 'adr_one_countryname', header: i18n._('Country'), dataIndex: 'adr_one_countryname', renderer: Tine.Addressbook.ContactGridPanel.countryRenderer },
	        { id: 'adr_two_street', header: i18n._('Street (private)'), dataIndex: 'adr_two_street' },
	        { id: 'adr_two_locality', header: i18n._('City (private)'), dataIndex: 'adr_two_locality' },
	        { id: 'adr_two_region', header: i18n._('Region (private)'), dataIndex: 'adr_two_region' },
	        { id: 'adr_two_postalcode', header: i18n._('Postalcode (private)'), dataIndex: 'adr_two_postalcode' },
	        { id: 'adr_two_countryname', header: i18n._('Country (private)'), dataIndex: 'adr_two_countryname', renderer: Tine.Addressbook.ContactGridPanel.countryRenderer },
	        { id: 'preferred_address', header: i18n._('Preferred Address'), dataIndex: 'preferred_address', renderer: Tine.Addressbook.ContactGridPanel.preferredAddressRenderer },
	        { id: 'email', header: i18n._('Email'), dataIndex: 'email', width: 150, hidden: false },
	        { id: 'tel_work', header: i18n._('Phone'), dataIndex: 'tel_work', hidden: false },
	        { id: 'tel_cell', header: i18n._('Mobile'), dataIndex: 'tel_cell', hidden: false },
	        { id: 'tel_fax', header: i18n._('Fax'), dataIndex: 'tel_fax' },
	        { id: 'tel_car', header: i18n._('Car phone'), dataIndex: 'tel_car' },
	        { id: 'tel_pager', header: i18n._('Pager'), dataIndex: 'tel_pager' },
	        { id: 'tel_home', header: i18n._('Phone (private)'), dataIndex: 'tel_home' },
	        { id: 'tel_fax_home', header: i18n._('Fax (private)'), dataIndex: 'tel_fax_home' },
	        { id: 'tel_cell_private', header: i18n._('Mobile (private)'), dataIndex: 'tel_cell_private' },
	        { id: 'email_home', header: i18n._('Email (private)'), dataIndex: 'email_home' },
	        { id: 'url', header: i18n._('Web'), dataIndex: 'url' },
	        { id: 'url_home', header: i18n._('URL (private)'), dataIndex: 'url_home' },
	        { id: 'note', header: i18n._('Note'), dataIndex: 'note' },
	        { id: 'tz', header: i18n._('Timezone'), dataIndex: 'tz' },
	        { id: 'geo', header: i18n._('Geo'), dataIndex: 'geo' },
	        { id: 'bday', header: i18n._('Birthday'), dataIndex: 'bday', renderer: Tine.Tinebase.common.dateRenderer },
	        { id: 'memberroles', header: i18n._('List Roles'), dataIndex: 'memberroles', renderer: Tine.Addressbook.ListMemberRoleRenderer }
	    ];
	
	    if (Tine.Tinebase.appMgr.get('Addressbook').featureEnabled('featureIndustry')) {
	        columns.push({ id: 'industry', header: i18n._('Industry'), dataIndex: 'industry', renderer: Tine.Tinebase.common.foreignRecordRenderer});
	    }
	    
	    return columns;
	};
	
	/**
	 *list member role render
	 *
	 * @param value
	 * @returns {string}
	 * @constructor
	 */
	Tine.Addressbook.ListMemberRoleRenderer = function(value) {
	    if (Ext.isArray(value)) {
	        var result = [];
	        Ext.each(value, function(memberrole) {
	            if (memberrole.list_role_id.name) {
	                result.push(memberrole.list_role_id.name);
	            }
	        });
	        return result.toString();
	    }
	
	    return '';
	};


/***/ },

/***/ 43:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * contacts combo box and store
	 * 
	 * @package     Addressbook
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2007-2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	
	Ext.ns('Tine.Addressbook');
	
	/**
	 * contact selection combo box
	 * 
	 * @namespace   Tine.Addressbook
	 * @class       Tine.Addressbook.SearchCombo
	 * @extends     Ext.form.ComboBox
	 * 
	 * <p>Contact Search Combobox</p>
	 * <p><pre>
	 * TODO         make this a twin trigger field with 'clear' button?
	 * TODO         add switch to filter for expired/enabled/disabled user accounts
	 * </pre></p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2007-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Addressbook.SearchCombo
	 * 
	 * TODO         add     forceSelection: true ?
	 */
	Tine.Addressbook.ContactSearchCombo = Ext.extend(Tine.Tinebase.widgets.form.RecordPickerComboBox, {
	    
	    /**
	     * @cfg {Boolean} userOnly
	     */
	    userOnly: false,
	    
	    /**
	     * use account objects/records in get/setValue
	     * 
	     * @cfg {Boolean} legacy
	     * @legacy
	     * 
	     * TODO remove this later
	     */
	    useAccountRecord: false,
	    allowBlank: false,
	    
	    itemSelector: 'div.search-item',
	    minListWidth: 350,
	    
	    //private
	    initComponent: function(){
	        this.app = Tine.Tinebase.appMgr.get('Addressbook');
	
	        if (this.recordClass === null) {
	            this.recordClass = Tine.Addressbook.Model.Contact;
	            this.recordProxy = Tine.Addressbook.contactBackend;
	        }
	
	        this.emptyText = this.emptyText || (this.userOnly ?
	            this.app.i18n._('Search for users ...') :
	            this.app.i18n._('Search for Contacts ...')
	        );
	
	        this.initTemplate();
	        Tine.Addressbook.SearchCombo.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * is called in accountMode to reset the value
	     * @param value
	     */
	    processValue: function(value) {
	        if (this.useAccountRecord) {
	            if (value == '') {
	                this.accountId = null;
	                this.selectedRecord = null;
	            }
	        }
	        return Tine.Addressbook.SearchCombo.superclass.processValue.call(this, value);
	    },
	
	    /**
	     * use beforequery to set query filter
	     * 
	     * @param {Event} qevent
	     */
	    onBeforeQuery: function(qevent){
	        Tine.Addressbook.SearchCombo.superclass.onBeforeQuery.apply(this, arguments);
	
	        var contactFilter = {condition: 'AND', filters: this.store.baseParams.filter},
	            pathFilter = { field: 'path', operator: 'contains', value: qevent.query };
	
	        this.store.baseParams.filter = [{condition: "OR", filters: [
	            contactFilter,
	            pathFilter
	        ] }];
	
	        if (this.userOnly) {
	            this.store.baseParams.filter.push({field: 'type', operator: 'equals', value: 'user'});
	        }
	    },
	    
	    /**
	     * init template
	     * @private
	     */
	    initTemplate: function() {
	        // Custom rendering Template
	        if (! this.tpl) {
	            this.tpl = new Ext.XTemplate(
	                '<tpl for="."><div class="search-item addressbook-search-combo x-combo-list-item">',
	                    '<table>',
	                        '<tr>',
	                            '<td style="min-width: 20px;">{[Tine.Addressbook.ContactGridPanel.contactTypeRenderer(null, null, values)]}</td>',
	                            '<td width="30%"><b>{[Tine.Addressbook.ContactGridPanel.displayNameRenderer(values.n_fileas)]}</b><br/>,' +
	                                '{[Tine.Tinebase.EncodingHelper.encode(values.org_name)]}</td>',
	                            '<td width="25%">{[Tine.Tinebase.EncodingHelper.encode(values.adr_one_street)]}<br/>',
	                                '{[Tine.Tinebase.EncodingHelper.encode(values.adr_one_postalcode)]} {[this.encode(values.adr_one_locality)]}</td>',
	                            '<td width="25%">{[Tine.Tinebase.EncodingHelper.encode(values.tel_work)]}<br/>{[Tine.Tinebase.EncodingHelper.encode(values.tel_cell)]}</td>',
	                            '<td width="50px">',
	                                '<img width="45px" height="39px" src="{jpegphoto}" />',
	                            '</td>',
	                        '</tr>',
	                    '</table>',
	                    '{[Tine.widgets.path.pathsRenderer(values.paths, this.getLastQuery())]}',
	                '</div></tpl>', {
	                    getLastQuery: this.getLastQuery.createDelegate(this)
	                }
	            );
	        }
	    },
	    
	    getValue: function() {
	        if (this.useAccountRecord) {
	            if (this.selectedRecord) {
	                return this.selectedRecord.get('account_id');
	            } else {
	                return this.accountId;
	            }
	        } else {
	            return Tine.Addressbook.SearchCombo.superclass.getValue.call(this);
	        }
	    },
	
	    setValue: function (value) {
	        if (this.useAccountRecord) {
	            if (value) {
	                if(value.accountId) {
	                    // account object
	                    this.accountId = value.accountId;
	                    value = value.accountDisplayName;
	                } else if (typeof(value.get) == 'function') {
	                    // account record
	                    this.accountId = value.get('id');
	                    value = value.get('name');
	                }
	            } else {
	                this.accountId = null;
	                this.selectedRecord = null;
	            }
	        }
	        return Tine.Addressbook.SearchCombo.superclass.setValue.call(this, value);
	    }
	
	});
	
	// legacy
	Tine.Addressbook.SearchCombo = Tine.Addressbook.ContactSearchCombo;
	
	Ext.reg('addressbookcontactpicker', Tine.Addressbook.ContactSearchCombo);
	Tine.widgets.form.RecordPickerManager.register('Addressbook', 'Contact', Tine.Addressbook.ContactSearchCombo);


/***/ },

/***/ 65:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJ4SURBVDiNxZNNaNN3HMY/v7eWNG1MV9Q2tSQW3Usj1bKIUGH4UkpFBG9edpwMdtSD6wZlC8OLG4jgyZPgRaQwROilR3FjTIqMIoJoE62lWMxM0ib//P7/33eH6nUXDz7HDzzP4eF5lIjwIdIf5AZUf3//0Xw+PwSQVeL+FeUBTFevDX7TA2REXF1tc+3S7j2vVCprzM7OXn5da8pGrSGrh8eluRVJO/Iy88sDCSFI0m7Jq6Ml8d6L915O/HRfmlttqTdbUi6Xf7Vaa6LIY62m68cyICgF35/dh4gg2tA3V0ZECCFw8fReosgTB0FEgvn02Nff3HqkDkyP7yQz9hnWGpy1FHb1bAcApjBKY7PFnT82CKLJpODbG49RSWtV53i5cvO7cQb6ujBGY41BKbbNApFPaHUS4jhm0wf60pa0U9w4P0ZOr1W1Ukp1O4O1mjcbG2gFURQRxzHtdgurQRFQGHb1apxRxEnAWg0Sgi2+WClszXxFdv4eS0sPmZ9/RhRFlEolqtUqzjkOHppgz0ie48VP8HGC1GrIuVN8sX8sb5/kR6tnrl7HpXuYmpri/bCcc3Q6HeI4oRV1iJNAkgSSILiBAbp/X+Txtd9WrCglJpXCaMXdhQUajQaDg4Osr6+jtca6bmq1Gum+HRw/Of2uJ41xXQSlxK7KcOHU5T+5c+EwI+PHmChkkCSh8/dfMFEi8oGl52/5fKgHSQLmn4c0DnzJ+WuPyIfhgh4xa5XFuUmyacvc7ScASOypX7oAKJIgXLm3grWGlAP5+RK7sykWfjjCkFSfq1wuN1ksFvMAoXc4o5urdYB9id/x1Li3/8eXl5cr6qO/8T+6xjV3Y2VVoAAAAABJRU5ErkJggg=="

/***/ },

/***/ 73:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKbSURBVHjatZVdaxNBFIbf3U2CERpv9Cbpl5Sair0VxY9rFf0dFryRWj/Ab+pNQUjxF6g/o4K/QOidSEhKQWuRgtuauJndnZ1Z58zEYZYgFkLfcOacsHOeffdsduPleY6jUImWG9eub0dRNOsHPu6uPEJZZbgn9D0AHjxPryBRbbKHhGdYf70GKSTm5uZ23r5/N6XBAzaYXV5eRndrC+cvXcWJ48cwxBLGgizcAFWY/Cti6H75DCEENj5sTFrHUkq01ltonmmCZ5ky6FmwhReBFkoXwzOJTqejwVLmsGCac6aAdAKClss+Nj51cRjdvDCPHDn1UiiWRMHxQnNBn8DzFTjwcOviPFypQwQwOTdZqoXmK4Qkt8axkEXHBKdLo00szfBxcxuH0ZXFKWQyJ6hxrViuYzpgwKpmSYbL56Zg3ZrVuB3al0PncWodm1HIfzjOBG3m2Oz8wGG0OHvKgjUnd8F0CUJQaR2fnT45AsmNCVM7jrmgfgN2HdNcNJDEucCwhKdhVhY6ciMBZGTMsFzHZhSk1ft3MIaI5Tq2oxhbZHDU8fgafUDoyfurl69WUavV/uts6fYS+v2e7p2eND9PIRww/VQ457YpDEM8ffwEaZqiWq3i2YvnsHJeAY16HXt7JRzs79t+IbIiOOO80MiiiJqpdmEEoKxDcE4HQB/qD4KAWA5YCnqrFR0JocNTrgeDgQu1kXBu32jUX2808HXnm3PzhJQxY36ppL8iSRIFScHiGBVRUXPsW6gbLGZqb0y1dtzv9YqOfS+49zMMW7WJCYJr0MqDh0h5qm9STzU4QOt+8DtCzGLwNAWvVLC7u1sEd7a7b07PzCA82G8hh99ut1FRG+3zL6UNV98VKE0TXTPGDLBciigf2Z/pH6S7UJf/7+KAAAAAAElFTkSuQmCC"

/***/ },

/***/ 83:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAUHSURBVDiNrZVtbNX1Fcc/v9//+X97uW0vtF4o9HbulrZSHVvGVpwPTYfOjaaZ2Rt8AXGgk6h7YoQlbsmir+abvdiSZdmybPEFsDh1RkVJlXRApFqQh67V4oCC1dLbh1t6H/7Pv72wkPByYyc5yTk5J9+TnHPy/aKUQinFz3685webN29edT2/VZcAfX19T7c0r/z9c7969tSeXzz/CP8HkwCmaf7dyGQqoyffbylOnnuhu7t7760CC6UUALt27Xr2J3v3/fL4W4fY+NWeaMfOHQ+Pj4+/CWiA1tnZaff39zdG2a7OL+VklMlk1ubGR78i7vqyaa5e7X48p9aGmCtbncUPenp6ton9Bw5+f0MSP2GqpPHFySvNvQ9+u+78yWG+du/9LC6V/fzxIcO49z5hrO8SF4pVJqYqDGzKoUlJ7R8v4fYPoKRkslihIWWSXPl3Odt1R7N48bV3Bjc1N/aRzSLdFH/6w+/4eu8DzF74kHx7J21teRobGtA0iSYFQggAlFL4vs/rp5eYnI9pqNPZtqmOym9/E63a90yjPDJRNs7rTTj19biOxVNP/4izw0dxGpu4dP5Dzo6OI4VC1yQoRZIkREFEVAuIqgGHRiNe/0jn7Gfg+wHm7h8qwJTfWF07t/H2ehzLwLYM0nUpHn/sMa7Nz5AInelPLnL4yDBJkhBHMf61GmHVJ/JDjJSFqQnubIINOZ2qF1DxEg0wZGlh/mrKNrFtA9vUMXRJOp3mgS1bWLN2Nf5SBRWUOHbiNEmSgBBEYUwYxNQqIevSMU3pmJZ6qNVCnn/tggRM7Xsp+/6u5qZevTV/04O7rksYBKxpXcf7Q0Ns+dY3mS8tYqZcYk0QAWGY0JmDDWsETSmBadvc05Hl5MjwC/JEw8pRrdBOkiSo5R1ej/NtbSwslPjOtkd49cABXMNifuEanh/jRTEhCsO2cGwb17FwLB3XNih88fasnJqaKoqm5huAURzj+SHlqk/Ni2jvuIPBtw7TfU8vx4fepjRzFd/3MHQN2zJwLB17+T62ZSCGj9FWn2mRI6fOzL07MU8Qxnh+hOfH1LyAStVjobTI4rUlHtr6XV75235WtBZYmP2Md958AykSpEgwdLl8+M8HmK5DW8r9gpz+9Ep5YSlUXhBRCyJqfoQXxnhBiAJcx0WX8PgTT3Js8A2WMNjQWeAvf/4jjm1iGTqWqWPoGlIIrJ67Ue0dugBumy6WPgmiRIuiGE2AEKBUjKZpJHGE6zg4jkO1WuHgwf1kMlm6OwucGR1l+/btN3HEpWKV08P//KsEwmR2JjF0Ddex0HWJFAopwNAkmcwKVqyow7YMVmYb6N+6FdsxODp0lK72Dqanp28CnlsKmI3qOzRA/2na/rnT2yctQ8O1LWzbRJMCVEIUBnhejSgKEULQmEpRmy1ycmyMiXNn0Z161rWuRdck3tARbnMAK5oQgHt1ZvbTE5N+Zn0uTSFXR3LhYypvH8basTMulUrRr18ekw9vbPAtGfpq+F1l1KWDCcetjJw6lb9v891acW7uvdJiaVg780H8r4SLH12+/J4AtN27dz9ZTLK5eG7i4tTlSzNjY2ML5XK5DHhAFUgAA7CWaRTAz+fz/Xv3PbNnoP8hZ2BgYNXIyEh4Yyf/jdwAAnCAHLAeuCuXy/XufPTR84OHBp+7qfd/1TQ+V58U0AJ0FwqFl9PpdPZ6/YaC3Iotc7S+7IFSKvkPAtu8m1aNqzYAAAAASUVORK5CYII="

/***/ },

/***/ 87:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAHaSURBVDiN1ZS9bhNREIXPmfu7a0QiCIm7SKRIGkBIvAANDQhRUCGoKVLyANTUtH4JeAaQksYdgYAswArCINlJCElsr3eHIloLGtvyKgWnulOcT3PvmTtUVZyH5Fyo/yXYlofNxsf3veNso6yTYHpXlpK7Lx6ubs0DZhne45c7g3u3Vrx3Z5dodU7QbB2oAkoCKEoHAZZ2BUGQVABIvHQbT9dX/unYiIAydmCtnmKtnhJ/YSapUMWr7R+Xy3oMds5wOFIUxXzjVyjgnBvXvPZsq1DVmbqaVSTVkuCT21cPL6ZuwVTE5wrsdfv7r7fbi9YZUzS/DvOF1EBY7RfmSvw6ztUZW1jvXEaKidGDqAZWEEenAxO8zWwMrk9AEm9QfW8QhJrg3alNgjsiikvBce6JKCVyBk6D79la9PsiXEoCMcqrpWcNQYJpdF1bi+6nqq5HJ8ikWsfOCEhIGl3HpsF8OxlkjB6QbP74CMA7QKC8EEzb1qL53B8OJdgC0GIqYBLZW0AEkkZp2SRw11DFYIAgFcAADARClVq072xn923bLN9E7/cQo7zaG1tDGCH2Prz5xI0799NHm43D1fqinW6dri/fD7LnD5YjVRUkrwO4gRlX5AQVAJqquvMHh8CfFP655doAAAAASUVORK5CYII="

/***/ },

/***/ 91:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAARsSURBVHjaxVbfbxtFEJ77bcd2Yrd2EwoRIgWpou+8IPEU3vg3gGfUlwqJ8gStVPh/kIoEqiq1b0U0hCKI1CJMjJPacbHv7LvbW2ZGHvt6d+ZCpNJN1jO7dzfz7Tff7p2ttYaX2ey5NbDrlwlAX/3k6u1Eq1258M6778HOm5fBsSyADEuGgXixm6YB/GdI54ts8RLPxVEMez/9CPfv3gFprda5b69/fv39NADw/cnuw72HsLm5BRc6HTjfuQDb26+D5zqFyI35D1lOnvUZhAH+LIR+/y+YBlOQNkie7mYZgCRJoFargWPb7JugeYW/90+KkmcYeX5gpAC+1m6g0RwznasQQHOjCZ7nLW6wLAPeerXFvs4m50TiiuU5YYDHwTSkS+UAaDc0Gg3x+WELGXBtC1bVYDUAiYnJqEPCMVO5ChnIxNcIAG+wJZpcKC6DngemhBp/0OVxrBSP0/GVUuUAEo248cGfHx9DUdOZkdbiMRKyPNg6VwOV5EpQDoCGET65vbn+vMg0/+foJKMZyIIN7rNQ0YpPp4F0U3ECMXUrDawAiKxekrJd+jEuQmn93zUQJwoi2o6RWl0CWb24OQaANaASfYYS4NNRrKB3PJapMi1I7cXl1lr3kE1VLkKdAaBwTPQ1GxXZV/lEmWQ8u2CAHYrBydPxdSEDOQ1oFqFRsnSdBiXjpQbIYQ2k4yen0cC9u99Dr9eDwPdL6C8WpjBTXVuDJ789ymqgvARPfv2FevoNmLXFoFYrvqQEOPmCW8lJ+P99GRVrQL9YBs5egg8//gje2NkpquXKOg8GA/j02jUwTRPjat7Sm53Ov4swjuNcYK/isYrH47EILyswmpMuc/xhU6lUwLIs3gmz2SwfXwAUCUNa+gS78cWXdKzK5xvcuHmTViig6D6yyxcPgzKJb/qyovkzAJgHpfb0+BikDU9OKAkBoJWRz89L18sXgphTACigKJxOKXgWIFFL80Qt2yiKZOXCAmcVMJqAISPVahVq9ToMB4MCDRQgtGy7EEAURxAEgSQgK0yQ5R4iKHsONKYYdK8BEOCiojg+HQPguhx8ig/FcSTlICvCotVLCSQ5X49CZIdFqPmFZKC1TQuejUbQWF8vAqB6YMBW9sQK/AAcx4ExWn8yYV00m00Uoi9Jhf6FDcMQgdF8shCoOd+e7XYb+v0+GNg0NgLAg8uXLn1Qqda+wVK10/tV6L711S0BRZ22JgXPiVD8KAxZKwLAMk2e73a7LF5sVUwbCAPGo4ODPzc2Nr7efuXiZ3jDGoswCjmRPddCasVEvdCfPowouGgqXTLRkIxDNOexdwUA3fn3aDT6DpXf8jzvIhHw9pUr1g8PHuy4ruu5juOiKF0E42ESh8onh4DmLzgVIpgwwjYcDn3bsQ8ODw9neNVY5mC6FTr30Jth5xJwDIzlo7sXzGaPsTs0/Ue3m1Sq1RBPtUTQI0uAQIkVjcA01bVerxt4+hmE5wTPiP39/eTo6MidTCYUx8x/NXDyZ5T3H9+a0pP7Q7enAAAAAElFTkSuQmCC"

/***/ },

/***/ 101:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,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"

/***/ },

/***/ 105:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIcSURBVHja7ZevbxVBFIXPuXNn+2hDX4EKDGlAg0MgUCQ4DKIJgn8B3b8BjcFgMbUEDMFgcdRBSBpMRRtef8zQ97Z7L7OveaEVBNF0avrtnmQyZr65J9lk6e64SAQXjM4Wrz7uPBsO5A2JeZzAHd144h++7/D5y9Vru+c2AQEezEWbb9RwMmUvLC74k9s37N3a+q/huU2g7YBx6/gX8w0e3lnuRq8/7eAsCH0yPsLTF4+X358SmLTWC/x/XMRZaSYtHgE4LbC1+3tplB01KBO4Pltz7e3m54WB3AM4IHwOFXBwDPhhOrSv+mO7W9HgWYgggioCZmjNkdsjW9EmxqQhDIUAiSq4A1Yi0iVttMkaZEh4VQEHIQxZY4w5BsHxltcRAIESimUdRE0hhKmWVxIgjvsO0wqipCDszy+pJEBO04kkjZFZBTB3uKEKFIeQODL2FUgWAmaECaogJEQIdWZtlKkX6HoBqyQgRCgxR6lAmUUAdqSZ1xKghumFSwWKBCEE7B1Qg9ALKAHzpLFhJvoHlK6SQACjEg5knQtMkNmHwVEDFaKJBAxJB5HZSLixp5YAGyXEkfsKkjvQdV7rfATxIgCQTHolMrcOTDoEWh0DEYQYifJm7RwH+xPy4BDqqAMBNSGHjR+oDbDx89vmXrOwdBOopzDa3tq/evfWBt0dJFcB3C9Z/Ct5bnjJXskXd1+fCRAXgBcu/w0vBf4AFt7lwaWEKeAAAAAASUVORK5CYII="

/***/ },

/***/ 146:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAH0SURBVHjapZG9axRBGIefmZ3d+/6I8RCNKJEzghbXKCkMFpJa7SxFrO0D+QfO2t42hUJIdyAKohYSRREs9GKMJGpMcnrmYnJ7tzvjzkCCENRIHvgx7y7zvDMvI4wx7AfJPlEAF+tzPcDnN3xPPNexvnp/4uQ8f8GNMH7rfXR9rORJKXAYeLUURi8+bKINij/wcKIqxHi9mdaGn9fGSokv2Ct3HrfxBBkV+HIL4O5sh/8hE0iALRUowYVTJYpZD8ne0NrQ3tQ8af5ApZRAeYLmcs/O61j5+Iatzjcc288sBNniIJVjp5ECjpQVzg2URElJLuVhya0+4Ex4DwJ204W3rRtkhs7iexLruhF8X5LPgI5jKq0G5YMVsrk8cT9iZPQKrx9NEUURK+2QzMIUuRPnnGNd1yCdfIDg6+I8urdBbfQS2mjXsDhwiJHaeeKkrsYRL582+NL+RLo0jGuQUpJ04KE8QzefxdJZW7AnumQODNP6/M7VcRJLMZ92jnVVyhdREmWfJS7niICwF9rrO2ludiZZ+zsNLQOlHIEvsK5MxMZyu2vsGIOlApZeGBLupLtdu/+WQiHL8veuTtxptd5amVxf6w8trh6uGa1lFdxmd+V+tOt0y7PmRtxpLc0aoSYFYHMUcPXticsL/IOb9ZnjgAGWfgEKtOct7JTVfgAAAABJRU5ErkJggg=="

/***/ },

/***/ 147:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAI7SURBVHjapdFPSFRBHMDx78ybt390c9VkW1MIxTSVSooMSgRFhBLrFGIHIyrqEAiehA4d6mCCnUq6WBFdokNUUEkQZR0EDSswKE2l1liV1DLXnvtn2vcskDIJ/MAP5vL9wcwIrTVrIVkjBVDdNrwImCxjGqI/EU80PG7dPMIqnCvUXPgQO1rhN6QUODS8Clmxl6MREhrFPzxpLRCipm3Ik9DMH6nwJ3vB/7r6fBZD4FUuUy4A3O6bYzXBmTGKvw/Tk1tNXEi8LgmwoFxKUFnkJy3FQLIyHZ1jz/QVrI5PlFo3CF28z+yC5sXQV5RbCZQhGAovktArPVKUQ6kn6Oye5m3oM8csi9Drd2SUFOG0LiVRUpLqNlhJpW6hb+ALt+6NcvlMDuORUmReIaYhsVvnCqYp8Xn5y/qJDqzYGO1dk5xrzsMyMnmvDlPgNZzGbp0FHlMCguXk5AOq8sepPzlJY32QXVs05x/upKahHNNtJBuxtMCtJB6XgTI0vyWmB6jNucnB5mHKy9I5vi9Ce08jJTvKyPD7AJx3s1vlNkUsOcr5ll8Cvhku3d3AxuwwZ5vmuDZ4isxAgNKtZazzGtjiWmO3dvgoPPujLj+QKuytoPFF4hyozmH3pkG6w6fxZRURTEsnOxjAFo1rRibmE8n2jmjperMNHb2empG9HYR0TfUy9LSTqv119IYLQXkwTDe+9CzcKWks0fFvUx/7tFBNArAnF3DOtXuLC5/1j4xYliUAF6BYEvtjNBD6CRu7uy+wP3NZAAAAAElFTkSuQmCC"

/***/ },

/***/ 160:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANbSURBVHjatZVPiBxFFId/r7r6z8xu1plsXOMiARUkoqAEQUTBHDxE4sGjCgqC4llPesstEC+KN/EgCHoQTxIQvYgE0ZsgrIEgG1DXLCbrsDPdO93Vr56vanqHxlOQ9dd8vKpDfTxeFTSJCP6PWAUXvsTw3tHeuwScQJea6crrZ8cf4D8mdvze17deOLmGz9CLKH+X8n7T4jvcZiRJqjefGX+1FF+6/NeLJ1bxKY4gk5l57q3z65ftuYtbp+8a54+uDXAk2Z/j6XMXd3+l1z7c3s7SZGQIIxxBvGDSOJ7YOafcgryKcURi37JhO8jzMjFmTBD0s0YTpFIB0oIUK1MwAyWtg4wFYOCJMDfHIUh6l05g70s7KAoVE/rvebP5Ec/f9zvYM+q6UWpU5Q1ASpWdxHAwwEAZDgf4/pd9/LT6Kg5DFMRSmkFqyjwl5CkiK2mDZ09tAwS0LSttRHgOm7RwzqFRYm0cnnzoDqxXPyzPB5c6VVyYqsgIWbrgsepjDIsiyHowuJ2C/AxN3cA1Szm49XjpwT9QJPN4PriC0w4zmnmAmAkhNvG4vnML87lDVdexzqoa9999HOONEa5s7SDL5xhmCfLMILda0wQbaz9jsvY4koTIgGa2yE3JItSyIGSQpzh1ZwEgcAwh3nvMypswNsdTj2yC9OO2URzYhVoizSyyjLQxQ+oubZGZyntGQ7SQUIp+VBpHQSZFkuVx1kIe4jskIDBpod0T1A9jwihyqRyTBjFOkigTUakImL3CcI1g7889AKRCgY9iVhbiJM3i5emcKU2ksjromXF+aXZiUDcNgHA4EsVeLNQBQQvPrQq1eo641sMWK6CMojhPzcxabXsOsSCDkKZN4jMK8dLJg4C5q0GodPvQ7UHt4LMxgkNA0WmvXt26VtMxlXiG5p4DZ5qiJUAg0hEES3mQdnivBDHj+u6UgRmMynOZXiMAqXJWGSm49M7Lbz9x5oEzkKgGwmHxfXknZXAn3tndr9+48MkrAESZKN8aEXHKN8rnARI5WDwhpas+PKtDWOlJvdZ54zyALzpHcDmLf2U6LW3oSowBxa4N4sKEGq7Cg5gB0hoAo2paBjBWbqL/a+pnc2N0fnWleBiHEaHlcrHvrcNO4Fw7++3G5CN11ejyD1DiXQlduDm4AAAAAElFTkSuQmCC"

/***/ },

/***/ 161:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAALySURBVHjatZVrSFRBGIbfb86cPbuuLbulpimIRCQUFAsRRFiEUZAE3cBC/GUEXags6ldSQZQFUhQRRfQj6AaSVkZJQZQkEUEQLqZoGZpIXrbcs+6uOzONYlLtWmL2wMthYHjOyzcDQ0op/A84NEfvIyXP23+GgDSMERXUsH2l7zymyGjjs/V9xZke3MRPKJ0BW52LxfEck0QZRnh/oe/RuPh03Zetaam4gWkgGGJF5etm1fG1JwP5s33WYo8L08K3CFasPdnTRmWXP3xwmIaXEbyYBqRCMDYsgjwiTBEHSS3GNIllXDDBXZZlG4z5CAqTwRkNIf/jC7ybtxqC8cQDBEFIaXOX06nFhMndZ4kidhy+xo/Iqa7C0yNPILkDP0M0IlY2c5nMtkyCZeKvWa4O48tAE3a/b4Hd24Hsl7eS7CNo50hjFgYUhCT8iRmfLyDD8xalVZ9RssGJ1CV+BL0lcPx2OMbomsI8xUEhCZAQE4udvfdQlPcYmw/2ocBPWFfgxYP4KaRYiTM2DCIGCnGnxWyhFMWFQjIc316jOL8G63d2I8sbwr5iN+7alUjNygI3E8twXVm7be50sLCUAjGixL8PtaNkfg22lbeCxFec3slQ218BMy0XbpczeREOMMb0KCwVHhZECd5YPzZlX8GByrfo7OrF1UMKj/t2Ieaehznp6botkotNItNQ4ZHDC7Fh+atZRrDKPIaqax149aYT5/fF0Ph1I3ppEbIzM+F2WwAmFlsmC3Gua0egOIiNX3G/vR/VDd2oftiOE2U2OqJLERhchoycmfCkZQLEMBEKNOrkzc2B1ijNgFRSQJOBTmrukezi9Tbs3RwG9+Spu00FyptuIEIp6lNXD/4EIwZLDbYSAFNnpY4XmvrbZypy52YvrK+9MFS4INDiLw2eGopB4u+osW9Q51nC03Rob+lwoR9RER08F/KZFVu23BGYClo8nj2la3J3bFt+6ccD8C9J+pgSkTE2IkOH6cTHIvR+iUnwHR2qWtBOXOCeAAAAAElFTkSuQmCC"

/***/ },

/***/ 172:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAUrSURBVHjaxVdLiBxVFD3vV93TM53pyUQIiCYZEPwkgugiEN0owU02WQSzcCnuBHfZunHhUty4yVI3EcFoFEREcBGJomiyEOOHfIwhmcn0fKq6vu95XlfVVPXQfiBkcqZP31fd8M6559aroYVzDvcTEvcZGhXe+WLl5HxXnhYCPbTAgIokdZ/9uiJefuvEwto9S4CLwx1je4G2aJOfqV2z7tiBRfvJqTOr8/csgawAkszhn9AL8OzSnmL47pcrd9excGmS4/hrR/d8OmEgzaw38N9xCdwtgjTD86yTBm6ujQbDyGEnwAR2o4I49f6Vr2e78hCXXQHXwQ7AQSR8j8PYXtS/Lxf7tHKRFFBSYkcMWIvMOkRZbvfpwJhQKzVPAxDkTsA5wJJSFqEOdBBpJecZ/44aoBqkUJE2xkRGyXIy5HZ07SqOqHOY4zksCkvmKPIceZ5BuDUIJLh8q4/AdKCNBveD0WW9EQ9wtXd02j0AkELaSHeNDpVSY1tuioFX91+AwgIyL5pl4It0vHZI4xiDeYVAZJiZ6SDoSHQCxWpYAwzXbuOjv35GNHcIbQiU81YcgQyMDAMtYDwVJvhoeg7rw1UU1sIWRZUAqy2rtBkcafMR8sKnQvrv8wI5ubh7F1558jcazCf3plZAem1pjIgCA0bmwAS32BcrOHbIYWHQnyrur4EYBcWdSyhYC9dGyjoaZXj41unW3qVWqSki2TUyGrtRPoWGh92HWF0NvVhDW1Y77jIDXIQs2WSNvdjUFAK2/OLTD2AQ/VjvTS2S1WtrLkIpwM0F2NwYs1iBkBK3hyHiJEWcZkhYozghc4QRaxjhpePPcfZd/HH+Ir7/6TrXBj3Ov1szUOiw1SDQ6MV3kC48BQ9JQUVah1DTUUQtiEIIy0/GsAZ9k2FxoQ+gM+UYORpKUIyWEecaB/Z2sPTg40wmb5FJWV9H4+tlzEFr1AaEVuOGeQo0QtCNhPAeSgHZR7yR/suTzJIOShtIZQBImrKka4jJ66A7C0NRD+UNaK6tYwKBiER1MGQhUEIhs2Za59WJ8CzYUQBJKkacp17INkZs6xqggbnGgIJg8nBgAh0lmED9YHCokY27cpVwKW5d2XnhDcAhTfxDKQHd8HvS1l1bYEzXkPnrqidNvcD4BBDqLo+CFXTDNwI10kL6u7g0gMqA9bRldRJZ5Ndevws3NmFZayO2ZQhgzz6B2oDwp4D9Rn4EoXNgV66tj8JxDJUB1AYaExN0ZZ0i3twHwgQ0gOoecDQAUDDUM0wgc75jKGFFYwCaCSRbCaAy4GxZ24LWV9K2xG0lXo9PBT1Ai+oUQBkjwFekC4fNjVSIzRjaoUHfqvEDBa4ZgSfIdoe27ro2UdbKhNsyEeUSaXWwBKAtxzAfuE1tu7h07fKV9WB2sBdoLMw4OX6auTqD7QZYSxNFk0bbRJMWk7QYFRpJFKG2MFy+udE/+NAlMZ6PECcAPEPuQgnxxusnj75w5OAS2gZATIiTto681TnZHlcYZXj7va8+/uaHyzeqia6T33GfMxolPqhYo7s4mDtri3ypSmW7gUq8qu17Ydu94sgky/HEI/vepIFvSwMNNAhHoAUmIofr68YWGYgmBEyOgLWdxFRxy3UUZzj7+flkmpbGdMiNzVAygekGSKAUYaGIqGol2hIvaCxiBPzHNgdAkvb/GMC1P+9cv/TL1WtbP0VscxyBqttmNCz1mn/WE7DVKRluJmkdLrZBNIlMjECzPEbuJ9Vd/h5yZEheoNYatuFvBUphl1MotG8AAAAASUVORK5CYII="

/***/ },

/***/ 173:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAATcSURBVHjaxdd7iBVlGMfx7/POO7PnsmfP2U1ti0xMQiIFlcqioAskSVmpaWGlZpBgXipSg/yjG0Vo0MW8oRQUEkgQWtrV/lBJS0tLxNLU3Uj3Zns9c3bPnHnf5tAGK+2up8z1MzzMMDA8v3me+WfEWsuFpLjANN3e+vL0A+mY2iBCgh6sJezK221HT8tDr06rbD1vE1BwfZlrEp429KzonlORtHcNv8h8vHRTc/q8TSAIoSuw9CXhcdMVg8KWNdtPcy6U2HxXgckLbh+09YwA+cAUA5x9XMK58vIBtwFnBqhrzWVafMtAiCZQRTdZurFmRzKmRoPEBFvGALBIF9jObKf5SR9rCodpx/pKcJRiQAIYQ2AsflAww7TnulntOGklIMKAsBZMVEqFWe1pz9eOSgt2QANYBCWOr13X9V1HARaJ6r8a/fMWRn22ltqbZ7B71DRCx+3vGwAEUcbXMVdnHccBa7H/MUCiYyeTr19F484k3qYVyN5d7J67jr4IAiI40QqU56qspwW3WA7/upLBLzw14km2HQqYW1tLS309Zfs/5dKfvuj7OS0UexZ7RysQXyswxQkY/hUnaODR6kf54UScl9e3U3OylpOLL6Nzq0c+XYWr6ZUoixKhYKS4AuUrAWMEoyiZGJ9pqTk0dwhPLG/jVF0jL8y/jPGjmtky8l3yqXG4IvSm2FwpQdsogKclqwTCYgBDiQy3q7lUeDmmLMvS0NTGrHsyTL6uji+6ltPsjiOhHfpSbO5EZSzRCrT4SoGEIsZYSjE29ywjq9uYsridusYcN41RLJrUyDf5hdTYW0mVJ9Ga/gKIdgRjiFagyaIEhRQzcDaZhrXcMrqemcuaqT0VMHRwllfm5DlcmMqB3H2kqsqJx2L0xykG0ALGRhPwxBeKB6JCoT+x058w+9qjPPP6H3x/qJ24bmbVU5ZGZzxfNcwhVZmgoiKN40j/ARzE1YIFX5c5UpwAIIiy9EW1fMus0TvYsLmJjz4/gQlaWb0EJHE5H9bMI5FJUp5JUxb3OButBM8VMGR1zBXfiGCNFNGr7DHuH7aRXQfaWbH2B0whxxtPQvXFKVYfno+XypBIJEhnKov7LSWAeFpQFr+4gqy1EIa21/42/wcTK17k+EnF/Of2YcKQZbMCxl2pePPAY9jYYBLJOBcNHkKZ61AKR9koAIhIVsejCQQW8iGOGKEnG3Zxo1lAzhdmLv6RILDMudPn7hvyrNz3CO0ylEwySSp68/J0GhGhFErhuK7gCr4OLR3teZGOTrTlTFfXLySWaWLqknr8nGXCNR08frfP23smcSR7JamqJAUdx81cSkcglEpAGyWS9myHNjEO/nakps1LZqrB8jcn9BlSPYGnX1tHU3PImBFZXnrE572949nz+1WUV2osirLyKoKCicqndEJLU117atTQg2KtRUSmAdcAFfxFXlwy87qHZ88ce+TQDtas/yC7ZsHvZbsOcvjepR27ODcWaAP2Rr03dQf45/L2bFv5ayzmD29tPEBrw0EuqWjfdix2bNL06Rj+JzbS67/h80umV3+zv+HUgxMH2YtT4T6TT867Y97733EeaHrR2pxbVBnvPL796+Mz3tm8bzfn0RkTEBENDAEuAeKA6rE3010FoAvId5+D7uugx3XBWmtKDnAh/QnZmwJJHxYe1gAAAABJRU5ErkJggg=="

/***/ },

/***/ 326:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.AccountEditDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * 
	 * <p>Account Edit Dialog</p>
	 * <p>
	 * </p>
	 * 
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009 Metaways Infosystems GmbH (http://www.metaways.de)
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Felamimail.AccountEditDialog
	 * 
	 */
	Tine.Felamimail.AccountEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	    
	    /**
	     * @private
	     */
	    windowNamePrefix: 'AccountEditWindow_',
	    appName: 'Felamimail',
	    recordClass: Tine.Felamimail.Model.Account,
	    recordProxy: Tine.Felamimail.accountBackend,
	    loadRecord: false,
	    tbarItems: [],
	    evalGrants: false,
	
	    /**
	     * overwrite update toolbars function (we don't have record grants yet)
	     * @private
	     */
	    updateToolbars: function() {
	
	    },
	    
	    /**
	     * executed after record got updated from proxy
	     * 
	     * -> only allow to change some of the fields if it is a system account
	     */
	    onRecordLoad: function() {
	        Tine.Felamimail.AccountEditDialog.superclass.onRecordLoad.call(this);
	        
	        // if account type == system disable most of the input fields
	        if (this.record.get('type') == 'system') {
	            this.getForm().items.each(function(item) {
	                // only enable some fields
	                switch(item.name) {
	                    case 'signature':
	                    case 'signature_position':
	                    case 'display_format':
	                    case 'compose_format':
	                    case 'preserve_format':
	                    case 'sieve_notification_email':
	                    case 'reply_to':
	                        break;
	                    default:
	                        item.setDisabled(true);
	                }
	            }, this);
	        }
	        if (! this.copyRecord && ! this.record.id && this.window) {
	            this.window.setTitle(this.app.i18n._('Add New Account'));
	        }
	    },    
	    
	    /**
	     * returns dialog
	     * 
	     * NOTE: when this method gets called, all initalisation is done.
	     * @private
	     */
	    getFormItems: function() {
	
	        this.signatureEditor = new Ext.form.HtmlEditor({
	            fieldLabel: this.app.i18n._('Signature'),
	            name: 'signature',
	            autoHeight: true,
	            getDocMarkup: function(){
	                var markup = '<span id="felamimail\-body\-signature">'
	                    + '</span>';
	                return markup;
	            },
	            plugins: [
	                new Ext.ux.form.HtmlEditor.RemoveFormat()
	            ]
	        });
	        
	        var commonFormDefaults = {
	            xtype: 'textfield',
	            anchor: '100%',
	            labelSeparator: '',
	            maxLength: 256,
	            columnWidth: 1
	        };
	        
	        return {
	            xtype: 'tabpanel',
	            deferredRender: false,
	            border: false,
	            activeTab: 0,
	            items: [{
	                title: this.app.i18n._('Account'),
	                autoScroll: true,
	                border: false,
	                frame: true,
	                xtype: 'columnform',
	                formDefaults: commonFormDefaults,
	                items: [[{
	                    fieldLabel: this.app.i18n._('Account Name'),
	                    name: 'name',
	                    allowBlank: false
	                }, {
	                    fieldLabel: this.app.i18n._('User Email'),
	                    name: 'email',
	                    allowBlank: false,
	                    vtype: 'email'
	                }, {
	                    fieldLabel: this.app.i18n._('User Name (From)'),
	                    name: 'from'
	                }, {
	                    fieldLabel: this.app.i18n._('Organization'),
	                    name: 'organization'
	                }, this.signatureEditor,
	                {
	                    fieldLabel: this.app.i18n._('Signature position'),
	                    name: 'signature_position',
	                    typeAhead     : false,
	                    triggerAction : 'all',
	                    lazyRender    : true,
	                    editable      : false,
	                    mode          : 'local',
	                    forceSelection: true,
	                    value: 'below',
	                    xtype: 'combo',
	                    store: [
	                        ['above', this.app.i18n._('Above the quote')],
	                        ['below',  this.app.i18n._('Below the quote')]
	                    ]
	                }
	                ]]
	            }, {
	                title: this.app.i18n._('IMAP'),
	                autoScroll: true,
	                border: false,
	                frame: true,
	                xtype: 'columnform',
	                formDefaults: commonFormDefaults,
	                items: [[{
	                    fieldLabel: this.app.i18n._('Host'),
	                    name: 'host',
	                    allowBlank: false
	                }, {
	                    fieldLabel: this.app.i18n._('Port (Default: 143 / SSL: 993)'),
	                    name: 'port',
	                    allowBlank: false,
	                    maxLength: 5,
	                    xtype: 'numberfield'
	                }, {
	                    fieldLabel: this.app.i18n._('Secure Connection'),
	                    name: 'ssl',
	                    typeAhead     : false,
	                    triggerAction : 'all',
	                    lazyRender    : true,
	                    editable      : false,
	                    mode          : 'local',
	                    forceSelection: true,
	                    value: 'none',
	                    xtype: 'combo',
	                    store: [
	                        ['none', this.app.i18n._('None')],
	                        ['tls',  this.app.i18n._('TLS')],
	                        ['ssl',  this.app.i18n._('SSL')]
	                    ]
	                },{
	                    fieldLabel: this.app.i18n._('Username'),
	                    name: 'user',
	                    allowBlank: false
	                }, {
	                    fieldLabel: this.app.i18n._('Password'),
	                    name: 'password',
	                    emptyText: 'password',
	                    inputType: 'password'
	                }]]
	            }, {
	                title: this.app.i18n._('SMTP'),
	                autoScroll: true,
	                border: false,
	                frame: true,
	                xtype: 'columnform',
	                formDefaults: commonFormDefaults,
	                items: [[ {
	                    fieldLabel: this.app.i18n._('Host'),
	                    name: 'smtp_hostname'
	                }, {
	                    fieldLabel: this.app.i18n._('Port (Default: 25)'),
	                    name: 'smtp_port',
	                    maxLength: 5,
	                    xtype:'numberfield',
	                    allowBlank: false
	                }, {
	                    fieldLabel: this.app.i18n._('Secure Connection'),
	                    name: 'smtp_ssl',
	                    typeAhead     : false,
	                    triggerAction : 'all',
	                    lazyRender    : true,
	                    editable      : false,
	                    mode          : 'local',
	                    value: 'none',
	                    xtype: 'combo',
	                    store: [
	                        ['none', this.app.i18n._('None')],
	                        ['tls',  this.app.i18n._('TLS')],
	                        ['ssl',  this.app.i18n._('SSL')]
	                    ]
	                }, {
	                    fieldLabel: this.app.i18n._('Authentication'),
	                    name: 'smtp_auth',
	                    typeAhead     : false,
	                    triggerAction : 'all',
	                    lazyRender    : true,
	                    editable      : false,
	                    mode          : 'local',
	                    xtype: 'combo',
	                    value: 'login',
	                    store: [
	                        ['none',    this.app.i18n._('None')],
	                        ['login',   this.app.i18n._('Login')],
	                        ['plain',   this.app.i18n._('Plain')]
	                    ]
	                },{
	                    fieldLabel: this.app.i18n._('Username (optional)'),
	                    name: 'smtp_user'
	                }, {
	                    fieldLabel: this.app.i18n._('Password (optional)'),
	                    name: 'smtp_password',
	                    emptyText: 'password',
	                    inputType: 'password'
	                }]]
	            }, {
	                title: this.app.i18n._('Sieve'),
	                autoScroll: true,
	                border: false,
	                frame: true,
	                xtype: 'columnform',
	                formDefaults: commonFormDefaults,
	                items: [[{
	                    fieldLabel: this.app.i18n._('Host'),
	                    name: 'sieve_hostname',
	                    maxLength: 64
	                }, {
	                    fieldLabel: this.app.i18n._('Port (Default: 2000)'),
	                    name: 'sieve_port',
	                    maxLength: 5,
	                    xtype:'numberfield'
	                }, {
	                    fieldLabel: this.app.i18n._('Secure Connection'),
	                    name: 'sieve_ssl',
	                    typeAhead     : false,
	                    triggerAction : 'all',
	                    lazyRender    : true,
	                    editable      : false,
	                    mode          : 'local',
	                    value: 'none',
	                    xtype: 'combo',
	                    store: [
	                        ['none', this.app.i18n._('None')],
	                        ['tls',  this.app.i18n._('TLS')]
	                    ]
	                }, {
	                    fieldLabel: this.app.i18n._('Notification Email'),
	                    name: 'sieve_notification_email',
	                    vtype: 'email'
	                }]]
	            }, {
	                title: this.app.i18n._('Other Settings'),
	                autoScroll: true,
	                border: false,
	                frame: true,
	                xtype: 'columnform',
	                formDefaults: commonFormDefaults,
	                items: [[{
	                    fieldLabel: this.app.i18n._('Sent Folder Name'),
	                    name: 'sent_folder',
	                    xtype: 'felamimailfolderselect',
	                    account: this.record,
	                    maxLength: 64
	                }, {
	                    fieldLabel: this.app.i18n._('Trash Folder Name'),
	                    name: 'trash_folder',
	                    xtype: 'felamimailfolderselect',
	                    account: this.record,
	                    maxLength: 64
	                }, {
	                    fieldLabel: this.app.i18n._('Drafts Folder Name'),
	                    name: 'drafts_folder',
	                    xtype: 'felamimailfolderselect',
	                    account: this.record,
	                    maxLength: 64
	                }, {
	                    fieldLabel: this.app.i18n._('Templates Folder Name'),
	                    name: 'templates_folder',
	                    xtype: 'felamimailfolderselect',
	                    account: this.record,
	                    maxLength: 64
	                }, {
	                    fieldLabel: this.app.i18n._('Display Format'),
	                    name: 'display_format',
	                    typeAhead     : false,
	                    triggerAction : 'all',
	                    lazyRender    : true,
	                    editable      : false,
	                    mode          : 'local',
	                    forceSelection: true,
	                    value: 'html',
	                    xtype: 'combo',
	                    store: [
	                        ['html', this.app.i18n._('HTML')],
	                        ['plain',  this.app.i18n._('Plain Text')],
	                        ['content_type',  this.app.i18n._('Depending on content type (experimental)')]
	                    ]
	                }, {
	                    fieldLabel: this.app.i18n._('Compose Format'),
	                    name: 'compose_format',
	                    typeAhead     : false,
	                    triggerAction : 'all',
	                    lazyRender    : true,
	                    editable      : false,
	                    mode          : 'local',
	                    forceSelection: true,
	                    value: 'html',
	                    xtype: 'combo',
	                    store: [
	                        ['html', this.app.i18n._('HTML')],
	                        ['plain',  this.app.i18n._('Plain Text')]
	                    ]
	                }, {
	                    fieldLabel: this.app.i18n._('Preserve Format'),
	                    name: 'preserve_format',
	                    typeAhead     : false,
	                    triggerAction : 'all',
	                    lazyRender    : true,
	                    editable      : false,
	                    mode          : 'local',
	                    forceSelection: true,
	                    value: '0',
	                    xtype: 'combo',
	                    store: [
	                        [0, this.app.i18n._('No')],
	                        [1,  this.app.i18n._('Yes')]
	                    ]
	                }, {
	                    fieldLabel: this.app.i18n._('Reply-To Email'),
	                    name: 'reply_to',
	                    vtype: 'email'
	                }]]
	            }]
	        };
	    },
	    
	    /**
	     * generic request exception handler
	     * 
	     * @param {Object} exception
	     */
	    onRequestFailed: function(exception) {
	        this.saving = false;
	        Tine.Felamimail.handleRequestException(exception);
	        this.loadMask.hide();
	    }    
	});
	
	/**
	 * Felamimail Account Edit Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	 Tine.Felamimail.AccountEditDialog.openWindow = function (config) {
	    var window = Tine.WindowFactory.getWindow({
	        width: 580,
	        height: 500,
	        name: Tine.Felamimail.AccountEditDialog.prototype.windowNamePrefix + Ext.id(),
	        contentPanelConstructor: 'Tine.Felamimail.AccountEditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

/***/ 327:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 *
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	
	Ext.ns('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.AttachmentUploadGrid
	 * @extends     Ext.grid.GridPanel
	 *
	 * @author      Michael Spahn <m.spahn@metaways.de>
	 * @copyright   Copyright (c) 2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 */
	Tine.Felamimail.AttachmentUploadGrid = Ext.extend(Tine.widgets.grid.FileUploadGrid, {
	    /**
	     * Store with all valid attachment types
	     */
	    attachmentTypeStore: null,
	
	    currentRecord: null,
	
	    initComponent: function () {
	        this.attachmentTypeStore = new Ext.data.JsonStore({
	            fields: ['id', 'name'],
	            data: this.getAttachmentMethods()
	        });
	
	        Tine.Felamimail.AttachmentUploadGrid.superclass.initComponent.call(this);
	
	        this.on('beforeedit', this.onBeforeEdit.createDelegate(this));
	    },
	
	    onBeforeEdit: function (e) {
	        var record = e.record;
	        this.currentRecord = record;
	    },
	
	    getAttachmentMethods: function () {
	        var methods = [{
	            id: 'attachment',
	            name: i18n._('Attachment')
	        }];
	
	        if (!Tine.Tinebase.appMgr.isEnabled('Filemanager')) {
	            return methods;
	        }
	
	        methods = methods.concat([{
	                id: 'download_public_fm',
	                name: i18n._('Filemanager (inline)')
	            }, {
	                id: 'download_protected_fm',
	                name: i18n._('Filemanager (inline, password)')
	            }, {
	                id: 'systemlink_fm',
	                name: i18n._('Filemanager (Systemlink)')
	            }]
	        );
	
	        return methods;
	    },
	
	    /**
	     * Override columns
	     */
	    getColumns: function () {
	        var me = this;
	
	        var combo = new Ext.form.ComboBox({
	            blurOnSelect: true,
	            expandOnFocus: true,
	            listWidth: 150,
	            mode: 'local',
	            value: 'attachment',
	            displayField: 'name',
	            valueField: 'id',
	            store: me.attachmentTypeStore,
	            disableKeyFilter: true,
	            queryMode: 'local'
	        });
	
	        combo.doQuery = function (q, forceAll, uploadGrid) {
	            this.store.clearFilter();
	
	            this.store.filterBy(function (record, id) {
	                var _ = window.lodash;
	
	                if (_.get(uploadGrid.currentRecord, 'data.type') === 'file' && !_.get(uploadGrid.currentRecord, 'data.account_grants.downloadGrant', true) && id === 'attachment') {
	                    return false;
	                }
	
	                // only fm files can be system links
	                if (_.get(uploadGrid.currentRecord, 'data.type') !== 'file' && id === 'systemlink_fm') {
	                    return false
	                }
	
	                // if no grants, then its not from fm
	                if (!_.get(uploadGrid.currentRecord, 'data.account_grants.publishGrant', true) && id.startsWith('download_')) {
	                    return false;
	                }
	
	                return true;
	            }.createDelegate(this, [uploadGrid.currentRecord], true));
	
	            this.onLoad();
	        }.createDelegate(combo, [this], true);
	
	        return [{
	            id: 'attachment_type',
	            dataIndex: 'attachment_type',
	            sortable: true,
	            width: 150,
	            header: i18n._('Attachment Type'),
	            tooltip: i18n._('Click icon to change'),
	            listeners: {},
	            value: 'attachment',
	            renderer: function (value) {
	                if (!value) {
	                    return null;
	                }
	
	                var record = me.attachmentTypeStore.getById(value);
	
	                if (!record) {
	                    return null;
	                }
	
	                return record.get('name');
	            },
	            editor: combo
	        }, {
	            resizable: true,
	            id: 'name',
	            dataIndex: 'name',
	            flex: 1,
	            header: i18n._('name'),
	            renderer: Ext.ux.PercentRendererWithName
	        }, {
	            resizable: true,
	            id: 'size',
	            dataIndex: 'size',
	            width: 70,
	            header: i18n._('size'),
	            renderer: Ext.util.Format.fileSize
	        }, {
	            resizable: true,
	            id: 'type',
	            dataIndex: 'type',
	            width: 70,
	            header: i18n._('type')
	        }]
	    },
	
	    onFilesSelect: function (fileSelector, e) {
	        var files = fileSelector.getFileList();
	        Ext.each(files, function (file) {
	
	            var upload = new Ext.ux.file.Upload({
	                file: file,
	                fileSelector: fileSelector
	            });
	
	            var uploadKey = Tine.Tinebase.uploadManager.queueUpload(upload);
	            var fileRecord = Tine.Tinebase.uploadManager.upload(uploadKey);
	
	            upload.on('uploadfailure', this.onUploadFail, this);
	            upload.on('uploadcomplete', this.onUploadComplete, fileRecord);
	            upload.on('uploadstart', Tine.Tinebase.uploadManager.onUploadStart, this);
	
	            if (fileRecord.get('status') !== 'failure') {
	                // overriden because of this
	                fileRecord.data.attachment_type = 'attachment';
	                this.store.add(fileRecord);
	            }
	
	
	        }, this);
	
	    },
	
	    onFileSelectFromFilemanager: function (nodes) {
	        var me = this;
	
	        Ext.each(nodes, function (node) {
	            var record = new Tine.Filemanager.Model.Node(node);
	
	            if (me.store.find('name', record.get('name')) === -1) {
	                // Overriden because of this
	                record.data.attachment_type = 'systemlink_fm';
	                me.store.add(record);
	            } else {
	                Ext.MessageBox.show({
	                    title: i18n._('Failure'),
	                    msg: i18n._('This file is already attached to this record.'),
	                    buttons: Ext.MessageBox.OK,
	                    icon: Ext.MessageBox.ERROR
	                });
	            }
	        });
	    },
	
	});


/***/ },

/***/ 328:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.ComposeEditor
	 * @extends     Ext.form.HtmlEditor
	 * 
	 * <p>Compose HTML Editor</p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Felamimail.ComposeEditor
	 */
	Tine.Felamimail.ComposeEditor = Ext.extend(Ext.form.HtmlEditor, {
	    
	    cls: 'felamimail-message-body-html',
	    name: 'body_html',
	    allowBlank: true,
	
	    getDocMarkup: function(){
	        var markup = '<html>'
	            + '<head>'
	            + '<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">'
	            + '<title></title>'
	            + '<style type="text/css">'
	                // standard css reset
	                + "html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{margin:0;padding:0;}img,body,html{border:0;}address,caption,cite,code,dfn,em,strong,th,var{font-style:normal;font-weight:normal;}ol,ul {list-style:none;}caption,th {text-align:left;}h1,h2,h3,h4,h5,h6{font-size:100%;}q:before,q:after{content:'';}"
	                // small forms
	                + "html,body,div,dl,dt,dd,ul,ol,li,h1,h2,h3,h4,h5,h6,pre,form,fieldset,input,p,blockquote,th,td{font-size: small;}"
	                // lists
	                + "ul {list-style:circle outside; margin-left: 20px;}"
	                + "ol {list-style:decimal outside; margin-left: 20px;}"
	                + "strong {font-weight: bold; font-style: inherit;}"
	                + "em {font-style: italic; font-weight: inherit;}"
	                // fmail special
	                + '.felamimail-body-blockquote {'
	                    + 'margin: 5px 10px 0 3px;'
	                    + 'padding-left: 10px;'
	                    + 'border-left: 2px solid #000088;'
	                + '} '
	            + '</style>'
	            + '</head>'
	            + '<body style="padding: 5px 0px 0px 5px; margin: 0px">'
	            + '</body></html>';
	
	        return markup;
	    },
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        
	        this.plugins = [
	            new Ext.ux.form.HtmlEditor.IndentOutdent(),  
	            new Ext.ux.form.HtmlEditor.RemoveFormat(),
	            new Ext.ux.form.HtmlEditor.EndBlockquote(),
	            new Ext.ux.form.HtmlEditor.SpecialKeys(),
	            new Ext.ux.form.HtmlEditor.PlainText()
	        ];
	        
	        Tine.Felamimail.ComposeEditor.superclass.initComponent.call(this);
	    },
	         
	    // *Fix* Overridding the onRender method, in order to
	    // unset the height and width property, so that the
	    // layout manager won't consider this field to be of
	    // fixed dimension, thus ignoring the flex option
	    onRender: function () {
	        Tine.Felamimail.ComposeEditor.superclass.onRender.apply(this, arguments);
	        delete this.height;
	        delete this.width;
	    }
	});
	
	Ext.namespace('Ext.ux.form.HtmlEditor');
	
	/**
	 * @class Ext.ux.form.HtmlEditor.EndBlockquote
	 * @extends Ext.util.Observable
	 * 
	 * plugin for htmleditor that ends blockquotes on ENTER
	 * tested with chrome, sarari, FF4+
	 * fallsback for old (non IE) browser which works for easy structures
	 * does not work with IE yet
	 * 
	 * TODO move this to ux dir
	 */
	Ext.ux.form.HtmlEditor.EndBlockquote = Ext.extend(Ext.util.Observable , {
	
	    // private
	    init: function(cmp){
	            this.cmp = cmp;
	            this.cmp.on('initialize', this.onInit, this);
	    },
	    
	    // private
	    onInit: function() {
	        if (Ext.isIE) {
	            Ext.EventManager.on(this.cmp.getDoc(), {
	                'keydown': this.endBlockquoteIE,
	                scope: this
	            });
	        } else if (Ext.isFunction(this.cmp.win.getSelection().modify)) {
	            Ext.EventManager.on(this.cmp.getDoc(), {
	                'keyup': this.endBlockquoteHTML5,
	                scope: this
	            });
	        } else {
	            Ext.EventManager.on(this.cmp.getDoc(), {
	                'keydown': this.endBlockquoteHTML4,
	                scope: this
	            });
	        }
	        
	    },
	
	    /**
	     * on keyup 
	     * 
	     * @param {Event} e
	     */
	    endBlockquoteIE: function(e) {
	        if (e.getKey() == e.ENTER) {
	            
	            e.stopEvent();
	            e.preventDefault();
	            
	            var s = this.cmp.win.document.selection,
	                r = s.createRange(),
	                doc = this.cmp.getDoc(),
	                anchor = r.parentElement(),
	                level = this.getBlockquoteLevel(anchor),
	                scrollTop = doc.body.scrollTop;
	                
	            if (level > 0) {
	                r.moveStart('word', -1);
	                r.moveEnd('textedit');
	                var fragment = r.htmlText;
	                r.execCommand('Delete');
	                
	                var newText = doc.createElement('p'),
	                    newTextMark = '###newTextHere###' + Ext.id(),
	                    fragmentMark = '###fragmentHere###' + Ext.id();
	                newText.innerHTML = newTextMark + fragmentMark;
	                doc.body.appendChild(newText);
	                
	                r.expand('textedit');
	                r.findText(fragmentMark);
	                r.select();
	                r.pasteHTML(fragment);
	
	                r.expand('textedit');
	                r.findText(newTextMark);
	                r.select();
	                r.execCommand('Delete');
	                
	                // reset scroller
	                doc.body.scrollTop = scrollTop;
	                
	                this.cmp.syncValue();
	                this.cmp.deferFocus();
	            }
	            
	        }
	        
	        return;
	    },
	    
	    /**
	     * on keyup 
	     * 
	     * @param {Event} e
	     */
	    endBlockquoteHTML5: function(e) {
	        // Chrome, Safari, FF4+
	        if (e.getKey() == e.ENTER) {
	            var s = this.cmp.win.getSelection(),
	                r = s.getRangeAt(0),
	                doc = this.cmp.getDoc(),
	                level = this.getBlockquoteLevel(s.anchorNode),
	                scrollTop = doc.body.scrollTop;
	                
	            if (level > 0) {
	                // cut from cursor to end of the document
	                if (s.anchorNode.nodeName == '#text') {
	                    r.setStartBefore(s.anchorNode.parentNode);
	                }
	                s.modify("move", "backward", "character");
	                r.setEndAfter(doc.body.lastChild);
	                var fragmet = r.extractContents();
	                
	                // insert paragraph for new text and move cursor in
	                // NOTE: we need at least one character in the newText to move cursor in
	                var newText = doc.createElement('p');
	                newText.innerHTML = '&nbsp;';
	                doc.body.appendChild(newText);
	                s.modify("move", "forward", "character");
	                
	                // paste rest of document 
	                doc.body.appendChild(fragmet);
	                
	                // reset scroller
	                doc.body.scrollTop = scrollTop;
	            }
	        }
	    },
	
	    /**
	     * on keydown 
	     * 
	     * @param {Event} e
	     */
	    endBlockquoteHTML4: function(e) {
	        if (e.getKey() == e.ENTER) {
	            var s = this.cmp.win.getSelection(),
	                r = s.getRangeAt(0),
	                doc = this.cmp.getDoc(),
	                level = this.getBlockquoteLevel(s.anchorNode);
	            
	            if (level > 0) {
	                e.stopEvent();
	                e.preventDefault();
	                
	                this.cmp.win.focus();
	                if (level == 1) {
	                    this.cmp.insertAtCursor('<br /><blockquote class="felamimail-body-blockquote"><br />');
	                    this.cmp.execCmd('outdent');
	                    this.cmp.execCmd('outdent');
	                } else if (level > 1) {
	                    for (var i=0; i < level; i++) {
	                        this.cmp.insertAtCursor('<br /><blockquote class="felamimail-body-blockquote">');
	                        this.cmp.execCmd('outdent');
	                        this.cmp.execCmd('outdent');
	                    }
	                    var br = doc.createElement('br');
	                    r.insertNode(br);
	                }
	                this.cmp.deferFocus();
	            }
	        }
	    },
	    
	    /**
	     * get blockquote level helper
	     * 
	     * @param {DOMNode} node
	     * @return {Integer}
	     */
	    getBlockquoteLevel: function(node) {
	        var result = 0;
	        
	        while (node.nodeName == '#text' || node.tagName.toLowerCase() != 'body') {
	            if (node.tagName && node.tagName.toLowerCase() == 'blockquote') {
	                result++;
	            }
	            node = node.parentNode ? node.parentNode : node.parentElement;
	        }
	        
	        return result;
	    }
	});
	
	/**
	 * @class Ext.ux.form.HtmlEditor.SpecialKeys
	 * @extends Ext.util.Observable
	 * 
	 * plugin for htmleditor that fires events for special keys (like CTRL-ENTER and SHIFT-TAB)
	 * 
	 * TODO move this to ux dir
	 */
	Ext.ux.form.HtmlEditor.SpecialKeys = Ext.extend(Ext.util.Observable , {
	    // private
	    init: function(cmp){
	        this.cmp = cmp;
	        this.cmp.on('initialize', this.onInit, this);
	    },
	    // private
	    onInit: function(){
	        Ext.EventManager.on(this.cmp.getDoc(), {
	            'keydown': this.onKeydown,
	            scope: this
	        });
	    },
	
	    /**
	     * on keydown 
	     * 
	     * @param {Event} e
	     * 
	     * TODO try to prevent TAB key event from inserting a TAB in the editor 
	     */
	    onKeydown: function(e) {
	        if (e.getKey() == e.TAB && e.shiftKey || e.getKey() == e.ENTER && e.ctrlKey) {
	            this.cmp.fireEvent('keydown', e);
	        }
	    }
	});


/***/ },

/***/ 329:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Felamimail');
	
	/**
	 * Contact grid panel
	 * 
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.ContactGridPanel
	 * @extends     Tine.Addressbook.ContactGridPanel
	 * 
	 * <p>Contact Grid Panel</p>
	 * <p>
	 * </p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Felamimail.ContactGridPanel
	 */
	Tine.Felamimail.ContactGridPanel = Ext.extend(Tine.Addressbook.ContactGridPanel, {
	
	    hasDetailsPanel: false,
	    hasFavoritesPanel: false,
	    hasQuickSearchFilterToolbarPlugin: false,
	    stateId: 'FelamimailContactGrid',
	    
	    gridConfig: {
	        autoExpandColumn: 'n_fileas',
	        enableDragDrop: false
	    },
	    
	    /**
	     * the message record with recipients
	     * @type Tine.Felamimail.Model.Message
	     */
	    messageRecord: null,
	    
	    /**
	     * felamimail app, needed for translations
	     * @type Tine.Felamimail.Application
	     */
	    felamimailApp: null,
	    
	    /**
	     * inits this cmp
	     * @private
	     */
	    initComponent: function() {
	        this.addEvents(
	            /**
	             * @event addcontacts
	             * Fired when contacts are added
	             */
	            'addcontacts'
	        );
	        
	        this.app = Tine.Tinebase.appMgr.get('Addressbook');
	        this.felamimailApp = Tine.Tinebase.appMgr.get('Felamimail');
	        
	        Tine.Felamimail.ContactGridPanel.superclass.initComponent.call(this);
	        
	        this.grid.on('rowdblclick', this.onRowDblClick, this);
	        this.grid.on('cellclick', this.onCellClick, this);
	        this.store.on('load', this.onContactStoreLoad, this);
	    },
	    
	    /**
	     * initialises the filter panel 
	     * 
	     * @param {Object} config
	     */
	    initFilterPanel: function(config) {
	        this.defaultFilters = [
	            {field: 'email_query', operator: 'contains', value: '@'}
	        ];
	        
	        Tine.Felamimail.ContactGridPanel.superclass.initFilterPanel.call(this, {
	            filterFieldWidth: 100,
	            filterValueWidth: 100
	        });
	    },
	    
	    /**
	     * returns array with columns
	     * 
	     * @return {Array}
	     */
	    getColumns: function() {
	        var columns = Tine.Felamimail.ContactGridPanel.superclass.getColumns.call(this);
	        
	        // hide all columns except name/company/email/email_home (?)
	        Ext.each(columns, function(column) {
	            if (['n_fileas', 'org_name', 'email'].indexOf(column.dataIndex) === -1) {
	                column.hidden = true;
	            }
	        });
	        
	        this.radioTpl = new Ext.XTemplate('<input',
	            ' name="' + this.id + '_{id}"',
	            ' value="{type}"',
	            ' type="radio"',
	            ' autocomplete="off"',
	            ' class="x-form-radio x-form-field"',
	            ' {checked}',
	        '>');
	        
	        Ext.each(['To', 'Cc', 'Bcc', 'None'], function(type) { // i18n._('None')
	            columns.push({
	                header: this.felamimailApp.i18n._(type),
	                dataIndex: Ext.util.Format.lowercase(type),
	                width: 50,
	                hidden: false,
	                renderer: this.typeRadioRenderer.createDelegate(this, [type], 0)
	            });
	            
	        }, this);
	            
	        return columns;
	    },
	    
	    /**
	     * render type radio buttons in grid
	     * 
	     * @param {String} type
	     * @param {String} value
	     * @param {Object} metaData
	     * @param {Object} record
	     * @param {Number} rowIndex
	     * @param {Number} colIndex
	     * @param {Store} store
	     * @return {String}
	     */
	    typeRadioRenderer: function(type, value, metaData, record, rowIndex, colIndex, store) {
	        if (! record.hasEmail()) {
	            return '';
	        }
	        
	        var lowerType = Ext.util.Format.lowercase(type);
	        
	        return this.radioTpl.apply({
	            id: record.id, 
	            type: lowerType,
	            checked: lowerType === 'none' ? 'checked' : ''
	        });
	    },
	    
	    /**
	     * called after a new set of Records has been loaded
	     * 
	     * @param  {Ext.data.Store} this.store
	     * @param  {Array}          loaded records
	     * @param  {Array}          load options
	     * @return {Void}
	     */
	    onContactStoreLoad: function(store, records, options) {
	        if (Ext.isRecord(this.messageRecord) && Ext.isArray(this.messageRecord.data[type])) {
	            Ext.each(records, function (record) {
	                Ext.each(['to', 'cc', 'bcc'], function (type) {
	                    if (this.messageRecord.data[type].indexOf(Tine.Felamimail.getEmailStringFromContact(record)) !== -1) {
	                        this.setTypeRadio(record, type);
	                    }
	                }, this);
	            }, this);
	        }
	    },
	    
	    /**
	     * cell click handler -> update recipients in record
	     * 
	     * @param {Grid} grid
	     * @param {Number} row
	     * @param {Number} col
	     * @param {Event} e
	     */
	    onCellClick: function(grid, row, col, e) {
	        var contact = this.store.getAt(row),
	            typeToSet = this.grid.getColumnModel().getDataIndex(col)
	        
	        if (['to', 'cc', 'bcc', 'none'].indexOf(typeToSet) === -1) {
	            // some other column has been clicked
	            return;
	        }
	        
	        if (! contact.hasEmail() && typeToSet !== 'none') {
	            this.setTypeRadio(contact, 'none');
	        } else {
	            this.setTypeRadio(contact, typeToSet);
	            this.updateRecipients(contact, typeToSet);
	        }
	    },
	    
	    /**
	     * update recipient
	     * 
	     * @param {Tine.Addressbook.Model.Contact} contact
	     * @param {String} typeToSet
	     */
	    updateRecipients: function(contact, typeToSet) {
	        var email = Tine.Felamimail.getEmailStringFromContact(contact),
	            found = false;
	            
	        Ext.each(['to', 'cc', 'bcc'], function(type) {
	            if (this.messageRecord.data[type].indexOf(email) !== -1) {
	                if (type !== typeToSet) {
	                    this.messageRecord.data[type].remove(email);
	                } else {
	                    found = true;
	                }
	            }
	        }, this);
	        
	        if (! found && typeToSet !== 'none') {
	            Tine.log.debug('Tine.Felamimail.ContactGridPanel::updateRecipients() - adding email ' + email + ' to ' + typeToSet);
	            this.messageRecord.data[typeToSet].push(email);
	        }
	    },
	    
	    /**
	     * update type radio buttons dom
	     * 
	     * @param {Array} records of type Tine.Addressbook.Model.Contact
	     * @param {String} type
	     */
	    setTypeRadio: function(records, type) {
	        var rs = [].concat(records);
	        
	        Ext.each(rs, function(r) {
	            if (r.hasEmail() || type === 'none') {
	                Ext.select('input[name=' + this.id + '_' + r.id + ']', this.grid.el).each(function(el) {
	                    el.dom.checked = type === el.dom.value;
	                });
	                this.updateRecipients(r, type);
	            }
	        }, this);
	    },
	    
	    /**
	     * Return CSS class to apply to rows depending upon email set or not
	     * 
	     * @param {Tine.Addressbook.Model.Contact} record
	     * @param {Integer} index
	     * @return {String}
	     */
	    getViewRowClass: function(record, index) {
	        var className = '';
	        
	        if (! record.hasEmail()) {
	            className = 'felamimail-no-email';
	        }
	        
	        return className;
	    },
	    
	    /**
	     * @private
	     */
	    initActions: function() {
	        this.actions_addAsTo = new Ext.Action({
	            requiredGrant: 'readGrant',
	            text: this.felamimailApp.i18n._('Add as "To"'),
	            disabled: true,
	            iconCls: 'action_add',
	            actionUpdater: this.updateRecipientActions,
	            handler: this.onAddContact.createDelegate(this, ['to']),
	            allowMultiple: true,
	            scope: this
	        });
	
	        this.actions_addAsCc = new Ext.Action({
	            requiredGrant: 'readGrant',
	            text: this.felamimailApp.i18n._('Add as "Cc"'),
	            disabled: true,
	            iconCls: 'action_add',
	            actionUpdater: this.updateRecipientActions,
	            handler: this.onAddContact.createDelegate(this, ['cc']),
	            allowMultiple: true,
	            scope: this
	        });
	
	        this.actions_addAsBcc = new Ext.Action({
	            requiredGrant: 'readGrant',
	            text: this.felamimailApp.i18n._('Add as "Bcc"'),
	            disabled: true,
	            iconCls: 'action_add',
	            actionUpdater: this.updateRecipientActions,
	            handler: this.onAddContact.createDelegate(this, ['bcc']),
	            allowMultiple: true,
	            scope: this
	        });
	        
	        this.actions_setToNone = new Ext.Action({
	            requiredGrant: 'readGrant',
	            text: this.felamimailApp.i18n._('Remove from recipients'),
	            disabled: true,
	            iconCls: 'action_delete',
	            actionUpdater: this.updateRecipientActions,
	            handler: this.onAddContact.createDelegate(this, ['none']),
	            allowMultiple: true,
	            scope: this
	        });
	        
	        //register actions in updater
	        this.actionUpdater.addActions([
	            this.actions_addAsTo,
	            this.actions_addAsCc,
	            this.actions_addAsBcc,
	            this.actions_setToNone
	        ]);
	    },
	    
	    /**
	     * updates context menu
	     * 
	     * @param {Ext.Action} action
	     * @param {Object} grants grants sum of grants
	     * @param {Object} records
	     */
	    updateRecipientActions: function(action, grants, records) {
	        if (records.length > 0) {
	            var emptyEmails = true;
	            for (var i=0; i < records.length; i++) {
	                if (records[i].hasEmail()) {
	                    emptyEmails = false;
	                    break;
	                }
	            }
	            
	            action.setDisabled(emptyEmails);
	        } else {
	            action.setDisabled(true);
	        }
	    },
	    
	    /**
	     * on add contact -> fires addcontacts event and passes rows + type
	     * 
	     * @param {String} type
	     */
	    onAddContact: function(type) {
	        var sm = this.grid.getSelectionModel(),
	            selectedRows = sm.getSelections();
	            
	        this.setTypeRadio(selectedRows, type);
	
	        // search contacts if all pages are selected (filter select)
	        if (sm.isFilterSelect) {
	            this['AddressLoadMask'] = new Ext.LoadMask(Ext.getBody(), {msg: this.felamimailApp.i18n._('Loading Mail Addresses')});
	            this['AddressLoadMask'].show();
	            
	            var contact = null;
	            Tine.Addressbook.searchContacts(sm.getSelectionFilter(), null, function(response) {
	                Ext.each(response.results, function(contactData) {
	                    contact = new Tine.Addressbook.Model.Contact(contactData);
	                    this.updateRecipients(contact, type);
	                }, this);
	                
	                this['AddressLoadMask'].hide();
	            }.createDelegate(this));
	        }
	    },
	    
	    /**
	     * row doubleclick handler
	     * 
	     * @param {} grid
	     * @param {} row
	     * @param {} e
	     */
	    onRowDblClick: function(grid, row, e) {
	        this.onAddContact('to');
	    }, 
	    
	    /**
	     * returns rows context menu
	     * 
	     * @return {Ext.menu.Menu}
	     */
	    getContextMenu: function() {
	        if (! this.contextMenu) {
	            var items = [
	                this.actions_addAsTo,
	                this.actions_addAsCc,
	                this.actions_addAsBcc,
	                this.actions_setToNone
	            ];
	            this.contextMenu = new Ext.menu.Menu({
	                items: items,
	                plugins: [{
	                    ptype: 'ux.itemregistry',
	                    key:   'Tinebase-MainContextMenu'
	                }]
	            });
	        }
	        return this.contextMenu;
	    }
	});
	
	Ext.reg('felamimailcontactgrid', Tine.Felamimail.ContactGridPanel);


/***/ },

/***/ 330:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.ContactSearchCombo
	 * @extends     Tine.Addressbook.SearchCombo
	 * 
	 * <p>Email Search ComboBox</p>
	 * <p></p>
	 * <pre></pre>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Felamimail.ContactSearchCombo
	 */
	Tine.Felamimail.ContactSearchCombo = Ext.extend(Tine.Addressbook.SearchCombo, {
	
	    /**
	     * @cfg {Boolean} forceSelection
	     */
	    forceSelection: false,
	    
	    /**
	     * @private
	     */ 
	    valueIsList: false,
	
	    /**
	     * @private
	     */
	    initComponent: function() {
	        // Search Lists and Contacts
	        this.recordClass = Tine.Addressbook.Model.EmailAddress;
	        this.recordProxy = Tine.Addressbook.emailAddressBackend;
	
	        // add additional filter to show only contacts with email addresses
	        this.additionalFilters = [{field: 'email_query', operator: 'contains', value: '@' }];
	        
	        this.tpl = new Ext.XTemplate(
	            '<tpl for="."><div class="search-item">',
	                '{[this.encode(values.n_fileas)]}',
	                ' (<b>{[this.shorten(this.encode(values.email, values.email_home, values.emails))]}</b>)',
	            '</div></tpl>',
	            {
	                encode: function(email, email_home, emails) {
	                    if (email) {
	                        return Ext.util.Format.htmlEncode(email);
	                    } else if (email_home) {
	                        return Ext.util.Format.htmlEncode(email_home);
	                    } else if (emails) {
	                        return Ext.util.Format.htmlEncode(emails);
	                    } else {
	                        return '';
	                    }
	                },
	                shorten: function(text) {
	                    if (text) {
	                        if (text.length < 50) {
	                            return text;
	                        } else {
	                            return text.substr(0,50) + "...";
	                        }
	                    } else {
	                        return "";
	                    }
	                }
	            }
	        );
	        
	        Tine.Felamimail.ContactSearchCombo.superclass.initComponent.call(this);
	        
	        this.store.on('load', this.onStoreLoad, this);
	    },
	    
	    /**
	     * override default onSelect
	     * - set email/name as value
	     * 
	     * @param {} record
	     * @private
	     */
	    onSelect: function(record, index) {
	        if (!record.get("emails")) {
	            var value = Tine.Felamimail.getEmailStringFromContact(record);
	            this.setValue(value);
	            this.valueIsList = false;
	        } else {
	            this.setValue(record.get("emails"));
	            this.valueIsList = true;
	        }
	        
	        this.collapse();
	        this.fireEvent('blur', this);
	        this.fireEvent('select', this, record, index);
	    },
	    
	    /**
	     * always return raw value
	     * 
	     * @return String
	     */
	    getValue: function() {
	        return this.getRawValue();
	    },
	
	    /** 
	     * @return bool
	     */
	    getValueIsList: function() {
	        return this.valueIsList;
	    },
	
	    /**
	     * always set valueIsList to false
	     *
	     * @param String value
	     */
	    setValue: function(value) {
	       this.valueIsList = false;
	       Tine.Felamimail.ContactSearchCombo.superclass.setValue.call(this, value); 
	    }, 
	    
	    /**
	     * on load handler of combo store
	     * -> add additional record if contact has multiple email addresses
	     * 
	     * @param {} store
	     * @param {} records
	     * @param {} options
	     */
	    onStoreLoad: function(store, records, options) {
	        this.addAlternativeEmail(store, records);
	        this.removeDuplicates(store);
	    },
	    
	    /**
	     * add alternative email addresses
	     * 
	     * @param {} store
	     * @param {} records
	     */
	    addAlternativeEmail: function(store, records) {
	        var index = 0,
	            newRecord,
	            recordData;
	            
	        Ext.each(records, function(record) {
	            if (record.get('email') && record.get('email_home') && record.get('email') !== record.get('email_home')) {
	                index++;
	                recordData = Ext.copyTo({}, record.data, ['email_home', 'n_fileas']);
	                newRecord = Tine.Addressbook.contactBackend.recordReader({responseText: Ext.util.JSON.encode(recordData)});
	                newRecord.id = Ext.id();
	                
	                Tine.log.debug('add alternative: ' + Tine.Felamimail.getEmailStringFromContact(newRecord));
	                store.insert(index, [newRecord]);
	            }
	            index++;
	        });
	    },
	    
	    /**
	     * remove duplicate contacts
	     * 
	     * @param {} store
	     */
	    removeDuplicates: function(store) {
	        var duplicates = null;
	        
	        store.each(function(record) {
	            duplicates = store.queryBy(function(contact) {
	                return record.id !== contact.id && Tine.Felamimail.getEmailStringFromContact(record) == Tine.Felamimail.getEmailStringFromContact(contact);
	            });
	            if (duplicates.getCount() > 0) {
	                Tine.log.debug('remove duplicate: ' + Tine.Felamimail.getEmailStringFromContact(record));
	                store.remove(record);
	            }
	        });
	    }    
	});
	Ext.reg('felamimailcontactcombo', Tine.Felamimail.ContactSearchCombo);


/***/ },

/***/ 331:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2013 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.Application
	 * @extends     Tine.Tinebase.Application
	 * 
	 * <p>Felamimail application obj</p>
	 * <p>
	 * </p>
	 * 
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * 
	 * @constructor
	 * Create a new  Tine.Felamimail.Application
	 */
	Tine.Felamimail.Application = Ext.extend(Tine.Tinebase.Application, {
	    
	    /**
	     * auto hook text i18n._('New Mail')
	     */
	    addButtonText: 'New Mail',
	    
	    /**
	     * @property checkMailsDelayedTask
	     * @type Ext.util.DelayedTask
	     */
	    checkMailsDelayedTask: null,
	    
	    /**
	     * @property defaultAccount
	     * @type Tine.Felamimail.Model.Account
	     */
	    defaultAccount: null,
	    
	    /**
	     * @type Ext.data.JsonStore
	     */
	    folderStore: null,
	    
	    /**
	     * @type Ext.data.JsonStore
	     */
	    accountStore: null,
	    
	    /**
	     * @property updateInterval user defined update interval (milliseconds)
	     * @type Number
	     */
	    updateInterval: null,
	    
	    /**
	     * transaction id of current update message cache request
	     * @type Number
	     */
	    updateMessageCacheTransactionId: null,
	    
	    getFolderStatusTransactionInProgress: false, 
	    
	    /**
	     * unreadcount in default account inbox
	     * @type Number
	     */
	    unreadcountInDefaultInbox: 0,
	
	    routes: {
	        'MailTo/:params': 'mailto'
	    },
	
	    /**
	     * returns title (Email)
	     * 
	     * @return {String}
	     */
	    getTitle: function() {
	        return this.i18n._('Email');
	    },
	    
	    /**
	     * start delayed task to init folder store / updateFolderStore
	     */
	    init: function() {
	        Tine.log.info('initialising app');
	        this.checkMailsDelayedTask = new Ext.util.DelayedTask(this.checkMails, this);
	        
	        this.updateInterval = parseInt(Tine.Felamimail.registry.get('preferences').get('updateInterval')) * 60000;
	        Tine.log.debug('user defined update interval is "' + this.updateInterval/1000 + '" seconds');
	        
	        this.defaultAccount = Tine.Felamimail.registry.get('preferences').get('defaultEmailAccount');
	        Tine.log.debug('default account is "' + this.defaultAccount);
	        
	        if (window.isMainWindow) {
	            if (Tine.Tinebase.appMgr.getActive() != this && this.updateInterval) {
	                var delayTime = this.updateInterval/20;
	                Tine.log.debug('start preloading mails in "' + delayTime/1000 + '" seconds');
	                this.checkMailsDelayedTask.delay(delayTime);
	            }
	            
	            this.showActiveVacation();
	            this.initGridPanelHooks();
	            this.registerProtocolHandler();
	        }
	    },
	    
	    /**
	     * show notification with active vacation information
	     */
	    showActiveVacation: function () {
	        var accountsWithActiveVacation = this.getAccountStore().query('sieve_vacation_active', true);
	        accountsWithActiveVacation.each(function(item) {
	            Ext.ux.Notification.show(
	                this.i18n._('Active Vacation Message'), 
	                String.format(this.i18n._('Email account "{0}" has an active vacation message.'), item.get('name'))
	            );
	        }, this);
	    },
	    
	    /**
	     * initialize grid panel hooks
	     */
	    initGridPanelHooks: function() {
	        var adbHook = new Tine.Felamimail.GridPanelHook({
	            app: this,
	            foreignAppName: 'Addressbook',
	            modelName: 'Contact'
	        });
	        var adbHook = new Tine.Felamimail.GridPanelHook({
	            app: this,
	            foreignAppName: 'Addressbook',
	            modelName: 'List'
	        });
	        var crmHook = new Tine.Felamimail.GridPanelHook({
	            app: this,
	            foreignAppName: 'Crm',
	            contactInRelation: true,
	            relationType: 'CUSTOMER',
	            modelName: 'Lead',
	            subjectField: 'lead_name'
	        });
	        var calHook = new Tine.Felamimail.GridPanelHook({
	            app: this,
	            foreignAppName: 'Calendar',
	            modelName: 'Event',
	            subjectFn: function(record) {
	                return record ? record.get('summary') + ' - ' + Tine.Calendar.Model.Event.datetimeRenderer(record.get('dtstart')) : '';
	            },
	            addMailFromRecord: function(mailAddresses, record) {
	                Ext.each(record.get('attendee'), function(attender) {
	                    Tine.log.debug('Tine.Felamimail.Application::initGridPanelHooks/addMailFromRecord() - Calendar attender:');
	                    Tine.log.debug(attender);
	                    if (attender.user_type == 'user' || attender.user_type == 'groupmember') {
	                        this.addMailFromAddressBook(mailAddresses, attender.user_id);
	                    }
	                }, this);
	            }
	        });
	    },
	
	    registerProtocolHandler: function() {
	        var text = String.format(this.i18n._('{0} as default mailer'), Tine.title),
	            enabled = true; //Tine.Tinebase.configManager.get('registerMailToHandler', 'Felamimail');
	        Tine.Felamimail.registerProtocolHandlerAction.setText(text);
	
	        if (! (enabled && Ext.isFunction(navigator.registerProtocolHandler))) {
	            Tine.Felamimail.registerProtocolHandlerAction.setHidden(true);
	        }
	
	
	    },
	
	    /**
	     * check mails
	     * 
	     * if no folder is given, we find next folder to update ourself
	     * 
	     * @param {Tine.Felamimail.Model.Folder} [folder]
	     * @param {Function} [callback]
	     */
	    checkMails: function(folder, callback) {
	        this.checkMailsDelayedTask.cancel();
	        
	        if (! this.getFolderStore().getCount() && this.defaultAccount) {
	            this.fetchSubfolders('/' + this.defaultAccount);
	            return;
	        }
	        
	        Tine.log.info('checking mails' + (folder ? ' for folder ' + folder.get('localname') : '') + ' now: ' + new Date());
	        
	        // if no folder is given, see if there is a folder to check in the folderstore
	        if (! folder) {
	            folder = this.getNextFolderToUpdate();
	        }
	        
	        // for testing purposes
	        //console.log('update disabled');
	        //return;
	        
	        if (folder) {
	            var executionTime = folder.isCurrentSelection() ? 10 : Math.min(this.updateInterval/1000, 120);
	            
	            if (this.updateMessageCacheTransactionId && Tine.Felamimail.folderBackend.isLoading(this.updateMessageCacheTransactionId)) {
	                var currentRequestFolder = this.folderStore.query('cache_status', 'pending').first(),
	                    expectedResponseIn = Math.floor((this.updateMessageCacheTransactionExpectedResponse.getTime() - new Date().getTime())/1000);
	            
	                if (currentRequestFolder && (currentRequestFolder !== folder || expectedResponseIn > executionTime)) {
	                    Tine.log.debug('aborting current update message request (expected response in ' + expectedResponseIn + ' seconds)');
	                    Tine.Felamimail.folderBackend.abort(this.updateMessageCacheTransactionId);
	                    currentRequestFolder.set('cache_status', 'incomplete');
	                    currentRequestFolder.commit();
	                } else {
	                    Tine.log.debug('a request updating message cache for folder "' + folder.get('localname') + '" is in progress -> wait for request to return');
	                    return;
	                }
	            }
	            
	            Tine.log.debug('Updating message cache for folder "' + folder.get('localname') + '" of account ' + folder.get('account_id'));
	            Tine.log.debug('Max execution time: ' + executionTime + ' seconds');
	            
	            this.updateMessageCacheTransactionExpectedResponse = new Date().add(Date.SECOND, executionTime);
	            folder.set('cache_status', 'pending');
	            folder.commit();
	            
	            this.updateMessageCacheTransactionId = Tine.Felamimail.folderBackend.updateMessageCache(folder.id, executionTime, {
	                scope: this,
	                callback: callback,
	                failure: this.onBackgroundRequestFail,
	                success: function(folder) {
	                    this.getAccountStore().getById(folder.get('account_id')).setLastIMAPException(null);
	                    this.getFolderStore().updateFolder(folder);
	                    
	                    if (folder.get('cache_status') === 'updating') {
	                        Tine.log.debug('updating message cache for folder "' + folder.get('localname') + '" is in progress on the server (folder is locked)');
	                        return this.checkMailsDelayedTask.delay(this.updateInterval);
	                    }
	                    this.checkMailsDelayedTask.delay(0);
	                }
	            });
	        } else {
	            var allFoldersFetched = this.fetchSubfolders();
	            
	            if (allFoldersFetched) {
	                Tine.log.info('nothing more to do -> will check mails again in "' + this.updateInterval/1000 + '" seconds');
	                if (this.updateInterval > 0) {
	                    this.checkMailsDelayedTask.delay(this.updateInterval);
	                }
	            } else {
	                this.checkMailsDelayedTask.delay(20000);
	            }
	        }
	    },
	    
	    /**
	     * fetch subfolders by parent path 
	     * - if parentPath param is empty, it loops all accounts and account folders to find the next folders to fetch
	     * 
	     * @param {String} parentPath
	     * @return {Boolean} true if all folders of all accounts have been fetched
	     */
	    fetchSubfolders: function(parentPath) {
	        var folderStore = this.getFolderStore(),
	            accountStore = this.getAccountStore(),
	            doQuery = true,
	            allFoldersFetched = false;
	        
	        if (! parentPath) {
	            // find first account that has unfetched folders
	            var index = accountStore.findExact('all_folders_fetched', false),
	                account = accountStore.getAt(index);
	            
	            if (account) {
	                // determine the next level of folders that is not fetched
	                parentPath = '/' + account.id;
	                
	                var recordsOfAccount = folderStore.query('account_id', account.id);
	                if (recordsOfAccount.getCount() > 0) {
	                    // loop account folders and find the next folder path that hasn't been queried and has children
	                    var path, found = false;
	                    recordsOfAccount.each(function(record) {
	                        path = parentPath + '/' + record.id;
	                        if (! folderStore.isLoadedOrLoading('parent_path', path) && (! account.get('has_children_support') || record.get('has_children'))) {
	                            parentPath = path;
	                            found = true;
	                            Tine.log.debug('fetching next level of subfolders for ' + record.get('globalname'));
	                            return false;
	                        }
	                        return true;
	                    }, this);
	                    
	                    if (! found) {
	                        Tine.log.debug('all folders of account ' + account.get('name') + ' have been fetched ...');
	                        account.set('all_folders_fetched', true);
	                        return false;
	                    }
	                } else {
	                    Tine.log.debug('fetching first level of folders for account ' + account.get('name'));
	                }
	                
	            } else {
	                Tine.log.debug('all folders of all accounts have been fetched ...');
	                return true;
	            }
	        } else {
	            Tine.log.debug('no folders in store yet, fetching first level ...');
	        }
	        
	        if (! folderStore.queriesPending || folderStore.queriesPending.length == 0) {
	            folderStore.asyncQuery('parent_path', parentPath, this.checkMails.createDelegate(this, []), [], this, folderStore);
	        } else {
	            this.checkMailsDelayedTask.delay(0);
	        }
	        
	        return false;
	    },
	    
	    /**
	     * get folder store
	     * 
	     * @return {Tine.Felamimail.FolderStore}
	     */
	    getFolderStore: function() {
	        if (! this.folderStore) {
	            Tine.log.debug('creating folder store');
	            this.folderStore = new Tine.Felamimail.FolderStore({
	                listeners: {
	                    scope: this,
	                    update: this.onUpdateFolder
	                }
	            });
	        }
	        
	        return this.folderStore;
	    },
	    
	    /**
	     * gets next folder which needs to be checked for mails
	     * 
	     * @return {Model.Folder/null}
	     */
	    getNextFolderToUpdate: function() {
	        var currNode = this.getMainScreen().getTreePanel().getSelectionModel().getSelectedNode(),
	            currFolder = currNode ? this.getFolderStore().getById(currNode.id) : null;
	        
	        // current selection has highest prio!
	        if (currFolder && currFolder.needsUpdate(this.updateInterval)) {
	            return currFolder;
	        }
	        
	        // check if inboxes need updates
	        var inboxes = this.folderStore.queryBy(function(folder) {
	            return folder.isInbox() && folder.needsUpdate(this.updateInterval);
	        }, this);
	        if (inboxes.getCount() > 0) {
	            return inboxes.first();
	        }
	        
	        // check for incompletes
	        var incompletes = this.folderStore.queryBy(function(folder) {
	            return (['complete', 'updating', 'disconnect'].indexOf(folder.get('cache_status')) === -1 && folder.get('is_selectable'));
	        }, this);
	        if (incompletes.getCount() > 0) {
	            Tine.log.debug('Got ' + incompletes.getCount() + ' incomplete folders.');
	            var firstIncomplete = incompletes.first();
	            Tine.log.debug('First ' + firstIncomplete.get('cache_status') + ' folder to check: ' + firstIncomplete.get('globalname'));
	            return firstIncomplete;
	        }
	        
	        // check for outdated
	        if (! this.getFolderStatusTransactionInProgress) {
	            this.getStatusOfOutdatedFolders();
	        } else {
	            Tine.log.debug('getFolderStatus() already running ... wait a little more.');
	        }
	        
	        // nothing to update
	        return null;
	    },
	    
	    /**
	     * collects outdated folders and calls getFolderStatus on server to fetch all folders that need to be updated
	     */
	    getStatusOfOutdatedFolders: function() {
	        var outdated = this.folderStore.queryBy(function(folder) {
	            if (! folder.get('is_selectable')) {
	                return false;
	            }
	            
	            var timestamp = folder.get('client_access_time');
	            if (! Ext.isDate(timestamp)) {
	                return true;
	            }
	            // update inboxes more often than other folders
	            if (folder.isInbox() && timestamp.getElapsed() > this.updateInterval) {
	                return true;
	            } else if (timestamp.getElapsed() > (this.updateInterval * 5)) {
	                return true;
	            }
	            return false;
	        }, this);
	        
	        if (outdated.getCount() > 0) {
	            Tine.log.debug('Still got ' + outdated.getCount() + ' outdated folders to update');
	            
	            // call Felamimail.getFolderStatus() with ids of outdated folders -> update folder store on success
	            // get only max 50 folders at once
	            var rangeOfFolders = (outdated.getCount() > 50) ? outdated.getRange(0, 49) : outdated.getRange(),
	                ids = [],
	                now = new Date();
	            Ext.each(rangeOfFolders, function(folder) {
	                folder.set('client_access_time', now);
	                ids.push(folder.id);
	            });
	            
	            var filter = [{field: 'id', operator: 'in', value: ids}];
	            Tine.log.debug('Requesting folder status of ' + rangeOfFolders.length + ' folders ...');
	            Tine.Felamimail.getFolderStatus(filter, this.onGetFolderStatusSuccess.createDelegate(this));
	            this.getFolderStatusTransactionInProgress = true;
	        }
	    },
	    
	    /**
	     * get folder status returned -> set folders that need an update to pending status
	     * 
	     * @param {Array} response
	     */
	    onGetFolderStatusSuccess: function(response) {
	        this.getFolderStatusTransactionInProgress = false;
	        Tine.log.debug('Tine.Felamimail.Application::onGetFolderStatusSuccess() -> Folder status update successful.');
	        Tine.log.debug(response);
	        
	        if (response && response.length > 0) {
	            Tine.log.debug('Tine.Felamimail.Application::onGetFolderStatusSuccess() -> Got ' + response.length + ' folders that need an update.');
	            
	            Ext.each(response, function(folder) {
	                var folderToUpdate = this.folderStore.getById(folder.id);
	                folderToUpdate.set('cache_status', 'pending');
	            }, this);
	            
	            this.checkMailsDelayedTask.delay(1000);
	        } else {
	            Tine.log.debug('Tine.Felamimail.Application::onGetFolderStatusSuccess() -> No folders for update found.');
	        }
	    },
	    
	    /**
	     * executed when updateMessageCache requests fail
	     * 
	     * NOTE: We show the credential error dlg and this only for the first error
	     * 
	     * @param {Object} exception
	     */
	    onBackgroundRequestFail: function(exception) {
	        var currentRequestFolder = this.folderStore.query('cache_status', 'pending').first();
	        var accountId     = currentRequestFolder.get('account_id'),
	            account       = accountId ? this.getAccountStore().getById(accountId): null,
	            imapStatus    = account ? account.get('imap_status') : null,
	            grid          = this.getMainScreen().getCenterPanel(),
	            manualRefresh = grid && grid.manualRefresh;
	        
	        if (manualRefresh) {
	            grid.manualRefresh = false;
	            grid.pagingToolbar.refresh.enable();
	        }
	        
	        if (exception.code == 913) {
	            // folder not found -> remove folder from store and tree panel
	            var treePanel = this.getMainScreen().getTreePanel(),
	                node = treePanel.getNodeById(currentRequestFolder.id);
	            if (node) {
	                node.remove();
	            }
	            this.getFolderStore().remove(currentRequestFolder);
	        } else if (account && (manualRefresh ||
	            //  do not show exclamation mark for timeouts and connection losses
	            (exception.code !== 520 && exception.code !== 510))
	        ) {
	            account.setLastIMAPException(exception);
	            
	            this.getFolderStore().each(function(folder) {
	                if (folder.get('account_id') === accountId) {
	                    folder.set('cache_status', 'disconnect');
	                    folder.commit();
	                }
	            }, this);
	            
	            if (exception.code == 912 && imapStatus !== 'failure' && Tine.Tinebase.appMgr.getActive() === this) {
	                Tine.Felamimail.folderBackend.handleRequestException(exception);
	            }
	        }
	        
	        Tine.log.info((manualRefresh ? 'Manual' : 'Background') + ' update failed (' + exception.message
	            + ') for folder ' + currentRequestFolder.get('globalname') 
	            + ' -> will check mails again in "' + this.updateInterval/1000 + '" seconds');
	        Tine.log.debug(exception);
	        this.checkMailsDelayedTask.delay(this.updateInterval);
	    },
	    
	    /**
	     * executed right before this app gets activated
	     */
	    onBeforeActivate: function() {
	        Tine.log.info('activating felamimail now');
	        // abort preloading/old actions and force fresh fetch
	        this.checkMailsDelayedTask.delay(0);
	    },
	    
	    /**
	     * on update folder
	     * 
	     * @param {Tine.Felamimail.FolderStore} store
	     * @param {Tine.Felamimail.Model.Folder} record
	     * @param {String} operation
	     */
	    onUpdateFolder: function(store, record, operation) {
	        if (operation === Ext.data.Record.EDIT) {
	            if (record.isModified('cache_status')) {
	                Tine.log.info('Tine.Felamimail.Application::onUpdateFolder(): Folder "' + record.get('localname') + '" updated with cache_status: ' + record.get('cache_status'));
	                
	                // as soon as we get a folder with status != complete we need to trigger checkmail soon!
	                if (['complete', 'pending'].indexOf(record.get('cache_status')) === -1) {
	                    this.checkMailsDelayedTask.delay(1000);
	                }
	                
	                // this should not be shown for messages that have been marked "unread" by another client
	                if (record.isInbox() && record.isModified('cache_unreadcount') && record.isModified('cache_totalcount')) {
	                    this.showNewMessageNotification(record);
	                }
	                
	                if (record.isModified('imap_lastmodseq')) {
	                    Tine.log.info('Tine.Felamimail.Application::onUpdateFolder(): flags have changed');
	                    // TODO this needs to be reviewed: grid is loaded way to often, selection is lost. maybe we need to have the updated flags here or the messages with updated flags
	                    // TODO maybe server needs to be reviewed, too as flags should not be synced if the tine client herself changes the flags
	                    // TODO maybe we need cache_lastmodseq, too
	                    //this.getMainScreen().getCenterPanel().getStore().reload();
	                }
	            }
	
	            if (record.isInbox()) {
	                if (this.isDefaultAccountId(record.get('account_id'))) {
	                    if (record.isModified('cache_unreadcount') || record.get('cache_unreadcount') != this.unreadcountInDefaultInbox) {
	                        this.setTitleWithUnreadcount(record.get('cache_unreadcount'));
	                    }
	                }
	                
	                if (record.isModified('quota_usage') || record.isModified('quota_limit')) {
	                    this.onUpdateFolderQuota(record);
	                }
	            }
	        }
	    },
	    
	    /**
	     * checks default account id
	     * 
	     * @param {String} accountId
	     * @return {Boolean}
	     */
	    isDefaultAccountId: function(accountId) {
	        return accountId == Tine.Felamimail.registry.get('preferences').get('defaultEmailAccount');
	    },
	    
	    /**
	     * show notification for new messages
	     * 
	     * @param {Tine.Felamimail.Model.Folder} record
	     */
	    showNewMessageNotification: function(record) {
	        var recents = (record.get('cache_unreadcount') - record.modified.cache_unreadcount),
	            account = this.getAccountStore().getById(record.get('account_id'));
	            
	        if (recents > 0 ) {
	            Tine.log.info('Show notification: ' + recents + ' new mails.');
	            var title = this.i18n._('New mails'),
	                message = String.format(this.i18n._('You got {0} new mail(s) in folder {1} ({2}).'), recents, record.get('localname'), account.get('name'));
	            
	            if (record.isCurrentSelection()) {
	                // need to defer the notification because the new messages are not shown yet 
	                // -> improve this with a callback fn or something like that / unread count should be updated when the messages become visible, too
	                Ext.ux.Notification.show.defer(3500, this, [title, message]);
	            } else {
	                Ext.ux.Notification.show(title, message);
	            }
	        }
	    },
	    
	    /**
	     * write number of unread messages in all accounts into title
	     * 
	     * @param {Number} unreadcount
	     */
	    setTitleWithUnreadcount: function(unreadcount) {
	        if (! window.isMainWindow) {
	            return;
	        }
	
	        this.unreadcountInDefaultInbox = unreadcount;
	        if (this.unreadcountInDefaultInbox < 0) {
	            this.unreadcountInDefaultInbox = 0;
	        }
	        
	        Tine.log.info('Updating title with new unreadcount: ' + this.unreadcountInDefaultInbox);
	        var currentTitle = document.title,
	            unreadString = (this.unreadcountInDefaultInbox != 0) ? '(' + this.unreadcountInDefaultInbox + ') ' : '';
	            
	        if (currentTitle.match(/^\([0-9]+\) /)) {
	            document.title = document.title.replace(/^\([0-9]+\) /, unreadString);
	        } else {
	            document.title = unreadString + currentTitle;
	        }
	    },
	    
	    /**
	     * folder quota is updated
	     * 
	     * @param {Tine.Felamimail.Model.Folder} record
	     */
	    onUpdateFolderQuota: function(record) {
	        if (record.get('quota_usage')) {
	            Tine.log.info('Folder "' + record.get('localname') + '" updated with quota values: ' 
	                + record.get('quota_usage') + ' / ' + record.get('quota_limit'));
	
	            this.getMainScreen().getCenterPanel().updateQuotaBar(record);
	        }
	    },
	    
	    /**
	     * get active account
	     * @return {Tine.Felamimail.Model.Account}
	     */
	    getActiveAccount: function() {
	        var account = null;
	            
	        var treePanel = this.getMainScreen().getTreePanel();
	        if (treePanel && treePanel.rendered) {
	            account = treePanel.getActiveAccount();
	        }
	        
	        if (account === null) {
	            account = this.getAccountStore().getById(Tine.Felamimail.registry.get('preferences').get('defaultEmailAccount'));
	        }
	        
	        if (account === null) {
	            // try to get first account in store
	            account = this.getAccountStore().getAt(0);
	        }
	        
	        return account;
	    },
	    
	    /**
	     * get account store
	     * 
	     * @return {Ext.data.JsonStore}
	     */
	    getAccountStore: function() {
	        if (! this.accountStore) {
	            Tine.log.debug('creating account store');
	            
	            // create store (get from initial data)
	            this.accountStore = new Ext.data.JsonStore({
	                fields: Tine.Felamimail.Model.Account,
	                data: Tine.Felamimail.registry.get('accounts'),
	                autoLoad: true,
	                id: 'id',
	                root: 'results',
	                totalProperty: 'totalcount',
	                proxy: Tine.Felamimail.accountBackend,
	                reader: Tine.Felamimail.accountBackend.getReader(),
	                listeners: {
	                    scope: this,
	                    'add': function (store, records) {
	                        Tine.log.info('Account added: ' + records[0].get(Tine.Felamimail.Model.Account.getMeta('titleProperty')));
	                        this.getMainScreen().getCenterPanel().action_write.setDisabled(! this.getActiveAccount());
	                    },
	                    'remove': function (store, record) {
	                        Tine.log.info('Account removed: ' + record.get(Tine.Felamimail.Model.Account.getMeta('titleProperty')));
	                        this.getMainScreen().getCenterPanel().action_write.setDisabled(! this.getActiveAccount());
	                    }
	                }
	            });
	        } 
	    
	        return this.accountStore;
	    },
	    
	    /**
	     * show felamimail credentials dialog
	     * 
	     * @param {Tine.Felamimail.Model.Account} account
	     * @param {String} username [optional]
	     */
	    showCredentialsDialog: function(account, username) {
	        Tine.Felamimail.credentialsDialog = Tine.widgets.dialog.CredentialsDialog.openWindow({
	            windowTitle: String.format(this.i18n._('IMAP Credentials for {0}'), account.get('name')),
	            appName: 'Felamimail',
	            credentialsId: account.id,
	            i18nRecordName: this.i18n._('Credentials'),
	            recordClass: Tine.Tinebase.Model.Credentials,
	            record: new Tine.Tinebase.Model.Credentials({
	                id: account.id,
	                username: username ? username : ''
	            }),
	            listeners: {
	                scope: this,
	                'update': function(data) {
	                    var folderStore = this.getFolderStore();
	                    if (folderStore.queriesPending.length > 0) {
	                        // reload all folders of account and try to select inbox
	                        var accountId = folderStore.queriesPending[0].substring(16, 56),
	                            account = this.getAccountStore().getById(accountId),
	                            accountNode = this.getMainScreen().getTreePanel().getNodeById(accountId);
	                            
	                        folderStore.resetQueryAndRemoveRecords('parent_path', '/' + accountId);
	                        account.set('all_folders_fetched', true);
	                        
	                        accountNode.loading = false;
	                        accountNode.reload(function(callback) {
	                            Ext.each(accountNode.childNodes, function(node) {
	                                if (Ext.util.Format.lowercase(node.attributes.localname) == 'inbox') {
	                                    node.select();
	                                    return false;
	                                }
	                            }, this);
	                        });
	                    } else {
	                        this.checkMailsDelayedTask.delay(0);
	                    }
	                }
	            }
	        });
	    },
	
	    /**
	     * compose mail via mailto link
	     *
	     * @param params from mailto link
	     */
	    mailto: function(paramString) {
	        var decodedParamString = decodeURIComponent(paramString).replace(/mailto:/, ''),
	            parts = decodedParamString.split(/\?|&/),
	            params = {};
	
	        Ext.each(parts, function(part){
	            var pair = part.split('='),
	                param = pair[1] ? pair[0] : 'to',
	                value = decodeURIComponent(pair[1] ? pair[1] : pair[0]);
	
	            value = param.match(/(body)|(subject)/) ? value : value.split(',');
	            param = param == 'body' ? 'msgBody' : param;
	
	            params[param] = value.length > 1 ? value : value[0];
	        });
	
	        var activeAccount = Tine.Tinebase.appMgr.get('Felamimail').getActiveAccount();
	        params['accountId'] = activeAccount ? activeAccount.id : null;
	
	        //@TODO: remove old url from popstate. its ugly!
	        Tine.Tinebase.MainScreenPanel.show(this);
	        Tine.Felamimail.MessageEditDialog.openWindow(params);
	    }
	});
	
	Tine.Felamimail.registerProtocolHandlerAction = new Ext.Action({
	    iconCls: 'FelamimailIconCls',
	    handler: function() {
	        var url = Tine.Tinebase.common.getUrl() + '#Felamimail/MailTo/%s';
	        navigator.registerProtocolHandler('mailto', url, Ext.util.Format.stripTags(Tine.title));
	    }
	});
	Ext.ux.ItemRegistry.registerItem('Tine.Tinebase.MainMenu.userActions', Tine.Felamimail.registerProtocolHandlerAction);
	
	
	/**
	 * @namespace Tine.Felamimail
	 * @class Tine.Felamimail.MainScreen
	 * @extends Tine.widgets.MainScreen
	 * 
	 * MainScreen Definition
	 */ 
	Tine.Felamimail.MainScreen = Ext.extend(Tine.widgets.MainScreen, {
	    /**
	     * adapter fn to get folder tree panel
	     * 
	     * @return {Ext.tree.TreePanel}
	     */
	    getTreePanel: function() {
	        return this.getWestPanel().getContainerTreePanel();
	    }
	});
	
	/**
	 * get flags store
	 *
	 * @param {Boolean} reload
	 * @return {Ext.data.JsonStore}
	 */
	Tine.Felamimail.loadFlagsStore = function(reload) {
	    
	    var store = Ext.StoreMgr.get('FelamimailFlagsStore');
	    
	    if (!store) {
	        // create store (get from initial registry data)
	        store = new Ext.data.JsonStore({
	            fields: Tine.Felamimail.Model.Flag,
	            data: Tine.Felamimail.registry.get('supportedFlags'),
	            autoLoad: true,
	            id: 'id',
	            root: 'results',
	            totalProperty: 'totalcount'
	        });
	        
	        Ext.StoreMgr.add('FelamimailFlagsStore', store);
	    } 
	
	    return store;
	};
	
	/**
	 * add signature (get it from default account settings)
	 * 
	 * @param {String} id
	 * @return {String}
	 */
	Tine.Felamimail.getSignature = function(id) {
	    
	    var result = '',
	        app = Tine.Tinebase.appMgr.get('Felamimail'),
	        activeAccount = app.getMainScreen().getTreePanel().getActiveAccount();
	        
	    id = id || (activeAccount ? activeAccount.id : 'default');
	    
	    if (id === 'default') {
	        id = Tine.Felamimail.registry.get('preferences').get('defaultEmailAccount');
	    }
	    
	    Tine.log.info('Tine.Felamimail.getSignature() - Fetch signature of account ' + id);
	    
	    var defaultAccount = app.getAccountStore().getById(id);
	    var signature = (defaultAccount) ? defaultAccount.get('signature') : '';
	    if (signature && signature != '') {
	        // NOTE: signature is always in html, nl2br here would cause duplicate linebreaks!
	        result = '<br><br><span id="felamimail-body-signature">-- <br>' + signature + '</span>';
	    }
	    
	    return result;
	};
	
	/**
	 * get email string (n_fileas <email@host.tld>) from contact
	 * 
	 * @param {Tine.Addressbook.Model.Contact} contact
	 * @return {String}
	 */
	Tine.Felamimail.getEmailStringFromContact = function(contact) {
	    var result = contact.get('n_fileas') + ' <';
	    result += contact.getPreferredEmail();
	    result += '>';
	    
	    return result;
	};
	
	/**
	 * generic exception handler for felamimail (used by folder and message backends and updateMessageCache)
	 * 
	 * TODO move all 902 exception handling here!
	 * TODO invent requery on 902 with cred. dialog
	 * 
	 * @param {Tine.Exception|Object} exception
	 */
	Tine.Felamimail.handleRequestException = function(exception) {
	    if (! exception.code && exception.responseText) {
	        // we need to decode the exception first
	        var response = Ext.util.JSON.decode(exception.responseText);
	        exception = response.data;
	    }
	
	    Tine.log.warn('Request exception :');
	    Tine.log.warn(exception);
	    
	    var app = Tine.Tinebase.appMgr.get('Felamimail');
	    
	    switch(exception.code) {
	        case 910: // Felamimail_Exception_IMAP
	        case 911: // Felamimail_Exception_IMAPServiceUnavailable
	            Ext.Msg.show({
	               title:   app.i18n._('IMAP Error'),
	               msg:     exception.message ? exception.message : app.i18n._('No connection to IMAP server.'),
	               icon:    Ext.MessageBox.ERROR,
	               buttons: Ext.Msg.OK
	            });
	            break;
	            
	        case 912: // Felamimail_Exception_IMAPInvalidCredentials
	            var accountId   = exception.account && exception.account.id ? exception.account.id : '',
	                account     = accountId ? app.getAccountStore().getById(accountId): null,
	                imapStatus  = account ? account.get('imap_status') : null;
	                
	            if (account) {
	                account.set('all_folders_fetched', true);
	                if (account.get('type') == 'system') {
	                    // just show message box for system accounts
	                    Ext.Msg.show({
	                       title:   app.i18n._('IMAP Credentials Error'),
	                       msg:     app.i18n._('Your email credentials are wrong. Please contact your administrator'),
	                       icon:    Ext.MessageBox.ERROR,
	                       buttons: Ext.Msg.OK
	                    });
	                } else {
	                    app.showCredentialsDialog(account, exception.username);
	                }
	            } else {
	                exception.code = 910;
	                return this.handleRequestException(exception);
	            }
	            break;
	            
	        case 913: // Felamimail_Exception_IMAPFolderNotFound
	            Ext.Msg.show({
	               title:   app.i18n._('IMAP Error'),
	               msg:     app.i18n._('One of your folders was deleted or renamed by another client. Please update the folder list of this account.'),
	               icon:    Ext.MessageBox.ERROR,
	               buttons: Ext.Msg.OK
	            });
	            // TODO reload account root node
	            break;
	            
	        case 914: // Felamimail_Exception_IMAPMessageNotFound
	            Tine.log.notice('Message was deleted by another client.');
	            
	            // remove message from store and select next message
	            var requestParams = Ext.util.JSON.decode(exception.request).params,
	                centerPanel = app.getMainScreen().getCenterPanel(),
	                msg = centerPanel.getStore().getById(requestParams.id);
	                
	            if (msg) {
	                var sm = centerPanel.getGrid().getSelectionModel(),
	                    selectedMsgs = sm.getSelectionsCollection(),
	                    nextMessage = centerPanel.getNextMessage(selectedMsgs);
	                    
	                centerPanel.getStore().remove(msg);
	                if (nextMessage) {
	                    sm.selectRecords([nextMessage]);
	                }
	            }
	            break;
	            
	        case 920: // Felamimail_Exception_SMTP
	            Ext.Msg.show({
	               title:   app.i18n._('SMTP Error'),
	               msg:     exception.message ? exception.message : app.i18n._('No connection to SMTP server.'),
	               icon:    Ext.MessageBox.ERROR,
	               buttons: Ext.Msg.OK
	            });
	            break;
	            
	        case 930: // Felamimail_Exception_Sieve
	            Ext.Msg.show({
	               title:   app.i18n._('Sieve Error'),
	               msg:     exception.message ? exception.message : app.i18n._('No connection to Sieve server.'),
	               icon:    Ext.MessageBox.ERROR,
	               buttons: Ext.Msg.OK
	            });
	            break;
	
	        case 931: // Felamimail_Exception_SievePutScriptFail
	            Ext.Msg.show({
	               title:   app.i18n._('Save Sieve Script Error'),
	               msg:     app.i18n._('Could not save script on Sieve server.') + (exception.message ? ' (' + exception.message + ')' : ''),
	               icon:    Ext.MessageBox.ERROR,
	               buttons: Ext.Msg.OK
	            });
	            break;
	
	        default:
	            Tine.Tinebase.ExceptionHandler.handleRequestException(exception);
	            break;
	    }
	};


/***/ },

/***/ 332:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 */
	Ext.ns('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.widgets.container
	 * @class       Tine.Felamimail.FolderFilterModel
	 * @extends     Tine.widgets.grid.FilterModel
	 * 
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 */
	Tine.Felamimail.FolderFilterModel = Ext.extend(Tine.widgets.grid.PickerFilter, {
	
	    /**
	     * @cfg 
	     */
	    operators: ['in', 'notin'],
	    field: 'path',
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        this.label = this.app.i18n._('Folder');
	        
	        this.multiselectFieldConfig = {
	            labelField: 'path',
	            selectionWidget: new Tine.Felamimail.FolderSelectTriggerField({
	                allAccounts: true
	            }),
	            recordClass: Tine.Felamimail.Model.Folder,
	            valueStore: this.app.getFolderStore(),
	            
	            /**
	             * functions
	             */
	            labelRenderer: Tine.Felamimail.GridPanel.prototype.accountAndFolderRenderer.createDelegate(this),
	            initSelectionWidget: function() {
	                this.selectionWidget.onSelectFolder = this.addRecord.createDelegate(this);
	            },
	            isSelectionVisible: function() {
	                return this.selectionWidget.selectPanel && ! this.selectionWidget.selectPanel.isDestroyed        
	            },
	            getRecordText: function(value) {
	                var path = (Ext.isString(value)) ? value : (value.path) ? value.path : '/' + value.id,
	                    index = this.valueStore.findExact('path', path),
	                    record = this.valueStore.getAt(index),
	                    text = null;
	                
	                if (! record) {
	                    // try account
	                    var accountId = path.substr(1, 40);
	                    record = this.app.getAccountStore().getById(accountId);
	                }
	                if (record) {
	                    this.currentValue.push(path);
	                    // always copy/clone record because it can't exist in 2 different stores
	                    this.store.add(record.copy());
	                    text = this.labelRenderer(record.id, {}, record);
	                } else {
	                    text = value;
	                    this.currentValue.push(value);
	                }
	                
	                return text;
	            }
	        };
	
	        Tine.Felamimail.FolderFilterModel.superclass.initComponent.call(this);
	    }
	});
	
	Tine.widgets.grid.FilterToolbar.FILTERS['tine.felamimail.folder.filtermodel'] = Tine.Felamimail.FolderFilterModel;


/***/ },

/***/ 333:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Felamimail');
	
	/**
	 * folder select trigger field
	 * 
	 * @namespace   Tine.widgets.container
	 * @class       Tine.Felamimail.FolderSelectTriggerField
	 * @extends     Ext.form.ComboBox
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * 
	 */
	Tine.Felamimail.FolderSelectTriggerField = Ext.extend(Ext.form.TriggerField, {
	    
	    triggerClass: 'x-form-search-trigger',
	    account: null,
	    allAccounts: false,
	    
	    /**
	     * onTriggerClick
	     * open ext window with (folder-)select panel that fires event on select
	     * 
	     * @param e
	     */
	    onTriggerClick: function(e) {
	        if (! this.disabled && (this.account && this.account.id !== 0) || this.allAccounts) {
	            this.selectPanel = Tine.Felamimail.FolderSelectPanel.openWindow({
	                account: this.account,
	                allAccounts: this.allAccounts,
	                listeners: {
	                    // NOTE: scope has to be first item in listeners! @see Ext.ux.WindowFactory
	                    scope: this,
	                    'folderselect': this.onSelectFolder
	                }
	            });
	        }
	    },
	    
	    /**
	     * select folder event listener
	     * 
	     * @param {Ext.tree.AsyncTreeNode} node
	     */
	    onSelectFolder: function(node) {
	        this.selectPanel.close();
	        this.setValue(node.attributes.globalname);
	        this.el.focus();
	    }
	});
	Ext.reg('felamimailfolderselect', Tine.Felamimail.FolderSelectTriggerField);


/***/ },

/***/ 334:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.FolderSelectPanel
	 * @extends     Ext.Panel
	 * 
	 * <p>Account/Folder Tree Panel</p>
	 * <p>Tree of Accounts with folders</p>
	 * <pre>
	 * TODO         show error if no account(s) available
	 * TODO         make it possible to preselect folder
	 * TODO         use it for folder subscriptions
	 * </pre>
	 * 
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Felamimail.FolderSelectPanel
	 */
	Tine.Felamimail.FolderSelectPanel = Ext.extend(Ext.Panel, {
	    
	    /**
	     * Panel config
	     * @private
	     */
	    frame: true,
	    border: true,
	    autoScroll: true,
	    bodyStyle: 'background-color:white',
	    selectedNode: null,
	    
	    /**
	     * init
	     * @private
	     */
	    initComponent: function() {
	        this.addEvents(
	            /**
	             * @event folderselect
	             * Fired when folder is selected
	             */
	            'folderselect'
	        );
	
	        this.app = Tine.Tinebase.appMgr.get('Felamimail');
	        
	        if (! this.allAccounts) {
	            this.account = this.account || this.app.getActiveAccount();
	        }
	        
	        this.initActions();
	        this.initFolderTree();
	        
	        Tine.Felamimail.FolderSelectPanel.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * init actions
	     */
	    initActions: function() {
	        this.action_cancel = new Ext.Action({
	            text: i18n._('Cancel'),
	            minWidth: 70,
	            scope: this,
	            handler: this.onCancel,
	            iconCls: 'action_cancel'
	        });
	        
	        this.action_ok = new Ext.Action({
	            disabled: true,
	            text: i18n._('Ok'),
	            iconCls: 'action_saveAndClose',
	            minWidth: 70,
	            handler: this.onOk,
	            scope: this
	        });
	        
	        this.fbar = [
	            '->',
	            this.action_cancel,
	            this.action_ok
	        ];
	    },
	        
	    /**
	     * init folder tree
	     */
	    initFolderTree: function() {
	        
	        if (this.allAccounts) {
	
	            this.root = new Ext.tree.TreeNode({
	                text: 'default',
	                draggable: false,
	                allowDrop: false,
	                expanded: true,
	                leaf: false,
	                id: 'root'
	            });
	        
	            var mainApp = Ext.ux.PopupWindowMgr.getMainWindow().Tine.Tinebase.appMgr.get('Felamimail');
	            mainApp.getAccountStore().each(function(record) {
	                // TODO generalize this
	                var node = new Ext.tree.AsyncTreeNode({
	                    id: record.data.id,
	                    path: '/' + record.data.id,
	                    record: record,
	                    globalname: '',
	                    draggable: false,
	                    allowDrop: false,
	                    expanded: false,
	                    text: Ext.util.Format.htmlEncode(record.get('name')),
	                    qtip: Tine.Tinebase.common.doubleEncode(record.get('host')),
	                    leaf: false,
	                    cls: 'felamimail-node-account',
	                    delimiter: record.get('delimiter'),
	                    ns_personal: record.get('ns_personal'),
	                    account_id: record.data.id
	                });
	            
	                this.root.appendChild(node);
	            }, this);
	            
	        } else {
	            this.root = new Ext.tree.AsyncTreeNode({
	                text: this.account.get('name'),
	                draggable: false,
	                allowDrop: false,
	                expanded: true,
	                leaf: false,
	                cls: 'felamimail-node-account',
	                id: this.account.id,
	                path: '/' + this.account.id
	            });
	        }
	        
	        
	        this.folderTree = new Ext.tree.TreePanel({
	            id: 'felamimail-foldertree',
	            rootVisible: ! this.allAccounts,
	            store: this.store || this.app.getFolderStore(),
	            // TODO use another loader/store for subscriptions
	            loader: this.loader || new Tine.Felamimail.TreeLoader({
	                folderStore: this.store,
	                app: this.app
	            }),
	            root: this.root
	        });
	        this.folderTree.on('dblclick', this.onTreeNodeDblClick, this);
	        this.folderTree.on('click', this.onTreeNodeClick, this);
	        
	        this.items = [this.folderTree];
	    },
	    
	    /**
	     * @private
	     */
	    afterRender: function() {
	        Tine.Felamimail.FolderSelectPanel.superclass.afterRender.call(this);
	        
	        var title = (! this.allAccounts) 
	            ? String.format(this.app.i18n._('Folders of account {0}'), this.account.get('name'))
	            : this.app.i18n._('Folders of all accounts');
	            
	        this.window.setTitle(title);
	    },
	
	    /**
	     * on folder select handler
	     * 
	     * @param {Ext.tree.AsyncTreeNode} node
	     * @private
	     */
	    onTreeNodeDblClick: function(node) {
	        this.selectedNode = node;
	        this.onOk();
	        return false;
	    },
	    
	    /**
	     * @private
	     */
	    onTreeNodeClick: function(node) {
	        this.selectedNode = node;
	        this.action_ok.setDisabled(false);
	    },
	    
	    /**
	     * @private
	     */
	    onCancel: function(){
	        this.purgeListeners();
	        this.window.close();
	    },
	    
	    /**
	     * @private
	     */
	    onOk: function() {
	        if (this.selectedNode) {
	            this.fireEvent('folderselect', this.selectedNode);
	        }
	    }
	});
	
	/**
	 * Felamimail FolderSelectPanel Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Felamimail.FolderSelectPanel.openWindow = function (config) {
	    var window = Tine.WindowFactory.getWindow({
	        width: 200,
	        height: 300,
	        modal: true,
	        name: Tine.Felamimail.FolderSelectPanel.prototype.windowNamePrefix + Ext.id(),
	        contentPanelConstructor: 'Tine.Felamimail.FolderSelectPanel',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

/***/ 335:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.FolderStore
	 * @extends     Ext.data.Store
	 * 
	 * <p>Felamimail folder store</p>
	 * <p>
	 * </p>
	 * 
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * 
	 * @constructor
	 * Create a new  Tine.Felamimail.FolderStore
	 */
	Tine.Felamimail.FolderStore = function(config) {
	    config = config || {};
	    Ext.apply(this, config);
	    
	    this.reader = Tine.Felamimail.folderBackend.getReader();
	    this.queriesPending = [];
	    this.queriesDone = [];
	
	    Tine.Felamimail.FolderStore.superclass.constructor.call(this);
	    
	    this.on('load', this.onStoreLoad, this);
	    this.on('add', this.onStoreAdd, this);
	    this.on('loadexception', this.onStoreLoadException, this);
	};
	
	Ext.extend(Tine.Felamimail.FolderStore, Ext.data.Store, {
	    
	    fields: Tine.Felamimail.Model.Folder,
	    proxy: Tine.Felamimail.folderBackend,
	    
	    /**
	     * @property queriesDone
	     * @type Array
	     */
	    queriesDone: null,
	    
	    /**
	     * @property queriesPending
	     * @type Array
	     */
	    queriesPending: null,
	    
	    /**
	     * async query
	     */
	    asyncQuery: function(field, value, callback, args, scope, store) {
	        var result = null,
	            key = store.getKey(field, value);
	        
	        Tine.log.info('Tine.Felamimail.FolderStore.asyncQuery: ' + key);
	        
	        if (store.queriesDone.indexOf(key) >= 0) {
	            Tine.log.debug('result already loaded -> directly query store');
	            // we need regexp here because query returns all records with path that begins with the value string otherwise
	            var valueReg = new RegExp(value + '$');
	            result = store.query(field, valueReg);
	            args.push(result);
	            callback.apply(scope, args);
	        } else if (store.queriesPending.indexOf(key) >= 0) {
	            Tine.log.debug('result not in store yet, but async query already running -> wait a bit');
	            this.asyncQuery.defer(2500, this, [field, value, callback, args, scope, store]);
	        } else {
	            Tine.log.debug('result is requested the first time -> fetch from server');
	            var accountId = value.match(/^\/([a-z0-9]*)/i)[1],
	                folderIdMatch = value.match(/[a-z0-9]+\/([a-z0-9]*)$/i),
	                folderId = (folderIdMatch) ? folderIdMatch[1] : null,
	                folder = folderId ? store.getById(folderId) : null;
	            
	            if (folderId && ! folder) {
	                Tine.log.warn('folder ' + folderId + ' not found -> performing no query at all');
	                callback.apply(scope, args);
	                return;
	            }
	            
	            store.queriesPending.push(key);
	            store.load({
	                path: value,
	                params: {filter: [
	                    {field: 'account_id', operator: 'equals', value: accountId},
	                    {field: 'globalname', operator: 'equals', value: (folder !== null) ? folder.get('globalname') : ''}
	                ]},
	                callback: function () {
	                    store.queriesDone.push(key);
	                    store.queriesPending.remove(key);
	                    
	                    // query store again (it should have the new folders now) and call callback function to add nodes
	                    result = store.query(field, value);
	                    args.push(result);
	                    callback.apply(scope, args);
	                },
	                add: true
	            });
	        }
	    },
	    
	    /**
	     * on store load exception
	     * 
	     * @param {Tine.Tinebase.data.RecordProxy} proxy
	     * @param {String} type
	     * @param {Object} error
	     * @param {Object} options
	     * 
	     * TODO remove loading class / remove from queriesDone?
	     */
	    onStoreLoadException: function(proxy, type, error, options) {
	        //var node = options.params.path
	        //node.getUI().removeClass("x-tree-node-loading");
	
	        Tine.Felamimail.handleRequestException(error);
	    },
	    
	    
	    /**
	     * check if query has already loaded or is loading
	     * 
	     * @param {String} field
	     * @param {String} value
	     * @return {boolean}
	     */
	    isLoadedOrLoading: function(field, value) {
	        var key = this.getKey(field, value),
	            result = false;
	        
	        result = (this.queriesDone.indexOf(key) >= 0 || this.queriesPending.indexOf(key) >= 0);
	        
	        return result;
	    },
	    
	    /**
	     * get key to store query 
	     * 
	     * @param  {string} field
	     * @param  {mixed} value
	     * @return {string}
	     */
	    getKey: function(field, value) {
	        return field + ' -> ' + value;
	    },
	    
	    /**
	     * load event handler
	     * 
	     * @param {Tine.Felamimail.FolderStore} store
	     * @param {Tine.Felamimail.Model.Folder} records
	     * @param {Object} options
	     */
	    onStoreLoad: function(store, records, options) {
	        this.computePaths(records, options.path);
	    },
	    
	    /**
	     * add event handler
	     * 
	     * @param {Tine.Felamimail.FolderStore} store
	     * @param {Tine.Felamimail.Model.Folder} records
	     * @param {Integer} index
	     */
	    onStoreAdd: function(store, records, index) {
	        this.computePaths(records, null);
	    },
	
	    /**
	     * compute paths for folder records
	     * 
	     * @param {Tine.Felamimail.Model.Folder} records
	     * @param {String|null} parentPath
	     */
	    computePaths: function(records, givenParentPath) {
	        var parentPath, path;
	        Ext.each(records, function(record) {
	            if (givenParentPath === null) {
	                var parent = this.getParent(record);
	                parentPath = (parent) ? parent.get('path') : '/' + record.get('account_id');
	            } else {
	                parentPath = givenParentPath;
	            }
	            path = parentPath + '/' + record.id;
	            
	            if (record.get('parent_path') != parentPath || record.get('path') != path) {
	                record.beginEdit();
	                record.set('parent_path', parentPath);
	                record.set('path', path);
	                record.endEdit();
	            }
	        }, this);
	    },
	    
	    /**
	     * resets the query and removes all records that match it
	     * 
	     * @param {String} field
	     * @param {String} value
	     */
	    resetQueryAndRemoveRecords: function(field, value) {
	        this.queriesPending.remove(this.getKey(field, value));
	        var toRemove = this.query(field, value);
	        toRemove.each(function(record) {
	            this.remove(record);
	            this.queriesDone.remove(this.getKey(field, record.get(field)));
	        }, this);
	    },
	    
	    /**
	     * update folder in this store
	     * 
	     * NOTE: parent_path and path are computed onLoad and must be preserved
	     * 
	     * @param {Array/Tine.Felamimail.Model.Folder} update
	     * @return {Tine.Felamimail.Model.Folder}
	     */
	    updateFolder: function(update) {
	        if (Ext.isArray(update)) {
	            Ext.each(update, function(u) {this.updateFolder.call(this, u)}, this);
	            return;
	        }
	        
	        var folder = this.getById(update.id);
	        
	        if (folder) {
	            folder.beginEdit();
	            Ext.each(Tine.Felamimail.Model.Folder.getFieldNames(), function(f) {
	                if (! f.match('path')) {
	                    folder.set(f, update.get(f));
	                }
	            }, this);
	            folder.endEdit();
	            folder.commit();
	            return folder;
	        }
	    },
	    
	    /**
	     * get parent folder
	     * 
	     * @param {Tine.Felamimail.Model.Folder} folder
	     * @return {Tine.Felamimail.Model.Folder|null}
	     */
	    getParent: function(folder) {
	        var result = this.queryBy(function(record, id) {
	            if (record.get('account_id') == folder.get('account_id') && record.get('globalname') == folder.get('parent')) {
	                return true;
	            }
	        });
	        
	        return result.first() || null;
	    }    
	});
	


/***/ },

/***/ 336:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	 
	Ext.ns('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.GridDetailsPanel
	 * @extends     Tine.widgets.grid.DetailsPanel
	 * 
	 * <p>Message Grid Details Panel</p>
	 * <p>the details panel (shows message content)</p>
	 * 
	 * TODO         replace telephone numbers in emails with 'call contact' link
	 * TODO         make only text body scrollable (headers should be always visible)
	 * TODO         show image attachments inline
	 * TODO         add 'download all' button
	 * TODO         'from' to contact: check for duplicates
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Felamimail.GridDetailsPanel
	 */
	 Tine.Felamimail.GridDetailsPanel = Ext.extend(Tine.widgets.grid.DetailsPanel, {
	    
	    /**
	     * config
	     * @private
	     */
	    defaultHeight: 350,
	    currentId: null,
	    record: null,
	    app: null,
	    i18n: null,
	    
	    fetchBodyTransactionId: null,
	    
	    /**
	     * init
	     * @private
	     */
	    initComponent: function() {
	        this.initTemplate();
	        this.initDefaultTemplate();
	        //this.initTopToolbar();
	
	        Tine.Felamimail.GridDetailsPanel.superclass.initComponent.call(this);
	    },
	
	    /**
	     * use default Tpl for default and multi view
	     */
	    initDefaultTemplate: function() {
	        this.defaultTpl = new Ext.XTemplate(
	            '<div class="preview-panel-felamimail">',
	                '<div class="preview-panel-felamimail-body">{[values ? values.msg : ""]}</div>',
	            '</div>'
	        );
	    },
	    
	    /**
	     * init bottom toolbar (needed for event invitations atm)
	     * 
	     * TODO add buttons (show header, add to addressbook, create filter, show images ...) here
	     */
	//    initTopToolbar: function() {
	//        this.tbar = new Ext.Toolbar({
	//            hidden: true,
	//            items: []
	//        });
	//    },
	    
	    /**
	     * add on click event after render
	     * @private
	     */
	    afterRender: function() {
	        Tine.Felamimail.GridDetailsPanel.superclass.afterRender.apply(this, arguments);
	        this.body.on('click', this.onClick, this);
	    },
	    
	    /**
	     * get panel for single record details
	     * 
	     * @return {Ext.Panel}
	     */
	    getSingleRecordPanel: function() {
	        if (! this.singleRecordPanel) {
	            this.singleRecordPanel = new Ext.Panel({
	                layout: 'vbox',
	                layoutConfig: {
	                    align:'stretch'
	                },
	                border: false,
	                items: [
	                    //this.getTopPanel(),
	                    this.getMessageRecordPanel()
	                    //this.getBottomPanel()
	                ]
	            });
	        }
	        return this.singleRecordPanel;
	    },
	
	    /**
	     * get panel for single record details
	     * 
	     * @return {Ext.Panel}
	     */
	    getMessageRecordPanel: function() {
	        if (! this.messageRecordPanel) {
	            this.messageRecordPanel = new Ext.Panel({
	                border: false,
	                autoScroll: true,
	                flex: 1
	            });
	        }
	        return this.messageRecordPanel;
	    },
	    
	    /**
	     * (on) update details
	     * 
	     * @param {Tine.Felamimail.Model.Message} record
	     * @param {String} body
	     * @private
	     */
	    updateDetails: function(record, body) {
	        if (record.id === this.currentId) {
	            // nothing to do
	        } else if (! record.bodyIsFetched()) {
	            this.waitForContent(record, this.getMessageRecordPanel().body);
	        } else if (record === this.record) {
	            this.setTemplateContent(record, this.getMessageRecordPanel().body);
	        }
	    },
	    
	    /**
	     * wait for body content
	     * 
	     * @param {Tine.Felamimail.Model.Message} record
	     * @param {String} body
	     */
	    waitForContent: function(record, body) {
	        if (! this.grid || this.grid.getSelectionModel().getCount() == 1) {
	            this.refetchBody(record, {
	                success: this.updateDetails.createDelegate(this, [record, body]),
	                failure: function (exception) {
	                    Tine.log.debug(exception);
	                    this.getLoadMask().hide();
	                    if (exception.code == 404) {
	                        this.defaultTpl.overwrite(body, {msg: this.app.i18n._('Message not available.')});
	                    } else {
	                        Tine.Felamimail.messageBackend.handleRequestException(exception);
	                    }
	                },
	                scope: this
	            });
	            this.defaultTpl.overwrite(body, {msg: ''});
	            this.getLoadMask().show();
	        } else {
	            this.getLoadMask().hide();
	        }
	    },
	    
	    /**
	     * refetch message body
	     * 
	     * @param {Tine.Felamimail.Model.Message} record
	     * @param {Function} callback
	     */
	    refetchBody: function(record, callback) {
	        // cancel old request first
	        if (this.fetchBodyTransactionId && ! Tine.Felamimail.messageBackend.isLoading(this.fetchBodyTransactionId)) {
	            Tine.log.debug('Tine.Felamimail.GridDetailsPanel::refetchBody -> cancelling current fetchBody request.');
	            Tine.Felamimail.messageBackend.abort(this.fetchBodyTransactionId);
	        }
	        Tine.log.debug('Tine.Felamimail.GridDetailsPanel::refetchBody -> calling fetchBody');
	        this.fetchBodyTransactionId = Tine.Felamimail.messageBackend.fetchBody(record, 'configured', callback);
	    },
	    
	    /**
	     * overwrite template with (body) content
	     * 
	     * @param {Tine.Felamimail.Model.Message} record
	     * @param {String} body
	     */
	    setTemplateContent: function(record, body) {
	        this.currentId = record.id;
	        this.getLoadMask().hide();
	
	        this.doLayout();
	
	        this.tpl.overwrite(body, record.data);
	
	        this.getEl().down('div').down('div').scrollTo('top', 0, false);
	
	        if (this.record.get('preparedParts') && this.record.get('preparedParts').length > 0) {
	            Tine.log.debug('Tine.Felamimail.GridDetailsPanel::setTemplateContent about to handle preparedParts');
	            this.handlePreparedParts(record);
	        }
	    },
	    
	    /**
	     * handle invitation messages (show top + bottom panels)
	     * 
	     * @param {Tine.Felamimail.Model.Message} record
	     */
	    handlePreparedParts: function(record) {
	        var firstPreparedPart = this.record.get('preparedParts')[0],
	            mimeType = String(firstPreparedPart.contentType).split(/[ ;]/)[0],
	            mainType = Tine.Felamimail.MimeDisplayManager.getMainType(mimeType);
	            
	        if (! mainType) {
	            Tine.log.info('Tine.Felamimail.GridDetailsPanel::handlePreparedParts nothing found to handle ' + mimeType);
	            return;
	        }
	        
	        var bodyEl = this.getMessageRecordPanel().getEl().query('div[class=preview-panel-felamimail-body]')[0],
	            detailsPanel = Tine.Felamimail.MimeDisplayManager.create(mainType, {
	                detailsPanel: this,
	                preparedPart: firstPreparedPart
	            });
	            
	        // quick hack till we have a card body here 
	        Ext.fly(bodyEl).update('');
	        detailsPanel.render(bodyEl);
	    },
	
	    /**
	     * init single message template (this.tpl)
	     * @private
	     */
	    initTemplate: function() {
	        
	        this.tpl = new Ext.XTemplate(
	            '<div class="preview-panel-felamimail">',
	                '<div class="preview-panel-felamimail-headers">',
	                    '<b>' + this.i18n._('Subject') + ':</b> {[this.encode(values.subject)]}<br/>',
	                    '<b>' + this.i18n._('From') + ':</b>',
	                    ' {[this.showFrom(values.from_email, values.from_name, "' + this.i18n._('Add') + '", "' 
	                        + this.i18n._('Add contact to addressbook') + '")]}<br/>',
	                    '<b>' + this.i18n._('Date') + ':</b> {[this.showDate(values.sent, values)]}',
	                    '{[this.showRecipients(values.headers)]}',
	                    '{[this.showHeaders("' + this.i18n._('Show or hide header information') + '")]}',
	                '</div>',
	                '<div class="preview-panel-felamimail-attachments">{[this.showAttachments(values.attachments, values)]}</div>',
	                '<div class="preview-panel-felamimail-body">{[this.showBody(values.body, values)]}</div>',
	            '</div>',{
	            app: this.app,
	            panel: this,
	            encode: function(value) {
	                if (value) {
	                    var encoded = Ext.util.Format.htmlEncode(value);
	                    encoded = Ext.util.Format.nl2br(encoded);
	                    // it should be enough to replace only 2 or more spaces
	                    encoded = encoded.replace(/ /g, '&nbsp;');
	                    
	                    return encoded;
	                } else {
	                    return '';
	                }
	                return value;
	            },
	            
	            showDate: function(sent, messageData) {
	                var date = (sent) ? sent : messageData.received;
	                return date.format('l') + ', ' + Tine.Tinebase.common.dateTimeRenderer(date);
	            },
	            
	            showFrom: function(email, name, addText, qtip) {
	                if (name === null) {
	                    return '';
	                }
	                
	                var result = this.encode(name + ' <' + email + '>');
	                
	                // add link with 'add to contacts'
	                var id = Ext.id() + ':' + email;
	                
	                var nameSplit = name.match(/^"*([^,^ ]+)(,*) *(.+)/i);
	                var firstname = (nameSplit && nameSplit[1]) ? nameSplit[1] : '';
	                var lastname = (nameSplit && nameSplit[3]) ? nameSplit[3] : '';
	                if (nameSplit && nameSplit[2] == ',') {
	                    firstname = lastname;
	                    lastname = nameSplit[1];
	                }
	                
	                id += Ext.util.Format.htmlEncode(':' + Ext.util.Format.trim(firstname) + ':' + Ext.util.Format.trim(lastname));
	                result = '<a id="' + id + '" class="tinebase-email-link">' + result + '</a>'
	                result += ' <span ext:qtip="' + Tine.Tinebase.common.doubleEncode(qtip) + '" id="' + id + '" class="tinebase-addtocontacts-link">[+]</span>';
	                return result;
	            },
	            
	            showBody: function(body, messageData) {
	                body = body || '';
	                if (body) {
	                    var account = this.app.getActiveAccount();
	                    if (account && (account.get('display_format') == 'plain' || 
	                        (account.get('display_format') == 'content_type' && messageData.body_content_type == 'text/plain'))
	                    ) {
	                        var width = this.panel.body.getWidth()-25,
	                            height = this.panel.body.getHeight()-90,
	                            id = Ext.id();
	                            
	                        if (height < 0) {
	                            // sometimes the height is negative, fix this here
	                            height = 500;
	                        }
	
	                        Tine.Tinebase.common.linkifyText(body, function(linkified) {
	                            var bodyEl = this.getMessageRecordPanel().getEl().query('div[class=preview-panel-felamimail-body]')[0];
	                            Ext.fly(bodyEl).update(linkified);
	                        }, this.panel);
	
	                        body = '<textarea ' +
	                            'style="width: ' + width + 'px; height: ' + height + 'px; " ' +
	                            'autocomplete="off" id="' + id + '" name="body" class="x-form-textarea x-form-field x-ux-display-background-border" readonly="" >' +
	                            body + '</textarea>';
	                    }
	                }
	                return body;
	            },
	            
	            showHeaders: function(qtip) {
	                var result = ' <span ext:qtip="' + Tine.Tinebase.common.doubleEncode(qtip) + '" id="' + Ext.id() + ':show" class="tinebase-showheaders-link">[...]</span>';
	                return result;
	            },
	            
	            showRecipients: function(value) {
	                if (value) {
	                    var i18n = Tine.Tinebase.appMgr.get('Felamimail').i18n,
	                        result = '';
	                    for (header in value) {
	                        if (value.hasOwnProperty(header) && (header == 'to' || header == 'cc' || header == 'bcc')) {
	                            result += '<br/><b>' + i18n._hidden(Ext.util.Format.capitalize(header)) + ':</b> ' 
	                                + Ext.util.Format.htmlEncode(value[header]);
	                        }
	                    }
	                    return result;
	                } else {
	                    return '';
	                }
	            },
	            
	            showAttachments: function(attachments, messageData) {
	                var result = (attachments.length > 0) ? '<b>' + this.app.i18n._('Attachments') + ':</b> ' : '';
	                
	                for (var i=0, id, cls; i < attachments.length; i++) {
	                    result += '<span id="' + Ext.id() + ':' + i + '" class="tinebase-download-link">' 
	                        + '<i>' + attachments[i].filename + '</i>' 
	                        + ' (' + Ext.util.Format.fileSize(attachments[i].size) + ')</span> ';
	                }
	                
	                return result;
	            }
	        });
	    },
	    
	    /**
	     * on click for attachment download / compose dlg / edit contact dlg
	     * 
	     * @param {} e
	     * @private
	     */
	    onClick: function(e) {
	        var selectors = [
	            'span[class=tinebase-download-link]',
	            'a[class=tinebase-email-link]',
	            'span[class=tinebase-addtocontacts-link]',
	            'span[class=tinebase-showheaders-link]',
	            'a[href^=#]'
	        ];
	        
	        // find the correct target
	        for (var i=0, target=null, selector=''; i < selectors.length; i++) {
	            target = e.getTarget(selectors[i]);
	            if (target) {
	                selector = selectors[i];
	                break;
	            }
	        }
	        
	        Tine.log.debug('Tine.Felamimail.GridDetailsPanel::onClick found target:"' + selector + '".');
	        
	        switch (selector) {
	            case 'span[class=tinebase-download-link]':
	                var idx = target.id.split(':')[1],
	                    attachment = this.record.get('attachments')[idx];
	                    
	                if (! this.record.bodyIsFetched()) {
	                    // sometimes there is bad timing and we do not have the attachments available -> refetch body
	                    this.refetchBody(this.record, this.onClick.createDelegate(this, [e]));
	                    return;
	                }
	                    
	                // remove part id if set (that is the case in message/rfc822 attachments)
	                var messageId = (this.record.id.match(/_/)) ? this.record.id.split('_')[0] : this.record.id;
	                    
	                if (attachment['content-type'] === 'message/rfc822') {
	                    
	                    Tine.log.debug('Tine.Felamimail.GridDetailsPanel::onClick openWindow for:"' + messageId + '_' + attachment.partId + '".');
	                    // display message
	                    Tine.Felamimail.MessageDisplayDialog.openWindow({
	                        record: new Tine.Felamimail.Model.Message({
	                            id: messageId + '_' + attachment.partId
	                        })
	                    });
	                    
	                } else {
	                    // download attachment
	                    new Ext.ux.file.Download({
	                        params: {
	                            requestType: 'HTTP',
	                            method: 'Felamimail.downloadAttachment',
	                            messageId: messageId,
	                            partId: attachment.partId
	                        }
	                    }).start();
	                }
	                
	                break;
	                
	            case 'a[class=tinebase-email-link]':
	                // open compose dlg
	                var email = target.id.split(':')[1];
	                var defaults = Tine.Felamimail.Model.Message.getDefaultData();
	                defaults.to = [email];
	                defaults.body = Tine.Felamimail.getSignature();
	                
	                var record = new Tine.Felamimail.Model.Message(defaults, 0);
	                var popupWindow = Tine.Felamimail.MessageEditDialog.openWindow({
	                    record: record
	                });
	                break;
	                
	            case 'span[class=tinebase-addtocontacts-link]':
	                // open edit contact dlg
	            
	                // check if addressbook app is available
	                if (! Tine.Addressbook || ! Tine.Tinebase.common.hasRight('run', 'Addressbook')) {
	                    return;
	                }
	            
	                var id = Ext.util.Format.htmlDecode(target.id);
	                var parts = id.split(':');
	                
	                var popupWindow = Tine.Addressbook.ContactEditDialog.openWindow({
	                    listeners: {
	                        scope: this,
	                        'load': function(editdlg) {
	                            editdlg.record.set('email', parts[1]);
	                            editdlg.record.set('n_given', parts[2]);
	                            editdlg.record.set('n_family', parts[3]);
	                        }
	                    }
	                });
	                
	                break;
	                
	            case 'span[class=tinebase-showheaders-link]':
	                // show headers
	            
	                var parts = target.id.split(':');
	                var targetId = parts[0];
	                var action = parts[1];
	                
	                var html = '';
	                if (action == 'show') {
	                    var recordHeaders = this.record.get('headers');
	                    
	                    for (header in recordHeaders) {
	                        if (recordHeaders.hasOwnProperty(header) && (header != 'to' || header != 'cc' || header != 'bcc')) {
	                            html += '<br/><b>' + header + ':</b> ' 
	                                + Ext.util.Format.htmlEncode(recordHeaders[header]);
	                        }
	                    }
	                
	                    target.id = targetId + ':' + 'hide';
	                    
	                } else {
	                    html = ' <span ext:qtip="' + Ext.util.Format.htmlEncode(this.i18n._('Show or hide header information')) + '" id="' 
	                        + Ext.id() + ':show" class="tinebase-showheaders-link">[...]</span>'
	                }
	                
	                target.innerHTML = html;
	                
	                break;
	            case 'a[href^=#]':
	                e.stopEvent();
	                var anchor = this.getEl().query('#' + target.href.replace(/.*#/, ''));
	                if (anchor.length) {
	                    var scrollEl = Ext.fly(anchor[0]).findParent('.x-panel-body');
	                    if (scrollEl) {
	                        var box = Ext.fly(anchor[0]).getBox();
	                        // TODO improve accuracy of scrolling
	                        scrollEl.scrollTop = box.y - 180;
	                    }
	                }
	                break;
	        }
	    }
	});


/***/ },

/***/ 337:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2007-2016 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	 
	Ext.namespace('Tine.Felamimail');
	
	/**
	 * Message grid panel
	 * 
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.GridPanel
	 * @extends     Tine.widgets.grid.GridPanel
	 * 
	 * <p>Message Grid Panel</p>
	 * <p><pre>
	 * </pre></p>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Felamimail.GridPanel
	 */
	Tine.Felamimail.GridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	    /**
	     * record class
	     * @cfg {Tine.Felamimail.Model.Message} recordClass
	     */
	    recordClass: Tine.Felamimail.Model.Message,
	    
	    /**
	     * message detail panel
	     * 
	     * @type Tine.Felamimail.GridDetailsPanel
	     * @property detailsPanel
	     */
	    detailsPanel: null,
	    
	    /**
	     * transaction id of current delete message request
	     * @type Number
	     */
	    deleteTransactionId: null,
	    
	    /**
	     * this is true if messages are moved/deleted
	     * 
	     * @type Boolean
	     */
	    movingOrDeleting: false,
	    
	    manualRefresh: false,
	    
	    /**
	     * @private model cfg
	     */
	    evalGrants: false,
	    filterSelectionDelete: true,
	    // autoRefresh is done via onUpdateFolderStore
	    autoRefreshInterval: false,
	    
	    /**
	     * @private grid cfg
	     */
	    defaultSortInfo: {field: 'received', direction: 'DESC'},
	    gridConfig: {
	        autoExpandColumn: 'subject',
	        // drag n dropfrom
	        enableDragDrop: true,
	        ddGroup: 'mailToTreeDDGroup'
	    },
	    // we don't want to update the preview panel on context menu
	    updateDetailsPanelOnCtxMenu: false,
	    
	    /**
	     * Return CSS class to apply to rows depending upon flags
	     * - checks Flagged, Deleted and Seen
	     * 
	     * @param {Tine.Felamimail.Model.Message} record
	     * @param {Integer} index
	     * @return {String}
	     */
	    getViewRowClass: function(record, index) {
	        var className = '';
	        
	        if (record.hasFlag('\\Flagged')) {
	            className += ' flag_flagged';
	        }
	        if (record.hasFlag('\\Deleted')) {
	            className += ' flag_deleted';
	        }
	        if (! record.hasFlag('\\Seen')) {
	            className += ' flag_unread';
	        }
	        
	        return className;
	    },
	    
	    /**
	     * init message grid
	     * @private
	     */
	    initComponent: function() {
	        
	        this.app = Tine.Tinebase.appMgr.get('Felamimail');
	        this.i18nEmptyText = this.app.i18n._('No Messages found or the cache is empty.');
	        
	        this.recordProxy = Tine.Felamimail.messageBackend;
	        
	        this.gridConfig.columns = this.getColumns();
	        this.initDetailsPanel();
	        
	        this.pagingConfig = {
	            doRefresh: this.doRefresh.createDelegate(this)
	        };
	        
	        Tine.Felamimail.GridPanel.superclass.initComponent.call(this);
	        this.grid.getSelectionModel().on('rowselect', this.onRowSelection, this);
	        this.app.getFolderStore().on('update', this.onUpdateFolderStore, this);
	        
	        this.initPagingToolbar();
	    },
	    
	    /**
	     * add quota bar to paging toolbar
	     */
	    initPagingToolbar: function() {
	        Ext.QuickTips.init();
	        
	        this.quotaBar = new Ext.ProgressBar({
	            width: 120,
	            height: 16,
	            style: {
	                marginTop: '1px'
	            },
	            text: this.app.i18n._('Quota usage')
	        });
	        this.pagingToolbar.insert(12, new Ext.Toolbar.Separator());
	        this.pagingToolbar.insert(12, this.quotaBar);
	        
	        // NOTE: the Ext.progessbar has an ugly bug: it does not layout correctly when hidden
	        //       so we need to listen when we get activated to relayout the progessbar
	        Tine.Tinebase.MainScreen.on('appactivate', function(app) {
	            if (app.appName === 'Felamimail') {
	                this.quotaBar.syncProgressBar();
	                this.quotaBar.setWidth(this.quotaBar.getWidth());
	            }
	        }, this);
	    },
	    
	    /**
	     * cleanup on destruction
	     */
	    onDestroy: function() {
	        this.app.getFolderStore().un('update', this.onUpdateFolderStore, this);
	    },
	    
	    /**
	     * folder store gets updated -> refresh grid if new messages arrived or messages have been removed
	     * 
	     * @param {Tine.Felamimail.FolderStore} store
	     * @param {Tine.Felamimail.Model.Folder} record
	     * @param {String} operation
	     */
	    onUpdateFolderStore: function(store, record, operation) {
	        if (operation === Ext.data.Record.EDIT && record.isModified('cache_totalcount')) {
	            var tree = this.app.getMainScreen().getTreePanel(),
	                selectedNodes = (tree) ? tree.getSelectionModel().getSelectedNodes() : [];
	            
	            // only refresh if 1 or no messages are selected
	            if (this.getGrid().getSelectionModel().getCount() <= 1) {
	                var refresh = false;
	                for (var i = 0; i < selectedNodes.length; i++) {
	                    if (selectedNodes[i].id == record.id) {
	                        refresh = true;
	                        break;
	                    }
	                }
	                
	                // check if folder is in filter or allinboxes are selected and updated folder is an inbox
	                if (! refresh) {
	                    var filters = this.filterToolbar.getValue();
	                    filters = filters.filters ? filter.filters : filters;
	                    
	                    for (var i = 0; i < filters.length; i++) {
	                        if (filters[i].field == 'path' && filters[i].operator == 'in') {
	                            if (filters[i].value.indexOf(record.get('path')) !== -1 || (filters[i].value.indexOf('/allinboxes') !== -1 && record.isInbox())) {
	                                refresh = true;
	                                break;
	                            }
	                        }
	                    }
	                }
	                
	                if (refresh && this.noDeleteRequestInProgress()) {
	                    Tine.log.debug('Refresh grid because of folder update.');
	                    this.loadGridData({
	                        removeStrategy: 'keepBuffered',
	                        autoRefresh: true
	                    });
	                }
	            }
	        }
	    },
	    
	    /**
	     * skip initial till we know the INBOX id
	     */
	    initialLoad: function() {
	        var account = this.app.getActiveAccount(),
	            accountId = account ? account.id : null,
	            inbox = accountId ? this.app.getFolderStore().queryBy(function(record) {
	                return record.get('account_id') === accountId && record.get('localname').match(/^inbox$/i);
	            }, this).first() : null;
	            
	        if (! inbox) {
	            this.initialLoad.defer(100, this, arguments);
	            return;
	        }
	        
	        return Tine.Felamimail.GridPanel.superclass.initialLoad.apply(this, arguments);
	    },
	    
	    /**
	     * init actions with actionToolbar, contextMenu and actionUpdater
	     * 
	     * @private
	     */
	    initActions: function() {
	
	        this.action_write = new Ext.Action({
	            requiredGrant: 'addGrant',
	            actionType: 'add',
	            text: this.app.i18n._('Compose'),
	            handler: this.onMessageCompose.createDelegate(this),
	            // TODO reactivate when account becomes available as sometimes this stays deactivated
	            disabled: ! this.app.getActiveAccount(),
	            iconCls: this.app.appName + 'IconCls'
	        });
	
	        this.action_reply = new Ext.Action({
	            requiredGrant: 'readGrant',
	            actionType: 'reply',
	            text: this.app.i18n._('Reply'),
	            handler: this.onMessageReplyTo.createDelegate(this, [false]),
	            iconCls: 'action_email_reply',
	            disabled: true
	        });
	
	        this.action_replyAll = new Ext.Action({
	            requiredGrant: 'readGrant',
	            actionType: 'replyAll',
	            text: this.app.i18n._('Reply To All'),
	            handler: this.onMessageReplyTo.createDelegate(this, [true]),
	            iconCls: 'action_email_replyAll',
	            disabled: true
	        });
	
	        this.action_forward = new Ext.Action({
	            requiredGrant: 'readGrant',
	            actionType: 'forward',
	            text: this.app.i18n._('Forward'),
	            handler: this.onMessageForward.createDelegate(this),
	            iconCls: 'action_email_forward',
	            disabled: true
	        });
	
	        this.action_flag = new Ext.Action({
	            requiredGrant: 'readGrant',
	            text: this.app.i18n._('Toggle highlighting'),
	            handler: this.onToggleFlag.createDelegate(this, ['\\Flagged'], true),
	            iconCls: 'action_email_flag',
	            allowMultiple: true,
	            disabled: true
	        });
	        
	        this.action_markUnread = new Ext.Action({
	            requiredGrant: 'readGrant',
	            text: this.app.i18n._('Mark read/unread'),
	            handler: this.onToggleFlag.createDelegate(this, ['\\Seen'], true),
	            iconCls: 'action_mark_read',
	            allowMultiple: true,
	            disabled: true
	        });
	        
	        this.action_deleteRecord = new Ext.Action({
	            requiredGrant: 'deleteGrant',
	            allowMultiple: true,
	            text: this.app.i18n._('Delete'),
	            handler: this.onDeleteRecords,
	            disabled: true,
	            iconCls: 'action_delete',
	            scope: this
	        });
	
	        this.action_moveRecord = new Ext.Action({
	            requiredGrant: 'editGrant',
	            allowMultiple: true,
	            text: this.app.i18n._('Move'),
	            disabled: true,
	            actionType: 'edit',
	            handler: this.onMoveRecords,
	            scope: this,
	            iconCls: 'action_move'
	        });
	
	        this.action_fileRecord = new Ext.Action({
	            requiredGrant: 'readGrant',
	            allowMultiple: true,
	            text: this.app.i18n._('File Message'),
	            handler: this.onFileRecords,
	            disabled: true,
	            hidden: ! (Tine.Tinebase.common.hasRight('run', 'MailFiler') || Tine.Tinebase.common.hasRight('run', 'Filemanager')),
	            iconCls: 'action_file',
	            scope: this
	        });
	
	        this.action_addAccount = new Ext.Action({
	            text: this.app.i18n._('Add Account'),
	            handler: this.onAddAccount,
	            iconCls: 'action_add',
	            scope: this,
	            disabled: ! Tine.Tinebase.common.hasRight('add_accounts', 'Felamimail')
	        });
	        this.action_printPreview = new Ext.Action({
	            requiredGrant: 'readGrant',
	            text: this.app.i18n._('Print Preview'),
	            handler: this.onPrintPreview.createDelegate(this, []),
	            disabled:true,
	            hidden: Ext.isTouchDevice, // no popups here
	            iconCls:'action_printPreview',
	            scope:this
	        });
	        this.action_print = new Ext.Action({
	            requiredGrant: 'readGrant',
	            text: this.app.i18n._('Print Message'),
	            handler: this.onPrint.createDelegate(this, []),
	            disabled:true,
	            iconCls:'action_print',
	            scope:this,
	            menu:{
	                items:[
	                    this.action_printPreview
	                ]
	            }
	        });
	        this.actionUpdater.addActions([
	            this.action_deleteRecord,
	            this.action_reply,
	            this.action_replyAll,
	            this.action_forward,
	            this.action_fileRecord,
	            this.action_flag,
	            this.action_markUnread,
	            this.action_addAccount,
	            this.action_print,
	            this.action_printPreview,
	            this.action_moveRecord
	        ]);
	        
	        this.contextMenu = new Ext.menu.Menu({
	            plugins: [{
	                ptype: 'ux.itemregistry',
	                key:   'Tinebase-MainContextMenu'
	            }],
	            items: [
	                this.action_reply,
	                this.action_replyAll,
	                this.action_forward,
	                this.action_flag,
	                this.action_markUnread,
	                this.action_moveRecord,
	                this.action_deleteRecord,
	                this.action_fileRecord
	            ]
	        });
	    },
	    
	    /**
	     * initializes the filterPanel, overwrites the superclass method
	     */
	    initFilterPanel: function() {
	        this.filterToolbar = this.getFilterToolbar();
	        this.filterToolbar.criteriaIgnores = [
	            {field: 'query',     operator: 'contains',     value: ''},
	            {field: 'id' },
	            {field: 'path' }
	        ];
	        
	        this.plugins = this.plugins || [];
	        this.plugins.push(this.filterToolbar);
	    },
	    
	    /**
	     * the details panel (shows message content)
	     * 
	     * @private
	     */
	    initDetailsPanel: function() {
	        this.detailsPanel = new Tine.Felamimail.GridDetailsPanel({
	            gridpanel: this,
	            grid: this,
	            app: this.app,
	            i18n: this.app.i18n
	        });
	    },
	    
	    /**
	     * get action toolbar
	     * 
	     * @return {Ext.Toolbar}
	     */
	    getActionToolbar: function() {
	        if (! this.actionToolbar) {
	            this.actionToolbar = new Ext.Toolbar({
	                defaults: {height: 55},
	                items: [{
	                    xtype: 'buttongroup',
	                    layout: 'toolbar',
	                    buttonAlign: 'left',
	                    columns: 6,
	                    items: [
	                        Ext.apply(new Ext.SplitButton(this.action_write), {
	                            scale: 'medium',
	                            rowspan: 2,
	                            iconAlign: 'top',
	                            arrowAlign:'right',
	                            menu: new Ext.menu.Menu({
	                                items: [],
	                                plugins: [{
	                                    ptype: 'ux.itemregistry',
	                                    key:   'Tine.widgets.grid.GridPanel.addButton'
	                                },{
	                                    ptype: 'ux.itemregistry',
	                                    key:   'Tinebase-MainContextMenu'
	                                }]
	                            })
	                        }),
	                        Ext.apply(new Ext.Button(this.action_deleteRecord), {
	                            scale: 'medium',
	                            rowspan: 2,
	                            iconAlign: 'top'
	                        }),
	                        Ext.apply(new Ext.Button(this.action_reply), {
	                            scale: 'medium',
	                            rowspan: 2,
	                            iconAlign: 'top'
	                        }),
	                        Ext.apply(new Ext.Button(this.action_replyAll), {
	                            scale: 'medium',
	                            rowspan: 2,
	                            iconAlign: 'top'
	                        }),
	                        Ext.apply(new Ext.Button(this.action_forward), {
	                            scale: 'medium',
	                            rowspan: 2,
	                            iconAlign: 'top'
	                        }),
	                        {
	                            xtype: 'buttongroup',
	                            buttonAlign: 'left',
	                            columns: 3,
	                            frame: false,
	                            items: [
	                                this.action_print,
	                                this.action_markUnread,
	                                this.action_addAccount,
	                                this.action_fileRecord,
	                                this.action_flag
	                            ]
	                        }
	                    ]
	                }, this.getActionToolbarItems()]
	            });
	
	            this.actionToolbar.on('resize', this.onActionToolbarResize, this, {buffer: 250});
	            this.actionToolbar.on('show', this.onActionToolbarResize, this);
	
	            if (this.filterToolbar && typeof this.filterToolbar.getQuickFilterField == 'function') {
	                this.actionToolbar.add('->', this.filterToolbar.getQuickFilterField());
	            }
	        }
	        
	        return this.actionToolbar;
	    },
	    
	    /**
	     * returns cm
	     * 
	     * @private
	     */
	    getColumns: function(){
	        return [{
	            id: 'id',
	            header: this.app.i18n._("Id"),
	            width: 100,
	            sortable: true,
	            dataIndex: 'id',
	            hidden: true
	        }, {
	            id: 'content_type',
	            header: this.app.i18n._("Attachments"),
	            width: 12,
	            sortable: true,
	            dataIndex: 'has_attachment',
	            renderer: this.attachmentRenderer
	        }, {
	            id: 'flags',
	            header: this.app.i18n._("Flags"),
	            width: 24,
	            sortable: true,
	            dataIndex: 'flags',
	            renderer: this.flagRenderer
	        },{
	            id: 'subject',
	            header: this.app.i18n._("Subject"),
	            width: 300,
	            sortable: true,
	            dataIndex: 'subject'
	        },{
	            id: 'from_email',
	            header: this.app.i18n._("From (Email)"),
	            width: 100,
	            sortable: true,
	            dataIndex: 'from_email'
	        },{
	            id: 'from_name',
	            header: this.app.i18n._("From (Name)"),
	            width: 100,
	            sortable: true,
	            dataIndex: 'from_name'
	        },{
	            id: 'sender',
	            header: this.app.i18n._("Sender"),
	            width: 100,
	            sortable: true,
	            dataIndex: 'sender',
	            hidden: true
	        },{
	            id: 'to',
	            header: this.app.i18n._("To"),
	            width: 150,
	            sortable: true,
	            dataIndex: 'to',
	            hidden: true
	        },{
	            id: 'sent',
	            header: this.app.i18n._("Sent"),
	            width: 100,
	            sortable: true,
	            dataIndex: 'sent',
	            hidden: true,
	            renderer: Tine.Tinebase.common.dateTimeRenderer
	        },{
	            id: 'received',
	            header: this.app.i18n._("Received"),
	            width: 100,
	            sortable: true,
	            dataIndex: 'received',
	            renderer: Tine.Tinebase.common.dateTimeRenderer
	        },{
	            id: 'folder_id',
	            header: this.app.i18n._("Folder"),
	            width: 100,
	            sortable: true,
	            dataIndex: 'folder_id',
	            hidden: true,
	            renderer: this.accountAndFolderRenderer.createDelegate(this)
	        },{
	            id: 'size',
	            header: this.app.i18n._("Size"),
	            width: 80,
	            sortable: true,
	            dataIndex: 'size',
	            hidden: true,
	            renderer: Ext.util.Format.fileSize
	        }];
	    },
	    
	    /**
	     * attachment column renderer
	     * 
	     * @param {String} value
	     * @return {String}
	     * @private
	     */
	    attachmentRenderer: function(value, metadata, record) {
	        var result = '';
	        
	        if (value == 1) {
	            result = '<img class="FelamimailFlagIcon" src="images/oxygen/16x16/actions/attach.png">';
	        }
	        
	        return result;
	    },
	    
	    /**
	     * get flag icon
	     * 
	     * @param {String} flags
	     * @return {String}
	     * @private
	     * 
	     * TODO  use spacer if first flag(s) is/are not set?
	     */
	    flagRenderer: function(value, metadata, record) {
	        var icons = [],
	            result = '';
	            
	        if (record.hasFlag('\\Answered')) {
	            icons.push({src: 'images/oxygen/16x16/actions/mail-reply-sender.png', qtip: Ext.util.Format.htmlEncode(i18n._('Answered'))});
	        }   
	        if (record.hasFlag('Passed')) {
	            icons.push({src: 'images/oxygen/16x16/actions/mail-forward.png', qtip: Ext.util.Format.htmlEncode(i18n._('Forwarded'))});
	        }   
	        if (record.hasFlag('Tine20')) {
	            icons.push({src: 'images/favicon.png', qtip: Ext.util.Format.htmlEncode(i18n._('Tine20'))});
	        }
	//        if (record.hasFlag('\\Recent')) {
	//            icons.push({src: 'images/oxygen/16x16/actions/knewstuff.png', qtip: i18n._('Recent')});
	//        }   
	        
	        Ext.each(icons, function(icon) {
	            result += '<img class="FelamimailFlagIcon" src="' + icon.src + '" ext:qtip="' + Tine.Tinebase.common.doubleEncode(icon.qtip) + '">';
	        }, this);
	        
	        return result;
	    },
	    
	    /**
	     * returns account and folder globalname
	     * 
	     * @param {String} folderId
	     * @param {Object} metadata
	     * @param {Folder|Account} record
	     * @return {String}
	     */
	    accountAndFolderRenderer: function(folderId, metadata, record) {
	        var folderStore = this.app.getFolderStore(),
	            account = this.app.getAccountStore().getById(record.get('account_id')),
	            result = (account) ? account.get('name') : record.get('account_id'),
	            folder = folderStore.getById(folderId);
	        
	        if (! folder) {
	            folder = folderStore.getById(record.id);
	            if (! folder) {
	                // only account
	                return (result) ? result : record.get('name');
	            }
	        }
	            
	        result += '/';
	        if (folder) {
	            result += folder.get('globalname');
	        } else {
	            result += folderId;
	        }
	            
	        return result;
	    },
	    
	    /**
	     * executed when user clicks refresh btn
	     */
	    doRefresh: function() {
	        var folder = this.getCurrentFolderFromTree(),
	            refresh = this.pagingToolbar.refresh;
	            
	        // refresh is explicit
	        this.editBuffer = [];
	        this.manualRefresh = true;
	        
	        if (folder) {
	            refresh.disable();
	            Tine.log.info('User forced mail check for folder "' + folder.get('localname') + '"');
	            this.app.checkMails(folder, function() {
	                refresh.enable();
	                this.manualRefresh = false;
	            });
	        } else {
	            this.filterToolbar.onFilterChange();
	        }
	    },
	    
	    /**
	     * get currently selected folder from tree
	     * @return {Tine.Felamimail.Model.Folder}
	     */
	    getCurrentFolderFromTree: function() {
	        var tree = this.app.getMainScreen().getTreePanel(),
	            node = tree ? tree.getSelectionModel().getSelectedNode() : null,
	            folder = node ? this.app.getFolderStore().getById(node.id) : null;
	        
	        return folder;
	    },
	    
	    /**
	     * delete messages handler
	     * 
	     * @return {void}
	     */
	    onDeleteRecords: function() {
	        var account = this.app.getActiveAccount(),
	            trashId = (account) ? account.getTrashFolderId() : null,
	            trash = trashId ? this.app.getFolderStore().getById(trashId) : null,
	            trashConfigured = (account.get('trash_folder'));
	            
	        return (trash && ! trash.isCurrentSelection()) || (! trash && trashConfigured) ? this.moveSelectedMessages(trash, true) : this.deleteSelectedMessages();
	    },
	
	    /**
	     * delete messages handler
	     *
	     * @return {void}
	     */
	    onMoveRecords: function() {
	        var selectPanel = Tine.Felamimail.FolderSelectPanel.openWindow({
	            account: this.app.getActiveAccount(),
	            listeners: {
	                scope: this,
	                folderselect: function(node) {
	                    var folder = new Tine.Felamimail.Model.Folder(node.attributes, node.attributes.id);
	                    this.moveSelectedMessages(folder, false);
	                    selectPanel.close();
	                }
	            }
	        });
	    },
	
	    /**
	     * file selected messages to a Filemanager
	     */
	    onFileRecords: function() {
	        // show filemanager tree to get target
	        // allow to decide which Filemanager to file the messages in (config or combo?)
	
	        var appStore = [],
	            app = null,
	            dlgItems = [];
	        Ext.each(['MailFiler', 'Filemanager'], function(appName) {
	            if (Tine.Tinebase.common.hasRight('run', appName)) {
	                // TODO remove ctx menus from tree selection panel?
	                switch(appName) {
	                    case 'MailFiler':
	                        this.folderCombo = this.mailFilerFolderCombo = new Tine.widgets.container.SelectionComboBox({
	                            recordClass: Tine.MailFiler.Model.Node,
	                            // TODO make this work & remove mode:local
	                            //remoteMethod: 'MailFiler.searchNodes',
	                            mode: 'local',
	                            treePanelClass: Tine.MailFiler.NodeTreePanel,
	                            allowNodeSelect: true,
	                            allowToplevelNodeSelect: false,
	                            label: 'save in folder',
	                            listWidth: 230,
	                            // TODO should be auto width
	                            width: 242
	                        });
	                        break;
	                    case 'Filemanager':
	                        this.folderCombo = this.filemanagerFolderCombo = new Tine.widgets.container.SelectionComboBox({
	                            recordClass: Tine.Filemanager.Model.Node,
	                            // TODO make this work & remove mode:local
	                            //remoteMethod: 'Filemanager.searchNodes',
	                            mode: 'local',
	                            treePanelClass: Tine.Filemanager.NodeTreePanel,
	                            allowNodeSelect: true,
	                            allowToplevelNodeSelect: false,
	                            listWidth: 230,
	                            width: 242
	                        });
	                        break;
	                }
	                app = Tine.Tinebase.appMgr.get(appName);
	                appStore.push([appName, app.i18n._(appName)]);
	            }
	        }, this);
	
	        if (appStore.length > 1) {
	            this.fileAppCombo = new Ext.form.ComboBox({
	                label: 'choose app',
	                store: appStore,
	                value: appStore[0][0],
	                listeners: {
	                    scope: this,
	                    select: function (combo, value) {
	                        // set visible state for folder combos
	                        // TODO generalize?
	                        if (value === 'MailFiler') {
	                            this.mailFilerFolderCombo.show();
	                            this.filemanagerFolderCombo.hide();
	                            this.folderCombo = this.mailFilerFolderCombo;
	                        } else {
	                            this.mailFilerFolderCombo.hide();
	                            this.filemanagerFolderCombo.show();
	                            this.folderCombo = this.filemanagerFolderCombo;
	                        }
	                    }
	                }
	            });
	
	            // set visible state for folder combos
	            if (appStore[0][0] === 'MailFiler') {
	                this.mailFilerFolderCombo.hidden = false;
	                this.filemanagerFolderCombo.hidden = true;
	                this.folderCombo = this.mailFilerFolderCombo;
	            } else {
	                this.mailFilerFolderCombo.hidden = true;
	                this.filemanagerFolderCombo.hidden = false;
	                this.folderCombo = this.filemanagerFolderCombo;
	            }
	            dlgItems = [
	                this.fileAppCombo,
	                this.filemanagerFolderCombo,
	                this.mailFilerFolderCombo
	            ];
	        } else {
	            dlgItems.push(this.folderCombo);
	        }
	
	        var fileRecordsWin = Tine.WindowFactory.getWindow({
	            layout: 'fit',
	            width: 250,
	            height: 100,
	            padding: '5px',
	            modal: true,
	            title: this.app.i18n._('File Messages To Folder'),
	            items: [{
	                xtype: 'form',
	                buttonAlign: 'right',
	                border: false,
	                layout: 'fit',
	                items: dlgItems,
	                buttons: [{
	                    text: i18n._('Cancel'),
	                    minWidth: 70,
	                    scope: this,
	                    handler: function () {
	                        fileRecordsWin.close();
	                    },
	                    iconCls: 'action_cancel'
	                }, {
	                    text: i18n._('Ok'),
	                    minWidth: 70,
	                    scope: this,
	                    handler: function() {
	                        if (this.folderCombo.getValue() == '') {
	                            return;
	                        }
	
	                        // get path from combo
	                        // TODO use stat path???
	                        var folder = this.folderCombo.getStore().getById(this.folderCombo.getValue()),
	                            path = folder ? folder.get('path') : null,
	                            appName = this.fileAppCombo
	                                        ? this.fileAppCombo.getValue()
	                                        : (Tine.Tinebase.common.hasRight('run', 'MailFiler') ? 'MailFiler' : 'Filemanager');
	                        if (path) {
	                            this.fileRecords(appName, path);
	                            fileRecordsWin.close();
	                        }
	                    },
	                    iconCls: 'action_saveAndClose'
	                }]
	            }]
	        });
	    },
	
	    /**
	     * file messages
	     *
	     * @param appName
	     * @param path
	     */
	    fileRecords: function(appName, path) {
	        var sm = this.getGrid().getSelectionModel(),
	            filter = sm.getSelectionFilter(),
	            msgsIds = [],
	            callback = Ext.emptyFn;
	
	        if (sm.isFilterSelect) {
	            var msgs = this.getStore();
	        } else {
	            var msgs = sm.getSelectionsCollection();
	        }
	
	        if (msgs.length < 5) {
	            this.fileMessagesLoadMask = new Ext.LoadMask(Ext.getBody(), {msg: this.app.i18n._('Filing Messages')});
	            this.fileMessagesLoadMask.show();
	            callback = this.afterFileRecords;
	        }
	        // last params are the callback & scope
	        Tine.Felamimail.fileMessages(filter, appName, path, callback, this);
	    },
	
	    /**
	     * show feedback when message filing has been (un)successful
	     *
	     * TODO reload grid when request returns?
	     */
	    afterFileRecords: function(unknown, result) {
	        Tine.log.info('Tine.Felamimail.GridPanel::afterFileRecords');
	        Tine.log.debug(result);
	
	        this.fileMessagesLoadMask.hide();
	
	        if (result && result.type && result.type == 'exception') {
	            var error = result.error ? result.error : null;
	            Ext.Msg.show({
	                title: this.app.i18n._('Error Filing Message'),
	                msg: error && error.message ? error.message : this.app.i18n._('Could not file message.'),
	                icon: Ext.MessageBox.ERROR,
	                buttons: Ext.Msg.OK
	            });
	        }
	    },
	
	    /**
	     * permanently delete selected messages
	     */
	    deleteSelectedMessages: function() {
	        this.moveOrDeleteMessages(null);
	    },
	    
	    /**
	     * move selected messages to given folder
	     * 
	     * @param {Tine.Felamimail.Model.Folder} folder
	     * @param {Boolean} toTrash
	     */
	    moveSelectedMessages: function(folder, toTrash) {
	        if (folder && folder.isCurrentSelection()) {
	            // nothing to do ;-)
	            return;
	        }
	        
	        this.moveOrDeleteMessages(folder, toTrash);
	    },
	    
	    /**
	     * move (folder !== null) or delete selected messages 
	     * 
	     * @param {Tine.Felamimail.Model.Folder} folder
	     * @param {Boolean} toTrash
	     */
	    moveOrDeleteMessages: function(folder, toTrash) {
	        
	        // this is needed to prevent grid reloads while messages are moved or deleted
	        this.movingOrDeleting = true;
	        
	        var sm = this.getGrid().getSelectionModel(),
	            filter = sm.getSelectionFilter(),
	            msgsIds = [],
	            foldersNeedUpdate = false;
	        
	        if (sm.isFilterSelect) {
	            var msgs = this.getStore(),
	                nextRecord = null;
	        } else {
	            var msgs = sm.getSelectionsCollection(),
	                nextRecord = this.getNextMessage(msgs);
	        }
	        
	        var increaseUnreadCountInTargetFolder = 0;
	        msgs.each(function(msg) {
	            var isSeen = msg.hasFlag('\\Seen'),
	                currFolder = this.app.getFolderStore().getById(msg.get('folder_id')),
	                diff = isSeen ? 0 : 1;
	            
	            if (currFolder) {
	                currFolder.set('cache_unreadcount', currFolder.get('cache_unreadcount') - diff);
	                currFolder.set('cache_totalcount', currFolder.get('cache_totalcount') - 1);
	                if (sm.isFilterSelect && sm.getCount() > 50 && currFolder.get('cache_status') !== 'pending') {
	                    Tine.log.debug('Tine.Felamimail.GridPanel::moveOrDeleteMessages - Set cache status to pending for folder ' + currFolder.get('globalname'));
	                    currFolder.set('cache_status', 'pending');
	                    foldersNeedUpdate = true;
	                }
	                currFolder.commit();
	            }
	            if (folder) {
	                increaseUnreadCountInTargetFolder += diff;
	            }
	           
	            msgsIds.push(msg.id);
	            this.getStore().remove(msg);
	        },  this);
	        
	        if (folder && increaseUnreadCountInTargetFolder > 0) {
	            // update unread count of target folder (only when moving)
	            folder.set('cache_unreadcount', folder.get('cache_unreadcount') + increaseUnreadCountInTargetFolder);
	            if (foldersNeedUpdate) {
	                Tine.log.debug('Tine.Felamimail.GridPanel::moveOrDeleteMessages - Set cache status to pending for target folder ' + folder.get('globalname'));
	                folder.set('cache_status', 'pending');
	            }
	            folder.commit();
	        }
	        
	        if (foldersNeedUpdate) {
	            Tine.log.debug('Tine.Felamimail.GridPanel::moveOrDeleteMessages - update message cache for "pending" folders');
	            this.app.checkMailsDelayedTask.delay(1000);
	        }
	        
	        this.deleteQueue = this.deleteQueue.concat(msgsIds);
	        this.pagingToolbar.refresh.disable();
	        if (nextRecord !== null) {
	            sm.selectRecords([nextRecord]);
	        }
	        
	        var callbackFn = this.onAfterDelete.createDelegate(this, [msgsIds]);
	        
	        if (folder !== null || toTrash) {
	            // move
	            var targetFolderId = (toTrash) ? '_trash_' : folder.id;
	            this.deleteTransactionId = Tine.Felamimail.messageBackend.moveMessages(filter, targetFolderId, {
	                callback: callbackFn
	            });
	        } else {
	            // delete
	            this.deleteTransactionId = Tine.Felamimail.messageBackend.addFlags(filter, '\\Deleted', {
	                callback: callbackFn
	            });
	        }
	    },
	
	    /**
	     * get next message in grid
	     * 
	     * @param {Ext.util.MixedCollection} msgs
	     * @return Tine.Felamimail.Model.Message
	     */
	    getNextMessage: function(msgs) {
	        
	        var nextRecord = null;
	        
	        if (msgs.getCount() == 1 && this.getStore().getCount() > 1) {
	            // select next message (or previous if it was the last or BACKSPACE)
	            var lastIdx = this.getStore().indexOf(msgs.last()),
	                direction = Ext.EventObject.getKey() == Ext.EventObject.BACKSPACE ? -1 : +1;
	            
	            nextRecord = this.getStore().getAt(lastIdx + 1 * direction);
	            if (! nextRecord) {
	                nextRecord = this.getStore().getAt(lastIdx + (-1) * direction);
	            }
	        }
	        
	        return nextRecord;
	    },
	    
	    /**
	     * executed after a msg compose
	     * 
	     * @param {String} composedMsg
	     * @param {String} action
	     * @param {Array}  [affectedMsgs]  messages affected 
	     * @param {String} [mode]
	     */
	    onAfterCompose: function(composedMsg, action, affectedMsgs, mode) {
	        Tine.log.debug('Tine.Felamimail.GridPanel::onAfterCompose / arguments:');
	        Tine.log.debug(arguments);
	
	        // mark send folders cache status incomplete
	        composedMsg = Ext.isString(composedMsg) ? new this.recordClass(Ext.decode(composedMsg)) : composedMsg;
	        
	        // NOTE: if affected messages is decoded, we need to fetch the originals out of our store
	        if (Ext.isString(affectedMsgs)) {
	            var msgs = [],
	                store = this.getStore();
	            Ext.each(Ext.decode(affectedMsgs), function(msgData) {
	                var msg = store.getById(msgData.id);
	                if (msg) {
	                    msgs.push(msg);
	                }
	            }, this);
	            affectedMsgs = msgs;
	        }
	        
	        var composerAccount = this.app.getAccountStore().getById(composedMsg.get('account_id')),
	            sendFolderId = composerAccount ? composerAccount.getSendFolderId() : null,
	            sendFolder = sendFolderId ? this.app.getFolderStore().getById(sendFolderId) : null;
	            
	        if (sendFolder) {
	            sendFolder.set('cache_status', 'incomplete');
	        }
	        
	        if (Ext.isArray(affectedMsgs)) {
	            Ext.each(affectedMsgs, function(msg) {
	                if (['reply', 'forward'].indexOf(action) !== -1) {
	                    msg.addFlag(action === 'reply' ? '\\Answered' : 'Passed');
	                } else if (action == 'senddraft') {
	                    this.deleteTransactionId = Tine.Felamimail.messageBackend.addFlags(msg.id, '\\Deleted', {
	                        callback: this.onAfterDelete.createDelegate(this, [[msg.id]])
	                    });
	                }
	            }, this);
	        } 
	    },
	    
	    /**
	     * executed after msg delete
	     * 
	     * @param {Array} [ids]
	     */
	    onAfterDelete: function(ids) {
	        this.deleteQueue = this.deleteQueue.diff(ids);
	        this.editBuffer = this.editBuffer.diff(ids);
	        
	        this.movingOrDeleting = false;
	        
	        Tine.log.debug('Tine.Felamimail.GridPanel::onAfterDelete() -> Loading grid data after delete.');
	        this.loadGridData({
	            removeStrategy: 'keepBuffered',
	            autoRefresh: true
	        });
	    },
	    
	    /**
	     * check if delete/move action is running atm
	     * 
	     * @return {Boolean}
	     */
	    noDeleteRequestInProgress: function() {
	        return (
	            ! this.movingOrDeleting && 
	            (! this.deleteTransactionId || ! Tine.Felamimail.messageBackend.isLoading(this.deleteTransactionId))
	        );
	    },
	    
	    /**
	     * compose new message handler
	     */
	    onMessageCompose: function() {
	        var activeAccount = Tine.Tinebase.appMgr.get('Felamimail').getActiveAccount();
	        
	        var win = Tine.Felamimail.MessageEditDialog.openWindow({
	            accountId: activeAccount ? activeAccount.id : null,
	            listeners: {
	                'update': this.onAfterCompose.createDelegate(this, ['compose', []], 1)
	            }
	        });
	    },
	    
	    /**
	     * forward message(s) handler
	     */
	    onMessageForward: function() {
	        var sm = this.getGrid().getSelectionModel(),
	            msgs = sm.getSelections(),
	            msgsData = [];
	            
	        Ext.each(msgs, function(msg) {msgsData.push(msg.data)}, this);
	        
	        if (sm.getCount() > 0) {
	            var win = Tine.Felamimail.MessageEditDialog.openWindow({
	                forwardMsgs : Ext.encode(msgsData),
	                listeners: {
	                    'update': this.onAfterCompose.createDelegate(this, ['forward', msgs], 1)
	                }
	            });
	        }
	    },
	    
	    /**
	     * reply message handler
	     * 
	     * @param {bool} toAll
	     */
	    onMessageReplyTo: function(toAll) {
	        var sm = this.getGrid().getSelectionModel(),
	            msg = sm.getSelected();
	            
	        var win = Tine.Felamimail.MessageEditDialog.openWindow({
	            replyTo : Ext.encode(msg.data),
	            replyToAll: toAll,
	            listeners: {
	                'update': this.onAfterCompose.createDelegate(this, ['reply', [msg]], 1)
	            }
	        });
	    },
	    
	    /**
	     * called when a row gets selected
	     * 
	     * @param {SelectionModel} sm
	     * @param {Number} rowIndex
	     * @param {Tine.Felamimail.Model.Message} record
	     * @param {Number} retryCount
	     * 
	     * TODO find a better way to check if body is fetched, this does not work correctly if a message is removed
	     *       and the next one is selected automatically
	     */
	    onRowSelection: function(sm, rowIndex, record, retryCount) {
	        if (sm.getCount() == 1 && (! retryCount || retryCount < 5) && ! record.bodyIsFetched()) {
	            Tine.log.debug('Tine.Felamimail.GridPanel::onRowSelection() -> Deferring onRowSelection');
	            retryCount = (retryCount) ? retryCount++ : 1;
	            return this.onRowSelection.defer(250, this, [sm, rowIndex, record, retryCount+1]);
	        }
	        
	        if (sm.getCount() == 1 && sm.isIdSelected(record.id) && !record.hasFlag('\\Seen')) {
	            Tine.log.debug('Tine.Felamimail.GridPanel::onRowSelection() -> Selected unread message');
	            Tine.log.debug(record);
	            
	            record.addFlag('\\Seen');
	            record.mtime = new Date().getTime();
	            Tine.Felamimail.messageBackend.addFlags(record.id, '\\Seen');
	            this.app.getMainScreen().getTreePanel().decrementCurrentUnreadCount();
	            
	            if (record.get('headers')['disposition-notification-to']) {
	                Ext.Msg.confirm(
	                    this.app.i18n._('Send Reading Confirmation'),
	                    this.app.i18n._('Do you want to send a reading confirmation message?'), 
	                    function(btn) {
	                        if (btn == 'yes'){
	                            Tine.Felamimail.sendReadingConfirmation(record.id);
	                        }
	                    }, 
	                    this
	                );
	            }
	        }
	    },
	    
	    /**
	     * row doubleclick handler
	     * 
	     * - opens message edit dialog (if draft/template)
	     * - opens message display dialog (everything else)
	     * 
	     * @param {Tine.Felamimail.GridPanel} grid
	     * @param {Row} row
	     * @param {Event} e
	     */
	    onRowDblClick: function(grid, row, e) {
	        
	        var record = this.grid.getSelectionModel().getSelected(),
	            folder = this.app.getFolderStore().getById(record.get('folder_id')),
	            account = this.app.getAccountStore().getById(folder.get('account_id')),
	            action = (folder.get('globalname') == account.get('drafts_folder')) ? 'senddraft' :
	                      folder.get('globalname') == account.get('templates_folder') ? 'sendtemplate' : null,
	            win;
	        
	        // check folder to determine if mail should be opened in compose dlg
	        if (action !== null) {
	            win = Tine.Felamimail.MessageEditDialog.openWindow({
	                draftOrTemplate: Ext.encode(record.data),
	                listeners: {
	                    scope: this,
	                    'update': this.onAfterCompose.createDelegate(this, [action, [record]], 1)
	                }
	            });
	        } else {
	            win = Tine.Felamimail.MessageDisplayDialog.openWindow({
	                record: Ext.encode(record.data),
	                listeners: {
	                    scope: this,
	                    'update': this.onAfterCompose.createDelegate(this, ['compose', []], 1),
	                    'remove': this.onRemoveInDisplayDialog
	                }
	            });
	        }
	    },
	    
	    /**
	     * message got removed in display dialog
	     * 
	     * @param {} msgData
	     */
	    onRemoveInDisplayDialog: function (msgData) {
	        var msg = this.getStore().getById(Ext.decode(msgData).id),
	            folderId = msg ? msg.get('folder_id') : null,
	            folder = folderId ? this.app.getFolderStore().getById(folderId) : null,
	            accountId = folder ? folder.get('account_id') : null,
	            account = accountId ? this.app.getAccountStore().getById(accountId) : null;
	            
	        this.getStore().remove(msg);
	        this.onAfterDelete(null);
	    },    
	    
	    /**
	     * called when the store gets updated
	     * 
	     * NOTE: we only allow updateing flags BUT the actual updating is done 
	     *       directly from the UI fn's to support IMAP optimised bulk actions
	     */
	    onStoreUpdate: function(store, record, operation) {
	        if (operation === Ext.data.Record.EDIT && record.isModified('flags')) {
	            record.commit()
	        }
	    },
	    
	    /**
	     * key down handler
	     * 
	     * @param {Event} e
	     */
	    onKeyDown: function(e) {
	        if (e.ctrlKey) {
	            switch (e.getKey()) {
	                case e.N:
	                case e.M:
	                    this.onMessageCompose();
	                    e.preventDefault();
	                    break;
	                case e.R:
	                    this.onMessageReplyTo();
	                    e.preventDefault();
	                    break;
	                case e.L:
	                    this.onMessageForward();
	                    e.preventDefault();
	                    break;
	            }
	        }
	        
	        Tine.Felamimail.GridPanel.superclass.onKeyDown.call(this, e);
	    },
	    
	    /**
	     * toggle flagged status of mail(s)
	     * - Flagged/Seen
	     * 
	     * @param {Button} button
	     * @param {Event} event
	     * @param {String} flag
	     */
	    onToggleFlag: function(btn, e, flag) {
	        var sm = this.getGrid().getSelectionModel(),
	            filter = sm.getSelectionFilter(),
	            msgs = sm.isFilterSelect ? this.getStore() : sm.getSelectionsCollection(),
	            flagCount = 0;
	            
	        // switch all msgs to one state -> toogle most of them
	        msgs.each(function(msg) {
	            flagCount += msg.hasFlag(flag) ? 1 : 0;
	        });
	        var action = flagCount >= Math.round(msgs.getCount()/2) ? 'clear' : 'add';
	        
	        Tine.log.info('Tine.Felamimail.GridPanel::onToggleFlag - Toggle flag for ' + msgs.getCount() + ' message(s): ' + flag);
	        
	        // mark messages in UI and add to edit buffer
	        msgs.each(function(msg) {
	            // update unreadcount
	            if (flag === '\\Seen') {
	                var isSeen = msg.hasFlag('\\Seen'),
	                    folder = this.app.getFolderStore().getById(msg.get('folder_id')),
	                    diff = (action === 'clear' && isSeen) ? 1 :
	                           (action === 'add' && ! isSeen) ? -1 : 0;
	                
	                if (folder) {
	                    folder.set('cache_unreadcount', folder.get('cache_unreadcount') + diff);
	                    if (sm.isFilterSelect && sm.getCount() > 50 && folder.get('cache_status') !== 'pending') {
	                        Tine.log.debug('Tine.Felamimail.GridPanel::onToggleFlag - Set cache status to pending for folder ' + folder.get('globalname'));
	                        folder.set('cache_status', 'pending');
	                    }
	                    folder.commit();
	                }
	            }
	            
	            msg[action + 'Flag'](flag);
	            
	            this.addToEditBuffer(msg);
	        }, this);
	        
	        if (sm.isFilterSelect && sm.getCount() > 50) {
	            Tine.log.debug('Tine.Felamimail.GridPanel::moveOrDeleteMessages - Update message cache for "pending" folders');
	            this.app.checkMailsDelayedTask.delay(1000);
	        }
	        
	        // do request
	        Tine.Felamimail.messageBackend[action+ 'Flags'](filter, flag);
	    },
	    
	    /**
	     * called before store queries for data
	     */
	    onStoreBeforeload: function(store, options) {
	        this.supr().onStoreBeforeload.apply(this, arguments);
	        
	        if (! Ext.isEmpty(this.deleteQueue)) {
	            options.params.filter.push({field: 'id', operator: 'notin', value: this.deleteQueue});
	        }
	    },
	    
	    /**
	     *  called after a new set of Records has been loaded
	     *  
	     * @param  {Ext.data.Store} this.store
	     * @param  {Array}          loaded records
	     * @param  {Array}          load options
	     * @return {Void}
	     */
	    onStoreLoad: function(store, records, options) {
	        this.supr().onStoreLoad.apply(this, arguments);
	        
	        Tine.log.debug('Tine.Felamimail.GridPanel::onStoreLoad(): store loaded new records.');
	        
	        var folder = this.getCurrentFolderFromTree();
	        if (folder && records.length < folder.get('cache_totalcount')) {
	            Tine.log.debug('Tine.Felamimail.GridPanel::onStoreLoad() - Count mismatch: got ' + records.length + ' records for folder ' + folder.get('globalname'));
	            Tine.log.debug(folder);
	            folder.set('cache_status', 'pending');
	            folder.commit();
	            this.app.checkMailsDelayedTask.delay(1000);
	        }
	        
	        this.updateQuotaBar();
	    },
	    
	    /**
	     * update quotaBar / only do it if we have a path filter with a single account id
	     * 
	     * @param {Record} accountInbox
	     */
	    updateQuotaBar: function(accountInbox) {
	        var accountId = this.extractAccountIdFromFilter();
	        
	        if (accountId === null) {
	            Tine.log.debug('No or multiple account ids in filter. Resetting quota bar.');
	            this.quotaBar.hide();
	            return;
	        }
	            
	        if (! accountInbox) {
	            var accountInbox = this.app.getFolderStore().queryBy(function(folder) {
	                return folder.isInbox() && (folder.get('account_id') == accountId);
	            }, this).first();
	        }
	        if (accountInbox && parseInt(accountInbox.get('quota_limit'), 10) && accountId == accountInbox.get('account_id')) {
	            Tine.log.debug('Showing quota info.');
	            
	            var limit = parseInt(accountInbox.get('quota_limit'), 10),
	                usage = parseInt(accountInbox.get('quota_usage'), 10),
	                left = limit - usage,
	                percentage = Math.round(usage/limit * 100),
	                text = String.format(this.app.i18n._('{0} %'), percentage);
	            this.quotaBar.show();
	            this.quotaBar.setWidth(75);
	            this.quotaBar.updateProgress(usage/limit, text);
	            
	            Ext.QuickTips.register({
	                target:  this.quotaBar,
	                dismissDelay: 30000,
	                title: this.app.i18n._('Your quota'),
	                text: String.format(this.app.i18n._('{0} available (total: {1})'), 
	                    Ext.util.Format.fileSize(left * 1024),
	                    Ext.util.Format.fileSize(limit * 1024)
	                ),
	                width: 200
	            });
	        } else {
	            Tine.log.debug('No account inbox found or no quota info found.');
	            this.quotaBar.hide();
	        }
	    },
	    
	    /**
	     * get account id from filter (only returns the id if a single account id was found)
	     * 
	     * @param {Array} filter
	     * @return {String}
	     */
	    extractAccountIdFromFilter: function(filter) {
	        if (! filter) {
	            filter = this.filterToolbar.getValue();
	        }
	        
	        // use first OR panel in case of filterPanel
	        Ext.each(filter, function(filterData) {
	            if (filterData.condition && filterData.condition == 'OR') {
	                filter = filterData.filters[0].filters;
	                return false;
	            }
	        }, this);
	        
	        // condition from filterPanel
	        while (filter.filters || (Ext.isArray(filter) && filter.length > 0 && filter[0].filters)) {
	            filter = (filter.filters) ? filter.filters : filter[0].filters;
	        }
	        
	        var accountId = null, 
	            filterAccountId = null,
	            accountIdMatch = null;
	
	        for (var i = 0; i < filter.length; i++) {
	            if (filter[i].field == 'path' && filter[i].operator == 'in') {
	                for (var j = 0; j < filter[i].value.length; j++) {
	                    accountIdMatch = filter[i].value[j].match(/^\/([a-z0-9]*)/i);
	                    if (accountIdMatch) {
	                        filterAccountId = accountIdMatch[1];
	                        if (accountId && accountId != filterAccountId) {
	                            // multiple different account ids found!
	                            return null;
	                        } else {
	                            accountId = filterAccountId;
	                        }
	                    }
	                }
	            }
	        }
	        
	        return accountId;
	    },
	    
	    /**
	     * add new account button
	     * 
	     * @param {Button} button
	     * @param {Event} event
	     */
	    onAddAccount: function(button, event) {
	        var popupWindow = Tine.Felamimail.AccountEditDialog.openWindow({
	            record: null,
	            listeners: {
	                scope: this,
	                'update': function(record) {
	                    var account = new Tine.Felamimail.Model.Account(Ext.util.JSON.decode(record));
	                    
	                    // add to registry
	                    Tine.Felamimail.registry.get('preferences').replace('defaultEmailAccount', account.id);
	                    // need to do this because store could be unitialized yet
	                    var registryAccounts = Tine.Felamimail.registry.get('accounts');
	                    registryAccounts.results.push(account.data);
	                    registryAccounts.totalcount++;
	                    Tine.Felamimail.registry.replace('accounts', registryAccounts);
	                    
	                    // add to tree / store
	                    var treePanel = this.app.getMainScreen().getTreePanel();
	                    treePanel.addAccount(account);
	                    treePanel.accountStore.add([account]);
	                }
	            }
	        });
	    },
	    
	    /**
	     * print handler
	     * 
	     * @todo move this to Ext.ux.Printer as iframe driver
	     * @param {Tine.Felamimail.GridDetailsPanel} details panel [optional]
	     */
	    onPrint: function(detailsPanel) {
	        var id = Ext.id(),
	            doc = document,
	            frame = doc.createElement('iframe');
	            
	        Ext.fly(frame).set({
	            id: id,
	            name: id,
	            style: {
	                position: 'absolute',
	                width: '210mm',
	                height: '297mm',
	                top: '-10000px', 
	                left: '-10000px'
	            }
	        });
	        
	        doc.body.appendChild(frame);
	
	        Ext.fly(frame).set({
	           src : Ext.SSL_SECURE_URL
	        });
	
	        var doc = frame.contentWindow.document || frame.contentDocument || WINDOW.frames[id].document,
	            content = this.getDetailsPanelContentForPrinting(detailsPanel || this.detailsPanel);
	            
	        doc.open();
	        doc.write(content);
	        doc.close();
	        
	        frame.contentWindow.focus();
	        frame.contentWindow.print();
	        
	        // removeing frame chrashes chrome
	//        setTimeout(function(){Ext.removeNode(frame);}, 100);
	    },
	    
	    /**
	     * get detail panel content
	     * 
	     * @param {Tine.Felamimail.GridDetailsPanel} details panel
	     * @return {String}
	     */
	    getDetailsPanelContentForPrinting: function(detailsPanel) {
	        // TODO somehow we have two <div class="preview-panel-felamimail"> -> we need to fix that and get the first element found
	        var detailsPanels = detailsPanel.getEl().query('.preview-panel-felamimail');
	        var detailsPanelContent = (detailsPanels.length > 1) ? detailsPanels[1].innerHTML : detailsPanels[0].innerHTML;
	        
	        var buffer = '<html><head>';
	        buffer += '<title>' + this.app.i18n._('Print Preview') + '</title>';
	        buffer += '</head><body>';
	        buffer += detailsPanelContent;
	        buffer += '</body></html>';
	        
	        return buffer;
	    },
	    
	    /**
	     * print preview handler
	     * 
	     * @param {Tine.Felamimail.GridDetailsPanel} details panel [optional]
	     */
	    onPrintPreview: function(detailsPanel) {
	        var content = this.getDetailsPanelContentForPrinting(detailsPanel || this.detailsPanel);
	        
	        var win = window.open('about:blank',this.app.i18n._('Print Preview'),'width=500,height=500,scrollbars=yes,toolbar=yes,status=yes,menubar=yes');
	        win.document.open()
	        win.document.write(content);
	        win.document.close();
	        win.focus();
	    },
	    
	    /**
	     * format headers
	     * 
	     * @param {Object} headers
	     * @param {Bool} ellipsis
	     * @param {Bool} onlyImportant
	     * @return {String}
	     */
	    formatHeaders: function(headers, ellipsis, onlyImportant, plain) {
	        var result = '';
	        for (header in headers) {
	            if (headers.hasOwnProperty(header) && 
	                    (! onlyImportant || header == 'from' || header == 'to' || header == 'cc' || header == 'subject' || header == 'date')) 
	            {
	                result += (plain ? (header + ': ') : ('<b>' + header + ':</b> '))
	                    + Ext.util.Format.htmlEncode(
	                        (ellipsis) 
	                            ? Ext.util.Format.ellipsis(headers[header], 40)
	                            : headers[header]
	                    ) + (plain ? '\n' : '<br/>');
	            }
	        }
	        return result;
	    }    
	});


/***/ },

/***/ 338:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2011-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.GridPanelHook
	 * 
	 * <p>Felamimail Gridpanel Hook</p>
	 * <p>
	 * </p>
	 * 
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @constructor
	 */
	Tine.Felamimail.GridPanelHook = function(config) {
	    Ext.apply(this, config);
	
	    Tine.log.info('Tine.Felamimail.GridPanelHook::Initialising Felamimail ' + this.foreignAppName + ' hooks.');
	    
	    // NOTE: due to the action updater this action is bound the the adb grid only!
	    this.composeMailAction = new Ext.Action({
	      actionType: 'add',
	      text: this.app.i18n._('Compose email'),
	      iconCls: this.app.getIconCls(),
	      disabled: true,
	      scope: this,
	      actionUpdater: this.updateAction,
	      handler: this.onComposeEmailTO,
	      allowMultiple: true,
	      listeners: {
	        scope: this,
	        render: this.onRender
	      },
	      menu: {
	        items: [
	          this.composeMailActionTO = new Ext.Action({
	              actionType: 'add',
	              text: this.app.i18n._('To'),
	              iconCls: this.app.getIconCls(),
	              disabled: true,
	              scope: this,
	              actionUpdater: this.updateAction,
	              handler: this.onComposeEmailTO,
	              listeners: {
	                  scope: this,
	                  render: this.onRender
	              }
	          }),
	          this.composeMailActionCC = new Ext.Action({
	              actionType: 'add',
	              text: this.app.i18n._('CC'),
	              iconCls: this.app.getIconCls(),
	              disabled: true,
	              scope: this,
	              actionUpdater: this.updateAction,
	              handler: this.onComposeEmailCC,
	              listeners: {
	                  scope: this,
	                  render: this.onRender
	              }
	          }),
	          this.composeMailActionBCC = new Ext.Action({
	              actionType: 'add',
	              text: this.app.i18n._('BCC'),
	              iconCls: this.app.getIconCls(),
	              disabled: true,
	              scope: this,
	              actionUpdater: this.updateAction,
	              handler: this.onComposeEmailBCC,
	              listeners: {
	                  scope: this,
	                  render: this.onRender
	              }
	          })
	        ]
	      }
	    });
	    this.composeMailBtn = Ext.apply(new Ext.Button(this.composeMailActionTO), {
	        text: this.app.i18n._('Compose email'),
	        scale: 'medium',
	        rowspan: 2,
	        iconAlign: 'top'
	    });
	    
	    // register in toolbar + contextmenu
	    Ext.ux.ItemRegistry.registerItem(this.foreignAppName + '-' + this.modelName + '-GridPanel-ActionToolbar-leftbtngrp', this.composeMailBtn, 30);
	    Ext.ux.ItemRegistry.registerItem(this.foreignAppName + '-' + this.modelName + '-GridPanel-ContextMenu', this.composeMailAction, 80);
	};
	
	Ext.apply(Tine.Felamimail.GridPanelHook.prototype, {
	    
	    /**
	     * @property app
	     * @type Tine.Felamimail.Application
	     * @private
	     */
	    app: null,
	    
	    /**
	     * foreign application name
	     * @type String
	     */
	    foreignAppName: null,
	     
	    /**
	     * @property composeMailAction
	     * @type Tine.widgets.ActionUpdater
	     * @private
	     */
	    composeMailActionTO: null,
	    
	    /**
	     * @property composeMailAction
	     * @type Tine.widgets.ActionUpdater
	     * @private
	     */
	    composeMailActionCC: null,
	    
	    /**
	     * @property composeMailAction
	     * @type Tine.widgets.ActionUpdater
	     * @private
	     */
	    composeMailActionBCC: null,
	    
	    /**
	     * @property composeMailBtn
	     * @type Ext.Button
	     * @private
	     */
	    composeMailBtn: null,
	    
	    /**
	     * @property gridPanel
	     * @type Tine.Addressbook.gridPanel
	     * @private
	     */
	    gridPanel: null,
	    
	    contactInRelation: false,
	    relationType: null,
	    addMailFromRecord: null,
	    mailAddresses: null,
	    subject: null,
	    subjectField: null,
	    subjectFn: null,
	    
	    /**
	     * get addressbook contact grid panel
	     */
	    getGridPanel: function() {
	        if (! this.gridPanel) {
	            this.gridPanel = Tine.Tinebase.appMgr.get(this.foreignAppName).getMainScreen().getCenterPanel();
	        }
	        
	        return this.gridPanel;
	    },
	    
	    /**
	     * return mail addresses of given contacts 
	     * 
	     * @param {Array} contacts
	     * @return {Array}
	     */
	    getMailAddresses: function(records) {
	        var mailAddresses = [];
	        
	        Ext.each(records, function(record) {
	            if (this.contactInRelation && record.get('relations')) {
	                Ext.each(record.get('relations'), function(relation) {
	                    if (relation.type === this.relationType) {
	                        this.addMailFromAddressBook(mailAddresses, relation.related_record);
	                    }
	                }, this);
	            } else if (Ext.isFunction(this.addMailFromRecord)){
	                // addMailFromRecord can be defined in config
	                this.addMailFromRecord(mailAddresses, record);
	            } else {
	                this.addMailFromAddressBook(mailAddresses, record);
	            }
	        }, this);
	        
	        if (mailAddresses.length > 0) {
	            this.mailAddresses = mailAddresses;
	        }
	        
	        return mailAddresses.unique();
	    },
	    
	    /**
	     * add mail address from addressbook (if available) and add it to mailAddresses array
	     * 
	     * @param {Array} mailAddresses
	     * @param {Tine.Addressbook.Model.Contact|Object} contact
	     */
	    addMailFromAddressBook: function(mailAddresses, contact) {
	        if (! contact) {
	            return;
	        }
	        if (! Ext.isFunction(contact.beginEdit)) {
	            contact = new Tine.Addressbook.Model.Contact(contact);
	        }
	        
	        if (!contact.get("members")) {
	            var mailAddress = (contact.getPreferredEmail()) ? Tine.Felamimail.getEmailStringFromContact(contact) : null;
	            if (mailAddress)
	                mailAddresses.push(mailAddress);
	        } else {
	            var emails = contact.get("emails");
	
	            if (emails) {
	                Ext.each(emails.split(","), function (mail) {
	                    mailAddresses.push(mail);
	                });
	            }
	        }
	    },
	    
	    /**
	     * compose an email to selected contacts
	     * 
	     * @param {Button} btn 
	     */
	    onComposeEmail: function(btn,to) {
	        if (this.getGridPanel().grid) {
	            var sm = this.getGridPanel().grid.getSelectionModel(),
	                mailAddresses = sm.isFilterSelect ? null : this.getMailAddresses(this.getGridPanel().grid.getSelectionModel().getSelections());
	        } else {
	            var sm = null,
	                mailAddresses = this.mailAddresses;
	        }
	
	        if( to == "CC")
	        {
	            var record = new Tine.Felamimail.Model.Message({
	                subject: (this.subject) ? this.subject : '',
	                cc: mailAddresses
	            }, 0);
	        }
	        else if( to == "BCC")
	        {
	            var record = new Tine.Felamimail.Model.Message({
	                subject: (this.subject) ? this.subject : '',
	                bcc: mailAddresses
	            }, 0);
	        }
	        else
	        {
	            var record = new Tine.Felamimail.Model.Message({
	                subject: (this.subject) ? this.subject : '',
	                to: mailAddresses
	            }, 0);
	        }
	        var popupWindow = Tine.Felamimail.MessageEditDialog.openWindow({
	            selectionFilter: sm && sm.isFilterSelect ? Ext.encode(sm.getSelectionFilter()) : null,
	            record: record
	        });
	    },
	    
	    /**
	     * compose an email to selected contacts
	     * 
	     * @param {Button} btn 
	     */
	    onComposeEmailTO: function(btn) {
	        this.onComposeEmail( btn, "TO" );
	    },
	
	    /**
	     * compose an email to selected contacts
	     * 
	     * @param {Button} btn 
	     */
	    onComposeEmailCC: function(btn) {
	        this.onComposeEmail( btn, "CC" );
	    },
	
	    /**
	     * compose an email to selected contacts
	     * 
	     * @param {Button} btn 
	     */
	    onComposeEmailBCC: function(btn) {
	        this.onComposeEmail( btn, "BCC" );
	    },
	
	    /**
	     * add to action updater the first time we render
	     */
	    onRender: function() {
	        var actionUpdater = this.getGridPanel().actionUpdater,
	            registeredActions = actionUpdater.actions;
	            
	        if (registeredActions.indexOf(this.composeMailAction) < 0) {
	            actionUpdater.addActions([this.composeMailAction]);
	        }
	        if (registeredActions.indexOf(this.composeMailActionTO) < 0) {
	            actionUpdater.addActions([this.composeMailActionTO]);
	        }
	        if (registeredActions.indexOf(this.composeMailActionCC) < 0) {
	            actionUpdater.addActions([this.composeMailActionCC]);
	        }
	        if (registeredActions.indexOf(this.composeMailActionBCC) < 0) {
	            actionUpdater.addActions([this.composeMailActionBCC]);
	        }
	    },
	    
	    /**
	     * updates compose button
	     * 
	     * @param {Ext.Action} action
	     * @param {Object} grants grants sum of grants
	     * @param {Object} records
	     */
	    updateAction: function(action, grants, records) {
	        this.mailAddresses = [];
	        action.setDisabled(this.getMailAddresses(records).length == 0);
	        if (this.subjectField && records.length > 0) {
	            this.subject = records[0].get(this.subjectField);
	        } else if (Ext.isFunction(this.subjectFn)) {
	            this.subject = this.subjectFn(records[0]);
	        }
	    }
	});


/***/ },

/***/ 339:
/***/ function(module, exports) {

	Tine.Felamimail.mailvelopeHelper = function() {
	
	    return {
	        //give mailvelope some seconds to load
	        mailvelopeLoaded: Promise.race([
	            new Promise(function (fullfill, reject) {
	                if (typeof mailvelope !== 'undefined') {
	                    fullfill();
	                } else {
	                    Ext.EventManager.addListener(window, 'mailvelope', fullfill);
	                }
	            }), new Promise(function (fullfill, reject) {
	                (function () {
	                    reject();
	                }).defer(5000);
	            })]
	        )['catch'](function() {
	            Tine.log.info('mailvelope not available');
	        }),
	
	        getKeyring: function() {
	            return this.mailvelopeLoaded.then(function() {
	                return new Promise(function(fullfill, reject) {
	                    var identifier = Tine.Tinebase.common.getUrl();
	                    mailvelope.getKeyring(identifier).then(fullfill, function(err) {
	                        mailvelope.createKeyring(identifier).then(fullfill);
	                    }).then(function(keyring) {
	                        // @TODO get dataurl of tine20logo
	                        //keyring.setLogo('data:image/png;base64,iVBORS==', 3)
	                    });
	                });
	            });
	        }
	    }
	}();


/***/ },

/***/ 340:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2013 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	 
	Ext.ns('Tine.Felamimail');
	
	
	Tine.Felamimail.MessageDisplayDialog = Ext.extend(Tine.Felamimail.GridDetailsPanel ,{
	    /**
	     * @cfg {Tine.Felamimail.Model.Message}
	     */
	    record: null,
	    
	    autoScroll: false,
	    
	    initComponent: function() {
	        if (Ext.isString(this.record)) {
	            this.record = Tine.Felamimail.messageBackend.recordReader({responseText: this.record});
	        }
	        
	        this.addEvents('remove');
	        
	        this.app = Tine.Tinebase.appMgr.get('Felamimail');
	        this.i18n = this.app.i18n;
	        
	        // trick onPrint/onPrintPreview
	        this.detailsPanel = this;
	        
	        this.initActions();
	        this.initToolbar();
	        
	        Tine.log.debug('Tine.Felamimail.MessageDisplayDialog::initComponent() -> message record:');
	        Tine.log.debug(this.record);
	        
	        this.supr().initComponent.apply(this, arguments);
	    },
	    
	    /**
	     * init actions
	     */
	    initActions: function() {
	        this.action_deleteRecord = new Ext.Action({
	            text: this.app.i18n._('Delete'),
	            handler: this.onMessageDelete.createDelegate(this, [false]),
	            iconCls: 'action_delete',
	            disabled: this.record.id.match(/_/)
	        });
	        
	        this.action_reply = new Ext.Action({
	            text: this.app.i18n._('Reply'),
	            handler: this.onMessageReplyTo.createDelegate(this, [false]),
	            iconCls: 'action_email_reply'
	        });
	
	        this.action_replyAll = new Ext.Action({
	            text: this.app.i18n._('Reply To All'),
	            handler: this.onMessageReplyTo.createDelegate(this, [true]),
	            iconCls: 'action_email_replyAll'
	        });
	
	        this.action_forward = new Ext.Action({
	            text: this.app.i18n._('Forward'),
	            handler: this.onMessageForward.createDelegate(this),
	            iconCls: 'action_email_forward'
	        });
	
	        this.action_download = new Ext.Action({
	            text: this.app.i18n._('Save'),
	            handler: this.onMessageDownload.createDelegate(this),
	            iconCls: 'action_email_download',
	            disabled: this.record.id.match(/_/)
	        });
	        
	        this.action_print = new Ext.Action({
	            text: this.app.i18n._('Print Message'),
	            handler: this.onMessagePrint.createDelegate(this.app.getMainScreen().getCenterPanel(), [this]),
	            iconCls:'action_print',
	            menu:{
	                items:[
	                    new Ext.Action({
	                        text: this.app.i18n._('Print Preview'),
	                        handler: this.onMessagePrintPreview.createDelegate(this.app.getMainScreen().getCenterPanel(), [this]),
	                        iconCls:'action_printPreview'
	                    })
	                ]
	            }
	        });
	        
	    },
	    
	    /**
	     * init toolbar
	     */
	    initToolbar: function() {
	        // use toolbar from gridPanel
	        this.tbar = new Ext.Toolbar({
	            defaults: {height: 55},
	            items: [{
	                xtype: 'buttongroup',
	                columns: 5,
	                items: [
	                    Ext.apply(new Ext.Button(this.action_deleteRecord), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    }),
	                    Ext.apply(new Ext.Button(this.action_reply), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    }),
	                    Ext.apply(new Ext.Button(this.action_replyAll), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    }),
	                    Ext.apply(new Ext.Button(this.action_forward), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    }), 
	                    Ext.apply(new Ext.SplitButton(this.action_print), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign:'top',
	                        arrowAlign:'right'
	                    }), 
	                    Ext.apply(new Ext.Button(this.action_download), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign:'top',
	                        arrowAlign:'right'
	                    })
	                ]
	            }]
	        });
	        
	    },
	    
	    /**
	     * after render
	     */
	    afterRender: function() {
	        this.supr().afterRender.apply(this, arguments);
	        this.showMessage();
	
	        var title = this.record.get('subject');
	        if (title !== undefined) {
	            // TODO make this work for attachment mails
	            this.window.setTitle(title);
	        }
	    },
	    
	    /**
	     * show message
	     */
	    showMessage: function() {
	        this.layout.setActiveItem(this.getSingleRecordPanel());
	        this.updateDetails(this.record, this.getSingleRecordPanel().body);
	    },
	    
	    /**
	     * executed after a msg compose
	     * 
	     * @param {String} composedMsg
	     * @param {String} action
	     * @param {Array}  [affectedMsgs]  messages affected 
	     * 
	     */
	    onAfterCompose: function(composedMsg, action, affectedMsgs) {
	        this.fireEvent('update', composedMsg, action, affectedMsgs);
	    },
	    
	    /**
	     * executed after deletion of this message
	     */
	    onAfterDelete: function() {
	        this.fireEvent('remove', Ext.encode(this.record.data));
	        this.window.close();
	    },
	    
	    /**
	     * download message
	     */
	    onMessageDownload: function() {
	        var downloader = new Ext.ux.file.Download({
	            params: {
	                method: 'Felamimail.downloadMessage',
	                requestType: 'HTTP',
	                messageId: this.record.id
	            }
	        }).start();
	    },
	    
	    /**
	     * delete message handler
	     */
	    onMessageDelete: function(force) {
	        var mainApp = Ext.ux.PopupWindowMgr.getMainWindow().Tine.Tinebase.appMgr.get('Felamimail'),
	            folderId = this.record.get('folder_id'),
	            folder = mainApp.getFolderStore().getById(folderId),
	            accountId = folder ? folder.get('account_id') : null,
	            account = mainApp.getAccountStore().getById(accountId),
	            trashId = account ? account.getTrashFolderId() : null;
	            
	        this.loadMask.show();
	        if (trashId) {
	            var filter = [{field: 'id', operator: 'equals', value: this.record.id}];
	            
	            Tine.Felamimail.messageBackend.moveMessages(filter, trashId, {
	                callback: this.onAfterDelete.createDelegate(this, ['move'])
	            });
	        } else {
	            Tine.Felamimail.messageBackend.addFlags(this.record.id, '\\Deleted', {
	                callback: this.onAfterDelete.createDelegate(this, ['flag'])
	            });
	        }
	    },
	    
	    /**
	     * reply message handler
	     */
	    onMessageReplyTo: function(toAll) {
	        Tine.Felamimail.MessageEditDialog.openWindow({
	            replyTo : Ext.encode(this.record.data),
	            replyToAll: toAll,
	            listeners: {
	                'update': this.onAfterCompose.createDelegate(this, ['reply', Ext.encode([this.record.data])], 1)
	            }
	        });
	    },
	    
	    /**
	     * forward message handler
	     */
	    onMessageForward: function() {
	        Tine.Felamimail.MessageEditDialog.openWindow({
	            forwardMsgs : Ext.encode([this.record.data]),
	            listeners: {
	                'update': this.onAfterCompose.createDelegate(this, ['forward', Ext.encode([this.record.data])], 1)
	            }
	        });
	    },
	    
	    onMessagePrint: Tine.Felamimail.GridPanel.prototype.onPrint,
	    onMessagePrintPreview: Tine.Felamimail.GridPanel.prototype.onPrintPreview
	});
	
	Tine.Felamimail.MessageDisplayDialog.openWindow = function (config) {
	    var record = (Ext.isString(config.record)) ? Ext.util.JSON.decode(config.record) : config.record,
	        id = (record && record.id) ? record.id : 0,
	        window = Tine.WindowFactory.getWindow({
	            width: 800,
	            height: 700,
	            name: 'TineFelamimailMessageDisplayDialog_' + id,
	            contentPanelConstructor: 'Tine.Felamimail.MessageDisplayDialog',
	            contentPanelConstructorConfig: config
	        });
	    return window;
	};


/***/ },

/***/ 341:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	 
	Ext.namespace('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.MessageEditDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * 
	 * <p>Message Compose Dialog</p>
	 * <p>This dialog is for composing emails with recipients, body and attachments. 
	 * you can choose from which account you want to send the mail.</p>
	 * <p>
	 * TODO         make email note editable
	 * </p>
	 * 
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new MessageEditDialog
	 */
	Tine.Felamimail.MessageEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	    /**
	     * @cfg {Array/String} bcc
	     * initial config for bcc
	     */
	    bcc: null,
	    
	    /**
	     * @cfg {String} body
	     */
	    msgBody: '',
	    
	    /**
	     * @cfg {Array/String} cc
	     * initial config for cc
	     */
	    cc: null,
	    
	    /**
	     * @cfg {Array} of Tine.Felamimail.Model.Message (optionally encoded)
	     * messages to forward
	     */
	    forwardMsgs: null,
	    
	    /**
	     * @cfg {String} accountId
	     * the accout id this message is sent from
	     */
	    accountId: null,
	    
	    /**
	     * @cfg {Tine.Felamimail.Model.Message} (optionally encoded)
	     * message to reply to
	     */
	    replyTo: null,
	
	    /**
	     * @cfg {Tine.Felamimail.Model.Message} (optionally encoded)
	     * message to use as draft/template
	     */
	    draftOrTemplate: null,
	    
	    /**
	     * @cfg {Boolean} (defaults to false)
	     */
	    replyToAll: false,
	    
	    /**
	     * @cfg {String} subject
	     */
	    subject: '',
	    
	    /**
	     * @cfg {Array/String} to
	     * initial config for to
	     */
	    to: null,
	    
	    /**
	     * validation error message
	     * @type String
	     */
	    validationErrorMessage: '',
	    
	    /**
	     * array with e-mail-addresses used as recipients
	     * @type {Array}
	     */
	    mailAddresses: null,
	    /**
	     * json-encoded selection filter
	     * @type {String} selectionFilter
	     */
	    selectionFilter: null,
	    
	    /**
	     * holds default values for the record
	     * @type {Object}
	     */
	    recordDefaults: null,
	
	    quotedPGPMessage: null,
	
	    /**
	     * @private
	     */
	    windowNamePrefix: 'MessageEditWindow_',
	    appName: 'Felamimail',
	    recordClass: Tine.Felamimail.Model.Message,
	    recordProxy: Tine.Felamimail.messageBackend,
	    loadRecord: false,
	    evalGrants: false,
	    hideAttachmentsPanel: true,
	    
	    bodyStyle:'padding:0px',
	    
	    /**
	     * overwrite update toolbars function (we don't have record grants)
	     * @private
	     */
	    updateToolbars: Ext.emptyFn,
	    
	    //private
	    initComponent: function() {
	        var me = this;
	
	        Tine.Felamimail.MessageEditDialog.superclass.initComponent.call(this);
	
	        Tine.Felamimail.mailvelopeHelper.mailvelopeLoaded.then(function() {
	            me.button_toggleEncrypt.setVisible(true);
	        })['catch'](function() {
	            Tine.log.info('mailvelope not available');
	        });
	    },
	
	
	    /**
	     * init buttons
	     */
	    initButtons: function() {
	        this.fbar = [];
	        
	        this.action_send = new Ext.Action({
	            text: this.app.i18n._('Send'),
	            handler: this.onSaveAndClose,
	            iconCls: 'FelamimailIconCls',
	            disabled: false,
	            scope: this
	        });
	
	        this.action_searchContacts = new Ext.Action({
	            text: this.app.i18n._('Search Recipients'),
	            handler: this.onSearchContacts,
	            iconCls: 'AddressbookIconCls',
	            disabled: false,
	            scope: this
	        });
	        
	        this.action_saveAsDraft = new Ext.Action({
	            text: this.app.i18n._('Save As Draft'),
	            handler: this.onSaveInFolder.createDelegate(this, ['drafts_folder']),
	            iconCls: 'action_saveAsDraft',
	            disabled: false,
	            scope: this
	        });
	
	        this.action_saveAsTemplate = new Ext.Action({
	            text: this.app.i18n._('Save As Template'),
	            handler: this.onSaveInFolder.createDelegate(this, ['templates_folder']),
	            iconCls: 'action_saveAsTemplate',
	            disabled: false,
	            scope: this
	        });
	        
	        // TODO think about changing icon onToggle
	        this.action_saveEmailNote = new Ext.Action({
	            text: this.app.i18n._('Save Email Note'),
	            handler: this.onToggleSaveNote,
	            iconCls: 'notes_noteIcon',
	            disabled: false,
	            scope: this,
	            enableToggle: true
	        });
	        this.button_saveEmailNote = Ext.apply(new Ext.Button(this.action_saveEmailNote), {
	            tooltip: this.app.i18n._('Activate this toggle button to save the email text as a note attached to the recipient(s) contact(s).')
	        });
	
	        this.action_toggleReadingConfirmation = new Ext.Action({
	            text: this.app.i18n._('Reading Confirmation'),
	            handler: this.onToggleReadingConfirmation,
	            iconCls: 'felamimail-action-reading-confirmation',
	            disabled: false,
	            scope: this,
	            enableToggle: true
	        });
	        this.button_toggleReadingConfirmation = Ext.apply(new Ext.Button(this.action_toggleReadingConfirmation), {
	            tooltip: this.app.i18n._('Activate this toggle button to receive a reading confirmation.')
	        });
	
	        this.action_toggleEncrypt = new Ext.Action({
	            text: this.app.i18n._('Encrypt Email'),
	            toggleHandler: this.onToggleEncrypt,
	            iconCls: 'felamimail-action-decrypt',
	            disabled: false,
	            pressed: false,
	            hidden: true,
	            scope: this,
	            enableToggle: true
	        });
	        this.button_toggleEncrypt = Ext.apply(new Ext.Button(this.action_toggleEncrypt), {
	            tooltip: this.app.i18n._('Encrypt email using Mailvelope')
	        });
	
	        this.tbar = new Ext.Toolbar({
	            defaults: {height: 55},
	            items: [{
	                xtype: 'buttongroup',
	                columns: 6,
	                items: [
	                    Ext.apply(new Ext.Button(this.action_send), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top'
	                    }),
	                    Ext.apply(new Ext.Button(this.action_searchContacts), {
	                        scale: 'medium',
	                        rowspan: 2,
	                        iconAlign: 'top',
	                        tooltip: this.app.i18n._('Click to search for and add recipients from the Addressbook.')
	                    }),
	                    this.action_saveAsDraft,
	                    this.button_saveEmailNote,
	                    this.action_saveAsTemplate,
	                    this.button_toggleReadingConfirmation,
	                    this.button_toggleEncrypt
	                ]
	            }]
	        });
	    },
	
	    
	    /**
	     * @private
	     */
	    initRecord: function() {
	        this.decodeMsgs();
	        
	        this.recordDefaults = Tine.Felamimail.Model.Message.getDefaultData();
	        
	        if (this.mailAddresses) {
	            this.recordDefaults.to = Ext.decode(this.mailAddresses);
	        } else if (this.selectionFilter) {
	            this.on('load', this.fetchRecordsOnLoad, this);
	        }
	        
	        if (! this.record) {
	            this.record = new Tine.Felamimail.Model.Message(this.recordDefaults, 0);
	        }
	        this.initFrom();
	        this.initRecipients();
	        this.initSubject();
	        this.initContent();
	        
	        // legacy handling:...
	        // TODO add this information to attachment(s) + flags and remove this
	        if (this.replyTo) {
	            this.record.set('flags', '\\Answered');
	            this.record.set('original_id', this.replyTo.id);
	        } else if (this.forwardMsgs) {
	            this.record.set('flags', 'Passed');
	            this.record.set('original_id', this.forwardMsgs[0].id);
	        } else if (this.draftOrTemplate) {
	            this.record.set('original_id', this.draftOrTemplate.id);
	        }
	        
	        Tine.log.debug('Tine.Felamimail.MessageEditDialog::initRecord() -> record:');
	        Tine.log.debug(this.record);
	    },
	    
	    /**
	     * show loadMask (loadRecord is false in this dialog)
	     * @param {} ct
	     * @param {} position
	     */
	    onRender : function(ct, position) {
	        Tine.Felamimail.MessageEditDialog.superclass.onRender.call(this, ct, position);
	        this.loadMask.show();
	    },
	
	    isRendered: function() {
	        var me = this;
	        return new Promise(function (fulfill, reject) {
	            if (me.rendered) {
	                fulfill(true);
	            } else {
	                me.on('render', fulfill);
	            }
	        });
	    },
	
	    /**
	     * handle attachments: attaches message when forwarding mails or
	     *  keeps attachments as they are (if preference is set or draft/template)
	     *
	     * @param {Tine.Felamimail.Model.Message} message
	     */
	    handleAttachmentsOfExistingMessage: function(message) {
	        if (message.get('attachments').length == 0) {
	            return;
	        }
	
	        var attachments = [];
	        if ((Tine[this.app.appName].registry.get('preferences').get('emlForward')
	                && Tine[this.app.appName].registry.get('preferences').get('emlForward') == 0)
	            || this.draftOrTemplate
	        ) {
	
	            Ext.each(message.get('attachments'), function(attachment) {
	                attachment = {
	                    name: attachment['filename'],
	                    type: attachment['content-type'],
	                    size: attachment['size'],
	                    id: message.id + '_' + attachment['partId']
	                };
	                attachments.push(attachment);
	            },this);
	
	        } else {
	            attachments = [{
	                name: message.get('subject'),
	                type: 'message/rfc822',
	                size: message.get('size'),
	                id: message.id
	            }];
	        }
	
	        this.record.set('attachments', attachments);
	    },
	    
	    /**
	     * inits body and attachments from reply/forward/template
	     */
	    initContent: function() {
	        if (! this.record.get('body')) {
	            var account = Tine.Tinebase.appMgr.get('Felamimail').getAccountStore().getById(this.record.get('account_id')),
	                format = account && account.get('compose_format') != '' ? 'text/' + account.get('compose_format') : 'text/html';
	            
	            if (! this.msgBody) {
	                var message = this.getMessageFromConfig();
	                if (message) {
	                    if (message.bodyIsFetched() && account.get('preserve_format')) {
	                        // format of the received message. this is the format to perserve
	                        format = message.get('body_content_type');
	                    }
	                    if (!message.bodyIsFetched() || format != message.getBodyType()) {
	                        // self callback when body needs to be (re) fetched
	                        return this.recordProxy.fetchBody(message, format, this.initContent.createDelegate(this));
	                    }
	
	                    this.setMessageBody(message, account, format);
	
	                    if (this.isForwardedMessage() || this.draftOrTemplate) {
	                        this.handleAttachmentsOfExistingMessage(message);
	                    }
	                }
	            }
	
	            this.addSignature(account, format);
	
	            this.record.set('content_type', format);
	            this.record.set('body', this.msgBody);
	        }
	
	        if (this.attachments) {
	            this.handleExternalAttachments();
	        }
	
	        delete this.msgBody;
	
	        this.onRecordLoad();
	    },
	
	    /**
	     * handle attachments like external URLs (COSR)
	     *
	     * TODO: check if this overwrites existing attachments in some cases
	     */
	    handleExternalAttachments: function() {
	        this.attachments = Ext.isArray(this.attachments) ? this.attachments : [this.attachments];
	        var attachments = [];
	        Ext.each(this.attachments, function(attachment) {
	
	            // external URL with COSR header enabled
	            if (Ext.isString(attachment)) {
	                attachment = {
	                    url: attachment
	                };
	            }
	
	            attachments.push(attachment);
	        }, this);
	
	        this.record.set('attachments', attachments);
	        delete this.attachments;
	    },
	    
	    /**
	     * set message body: converts newlines, adds quotes
	     * 
	     * @param {Tine.Felamimail.Model.Message} message
	     * @param {Tine.Felamimail.Model.Account} account
	     * @param {String}                        format
	     */
	    setMessageBody: function(message, account, format) {
	        var preparedParts = message.get('preparedParts');
	
	        this.msgBody = message.get('body');
	
	        if (preparedParts && preparedParts.length > 0) {
	            if (preparedParts[0].contentType == 'application/pgp-encrypted') {
	                this.quotedPGPMessage = preparedParts[0].preparedData;
	
	                this.msgBody = this.msgBody + this.app.i18n._('Encrypted Content');
	
	                var me = this;
	                this.isRendered().then(function () {
	                    me.button_toggleEncrypt.toggle();
	                });
	            }
	        }
	
	        if (this.replyTo) {
	            if (format == 'text/plain') {
	                this.msgBody = String('> ' + this.msgBody).replace(/\r?\n/g, '\n> ');
	            } else {
	                this.msgBody = '<br/>'
	                    + '<blockquote class="felamimail-body-blockquote">' + this.msgBody + '</blockquote><br/>';
	            }
	        }
	        this.msgBody = this.getQuotedMailHeader(format) + this.msgBody;
	    },
	
	    /**
	     * returns true if message is forwarded
	     *
	     * @return {Boolean}
	     */
	    isForwardedMessage: function() {
	        return (this.forwardMsgs && this.forwardMsgs.length === 1);
	    },
	
	    /**
	     * add signature to message
	     * 
	     * @param {Tine.Felamimail.Model.Account} account
	     * @param {String} format
	     */
	    addSignature: function(account, format) {
	        if (this.draftOrTemplate) {
	            return;
	        }
	        
	        var accountId = account ? this.record.get('account_id') : Tine.Felamimail.registry.get('preferences').get('defaultEmailAccount'),
	            account = account ? account :this.app.getAccountStore().getById(accountId),
	            signaturePosition = (account && account.get('signature_position')) ? account.get('signature_position') : 'below',
	            signature = this.getSignature(account, format);
	
	        if (signaturePosition == 'below') {
	            this.msgBody += signature;
	        } else {
	            this.msgBody = signature + '<br/><br/>' + this.msgBody;
	        }
	    },
	
	    /**
	     * get account signature
	     *
	     * @param {Tine.Felamimail.Model.Account} account
	     * @param {String} format
	     */
	    getSignature: function(account, format) {
	        var accountId = account ? this.record.get('account_id') : Tine.Felamimail.registry.get('preferences').get('defaultEmailAccount'),
	            account = account ? account :this.app.getAccountStore().getById(accountId),
	            signaturePosition = (account && account.get('signature_position')) ? account.get('signature_position') : 'below',
	            signature = Tine.Felamimail.getSignature(accountId);
	
	        if (format == 'text/plain') {
	            signature = Tine.Tinebase.common.html2text(signature);
	        }
	
	        return signature;
	    },
	
	    /**
	     * inits / sets sender of message
	     */
	    initFrom: function() {
	        if (! this.record.get('account_id')) {
	            if (! this.accountId) {
	                var message = this.getMessageFromConfig(),
	                    folderId = message ? message.get('folder_id') : null, 
	                    folder = folderId ? Tine.Tinebase.appMgr.get('Felamimail').getFolderStore().getById(folderId) : null,
	                    accountId = folder ? folder.get('account_id') : null;
	                    
	                if (! accountId) {
	                    var activeAccount = Tine.Tinebase.appMgr.get('Felamimail').getActiveAccount();
	                    accountId = (activeAccount) ? activeAccount.id : null;
	                }
	                
	                this.accountId = accountId;
	            }
	            
	            this.record.set('account_id', this.accountId);
	        }
	        delete this.accountId;
	    },
	    
	    /**
	     * after render
	     */
	    afterRender: function() {
	        Tine.Felamimail.MessageEditDialog.superclass.afterRender.apply(this, arguments);
	        
	        this.getEl().on(Ext.EventManager.useKeydown ? 'keydown' : 'keypress', this.onKeyPress, this);
	        this.recipientGrid.on('specialkey', function(field, e) {
	            this.onKeyPress(e);
	        }, this);
	        
	        this.htmlEditor.on('keydown', function(e) {
	            if (e.getKey() == e.ENTER && e.ctrlKey) {
	                this.onSaveAndClose();
	            } else if (e.getKey() == e.TAB && e.shiftKey) {
	                this.subjectField.focus.defer(50, this.subjectField);
	            }
	        }, this);
	
	        this.htmlEditor.on('toggleFormat', this.onToggleFormat, this);
	
	        this.initHtmlEditorDD();
	    },
	    
	    
	    initHtmlEditorDD: function() {
	        return;
	        if (! this.htmlEditor.rendered) {
	            return this.initHtmlEditorDD.defer(500, this);
	        }
	        
	        this.htmlEditor.getDoc().addEventListener('dragover', function(e) {
	            this.action_addAttachment.plugins[0].onBrowseButtonClick();
	        }.createDelegate(this));
	        
	        this.htmlEditor.getDoc().addEventListener('drop', function(e) {
	            this.action_addAttachment.plugins[0].onDrop(Ext.EventObject.setEvent(e));
	        }.createDelegate(this));
	    },
	    
	    /**
	     * on key press
	     * @param {} e
	     * @param {} t
	     * @param {} o
	     */
	    onKeyPress: function(e, t, o) {
	        if ((e.getKey() == e.TAB || e.getKey() == e.ENTER) && ! e.shiftKey) {
	            if (e.getTarget('input[name=subject]')) {
	                this.htmlEditor.focus.defer(50, this.htmlEditor);
	            } else if (e.getTarget('input[type=text]')) {
	                this.subjectField.focus.defer(50, this.subjectField);
	            }
	        }
	    },
	    
	    /**
	     * returns message passed with config
	     * 
	     * @return {Tine.Felamimail.Model.Message}
	     */
	    getMessageFromConfig: function() {
	        return this.replyTo ? this.replyTo : 
	               this.forwardMsgs && this.forwardMsgs.length === 1 ? this.forwardMsgs[0] :
	               this.draftOrTemplate ? this.draftOrTemplate : null;
	    },
	    
	    /**
	     * inits to/cc/bcc
	     */
	    initRecipients: function() {
	        if (this.replyTo) {
	            this.initReplyRecipients();
	        }
	        
	        Ext.each(['to', 'cc', 'bcc'], function(field) {
	            if (this.draftOrTemplate) {
	                this[field] = this.draftOrTemplate.get(field);
	            }
	            
	            if (! this.record.get(field)) {
	                this[field] = Ext.isArray(this[field]) ? this[field] : Ext.isString(this[field]) ? [this[field]] : [];
	                this.record.set(field, Ext.unique(this[field]));
	            }
	            delete this[field];
	            
	            this.resolveRecipientFilter(field);
	            
	        }, this);
	    },
	    
	    /**
	     * init recipients from reply/replyToAll information
	     */
	    initReplyRecipients: function() {
	        var replyTo = this.replyTo.get('headers')['reply-to'];
	        
	        if (replyTo) {
	            this.to = replyTo;
	        } else {
	            var toemail = '<' + this.replyTo.get('from_email') + '>';
	            if (this.replyTo.get('from_name') && this.replyTo.get('from_name') != this.replyTo.get('from_email')) {
	                this.to = this.replyTo.get('from_name') + ' ' + toemail;
	            } else {
	                this.to = toemail;
	            }
	        }
	        
	        if (this.replyToAll) {
	            if (! Ext.isArray(this.to)) {
	                this.to = [this.to];
	            }
	            this.to = this.to.concat(this.replyTo.get('to'));
	            this.cc = this.replyTo.get('cc');
	            
	            // remove own email and all non-email strings/objects from to/cc
	            var account = Tine.Tinebase.appMgr.get('Felamimail').getAccountStore().getById(this.record.get('account_id')),
	                ownEmailRegexp = new RegExp(account.get('email'));
	            Ext.each(['to', 'cc'], function(field) {
	                for (var i=0; i < this[field].length; i++) {
	                    if (! Ext.isString(this[field][i]) || ! this[field][i].match(/@/) || ownEmailRegexp.test(this[field][i])) {
	                        this[field].splice(i, 1);
	                    }
	                }
	            }, this);
	        }
	    },
	    
	    /**
	     * resolve recipient filter / queries addressbook
	     * 
	     * @param {String} field to/cc/bcc
	     */
	    resolveRecipientFilter: function(field) {
	        if (! Ext.isEmpty(this.record.get(field)) && Ext.isObject(this.record.get(field)[0]) &&  this.record.get(field)[0].operator) {
	            // found a filter
	            var filter = this.record.get(field);
	            this.record.set(field, []);
	            
	            this['AddressLoadMask'] = new Ext.LoadMask(Ext.getBody(), {msg: this.app.i18n._('Loading Mail Addresses')});
	            this['AddressLoadMask'].show();
	            
	            Tine.Addressbook.searchContacts(filter, null, function(response) {
	                var mailAddresses = Tine.Felamimail.GridPanelHook.prototype.getMailAddresses(response.results);
	                
	                this.record.set(field, mailAddresses);
	                this.recipientGrid.syncRecipientsToStore([field], this.record, true, false);
	                this['AddressLoadMask'].hide();
	                
	            }.createDelegate(this));
	        }
	    },
	    
	    /**
	     * sets / inits subject
	     */
	    initSubject: function() {
	        if (! this.record.get('subject')) {
	            if (! this.subject) {
	                if (this.replyTo) {
	                    this.setReplySubject();
	                } else if (this.forwardMsgs) {
	                    this.setForwardSubject();
	                } else if (this.draftOrTemplate) {
	                    this.subject = this.draftOrTemplate.get('subject');
	                }
	            }
	            this.record.set('subject', this.subject);
	        }
	        
	        delete this.subject;
	    },
	    
	    /**
	     * setReplySubject -> this.subject
	     * 
	     * removes existing prefixes + just adds 'Re: '
	     */
	    setReplySubject: function() {
	        var replyPrefix = 'Re: ',
	            replySubject = (this.replyTo.get('subject')) ? this.replyTo.get('subject') : '',
	            replySubject = replySubject.replace(/^((re|aw|antw|fwd|odp|sv|wg|tr|rép):\s*)*/i, replyPrefix);
	            
	        this.subject = replySubject;
	    },
	    
	    /**
	     * setForwardSubject -> this.subject
	     */
	    setForwardSubject: function() {
	        this.subject =  this.app.i18n._('Fwd:') + ' ';
	        this.subject += this.forwardMsgs.length === 1 ?
	            this.forwardMsgs[0].get('subject') :
	            String.format(this.app.i18n._('{0} Message', '{0} Messages', this.forwardMsgs.length));
	    },
	    
	    /**
	     * decode this.replyTo / this.forwardMsgs from interwindow json transport
	     */
	    decodeMsgs: function() {
	        if (Ext.isString(this.draftOrTemplate)) {
	            this.draftOrTemplate = new this.recordClass(Ext.decode(this.draftOrTemplate));
	        }
	        
	        if (Ext.isString(this.replyTo)) {
	            this.replyTo = new this.recordClass(Ext.decode(this.replyTo));
	        }
	        
	        if (Ext.isString(this.forwardMsgs)) {
	            var msgs = [];
	            Ext.each(Ext.decode(this.forwardMsgs), function(msg) {
	                msgs.push(new this.recordClass(msg));
	            }, this);
	            
	            this.forwardMsgs = msgs;
	        }
	    },
	    
	    /**
	     * fix input fields layout
	     */
	    fixLayout: function() {
	        if (! this.subjectField.rendered || ! this.accountCombo.rendered || ! this.recipientGrid.rendered) {
	            return;
	        }
	        
	        var scrollWidth = this.recipientGrid.getView().getScrollOffset();
	        this.subjectField.setWidth(this.subjectField.getWidth() - scrollWidth + 1);
	        this.accountCombo.setWidth(this.accountCombo.getWidth() - scrollWidth + 1);
	    },
	    
	    /**
	     * save message in folder
	     * 
	     * @param {String} folderField
	     */
	    onSaveInFolder: function (folderField) {
	        this.onRecordUpdate();
	        
	        var account = Tine.Tinebase.appMgr.get('Felamimail').getAccountStore().getById(this.record.get('account_id')),
	            folderName = account.get(folderField);
	        
	        Tine.log.debug('onSaveInFolder() - Save message in folder ' + folderName);
	        Tine.log.debug(this.record);
	            
	        if (! folderName || folderName == '') {
	            Ext.MessageBox.alert(
	                i18n._('Failed'),
	                String.format(this.app.i18n._('{0} account setting empty.'), folderField)
	            );
	        } else if (this.attachmentGrid.isUploading()) {
	            Ext.MessageBox.alert(
	                i18n._('Failed'),
	                this.app.i18n._('Files are still uploading.')
	            );
	        } else {
	            this.loadMask.show();
	            this.recordProxy.saveInFolder(this.record, folderName, {
	                scope: this,
	                success: function(record) {
	                    this.fireEvent('update', Ext.util.JSON.encode(this.record.data));
	                    this.purgeListeners();
	                    this.window.close();
	                },
	                failure: Tine.Felamimail.handleRequestException.createInterceptor(function() {
	                        this.loadMask.hide();
	                    }, this
	                ),
	                timeout: 150000 // 3 minutes
	            });
	        }
	    },
	    
	    /**
	     * toggle save note
	     * 
	     * @param {} button
	     * @param {} e
	     */
	    onToggleSaveNote: function (button, e) {
	        this.record.set('note', (! this.record.get('note')));
	    },
	    
	    /**
	     * toggle Request Reading Confirmation
	     */
	    onToggleReadingConfirmation: function () {
	        this.record.set('reading_conf', (! this.record.get('reading_conf')));
	    },
	
	    onToggleEncrypt: function(btn, e) {
	        btn.setIconClass(btn.pressed ? 'felamimail-action-encrypt' : 'felamimail-action-decrypt');
	
	        var account = Tine.Tinebase.appMgr.get('Felamimail').getAccountStore().getById(this.record.get('account_id')),
	            text = this.bodyCards.layout.activeItem.getValue() || this.record.get('body'),
	            format = this.record.getBodyType(),
	            textEditor = format == 'text/html' ? this.htmlEditor : this.textEditor;
	
	        this.bodyCards.layout.setActiveItem(btn.pressed ? this.mailvelopeWrap : textEditor);
	
	        if (btn.pressed) {
	            var me = this,
	                textMsg = Tine.Tinebase.common.html2text(text),
	                quotedMailHeader = '';
	
	            if (this.quotedPGPMessage) {
	                textMsg = this.getSignature(account, 'text/plain');
	                quotedMailHeader = Ext.util.Format.htmlDecode(me.getQuotedMailHeader('text/plain'));
	                quotedMailHeader = quotedMailHeader.replace(/\n/, "\n>");
	
	            }
	
	            Tine.Felamimail.mailvelopeHelper.getKeyring().then(function(keyring) {
	                mailvelope.createEditorContainer('#' + me.mailvelopeWrap.id, keyring, {
	                    predefinedText: textMsg,
	                    quotedMailHeader: quotedMailHeader,
	                    quotedMail: me.quotedPGPMessage,
	                    keepAttachments: true,
	                    quota: 32*1024*1024
	                }).then(function(editor) {
	                    me.mailvelopeEditor = editor;
	                });
	            });
	
	            this.southPanel.collapse();
	            this.southPanel.setVisible(false);
	            this.btnAddAttachemnt.setDisabled(true);
	        } else {
	            this.mailvelopeEditor = null;
	            delete this.mailvelopeEditor;
	            this.mailvelopeWrap.update('');
	
	            this.southPanel.setVisible(true);
	            this.btnAddAttachemnt.setDisabled(false);
	        }
	    },
	
	    /**
	     * toggle format
	     */
	    onToggleFormat: function() {
	        var source = this.bodyCards.layout.activeItem,
	            format = source.mimeType,
	            target = format == 'text/plain' ? this.htmlEditor : this.textEditor,
	            convert = format == 'text/plain' ?
	                Ext.util.Format.nl2br :
	                Tine.Tinebase.common.html2text;
	
	        if (format.match(/^text/)) {
	            this.bodyCards.layout.setActiveItem(target);
	            target.setValue(convert(source.getValue()));
	        } else {
	            // ignore toggle request for encrypted content
	        }
	    },
	
	    /**
	     * get quoted mail header
	     *
	     * @param format
	     * @returns {String}
	     */
	    getQuotedMailHeader: function(format) {
	        if (this.replyTo) {
	            var date = (this.replyTo.get('sent'))
	                ? this.replyTo.get('sent')
	                : ((this.replyTo.get('received')) ? this.replyTo.get('received') : new Date());
	
	            return String.format(this.app.i18n._('On {0}, {1} wrote'),
	                    Tine.Tinebase.common.dateTimeRenderer(date),
	                    Ext.util.Format.htmlEncode(this.replyTo.get('from_name'))
	                ) + ':\n';
	        } else if (this.isForwardedMessage()) {
	            return String.format('{0}-----' + this.app.i18n._('Original message') + '-----{1}',
	                    format == 'text/plain' ? '' : '<br /><b>',
	                    format == 'text/plain' ? '\n' : '</b><br />')
	                + Tine.Felamimail.GridPanel.prototype.formatHeaders(this.forwardMsgs[0].get('headers'), false, true, format == 'text/plain')
	                + (format == 'text/plain' ? '' : '<br /><br />');
	        }
	
	        return '';
	    },
	
	    /**
	     * search for contacts as recipients
	     */
	    onSearchContacts: function() {
	        Tine.Felamimail.RecipientPickerDialog.openWindow({
	            record: Ext.encode(Ext.copyTo({}, this.record.data, ['subject', 'to', 'cc', 'bcc'])),
	            listeners: {
	                scope: this,
	                'update': function(record) {
	                    var messageWithRecipients = Ext.isString(record) ? new this.recordClass(Ext.decode(record)) : record;
	                    this.recipientGrid.syncRecipientsToStore(['to', 'cc', 'bcc'], messageWithRecipients, true, true);
	                }
	            }
	        });
	    },
	    
	    /**
	     * executed after record got updated from proxy
	     * 
	     * @private
	     */
	    onRecordLoad: function() {
	        // interrupt process flow till dialog is rendered
	        if (! this.rendered) {
	            this.onRecordLoad.defer(250, this);
	            return;
	        }
	        
	        var title = this.app.i18n._('Compose email:'),
	            editor = this.record.get('content_type') == 'text/html' ? this.htmlEditor : this.textEditor;
	
	        if (this.record.get('subject')) {
	            title = title + ' ' + this.record.get('subject');
	        }
	        this.window.setTitle(title);
	
	        if (! this.button_toggleEncrypt.pressed) {
	            editor.setValue(this.record.get('body'));
	            this.bodyCards.layout.setActiveItem(editor);
	        }
	
	        // to make sure we have all recipients (for example when composing from addressbook with "all pages" filter)
	        var ticketFn = this.onAfterRecordLoad.deferByTickets(this),
	        wrapTicket = ticketFn();
	        this.fireEvent('load', this, this.record, ticketFn);
	        wrapTicket();
	        
	        this.getForm().loadRecord(this.record);
	        this.attachmentGrid.loadRecord(this.record);
	        
	        if (this.record.get('note') && this.record.get('note') == '1') {
	            this.button_saveEmailNote.toggle();
	        }
	        
	        this.onAfterRecordLoad();
	    },
	
	    /**
	     * overwrite, just hide the loadMask
	     */
	    onAfterRecordLoad: function() {
	        if (this.loadMask) {
	            this.loadMask.hide();
	        }
	    },
	    
	    /**
	     * executed when record gets updated from form
	     * - add attachments to record here
	     * - add alias / from
	     * 
	     * @private
	     */
	    onRecordUpdate: function() {
	        this.record.data.attachments = [];
	        var attachmentData = null;
	
	        var format = this.bodyCards.layout.activeItem.mimeType;
	        if (format.match(/^text/)) {
	            var editor = format == 'text/html' ? this.htmlEditor : this.textEditor;
	
	            this.record.set('content_type', format);
	            this.record.set('body', editor.getValue());
	        }
	        
	        this.attachmentGrid.store.each(function(attachment) {
	            var fileData = Ext.copyTo({}, attachment.data, ['tempFile', 'name', 'path', 'size', 'type', 'id', 'attachment_type', 'password']);
	            this.record.data.attachments.push(fileData);
	        }, this);
	        
	        var accountId = this.accountCombo.getValue(),
	            account = this.accountCombo.getStore().getById(accountId),
	            emailFrom = account.get('email');
	            
	        this.record.set('from_email', emailFrom);
	        this.record.set('from_name', account.get('from'));
	        
	        Tine.Felamimail.MessageEditDialog.superclass.onRecordUpdate.call(this);
	
	        this.record.set('account_id', account.get('original_id'));
	        
	        // need to sync once again to make sure we have the correct recipients
	        this.recipientGrid.syncRecipientsToRecord();
	    },
	
	    /**
	     * init attachment grid + add button to toolbar
	     */
	    initAttachmentGrid: function() {
	        if (! this.attachmentGrid) {
	            this.attachmentGrid = new Tine.Felamimail.AttachmentUploadGrid({
	                fieldLabel: this.app.i18n._('Attachments'),
	                hideLabel: true,
	                filesProperty: 'attachments',
	                // TODO     think about that -> when we deactivate the top toolbar, we lose the dropzone for files!
	                //showTopToolbar: false,
	                anchor: '100% 95%'
	            });
	            
	            // add file upload button to toolbar
	            this.action_addAttachment = this.attachmentGrid.getAddAction();
	            this.action_addAttachment.plugins[0].dropElSelector = 'div[id=' + this.id + ']';
	            this.action_addAttachment.plugins[0].onBrowseButtonClick = function() {
	                this.southPanel.expand();
	            }.createDelegate(this);
	
	            this.btnAddAttachemnt = new Ext.Button(this.action_addAttachment);
	            this.tbar.get(0).insert(1, Ext.apply(this.btnAddAttachemnt, {
	                scale: 'medium',
	                rowspan: 2,
	                iconAlign: 'top'
	            }));
	        }
	    },
	    
	    /**
	     * init account (from) combobox
	     * 
	     * - need to create a new store with an account record for each alias
	     */
	    initAccountCombo: function() {
	        var accountStore = Tine.Tinebase.appMgr.get('Felamimail').getAccountStore(),
	            accountComboStore = new Ext.data.ArrayStore({
	                fields   : Tine.Felamimail.Model.Account
	            });
	        
	        var aliasAccount = null,
	            aliases = null,
	            id = null;
	            
	        accountStore.each(function(account) {
	            aliases = [ account.get('email') ];
	
	            if (account.get('type') == 'system') {
	                // add identities / aliases to store (for systemaccounts)
	                var user = Tine.Tinebase.registry.get('currentAccount');
	                if (user.emailUser && user.emailUser.emailAliases && user.emailUser.emailAliases.length > 0) {
	                    aliases = aliases.concat(user.emailUser.emailAliases);
	                }
	            }
	            
	            for (var i = 0; i < aliases.length; i++) {
	                id = (i == 0) ? account.id : Ext.id();
	                aliasAccount = account.copy(id);
	                if (i > 0) {
	                    aliasAccount.data.id = id;
	                    aliasAccount.set('email', aliases[i]);
	                }
	                aliasAccount.set('name', aliasAccount.get('name') + ' (' + aliases[i] +')');
	                aliasAccount.set('original_id', account.id);
	                accountComboStore.add(aliasAccount);
	            }
	        }, this);
	        
	        this.accountCombo = new Ext.form.ComboBox({
	            name: 'account_id',
	            ref: '../../accountCombo',
	            plugins: [ Ext.ux.FieldLabeler ],
	            fieldLabel: this.app.i18n._('From'),
	            displayField: 'name',
	            valueField: 'id',
	            editable: false,
	            triggerAction: 'all',
	            store: accountComboStore,
	            mode: 'local',
	            listeners: {
	                scope: this,
	                select: this.onFromSelect
	            }
	        });
	    },
	    
	    /**
	     * if 'account_id' is changed we need to update the signature
	     * 
	     * @param {} combo
	     * @param {} newValue
	     * @param {} oldValue
	     */
	     onFromSelect: function(combo, record, index) {
	        
	        // get new signature
	        var accountId = record.get('original_id');
	        var newSignature = Tine.Felamimail.getSignature(accountId);
	        var signatureRegexp = new RegExp('<br><br><span id="felamimail\-body\-signature">\-\-<br>.*</span>');
	        
	        // update signature
	        var bodyContent = this.htmlEditor.getValue();
	        bodyContent = bodyContent.replace(signatureRegexp, newSignature);
	        
	        this.htmlEditor.setValue(bodyContent);
	    },
	    
	    /**
	     * returns dialog
	     * 
	     * NOTE: when this method gets called, all initialisation is done.
	     * 
	     * @return {Object}
	     * @private
	     */
	    getFormItems: function() {
	        
	        this.initAttachmentGrid();
	        this.initAccountCombo();
	        
	        this.recipientGrid = new Tine.Felamimail.RecipientGrid({
	            record: this.record,
	            i18n: this.app.i18n,
	            hideLabel: true,
	            composeDlg: this,
	            autoStartEditing: !this.AddressLoadMask
	        });
	        
	        this.southPanel = new Ext.Panel({
	            region: 'south',
	            layout: 'form',
	            height: 150,
	            split: true,
	            collapseMode: 'mini',
	            header: false,
	            collapsible: true,
	            collapsed: (this.record.bodyIsFetched() && (! this.record.get('attachments') || this.record.get('attachments').length == 0)),
	            items: [this.attachmentGrid]
	        });
	
	        this.textEditor = new Ext.Panel({
	            layout: 'fit',
	            mimeType: 'text/plain',
	            cls: 'felamimail-edit-text-plain',
	            flex: 1,  // Take up all *remaining* vertical space
	            setValue: function(v) {return this.items.get(0).setValue(v);},
	            getValue: function() {return this.items.get(0).getValue();},
	            tbar: ['->', {
	                iconCls: 'x-edit-toggleFormat',
	                tooltip: this.app.i18n._('Convert to formated text'),
	                handler: this.onToggleFormat,
	                scope: this
	            }],
	            items: [
	                new Ext.form.TextArea({
	                    fieldLabel: this.app.i18n._('Body'),
	                    name: 'body_text'
	                })
	            ]
	        });
	
	        this.htmlEditor = new Tine.Felamimail.ComposeEditor({
	            fieldLabel: this.app.i18n._('Body'),
	            name: 'body_html',
	            mimeType: 'text/html',
	            flex: 1  // Take up all *remaining* vertical space
	        });
	
	        this.mailvelopeWrap = new Ext.Container({
	            flex: 1,  // Take up all *remaining* vertical space
	            mimeType: 'application/pgp-encrypted',
	            getValue: function() {return '';}
	        });
	
	        return {
	            border: false,
	            frame: true,
	            layout: 'border',
	            items: [
	                {
	                region: 'center',
	                layout: {
	                    align: 'stretch',  // Child items are stretched to full width
	                    type: 'vbox'
	                },
	                listeners: {
	                    'afterlayout': this.fixLayout,
	                    scope: this
	                },
	                items: [
	                    this.accountCombo, 
	                    this.recipientGrid, 
	                {
	                    xtype:'textfield',
	                    plugins: [ Ext.ux.FieldLabeler ],
	                    fieldLabel: this.app.i18n._('Subject'),
	                    name: 'subject',
	                    ref: '../../subjectField',
	                    enableKeyEvents: true,
	                    listeners: {
	                        scope: this,
	                        // update title on keyup event
	                        'keyup': function(field, e) {
	                            if (! e.isSpecialKey()) {
	                                this.window.setTitle(
	                                    this.app.i18n._('Compose email:') + ' ' 
	                                    + field.getValue()
	                                );
	                            }
	                        },
	                        'focus': function(field) {
	                            this.subjectField.focus(true, 100);
	                        }
	                    }
	                }, {
	                    layout:'card',
	                    ref: '../../bodyCards',
	                    activeItem: 0,
	                    flex: 1,
	                    items: [
	                        this.textEditor,
	                        this.htmlEditor,
	                        this.mailvelopeWrap
	                    ]
	
	                }]
	            }, this.southPanel]
	        };
	    },
	
	    /**
	     * is form valid (checks if attachments are still uploading / recipients set)
	     * 
	     * @return {Boolean}
	     */
	    isValid: function() {
	        var me = this;
	        return Tine.Felamimail.MessageEditDialog.superclass.isValid.call(me).then(function(){
	            if (me.attachmentGrid.isUploading()) {
	                reject(me.app.i18n._('Files are still uploading.'));
	            }
	
	            return me.validateRecipients();
	        });
	    },
	    
	    /**
	     * generic apply changes handler
	     * - NOTE: overwritten to check here if the subject is empty and if the user wants to send an empty message
	     * 
	     * @param {Ext.Button} button
	     * @param {Event} event
	     * @param {Boolean} closeWindow
	     * 
	     * TODO add note editing textfield here
	     */
	    onApplyChanges: function(closeWindow, emptySubject, passwordSet) {
	        var me = this;
	
	        Tine.log.debug('Tine.Felamimail.MessageEditDialog::onApplyChanges()');
	        
	        this.loadMask.show();
	
	        // If filemanager attachments are possible check if passwords are required to enter
	        if (Tine.Tinebase.appMgr.isEnabled('Filemanager') && passwordSet !== true) {
	            var attachmentStore = this.attachmentGrid.getStore();
	
	            if (attachmentStore.find('attachment_type', 'download_protected_fm') !== -1) {
	                var dialog = new Tine.Tinebase.widgets.dialog.PasswordDialog();
	                dialog.openWindow();
	
	                dialog.on('passwordEntered', function (password) {
	                    attachmentStore.each(function (attachment) {
	                        if (attachment.get('attachment_type') === 'download_protected_fm') {
	                            attachment.data.password = password;
	                        }
	                    });
	
	                    me.onApplyChanges(closeWindow, emptySubject, true);
	                });
	                return;
	            }
	        }
	
	        if (! emptySubject && this.getForm().findField('subject').getValue() == '') {
	            Tine.log.debug('Tine.Felamimail.MessageEditDialog::onApplyChanges - empty subject');
	            Ext.MessageBox.confirm(
	                this.app.i18n._('Empty subject'),
	                this.app.i18n._('Do you really want to send a message with an empty subject?'),
	                function (button) {
	                    Tine.log.debug('Tine.Felamimail.MessageEditDialog::doApplyChanges - button: ' + button);
	                    if (button == 'yes') {
	                        this.onApplyChanges(closeWindow, true, true);
	                    } else {
	                        this.loadMask.hide();
	                    }
	                },
	                this
	            );
	            
	            return;
	        }
	
	        Tine.log.debug('Tine.Felamimail.MessageEditDialog::doApplyChanges - call parent');
	        this.doApplyChanges(closeWindow);
	    },
	    
	    /**
	     * checks recipients
	     * 
	     * @return {Boolean}
	     */
	    validateRecipients: function() {
	        var me = this;
	        return new Promise(function (fulfill, reject) {
	            var to = me.record.get('to'),
	                cc = me.record.get('cc'),
	                bcc = me.record.get('bcc'),
	                all = [].concat(to).concat(cc).concat(bcc);
	
	            if (all.length == 0) {
	                reject(me.app.i18n._('No recipients set.'));
	            }
	
	            if (me.button_toggleEncrypt.pressed && me.mailvelopeEditor) {
	                // always add own address so send message can be decrypted
	                all.push(me.record.get('from_email'));
	
	                all = all.map(function (item) {
	                    return addressparser.parse(item.replace(/,/g, '\\\\,'))[0].address;
	                });
	
	                return Tine.Felamimail.mailvelopeHelper.getKeyring().then(function (keyring) {
	                    keyring.validKeyForAddress(all).then(function (result) {
	                        var missingKeys = [];
	                        for (var address in result) {
	                            if (!result[address]) {
	                                missingKeys.push(address);
	                            }
	                        }
	
	                        if (missingKeys.length) {
	                            reject(String.format(
	                                me.app.i18n._('Cannot encrypt message. Public keys for the following recipients are missing: {0}'),
	                                Ext.util.Format.htmlEncode(missingKeys.join(', '))
	                            ));
	                        } else {
	                            // NOTE: we sync message here as we have a promise at hand and onRecordUpdate is done before validation
	                            return me.mailvelopeEditor.encrypt(all).then(function (armoredMessage) {
	                                me.record.set('body', armoredMessage);
	                                me.record.set('content_type', 'text/plain');
	                                // NOTE: Server would spoil MIME structure with attachments
	                                me.record.set('attachments', '');
	                                me.record.set('has_attachment', false);
	                                fulfill(true);
	                            });
	                        }
	                    });
	                });
	            } else {
	                fulfill(true);
	            }
	        });
	    },
	    
	    /**
	     * get validation error message
	     * 
	     * @return {String}
	     */
	    getValidationErrorMessage: function() {
	        return this.validationErrorMessage;
	    },
	    
	    /**
	     * fills the recipient grid with the records gotten from this.fetchRecordsOnLoad
	     * @param {Array} contacts
	     */
	    fillRecipientGrid: function(contacts) {
	        this.recipientGrid.addRecordsToStore(contacts, 'to');
	        this.recipientGrid.setFixedHeight(true);
	    },
	    
	    /**
	     * fetches records to send an email to
	     */
	    fetchRecordsOnLoad: function(dialog, record, ticketFn) {
	        var interceptor = ticketFn(),
	            sf = Ext.decode(this.selectionFilter);
	            
	        Tine.log.debug('Fetching additional records...');
	        Tine.Addressbook.contactBackend.searchRecords(sf, null, {
	            scope: this,
	            success: function(result) {
	                this.fillRecipientGrid(result.records);
	                interceptor();
	            }
	        });
	        this.addressesLoaded = true;
	    }
	});
	
	/**
	 * Felamimail Edit Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Felamimail.MessageEditDialog.openWindow = function (config) {
	    var window = Tine.WindowFactory.getWindow({
	        width: 700,
	        height: 700,
	        name: Tine.Felamimail.MessageEditDialog.prototype.windowNamePrefix + Ext.id(),
	        contentPanelConstructor: 'Tine.Felamimail.MessageEditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

/***/ 342:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Felamimail');
	
	/**
	 * display panel item registry per MIME type
	 * 
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.MimeDisplayManager
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @singleton
	 */
	Tine.Felamimail.MimeDisplayManager = function() {
	    var items = {},
	        alternatives = {};
	    
	    return {
	        /**
	         * creates a new details panel for given mimeType
	         * 
	         * @param {String} mimeType
	         * @return {Tine.widgets.grid.DisplayPanel}
	         */
	        create: function(mimeType, config) {
	            var c = this.get(mimeType);
	            
	            if (! c) {
	                throw new Ext.Error('No details panel registered for ' + mimeType);
	            }
	            
	            return new c(config || {});
	        },
	        
	        /**
	         * returns basic form of MIME type if a display panel is registered for it
	         * 
	         * @param {String} mimeType
	         * @return {String}
	         */
	        getMainType: function(mimeType) {
	            var mainType = alternatives[mimeType];
	            
	            return items.hasOwnProperty(mainType) ? mainType : null;
	        },
	        
	        /**
	         * returns Display Panel for given MIME type
	         * 
	         * @param  {String} mimeType
	         * @return {Function} consturctor function of a Tine.widgets.grid.DisplayPanel 
	         */
	        get: function(mimeType) {
	            var mainType = this.getMainType(mimeType);
	            
	            return mainType ? items[mainType] : null;
	        },
	        
	        /**
	         * register Display Panel for given MIME type
	         * 
	         * @param {String/Array} mimeType
	         * @param {Function} displayPanel consturctor function of a Tine.widgets.grid.DisplayPanel 
	         * @param {Array} otherTypes
	         */
	        register: function(mimeType, displayPanel, otherTypes) {
	            if (items.hasOwnProperty(mimeType)) {
	                throw new Ext.Error('There is already an registration for ' + mimeType);
	            }
	            
	            items[mimeType] = displayPanel;
	            alternatives[mimeType] = mimeType;
	            
	            if (Ext.isArray(otherTypes)) {
	                Ext.each(otherTypes, function(otherType) {
	                    if (alternatives.hasOwnProperty(otherType)) {
	                        throw new Ext.Error(alternatives[otherType] + ' is already registered as alternative for ' + otherType);
	                    }
	                    alternatives[otherType] = mimeType;
	                }, this);
	            }
	        }
	    };
	}();

/***/ },

/***/ 343:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Cornelius Weiss <c.weiss@metaways.de>
	 * @copyright   Copyright (c) 2007-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 * 
	 * TODO         think about adding a generic felamimail backend with the exception handler
	 */
	Ext.ns('Tine.Felamimail.Model');
	
	/**
	 * @namespace Tine.Felamimail.Model
	 * @class Tine.Felamimail.Model.Message
	 * @extends Tine.Tinebase.data.Record
	 * 
	 * Message Record Definition
	 */ 
	Tine.Felamimail.Model.Message = Tine.Tinebase.data.Record.create([
	      { name: 'id' },
	      { name: 'account_id' },
	      { name: 'subject' },
	      { name: 'from_email' },
	      { name: 'from_name' },
	      { name: 'sender' },
	      { name: 'to' },
	      { name: 'cc' },
	      { name: 'bcc' },
	      { name: 'sent',     type: 'date', dateFormat: Date.patterns.ISO8601Long },
	      { name: 'received', type: 'date', dateFormat: Date.patterns.ISO8601Long },
	      { name: 'flags' },
	      { name: 'size' },
	      { name: 'body',     defaultValue: undefined },
	      { name: 'body_content_type_of_body_property_of_this_record'},
	      { name: 'headers' },
	      { name: 'content_type' },
	      { name: 'body_content_type' },
	      { name: 'structure' },
	      { name: 'attachments' },
	      { name: 'has_attachment', type: 'bool' },
	      { name: 'original_id' },
	      { name: 'folder_id' },
	      { name: 'note' },
	      { name: 'preparedParts' }, // contains invitation event record
	      { name: 'reading_conf' }
	    ], {
	    appName: 'Felamimail',
	    modelName: 'Message',
	    idProperty: 'id',
	    titleProperty: 'subject',
	    // ngettext('Message', 'Messages', n);
	    recordName: 'Message',
	    recordsName: 'Messages',
	    containerProperty: 'folder_id',
	    // ngettext('Folder', 'Folders', n);
	    containerName: 'Folder',
	    containersName: 'Folders',
	    
	    /**
	     * check if message has given flag
	     * 
	     * @param  {String} flag
	     * @return {Boolean}
	     */
	    hasFlag: function(flag) {
	        var flags = this.get('flags') || [];
	        return flags.indexOf(flag) >= 0;
	    },
	    
	    /**
	     * adds given flag to message
	     * 
	     * @param  {String} flag
	     * @return {Boolean} false if flag was already set before, else true
	     */
	    addFlag: function(flag) {
	        Tine.log.info('Tine.Felamimail.Model.Message::addFlag - add flag ' + flag);
	
	        if (! this.hasFlag(flag)) {
	            var flags = Ext.unique(this.get('flags'));
	            flags.push(flag);
	            this.set('flags', flags);
	            return true;
	        }
	        
	        return false;
	    },
	    
	    /**
	     * check if body has been fetched
	     * 
	     * @return {Boolean}
	     */
	    bodyIsFetched: function() {
	        return this.get('body') !== undefined;
	    },
	    
	    /**
	     * clears given flag from message
	     * 
	     * @param {String} flag
	     * @return {Boolean} false if flag was not set before, else true
	     */
	    clearFlag: function(flag) {
	        if (this.hasFlag(flag)) {
	            var flags = Ext.unique(this.get('flags'));
	            flags.remove(flag);
	            this.set('flags', flags);
	            return true;
	        }
	        
	        return false;
	    },
	    
	    /**
	     * returns true if given record obsoletes this one
	     * 
	     * NOTE: this does only work for Tine.widgets.grid.GridPanel::onStoreBeforeLoadRecords record comparison
	     * 
	     * @param {Tine.Tinebase.data.Record} record
	     * @return {Boolean}
	     */
	    isObsoletedBy: function(record) {
	        return record.mtime || record.ctime > this.ctime;
	    },
	
	    /**
	     * returns actual mimeType of the current body property
	     *
	     * NOTE: This is not the contents of body_content_type!
	     *       body_content_type is the type of the original message derrived by the message structure.
	     *       But the server transforms the original type into the requested format/display_format.
	     */
	    getBodyType: function() {
	        return this.get('body_content_type_of_body_property_of_this_record');
	    }
	});
	
	/**
	 * get default message data
	 * 
	 * @return {Object}
	 */
	Tine.Felamimail.Model.Message.getDefaultData = function() {
	    var autoAttachNote = Tine.Felamimail.registry.get('preferences').get('autoAttachNote');
	    
	    return {
	        note: autoAttachNote,
	        content_type: 'text/html'
	    };
	};
	
	/**
	 * get filtermodel for messages
	 * 
	 * @namespace Tine.Felamimail.Model
	 * @static
	 * @return {Object} filterModel definition
	 */ 
	Tine.Felamimail.Model.Message.getFilterModel = function() {
	    var app = Tine.Tinebase.appMgr.get('Felamimail');
	    
	    return [
	        {filtertype: 'tine.felamimail.folder.filtermodel', app: app},
	        {label: app.i18n._('Subject/From'),field: 'query',         operators: ['contains']},
	        {label: app.i18n._('Subject'),     field: 'subject',       operators: ['contains']},
	        {label: app.i18n._('From (Email)'),field: 'from_email',    operators: ['contains']},
	        {label: app.i18n._('From (Name)'), field: 'from_name',     operators: ['contains']},
	        {label: app.i18n._('To'),          field: 'to',            operators: ['contains']},
	        {label: app.i18n._('Cc'),          field: 'cc',            operators: ['contains']},
	        {label: app.i18n._('Bcc'),         field: 'bcc',           operators: ['contains']},
	        {label: app.i18n._('Flags'),       field: 'flags',         filtertype: 'tinebase.multiselect', app: app, multiselectFieldConfig: {
	            valueStore: Tine.Felamimail.loadFlagsStore()
	        }},
	        {label: app.i18n._('Received'),    field: 'received',      valueType: 'date', pastOnly: true}
	    ];
	};
	
	/**
	 * @namespace Tine.Felamimail
	 * @class Tine.Felamimail.messageBackend
	 * @extends Tine.Tinebase.data.RecordProxy
	 * 
	 * Message Backend
	 * 
	 * TODO make clear/addFlags send filter as param instead of array of ids
	 */ 
	Tine.Felamimail.messageBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Felamimail',
	    modelName: 'Message',
	    recordClass: Tine.Felamimail.Model.Message,
	    
	    /**
	     * move messsages to folder
	     *
	     * @param  array $filterData filter data
	     * @param  string $targetFolderId
	     * @return  {Number} Ext.Ajax transaction id
	     */
	    moveMessages: function(filter, targetFolderId, options) {
	        options = options || {};
	        options.params = options.params || {};
	        
	        var p = options.params;
	        
	        p.method = this.appName + '.moveMessages';
	        p.filterData = filter;
	        p.targetFolderId = targetFolderId;
	        
	        options.beforeSuccess = function(response) {
	            return [Tine.Felamimail.folderBackend.recordReader(response)];
	        };
	        
	        // increase timeout as this can take a longer (5 minutes)
	        options.timeout = 300000;
	        
	        return this.doXHTTPRequest(options);
	    },
	    
	    /**
	     * fetches body and additional headers (which are needed for the preview panel) into given message
	     * 
	     * @param {Message} message
	     * @param {String} mimeType
	     * @param {Function|Object} callback (NOTE: this has NOTHING to do with standard Ext request callback fn)
	     */
	    fetchBody: function(message, mimeType, callback) {
	
	        if (mimeType == 'configured') {
	            var account = Tine.Tinebase.appMgr.get('Felamimail').getAccountStore().getById(message.get('account_id'));
	            if (account) {
	                mimeType = account.get('display_format');
	                if (!mimeType.match(/^text\//)) {
	                    mimeType = 'text/' + mimeType;
	                }
	            } else {
	                // no account found, might happen for .eml emails
	                mimeType = 'text/plain';
	            }
	        }
	
	        return this.loadRecord(message, {
	            params: {mimeType: mimeType},
	            timeout: 120000, // 2 minutes
	            scope: this,
	            success: function(response, options) {
	                var msg = this.recordReader({responseText: Ext.util.JSON.encode(response.data)});
	                // NOTE: Flags from the server might be outdated, so we skip them
	                Ext.copyTo(message.data, msg.data, Tine.Felamimail.Model.Message.getFieldNames().remove('flags'));
	                if (Ext.isFunction(callback)) {
	                    callback(message);
	                } else if (callback.success) {
	                    Ext.callback(callback.success, callback.scope, [message]);
	                }
	            },
	            failure: function(exception) {
	                if (callback.failure) {
	                    Ext.callback(callback.failure, callback.scope, [exception]);
	                } else {
	                    this.handleRequestException(exception);
	                }
	            }
	        });
	    },
	    
	    /**
	     * saves a message into a folder
	     * 
	     * @param   {Ext.data.Record} record
	     * @param   {String} folderName
	     * @param   {Object} options
	     * @return  {Number} Ext.Ajax transaction id
	     * @success {Ext.data.Record}
	     */
	    saveInFolder: function(record, folderName, options) {
	        options = options || {};
	        options.params = options.params || {};
	        options.beforeSuccess = function(response) {
	            return [this.recordReader(response)];
	        };
	        
	        var p = options.params;
	        p.method = this.appName + '.saveMessageInFolder';
	        p.recordData = record.data;
	        p.folderName = folderName;
	        
	        // increase timeout as this can take a longer (5 minutes)
	        options.timeout = 300000;
	        
	        return this.doXHTTPRequest(options);
	    },
	
	    
	    /**
	     * add given flags to given messages
	     *
	     * @param  {String/Array} ids
	     * @param  {String/Array} flags
	     */
	    addFlags: function(ids, flags, options)
	    {
	        options = options || {};
	        options.params = options.params || {};
	        
	        var p = options.params;
	        
	        p.method = this.appName + '.addFlags';
	        p.filterData = ids;
	        p.flags = flags;
	        
	        // increase timeout as this can take a longer (5 minutes)
	        options.timeout = 300000;
	        
	        return this.doXHTTPRequest(options);
	    },
	    
	    /**
	     * clear given flags from given messages
	     *
	     * @param  {String/Array} ids
	     * @param  {String/Array} flags
	     */
	    clearFlags: function(ids, flags, options)
	    {
	        options = options || {};
	        options.params = options.params || {};
	        
	        var p = options.params;
	        
	        p.method = this.appName + '.clearFlags';
	        p.filterData = ids;
	        p.flags = flags;
	        
	        // increase timeout as this can take a longer (5 minutes)
	        options.timeout = 300000;
	        
	        return this.doXHTTPRequest(options);
	    },
	    
	    /**
	     * exception handler for this proxy
	     * 
	     * @param {Tine.Exception} exception
	     */
	    handleRequestException: function(exception) {
	        Tine.Felamimail.handleRequestException(exception);
	    }
	});
	
	
	/**
	 * @namespace Tine.Felamimail.Model
	 * @class Tine.Felamimail.Model.Account
	 * @extends Tine.Tinebase.data.Record
	 * 
	 * Account Record Definition
	 */ 
	Tine.Felamimail.Model.Account = Tine.Tinebase.data.Record.create(Tine.Tinebase.Model.modlogFields.concat([
	    { name: 'id' },
	    { name: 'original_id' }, // client only, used in message compose dialog for accounts combo
	    { name: 'user_id' },
	    { name: 'name' },
	    { name: 'type' },
	    { name: 'user' },
	    { name: 'host' },
	    { name: 'email' },
	    { name: 'password' },
	    { name: 'from' },
	    { name: 'organization' },
	    { name: 'port' },
	    { name: 'ssl' },
	    { name: 'imap_status', defaultValue: 'success'}, // client only {success|failure}
	    { name: 'sent_folder' },
	    { name: 'trash_folder' },
	    { name: 'drafts_folder' },
	    { name: 'templates_folder' },
	    { name: 'has_children_support', type: 'bool' },
	    { name: 'delimiter' },
	    { name: 'display_format' },
	    { name: 'compose_format' },
	    { name: 'preserve_format' },
	    { name: 'reply_to' },
	    { name: 'ns_personal' },
	    { name: 'ns_other' },
	    { name: 'ns_shared' },
	    { name: 'signature' },
	    { name: 'signature_position' },
	    { name: 'smtp_port' },
	    { name: 'smtp_hostname' },
	    { name: 'smtp_auth' },
	    { name: 'smtp_ssl' },
	    { name: 'smtp_user' },
	    { name: 'smtp_password' },
	    { name: 'sieve_hostname' },
	    { name: 'sieve_port' },
	    { name: 'sieve_ssl' },
	    { name: 'sieve_vacation_active', type: 'bool' },
	    { name: 'sieve_notification_email' },
	    { name: 'all_folders_fetched', type: 'bool', defaultValue: false } // client only
	]), {
	    appName: 'Felamimail',
	    modelName: 'Account',
	    idProperty: 'id',
	    titleProperty: 'name',
	    // ngettext('Account', 'Accounts', n);
	    recordName: 'Account',
	    recordsName: 'Accounts',
	    // ngettext('Email Accounts', 'Email Accounts', n);
	    containerName: 'Email Accounts',
	    containersName: 'Email Accounts',
	    
	    /**
	     * @type Object
	     */
	    lastIMAPException: null,
	    
	    /**
	     * get the last IMAP exception
	     * 
	     * @return {Object}
	     */
	    getLastIMAPException: function() {
	        return this.lastIMAPException;
	    },
	    
	    /**
	     * returns sendfolder id
	     * -> needed as trash is saved as globname :(
	     */
	    getSendFolderId: function() {
	        var app = Ext.ux.PopupWindowMgr.getMainWindow().Tine.Tinebase.appMgr.get('Felamimail'),
	            sendName = this.get('sent_folder'),
	            accountId = this.id,
	            send = sendName ? app.getFolderStore().queryBy(function(record) {
	                return record.get('account_id') === accountId && record.get('globalname') === sendName;
	            }, this).first() : null;
	            
	        return send ? send.id : null;
	    },
	    
	    /**
	     * returns trashfolder id
	     * -> needed as trash is saved as globname :(
	     */
	    getTrashFolderId: function() {
	        var app = Ext.ux.PopupWindowMgr.getMainWindow().Tine.Tinebase.appMgr.get('Felamimail'),
	            trashName = this.get('trash_folder'),
	            accountId = this.id,
	            trash = trashName ? app.getFolderStore().queryBy(function(record) {
	                return record.get('account_id') === accountId && record.get('globalname') === trashName;
	            }, this).first() : null;
	            
	        return trash ? trash.id : null;
	    },
	    
	    /**
	     * set or clear IMAP exception and update imap_state
	     * 
	     * @param {Object} exception
	     */
	    setLastIMAPException: function(exception) {
	        this.lastIMAPException = exception;
	        this.set('imap_status', exception ? 'failure' : 'success');
	        this.commit();
	    }
	});
	
	/**
	 * get default data for account
	 * 
	 * @return {Object}
	 */
	Tine.Felamimail.Model.Account.getDefaultData = function() {
	    var currentUserDisplayName = Tine.Tinebase.registry.get('currentAccount').accountDisplayName;
	    
	    return {
	        from: currentUserDisplayName,
	        port: 143,
	        smtp_port: 25,
	        smtp_ssl: 'none',
	        sieve_port: 2000,
	        sieve_ssl: 'none',
	        signature: 'Sent with love from the Tine 2.0 email client ...<br/>'
	            + 'Please visit <a href="http://www.tine20.com">http://www.tine20.com</a>',
	        sent_folder: 'Sent',
	        trash_folder: 'Trash'
	    };
	};
	
	/**
	 * @namespace Tine.Felamimail
	 * @class Tine.Felamimail.accountBackend
	 * @extends Tine.Tinebase.data.RecordProxy
	 * 
	 * Account Backend
	 */ 
	Tine.Felamimail.accountBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Felamimail',
	    modelName: 'Account',
	    recordClass: Tine.Felamimail.Model.Account
	});
	
	/**
	 * @namespace Tine.Felamimail.Model
	 * @class Tine.Felamimail.Model.Record
	 * @extends Ext.data.Record
	 * 
	 * Folder Record Definition
	 */ 
	Tine.Felamimail.Model.Folder = Tine.Tinebase.data.Record.create([
	      { name: 'id' },
	      { name: 'localname' },
	      { name: 'globalname' },
	      { name: 'path' }, // /accountid/folderid/...
	      { name: 'parent' },
	      { name: 'parent_path' }, // /accountid/folderid/...
	      { name: 'account_id' },
	      { name: 'has_children',       type: 'bool' },
	      { name: 'is_selectable',      type: 'bool' },
	      { name: 'system_folder',      type: 'bool' },
	      { name: 'imap_status' },
	      { name: 'imap_timestamp',     type: 'date', dateFormat: Date.patterns.ISO8601Long },
	      { name: 'imap_uidvalidity',   type: 'int' },
	      { name: 'imap_totalcount',    type: 'int' },
	      { name: 'imap_lastmodseq',    type: 'int' },
	      { name: 'cache_status' },
	      { name: 'cache_recentcount',  type: 'int' },
	      { name: 'cache_totalcount',   type: 'int' },
	      { name: 'cache_unreadcount',  type: 'int' },
	      { name: 'cache_timestamp',    type: 'date', dateFormat: Date.patterns.ISO8601Long  },
	      { name: 'cache_job_actions_est',     type: 'int' },
	      { name: 'cache_job_actions_done',         type: 'int' },
	      { name: 'quota_usage',         type: 'int' },
	      { name: 'quota_limit',         type: 'int' },
	      { name: 'client_access_time', type: 'date', dateFormat: Date.patterns.ISO8601Long  }, // client only {@see Tine.Felamimail.folderBackend#updateMessageCache}
	      { name: 'unread_children', type: 'Array', defaultValue: [] } // client only / array of unread child ids
	], {
	    // translations for system folders:
	    // i18n._('INBOX') i18n._('Drafts') i18n._('Sent') i18n._('Templates') i18n._('Junk') i18n._('Trash')
	
	    appName: 'Felamimail',
	    modelName: 'Folder',
	    idProperty: 'id',
	    titleProperty: 'localname',
	    // ngettext('Folder', 'Folders', n);
	    recordName: 'Folder',
	    recordsName: 'Folders',
	    // ngettext('record list', 'record lists', n);
	    containerName: 'Folder list',
	    containersName: 'Folder lists',
	    
	    /**
	     * is this folder the currently selected folder
	     * 
	     * @return {Boolean}
	     */
	    isCurrentSelection: function() {
	        if (Tine.Tinebase.appMgr.get(this.appName).getMainScreen().getTreePanel()) {
	            // get active node
	            var node = Tine.Tinebase.appMgr.get(this.appName).getMainScreen().getTreePanel().getSelectionModel().getSelectedNode();
	            if (node && node.attributes.folder_id) {
	                return node.id == this.id;
	            }
	        }
	        
	        return false;
	    },
	    
	    /**
	     * is this folder an inbox?
	     * 
	     * @return {Boolean}
	     */
	    isInbox: function() {
	        return Ext.util.Format.lowercase(this.get('localname')) === 'inbox';
	    },
	    
	    /**
	     * returns true if current folder needs an update
	     */
	    needsUpdate: function(updateInterval) {
	        if (! this.get('is_selectable')) {
	            return false;
	        }
	        
	        var timestamp = this.get('client_access_time');
	        return this.get('cache_status') !== 'complete' || ! Ext.isDate(timestamp) || timestamp.getElapsed() > updateInterval;
	    }
	});
	
	/**
	 * @namespace Tine.Felamimail
	 * @class Tine.Felamimail.folderBackend
	 * @extends Tine.Tinebase.data.RecordProxy
	 * 
	 * Folder Backend
	 */ 
	Tine.Felamimail.folderBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Felamimail',
	    modelName: 'Folder',
	    recordClass: Tine.Felamimail.Model.Folder,
	    
	    /**
	     * update message cache of given folder for given execution time and sets the client_access_time
	     * 
	     * @param   {String} folderId
	     * @param   {Number} executionTime (seconds)
	     * @return  {Number} Ext.Ajax transaction id
	     */
	    updateMessageCache: function(folderId, executionTime, options) {
	        options = options || {};
	        options.params = options.params || {};
	        
	        var p = options.params;
	        
	        p.method = this.appName + '.updateMessageCache';
	        p.folderId = folderId;
	        p.time = executionTime;
	        
	        options.beforeSuccess = function(response) {
	            var folder = this.recordReader(response);
	            folder.set('client_access_time', new Date());
	            return [folder];
	        };
	        
	        // give 5 times more before timeout
	        options.timeout = executionTime * 5000;
	        
	        return this.doXHTTPRequest(options);
	    },
	    
	    /**
	     * exception handler for this proxy
	     * 
	     * @param {Tine.Exception} exception
	     */
	    handleRequestException: function(exception) {
	        Tine.Felamimail.handleRequestException(exception);
	    }
	});
	
	/**
	 * @namespace Tine.Felamimail.Model
	 * @class Tine.Felamimail.Model.Vacation
	 * @extends Tine.Tinebase.data.Record
	 * 
	 * Vacation Record Definition
	 */ 
	Tine.Felamimail.Model.Vacation = Tine.Tinebase.data.Record.create(Tine.Tinebase.Model.modlogFields.concat([
	    { name: 'id' },
	    { name: 'reason' },
	    { name: 'enabled', type: 'boolean'},
	    { name: 'days' },
	    { name: 'start_date', type: 'date' },
	    { name: 'end_date', type: 'date' },
	    { name: 'contact_ids' },
	    { name: 'template_id' },
	    { name: 'signature' },
	    { name: 'mime' }
	]), {
	    appName: 'Felamimail',
	    modelName: 'Vacation',
	    idProperty: 'id',
	    titleProperty: 'id',
	    // ngettext('Vacation', 'Vacations', n);
	    recordName: 'Vacation',
	    recordsName: 'Vacations',
	    // ngettext('record list', 'record lists', n);
	    containerName: 'Vacation list',
	    containersName: 'Vacation lists'    
	});
	
	/**
	 * get default data for vacation
	 * 
	 * @return {Object}
	 */
	Tine.Felamimail.Model.Vacation.getDefaultData = function() {
	    return {
	        days: 7,
	        mime: 'multipart/alternative'
	    };
	};
	
	/**
	 * @namespace Tine.Felamimail
	 * @class Tine.Felamimail.vacationBackend
	 * @extends Tine.Tinebase.data.RecordProxy
	 * 
	 * Vacation Backend
	 */ 
	Tine.Felamimail.vacationBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Felamimail',
	    modelName: 'Vacation',
	    recordClass: Tine.Felamimail.Model.Vacation,
	    
	    /**
	     * exception handler for this proxy
	     * 
	     * @param {Tine.Exception} exception
	     */
	    handleRequestException: function(exception) {
	        Tine.Felamimail.handleRequestException(exception);
	    }
	});
	
	/**
	 * @namespace Tine.Felamimail.Model
	 * @class Tine.Felamimail.Model.Rule
	 * @extends Tine.Tinebase.data.Record
	 * 
	 * Rule Record Definition
	 */ 
	Tine.Felamimail.Model.Rule = Tine.Tinebase.data.Record.create(Tine.Tinebase.Model.modlogFields.concat([
	    { name: 'id', sortType: function(value) {
	        // should be sorted as int
	        return parseInt(value, 10);
	    }
	    },
	    { name: 'action_type' },
	    { name: 'action_argument' },
	    { name: 'conjunction' },
	    { name: 'enabled', type: 'boolean'},
	    { name: 'conditions' },
	    { name: 'account_id' }
	]), {
	    appName: 'Felamimail',
	    modelName: 'Rule',
	    idProperty: 'id',
	    titleProperty: 'id',
	    // ngettext('Rule', 'Rules', n);
	    recordName: 'Rule',
	    recordsName: 'Rules',
	    // ngettext('record list', 'record lists', n);
	    containerName: 'Rule list',
	    containersName: 'Rule lists'    
	});
	
	/**
	 * get default data for rules
	 * 
	 * @return {Object}
	 */
	Tine.Felamimail.Model.Rule.getDefaultData = function() {
	    return {
	        enabled: true,
	        conditions: [{
	            test: 'address',
	            header: 'from',
	            comperator: 'contains',
	            key: ''
	        }],
	        conjunction: 'allof',
	        action_type: 'fileinto',
	        action_argument: ''
	    };
	};
	
	/**
	 * @namespace Tine.Felamimail
	 * @class Tine.Felamimail.rulesBackend
	 * @extends Tine.Tinebase.data.RecordProxy
	 * 
	 * Rule Backend
	 */ 
	Tine.Felamimail.rulesBackend = new Tine.Tinebase.data.RecordProxy({
	    appName: 'Felamimail',
	    modelName: 'Rule',
	    recordClass: Tine.Felamimail.Model.Rule,
	    
	    /**
	     * searches all (lightweight) records matching filter
	     * 
	     * @param   {Object} filter accountId
	     * @param   {Object} paging
	     * @param   {Object} options
	     * @return  {Number} Ext.Ajax transaction id
	     * @success {Object} root:[records], totalcount: number
	     */
	    searchRecords: function(filter, paging, options) {
	        options = options || {};
	        options.params = options.params || {};
	        var p = options.params;
	        
	        p.method = this.appName + '.get' + this.modelName + 's';
	        p.accountId = filter;
	        
	        options.beforeSuccess = function(response) {
	            return [this.jsonReader.read(response)];
	        };
	        
	        // increase timeout as this can take a longer (1 minute)
	        options.timeout = 60000;
	        
	        return this.doXHTTPRequest(options);
	    },
	    
	    /**
	     * save sieve rules
	     *
	     * @param  {String}     accountId
	     * @param  {Array}      rules
	     * @param  {Object}     options
	     */
	    saveRules: function(accountId, rules, options)
	    {
	        options = options || {};
	        options.params = options.params || {};
	        
	        var p = options.params;
	        
	        p.method = this.appName + '.saveRules';
	        p.accountId = accountId;
	        p.rulesData = rules;
	        
	        return this.doXHTTPRequest(options);
	    },
	
	    /**
	     * saves a single record
	     * 
	     * NOTE: Single rule records can't be saved
	     * 
	     * @param   {Ext.data.Record} record
	     * @param   {Object} options
	     * @return  {Number} Ext.Ajax transaction id
	     * @success {Ext.data.Record}
	     */
	    saveRecord: function(record, options, additionalArguments) {
	        // does nothing
	    },
	    
	    /**
	     * exception handler for this proxy
	     * 
	     * @param {Tine.Exception} exception
	     */
	    handleRequestException: function(exception) {
	        Tine.Felamimail.handleRequestException(exception);
	    }
	});
	
	/**
	 * @namespace Tine.Felamimail.Model
	 * @class Tine.Felamimail.Model.Flag
	 * @extends Tine.Tinebase.data.Record
	 * 
	 * Flag Record Definition
	 */ 
	Tine.Felamimail.Model.Flag = Tine.Tinebase.data.Record.create(Tine.Tinebase.Model.modlogFields.concat([
	    { name: 'id' },
	    { name: 'name' }
	]), {
	    appName: 'Felamimail',
	    modelName: 'Flag',
	    idProperty: 'id',
	    titleProperty: 'id',
	    // ngettext('Flag', 'Flags', n);
	    recordName: 'Flag',
	    recordsName: 'Flags',
	    // ngettext('Flag list', 'Flag lists', n);
	    containerName: 'Flag list',
	    containersName: 'Flag lists'    
	});


/***/ },

/***/ 344:
/***/ function(module, exports) {

	Tine.Felamimail.PGPDetailsPanel = Ext.extend(Ext.Component, {
	    render: function(el) {
	        var me = this,
	            body = Ext.get(el),
	            height = me.detailsPanel.el.getHeight() - (body.getXY()[1] - me.detailsPanel.el.getXY()[1]);
	
	        me.detailsPanel.on('resize', function() {
	            body.setHeight(me.detailsPanel.el.getHeight() - (body.getXY()[1] - me.detailsPanel.el.getXY()[1]));
	        }, me);
	
	        me.detailsPanel.getLoadMask().show();
	        body.dom.id = Ext.id();
	        body.setHeight(height);
	
	        Tine.Felamimail.mailvelopeHelper.getKeyring().then(function (keyring) {
	            var armoredMsg = me.preparedPart.preparedData;
	            mailvelope.createDisplayContainer('#' + body.dom.id, armoredMsg, keyring).then(function() {
	                me.detailsPanel.getLoadMask().hide();
	            })['catch'](function(error) {
	                Tine.log.warn(arguments);
	                var app = Tine.Tinebase.appMgr.get('Felamimail'),
	                    msg = app.i18n._('Mailvelope decryption Error [{0}]');
	
	                me.detailsPanel.getLoadMask().hide();
	                Ext.Msg.alert(String.format(msg, error.code), error.message, function() {
	                    me.detailsPanel.record.set('preparedParts', '');
	                    me.detailsPanel.currentId = '';
	                    me.detailsPanel.updateDetails(me.detailsPanel.record, body);
	                }, this);
	            });
	        })['catch'](function() {
	            var app = Tine.Tinebase.appMgr.get('Felamimail'),
	                msg = app.i18n._('To decrypt this message please install {0} with API support enabled');
	
	            msg = String.format(msg, '<a href="https://www.mailvelope.com" target="_blank">Mailvelope</a>');
	            Ext.Msg.alert(app.i18n._('PGP encrypted Message'), msg);
	
	            me.detailsPanel.getLoadMask().hide();
	        });
	    }
	});
	Tine.Felamimail.MimeDisplayManager.register('application/pgp-encrypted', Tine.Felamimail.PGPDetailsPanel);


/***/ },

/***/ 345:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2013 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.RecipientGrid
	 * @extends     Ext.grid.EditorGridPanel
	 * 
	 * <p>Recipient Grid Panel</p>
	 * <p>grid panel for to/cc/bcc recipients</p>
	 * <pre>
	 * </pre>
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Felamimail.RecipientGrid
	 */
	Tine.Felamimail.RecipientGrid = Ext.extend(Ext.grid.EditorGridPanel, {
	    
	    /**
	     * @private
	     */
	    cls: 'felamimail-recipient-grid',
	    
	    /**
	     * the message record
	     * @type Tine.Felamimail.Model.Message
	     * @property record
	     */
	    record: null,
	    
	    /**
	     * message compose dlg
	     * @type Tine.Felamimail.MessageEditDialog
	     */
	    composeDlg: null,
	    
	    /**
	     * @type Ext.Menu
	     * @property contextMenu
	     */
	    contextMenu: null,
	    
	    /**
	     * @type Ext.data.SimpleStore
	     * @property store
	     */
	    store: null,
	    
	    /**
	     * @cfg {Boolean} autoStartEditing
	     */
	    autoStartEditing: true,
	    
	    /**
	     * @cfg {String} autoExpandColumn
	     * auto expand column of grid
	     */
	    autoExpandColumn: 'address',
	    
	    /**
	     * @cfg {Number} clicksToEdit
	     * clicks to edit for editor grid panel
	     */
	    clicksToEdit:1,
	    
	    /**
	     * @cfg {Number} numberOfRecordsForFixedHeight
	     */
	    numberOfRecordsForFixedHeight: 6,
	
	    /**
	     * @cfg {Boolean} header
	     * show header
	     */
	    header: false,
	    
	    /**
	     * @cfg {Boolean} border
	     * show border
	     */
	    border: false,
	    
	    /**
	     * @cfg {Boolean} deferredRender
	     * deferred rendering
	     */
	    deferredRender: false,
	    
	    forceValidation: true,
	    
	    enableDrop: true,
	    ddGroup: 'recipientDDGroup',
	    
	    /**
	     * options are saved in onAfterEdit
	     * 
	     * @type Ext.data.Record
	     */
	    lastEditedRecord: null,
	    
	    /**
	     * grid view config
	     * - do not mark records as dirty
	     * 
	     * @type Object
	     */
	    viewConfig: {
	        markDirty: false
	    },
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        
	        this.initStore();
	        this.initColumnModel();
	        this.initActions();
	        this.sm = new Ext.grid.RowSelectionModel();
	        
	        Tine.Felamimail.RecipientGrid.superclass.initComponent.call(this);
	        
	        this.on('rowcontextmenu', this.onCtxMenu, this);
	        // this is relayed by the contact search combo
	        this.on('contextmenu', this.onCtxMenu.createDelegate(this, [this, null], 0), this);
	        
	        this.on('beforeedit', this.onBeforeEdit, this);
	        this.on('afteredit', this.onAfterEdit, this);
	    },
	    
	    /**
	     * show context menu
	     * 
	     * @param {Tine.Felamimail.RecipientGrid} grid
	     * @param {Number} row
	     * @param {Event} e
	     */
	    onCtxMenu: function(grid, row, e) {
	        var activeRow = (row === null) ? ((this.activeEditor) ? this.activeEditor.row : 0) : row;
	        
	        e.stopEvent();
	        var selModel = grid.getSelectionModel();
	        if (! selModel.isSelected(activeRow)) {
	            selModel.selectRow(activeRow);
	        }
	        
	        var record = this.store.getAt(activeRow);
	        if (record) {
	            this.action_remove.setDisabled(record.get('address') == '');
	            this.contextMenu.showAt(e.getXY());
	        }
	    },
	    
	    /**
	     * init store
	     * @private
	     */
	    initStore: function() {
	        
	        if(!this.record) {
	            this.initStore.defer(200, this);
	            return false;
	        }
	        
	        this.store = new Ext.data.SimpleStore({
	            fields   : ['type', 'address']
	        });
	        
	        // init recipients (on reply/reply to all)
	        this.syncRecipientsToStore(['to', 'cc', 'bcc']);
	        
	        this.store.add(new Ext.data.Record({type: 'to', 'address': ''}));
	        
	        this.store.on('update', this.onUpdateStore, this);
	        this.store.on('add', this.onAddStore, this);
	    },
	    
	    /**
	     * init cm
	     * @private
	     */
	    initColumnModel: function() {
	        
	        var app = Tine.Tinebase.appMgr.get('Felamimail');
	        
	        this.searchCombo = new Tine.Felamimail.ContactSearchCombo({
	            lazyInit: false,
	            listeners: {
	                scope: this,
	                specialkey: this.onSearchComboSpecialkey,
	                select: this.onSearchComboSelect,
	                blur: function(combo) {
	                    Tine.log.debug('Tine.Felamimail.MessageEditDialog::onSearchComboBlur()');
	                    this.getView().el.select('.x-grid3-td-address-editing').removeClass('x-grid3-td-address-editing');
	                    // need to update record because it might not be updated otherwise (for example: delete value, click into next row or subject)
	                    if (this.activeEditor) {
	                        var value = combo.getRawValue();
	                        Tine.log.debug('Tine.Felamimail.MessageEditDialog::onSearchComboBlur() -> current value: ' + value);
	                        if (value !== null && this.activeEditor.record.get('address') != value) {
	                            this.activeEditor.record.set('address', value);
	                        }
	                        if (!this.searchCombo.getValueIsList()) {
	                            this.onSearchComboSelect(combo);
	                        }
	                    }
	                    this.stopEditing();
	                }
	            }
	        });
	        
	        this.cm = new Ext.grid.ColumnModel([
	            {
	                resizable: true,
	                id: 'type',
	                dataIndex: 'type',
	                width: 104,
	                menuDisabled: true,
	                header: 'type',
	                renderer: function(value) {
	                    var result = '',
	                        qtip = Ext.util.Format.htmlEncode(app.i18n._('Click here to set To/CC/BCC.'));
	
	                    switch(value) {
	                        case 'to':
	                            result = Ext.util.Format.htmlEncode(app.i18n._('To:'));
	                            break;
	                        case 'cc':
	                            result = Ext.util.Format.htmlEncode(app.i18n._('Cc:'));
	                            break;
	                        case 'bcc':
	                            result = Ext.util.Format.htmlEncode(app.i18n._('Bcc:'));
	                            break;
	                    }
	                    
	                    result = Tine.Tinebase.common.cellEditorHintRenderer(result);
	                    
	                    return '<div qtip="' + qtip +'">' + result + '</div>';
	                },
	                editor: new Ext.form.ComboBox({
	                    typeAhead     : false,
	                    triggerAction : 'all',
	                    lazyRender    : true,
	                    editable      : false,
	                    mode          : 'local',
	                    value         : null,
	                    forceSelection: true,
	                    lazyInit      : false,
	                    store         : [
	                        ['to',  app.i18n._('To:')],
	                        ['cc',  app.i18n._('Cc:')],
	                        ['bcc', app.i18n._('Bcc:')]
	                    ],
	                    listeners: {
	                        focus: function(combo) {
	                            combo.onTriggerClick();
	                        }
	                    }
	                })
	            },{
	                resizable: true,
	                menuDisabled: true,
	                id: 'address',
	                dataIndex: 'address',
	                header: 'address',
	                editor: this.searchCombo
	            }
	        ]);
	    },
	    
	    /**
	     * specialkey is pressed in search combo
	     * 
	     * @param {Combo} combo
	     * @param {Event} e
	     */
	    onSearchComboSpecialkey: function(combo, e) {
	        var value = combo.getValue();
	        Tine.log.debug('Tine.Felamimail.MessageEditDialog::onSearchComboSpecialkey() -> current value: ' + value);
	        
	        if (e.getKey() == e.ENTER) {
	            Tine.log.debug('Tine.Felamimail.MessageEditDialog::onSearchComboSpecialkey() -> ENTER');
	            if (this.activeEditor && value !== null && this.activeEditor.record.get('address') != value) {
	                this.activeEditor.record.set('address', value);
	            }
	            if (!combo.getValueIsList()) {
	                this.onSearchComboSelect(combo);
	            }
	        } else if (this.activeEditor && e.getKey() == e.BACKSPACE) {
	            Tine.log.debug('Tine.Felamimail.MessageEditDialog::onSearchComboSpecialkey() -> BACKSPACE');
	            // remove row on backspace if we have more than 1 rows in grid
	            if (value == '' && this.store.getCount() > 1 && this.activeEditor.row > 0) {
	                this.store.remove(this.activeEditor.record);
	                this.activeEditor.row -= 1;
	                this.setFixedHeight(false);
	                this.ownerCt.doLayout();
	                this.startEditing.defer(50, this, [this.activeEditor.row, this.activeEditor.col]);
	                return true;
	            }
	        } else if (this.activeEditor && e.getKey() == e.ESC) {
	            // TODO should ESC close the compose window if search combo is already empty?
	//            if (value == '') {
	//                this.fireEvent('specialkey', this, e);
	//            }
	            this.startEditing.defer(50, this, [this.activeEditor.row, this.activeEditor.col]);
	            return true;
	        }
	
	        // jump to subject if we are in the last row and it is empty OR TAB was pressed
	        if (this.activeEditor && e.getKey() == e.TAB || (e.getKey() == e.ENTER && value == '' && this.store.getCount() == this.activeEditor.row + 1)) {
	            Tine.log.debug('Tine.Felamimail.MessageEditDialog::onSearchComboSpecialkey() -> TAB');
	            if (value !== null && this.activeEditor.record.get('address') != value) {
	                this.activeEditor.record.set('address', value);
	            }
	            
	            this.fireEvent('specialkey', combo, e);
	            this.getView().el.select('.x-grid3-td-address-editing').removeClass('x-grid3-td-address-editing');
	            this.stopEditing();
	            return false;
	        }
	    },
	    
	    onSearchComboSelect: function(combo) {
	        Tine.log.debug('Tine.Felamimail.MessageEditDialog::onSearchComboSelect()');
	        
	        var value = combo.getValue();
	        if (combo.getValueIsList()) {
	            var emails = value.split(",");
	            emails.sort();
	            this._addRecipients(emails, this.activeEditor ? this.activeEditor.record.data.type : this.lastActiveEditor.record.data.type);
	            this.setFixedHeight(false);
	            this.ownerCt.doLayout();
	            this.store.remove(this.activeEditor ? this.activeEditor.record : this.lastEditedRecord);
	            this.addRowAndDoLayout(this.activeEditor ? this.activeEditor.record : this.lastEditedRecord);
	        } else {
	            if (value !== '') {
	                this.addRowAndDoLayout(this.activeEditor ? this.activeEditor.record : this.lastEditedRecord);
	            }
	        }
	    },
	    
	    /**
	     * adds row and adjusts layout
	     * 
	     * @param {} oldRecord
	     */
	    addRowAndDoLayout: function(oldRecord) {
	        var emptyRecord = this.store.getAt(this.store.findExact('address', ''));
	        if (! emptyRecord) {
	            emptyRecord = new Ext.data.Record({type: oldRecord.data.type, 'address': ''});
	            this.store.add(emptyRecord);
	            this.store.commitChanges();
	            this.setFixedHeight(false);
	            this.ownerCt.doLayout();
	        }
	        
	        this.startEditing.defer(50, this, [this.store.indexOf(emptyRecord), 1]);
	    },
	    
	    /**
	     * start editing (check if message compose dlg is saving/sending first)
	     * 
	     * @param {} row
	     * @param {} col
	     */
	    startEditing: function(row, col) {
	        if (! this.composeDlg || ! this.composeDlg.saving) {
	            Tine.Felamimail.RecipientGrid.superclass.startEditing.apply(this, arguments);
	        }
	    },
	    
	    /**
	     * init actions / ctx menu
	     * @private
	     */
	    initActions: function() {
	        this.action_remove = new Ext.Action({
	            text: i18n._('Remove'),
	            handler: this.onDelete,
	            iconCls: 'action_delete',
	            scope: this
	        });
	        
	        this.contextMenu = new Ext.menu.Menu({
	            items:  this.action_remove
	        });
	    },
	    
	    /**
	     * start editing after render
	     * @private
	     */
	    afterRender: function() {
	        Tine.Felamimail.RecipientGrid.superclass.afterRender.call(this);
	        
	        // kill x-scrollers
	        this.el.child('div[class=x-grid3-scroller]').setStyle('overflow-x', 'hidden');
	        
	        if (this.autoStartEditing && this.store.getCount() == 1) {
	            this.startEditing.defer(200, this, [0, 1]);
	        }
	        
	        this.setFixedHeight(true);
	        
	        this.initDropTarget();
	    },
	    
	    /**
	     * init drop target with notifyDrop fn 
	     * - adds new records from drag data to the recipient store
	     */
	    initDropTarget: function() {
	        var dropTargetEl = this.getView().scroller.dom;
	        var dropTarget = new Ext.dd.DropTarget(dropTargetEl, {
	            ddGroup    : 'recipientDDGroup',
	            notifyDrop : function(ddSource, e, data) {
	                this.grid.addRecordsToStore(ddSource.dragData.selections);
	                return true;
	            },
	            grid: this
	        });
	    },
	    
	    /**
	     * add records to recipient store
	     * 
	     * @param {Array} records
	     * @param {String} type
	     */
	    addRecordsToStore: function(records, type) {
	        if (! type) {
	            var emptyRecord = this.store.getAt(this.store.findExact('address', '')),
	                type = (emptyRecord) ? emptyRecord.get('type') : 'to';
	        }
	        
	        var hasEmail = false,
	            added = false;
	        
	        Ext.each(records, function(record) {
	            if (record.hasEmail()) {
	                this.store.add(new Ext.data.Record({type: type, 'address': Tine.Felamimail.getEmailStringFromContact(record)}));
	                added = true;
	            }
	        }, this);
	    },
	    
	    /**
	     * set grid to fixed height if it has more than X records
	     *  
	     * @param {} doLayout
	     */
	    setFixedHeight: function (doLayout) {
	        if (this.store.getCount() > this.numberOfRecordsForFixedHeight) {
	            this.setHeight(155);
	        } else {
	            this.setHeight(this.store.getCount()*24 + 1);
	        }
	
	        if (doLayout && doLayout === true) {
	            this.ownerCt.doLayout();
	        }
	    },
	    
	    /**
	     * store has been updated
	     * 
	     * @param {} store
	     * @param {} record
	     * @param {} operation
	     * @private
	     */
	    onUpdateStore: function(store, record, operation) {
	        this.syncRecipientsToRecord();
	    },
	    
	    /**
	     * on add event of store
	     * 
	     * @param {} store
	     * @param {} records
	     * @param {} index
	     */
	    onAddStore: function(store, records, index) {
	        this.syncRecipientsToRecord();
	    },
	    
	    /**
	     * sync grid with record
	     * -> update record to/cc/bcc
	     */
	    syncRecipientsToRecord: function() {
	        // update record recipient fields
	        this.record.data.to = [];
	        this.record.data.cc = [];
	        this.record.data.bcc = [];
	        this.store.each(function(recipient){
	            if (recipient.data.address != '') {
	                this.record.data[recipient.data.type].push(recipient.data.address);
	            }
	        }, this);
	    },
	
	    /**
	     * sync grid with record
	     * -> update store
	     * 
	     * @param {Array} fields
	     * @param {Tine.Felamimail.Model.Message} record
	     * @param {Boolean} setHeight
	     * @param {Boolean} clearStore
	     */
	    syncRecipientsToStore: function(fields, record, setHeight, clearStore) {
	        if (clearStore) {
	            this.store.removeAll(true);
	        }
	        
	        record = record || this.record;
	        
	        Ext.each(fields, function(field) {
	            this._addRecipients(record.get(field), field);
	        }, this);
	        this.store.sort('address');
	        
	        if (clearStore) {
	            this.store.add(new Ext.data.Record({type: 'to', 'address': ''}));
	        }
	        
	        if (setHeight && setHeight === true) {
	            this.setFixedHeight(true);
	        }
	    },
	    
	    /**
	     * after edit
	     * 
	     * @param {} o
	     */
	    onAfterEdit: function(o) {
	        if (o.field == 'address') {
	            Tine.log.debug('Tine.Felamimail.MessageEditDialog::onAfterEdit()');
	            Tine.log.debug(o);
	            
	            Ext.fly(this.getView().getCell(o.row, o.column)).removeClass('x-grid3-td-address-editing');
	            
	            this.lastEditedRecord = o.record;
	        }
	    },
	    
	    /**
	     * delete handler
	     */
	    onDelete: function(btn, e) {
	        var sm = this.getSelectionModel();
	        var records = sm.getSelections();
	        Ext.each(records, function(record) {
	            if (record.get('address') != '' && this.store.getCount() > 1) {
	                this.store.remove(record);
	                this.store.fireEvent('update', this.store);
	            }
	        }, this);
	        
	        this.setFixedHeight(true);
	    },
	    
	    /**
	     * on before edit
	     * 
	     * @param {} o
	     */
	    onBeforeEdit: function(o) {
	        this.getView().el.select('.x-grid3-td-address-editing').removeClass('x-grid3-td-address-editing');
	        Ext.fly(this.getView().getCell(o.row, o.column)).addClass('x-grid3-td-address-editing');
	    },
	    
	    
	    /**
	     * add recipients to grid store
	     * 
	     * @param {Array} recipients
	     * @param {String} type
	     * @private
	     */
	    _addRecipients: function(recipients, type) {
	        if (recipients) {
	            recipients = Ext.unique(recipients);
	            for (var i=0; i < recipients.length; i++) {
	                this.store.add(new Ext.data.Record({type: type, 'address': recipients[i]}));
	            }
	        }
	    }
	});
	
	Ext.reg('felamimailrecipientgrid', Tine.Felamimail.RecipientGrid);


/***/ },

/***/ 346:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.RecipientPickerDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * 
	 * <p>Message Compose Dialog</p>
	 * <p>This dialog is for searching contacts in the addressbook and adding them to the recipient list in the email compose dialog.</p>
	 * <p>
	 * </p>
	 * 
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new RecipientPickerDialog
	 */
	 Tine.Felamimail.RecipientPickerDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	    
	    /**
	     * @private
	     */
	    windowNamePrefix: 'RecipientPickerWindow_',
	    appName: 'Felamimail',
	    recordClass: Tine.Felamimail.Model.Message,
	    recordProxy: Tine.Felamimail.messageBackend,
	    loadRecord: false,
	    evalGrants: false,
	    mode: 'local',
	    hideAttachmentsPanel: true,
	    
	    bodyStyle:'padding:0px',
	    
	    /**
	     * overwrite update toolbars function (we don't have record grants)
	     * @private
	     */
	    updateToolbars: Ext.emptyFn,
	    
	    /**
	     * @private
	     */
	    onRecordLoad: function() {
	        // interrupt process flow till dialog is rendered
	        if (! this.rendered) {
	            this.onRecordLoad.defer(250, this);
	            return;
	        }
	        
	        var subject = (this.record.get('subject') != '') ? this.record.get('subject') : this.app.i18n._('(new message)');
	        this.window.setTitle(String.format(this.app.i18n._('Select recipients for "{0}"'), subject));
	        
	        this.loadMask.hide();
	    },
	
	    /**
	     * returns dialog
	     * 
	     * NOTE: when this method gets called, all initialisation is done.
	     * 
	     * @return {Object}
	     * @private
	     */
	    getFormItems: function() {
	        var adbApp = Tine.Tinebase.appMgr.get('Addressbook');
	        
	        this.treePanel = new Tine.widgets.container.TreePanel({
	            allowMultiSelection: true,
	            region: 'west',
	            filterMode: 'filterToolbar',
	            recordClass: Tine.Addressbook.Model.Contact,
	            app: adbApp,
	            width: 200,
	            minSize: 100,
	            maxSize: 300,
	            border: false,
	            enableDrop: false
	        });
	        
	        this.contactGrid = new Tine.Felamimail.ContactGridPanel({
	            region: 'center',
	            messageRecord: this.record,
	            app: adbApp,
	            plugins: [this.treePanel.getFilterPlugin()]
	        });
	        
	        this.westPanel = new Tine.widgets.mainscreen.WestPanel({
	            app: adbApp,
	            hasFavoritesPanel: true,
	            ContactTreePanel: this.treePanel,
	            ContactFilterPanel: new Tine.widgets.persistentfilter.PickerPanel({
	                filter: [{field: 'model', operator: 'equals', value: 'Addressbook_Model_ContactFilter'}],
	                app: adbApp,
	                grid: this.contactGrid
	            }),
	            additionalItems: [ new Tine.Felamimail.RecipientPickerFavoritePanel({
	                app: this.app,
	                grid: this.contactGrid
	            })]
	        });
	        
	        return {
	            border: false,
	            layout: 'border',
	            items: [{
	                cls: 'tine-mainscreen-centerpanel-west',
	                region: 'west',
	                stateful: false,
	                layout: 'border',
	                split: true,
	                width: 200,
	                minSize: 100,
	                maxSize: 300,
	                border: false,
	                collapsible: true,
	                collapseMode: 'mini',
	                header: false,
	                items: [{
	                    border: false,
	                    region: 'center',
	                    items: [ this.westPanel ]
	                }]
	            }, this.contactGrid]
	        };
	    }
	});
	
	/**
	 * Felamimail Edit Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Felamimail.RecipientPickerDialog.openWindow = function (config) {
	    var window = Tine.WindowFactory.getWindow({
	        width: 1000,
	        height: 600,
	        name: Tine.Felamimail.RecipientPickerDialog.prototype.windowNamePrefix + Ext.id(),
	        contentPanelConstructor: 'Tine.Felamimail.RecipientPickerDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

/***/ 347:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	Ext.ns('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.RecipientPickerFavoritePanel
	 * @extends     Ext.tree.TreePanel
	 * 
	 * <p>PersistentFilter Picker Panel</p>
	 * 
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Felamimail.RecipientPickerFavoritePanel
	 */
	Tine.Felamimail.RecipientPickerFavoritePanel = Ext.extend(Tine.widgets.persistentfilter.PickerPanel, {
	    
	    collapsible: true,
	    baseCls: 'ux-arrowcollapse',
	    animCollapse: true,
	    titleCollapse:true,
	    draggable : true,
	    autoScroll: false,
	    
	    /**
	     * no context menu
	     * @type Function
	     */
	    onContextMenu: Ext.emptyFn,
	    
	    /**
	     * @private
	     */
	    initComponent: function() {
	        this.title = this.app.i18n._('Recipient filter');
	        
	        this.store = new Ext.data.ArrayStore({
	            fields: Tine.widgets.persistentfilter.model.PersistentFilter.getFieldDefinitions(),
	            sortInfo: {field: 'name', direction: 'ASC'}
	        });
	        
	        var label = '';
	        Ext.each(['all', 'to', 'cc', 'bcc'], function(field) {
	            switch (field) {
	                case 'all':
	                    label = this.app.i18n._('All recipients');
	                    break;
	                default:
	                    label = String.format(this.app.i18n._('"{0}" recipients'), field);
	                    break;
	            }
	            this.store.add([new Tine.widgets.persistentfilter.model.PersistentFilter({
	                filters: field,
	                name: label,
	                model: 'Addressbook_Model_Contact',
	                application_id: this.app.id,
	                id: Ext.id()
	            })]);
	        }, this);
	
	        
	        this.filterNode = new Ext.tree.AsyncTreeNode({
	            id: '_recipientFilter',
	            leaf: false,
	            expanded: true
	        });
	        
	        Tine.Felamimail.RecipientPickerFavoritePanel.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * load grid from saved filter
	     * 
	     * -> overwritten to allow to dynamically update email filter
	     * 
	     *  @param {Tine.widgets.persistentfilter.model.PersistentFilter} persistentFilter
	     */
	    onFilterSelect: function(persistentFilter) {
	        var emailRecipients = [];
	
	        switch (persistentFilter.get('filters')) {
	            case 'all':
	                Ext.each(['to', 'cc', 'bcc'], function(field) {
	                    emailRecipients = emailRecipients.concat(this.grid.messageRecord.data[field]);
	                }, this);
	                break;
	            default:
	                emailRecipients = this.grid.messageRecord.data[persistentFilter.get('filters')];
	                break;
	        }
	        
	        var filterValue = [], emailRegExp = /<([^>]*)/, filter = [{field: 'container_id', operator: 'in', value: []}];
	        Ext.each(emailRecipients, function(email) {
	            emailRegExp.exec(email);
	            if (RegExp.$1 != '') {
	                filterValue.push(RegExp.$1)
	            }
	        }, this);
	        if (filterValue.length > 0) {
	            filter = [{field: 'email_query', operator: 'in', value: filterValue}];
	        }
	
	        var updatedPersistentFilter = new Tine.widgets.persistentfilter.model.PersistentFilter({
	            filters: filter,
	            name: persistentFilter.get('name'),
	            model: 'Addressbook_Model_Contact',
	            application_id: this.app.id,
	            id: Ext.id()
	        });
	
	        Tine.Felamimail.RecipientPickerFavoritePanel.superclass.onFilterSelect.call(this, updatedPersistentFilter);
	    }
	});


/***/ },

/***/ 348:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Felamimail');
	
	/**
	 * get felamimail tree panel context menus
	 * this is used in Tine.Felamimail.TreePanel (with createDelegate)
	 * 
	 * TODO use Ext.apply to get this
	 */
	Tine.Felamimail.setTreeContextMenus = function() {
	    
	    // define additional actions
	    var emptyFolderAction = {
	        text: this.app.i18n._('Empty Folder'),
	        iconCls: 'action_folder_emptytrash',
	        scope: this,
	        handler: function() {
	            this.ctxNode.getUI().addClass("x-tree-node-loading");
	            var folderId = this.ctxNode.attributes.folder_id;
	            Ext.Ajax.request({
	                params: {
	                    method: 'Felamimail.emptyFolder',
	                    folderId: folderId
	                },
	                scope: this,
	                success: function(result, request){
	                    var selectedNode = this.getSelectionModel().getSelectedNode(),
	                        isSelectedNode = (selectedNode && this.ctxNode.id == selectedNode.id);
	                        
	                    if (isSelectedNode) {
	                        var folder = Tine.Felamimail.folderBackend.recordReader(result);
	                        this.app.getFolderStore().updateFolder(folder);
	                    } else {
	                        var folder = this.app.getFolderStore().getById(folderId);
	                        folder.set('cache_unreadcount', 0);
	                    }
	                    this.ctxNode.getUI().removeClass("x-tree-node-loading");
	                    this.ctxNode.removeAll();
	                },
	                failure: function() {
	                    this.ctxNode.getUI().removeClass("x-tree-node-loading");
	                },
	                timeout: 120000 // 2 minutes
	            });
	        }
	    };
	    
	    // we need this for adding folders to account (root level)
	    var addFolderToRootAction = {
	        text: this.app.i18n._('Add Folder'),
	        iconCls: 'action_add',
	        scope: this,
	        disabled: true,
	        handler: function() {
	            Ext.MessageBox.prompt(String.format(i18n._('New {0}'), this.app.i18n._('Folder')), String.format(i18n._('Please enter the name of the new {0}:'), this.app.i18n._('Folder')), function(_btn, _text) {
	                if( this.ctxNode && _btn == 'ok') {
	                    if (! _text) {
	                        Ext.Msg.alert(String.format(i18n._('No {0} added'), this.app.i18n._('Folder')), String.format(i18n._('You have to supply a {0} name!'), this.app.i18n._('Folder')));
	                        return;
	                    }
	                    Ext.MessageBox.wait(i18n._('Please wait'), String.format(i18n._('Creating {0}...' ), this.app.i18n._('Folder')));
	                    var parentNode = this.ctxNode;
	                    
	                    var params = {
	                        method: 'Felamimail.addFolder',
	                        name: _text
	                    };
	                    
	                    params.parent = '';
	                    params.accountId = parentNode.id;
	                    
	                    Ext.Ajax.request({
	                        params: params,
	                        scope: this,
	                        timeout: 150000, // 2 minutes
	                        success: function(_result, _request){
	                            var nodeData = Ext.util.JSON.decode(_result.responseText);
	                            var newNode = this.loader.createNode(nodeData);
	                            parentNode.appendChild(newNode);
	                            this.fireEvent('containeradd', nodeData);
	                            Ext.MessageBox.hide();
	                        }
	                    });
	                    
	                }
	            }, this);
	        }
	    };
	    
	    var editAccountAction = {
	        text: this.app.i18n._('Edit Account'),
	        iconCls: 'FelamimailIconCls',
	        scope: this,
	        disabled: ! Tine.Tinebase.common.hasRight('manage_accounts', 'Felamimail'),
	        handler: function() {
	            var record = this.accountStore.getById(this.ctxNode.attributes.account_id);
	            var popupWindow = Tine.Felamimail.AccountEditDialog.openWindow({
	                record: record,
	                listeners: {
	                    scope: this,
	                    'update': function(record) {
	                        var account = new Tine.Felamimail.Model.Account(Ext.util.JSON.decode(record));
	                        
	                        // update tree node + store
	                        this.ctxNode.setText(account.get('name'));
	                        this.accountStore.reload();
	                        
	                        // reload tree node + remove all folders of this account from store ?
	                        this.folderStore.resetQueryAndRemoveRecords('parent_path', '/' + this.ctxNode.attributes.account_id);
	                        this.ctxNode.reload(function(callback) {
	                        });
	                    }
	                }
	            });
	        }
	    };
	
	    var editVacationAction = {
	        text: this.app.i18n._('Edit Vacation Message'),
	        iconCls: 'action_email_replyAll',
	        scope: this,
	        handler: function() {
	            var accountId = this.ctxNode.attributes.account_id;
	            var account = this.accountStore.getById(accountId);
	            var record = new Tine.Felamimail.Model.Vacation({id: accountId}, accountId);
	            
	            var popupWindow = Tine.Felamimail.sieve.VacationEditDialog.openWindow({
	                account: account,
	                record: record
	            });
	        }
	    };
	    
	    var editRulesAction = {
	        text: this.app.i18n._('Edit Filter Rules'),
	        iconCls: 'action_email_forward',
	        scope: this,
	        handler: function() {
	            var accountId = this.ctxNode.attributes.account_id;
	            var account = this.accountStore.getById(accountId);
	            
	            var popupWindow = Tine.Felamimail.sieve.RulesDialog.openWindow({
	                account: account
	            });
	        }
	    };
	
	    var editNotificationAction = {
	        text: this.app.i18n._('Notifications'),
	        iconCls: 'felamimail-action-sieve-notification',
	        scope: this,
	        handler: function() {
	            var accountId = this.ctxNode.attributes.account_id;
	            var account = this.accountStore.getById(accountId);
	
	            if (account.get('type') == 'system') {
	                var popupWindow = Tine.Felamimail.sieve.NotificationDialog.openWindow({
	                    record: account
	                });
	            }
	        }
	    };
	
	    var markFolderSeenAction = {
	        text: this.app.i18n._('Mark Folder as read'),
	        iconCls: 'action_mark_read',
	        scope: this,
	        handler: function() {
	            if (this.ctxNode) {
	                var folderId = this.ctxNode.id,
	                    filter = [{
	                        field: 'folder_id',
	                        operator: 'equals',
	                        value: folderId
	                    }, {
	                        field: 'flags',
	                        operator: 'notin',
	                        value: ['\\Seen']
	                    }
	                ];
	                
	                var selectedNode = this.getSelectionModel().getSelectedNode(),
	                    isSelectedNode = (selectedNode && this.ctxNode.id == selectedNode.id);
	                
	                Tine.Felamimail.messageBackend.addFlags(filter, '\\Seen', {
	                    callback: function() {
	                        this.app = Tine.Tinebase.appMgr.get('Felamimail');
	                        var folder = this.app.getFolderStore().getById(folderId);
	                        folder.set('cache_unreadcount', 0);
	                        if (isSelectedNode) {
	                            this.app.getMainScreen().getCenterPanel().loadGridData({
	                                removeStrategy: 'keepBuffered'
	                            });
	                        }
	                    }
	                });
	            }
	        }
	    };
	
	    var updateFolderCacheAction = {
	        text: this.app.i18n._('Update Folder List'),
	        iconCls: 'action_update_cache',
	        scope: this,
	        handler: function() {
	            if (this.ctxNode) {
	                this.getSelectionModel().clearSelections();
	                
	                var folder = this.app.getFolderStore().getById(this.ctxNode.id),
	                    account = folder ? this.app.getAccountStore().getById(folder.get('account_id')) :
	                                       this.app.getAccountStore().getById(this.ctxNode.id);
	                this.ctxNode.getUI().addClass("x-tree-node-loading");
	                // call update folder cache
	                Ext.Ajax.request({
	                    params: {
	                        method: 'Felamimail.updateFolderCache',
	                        accountId: account.id,
	                        folderName: folder ? folder.get('globalname') : ''
	                    },
	                    scope: this,
	                    timeout: 150000, // 3 minutes
	                    success: function(result, request){
	                        this.ctxNode.getUI().removeClass("x-tree-node-loading");
	                        // clear query to query server again and reload subfolders
	                        this.folderStore.resetQueryAndRemoveRecords('parent_path', (folder ? folder.get('path') : '/') + account.id);
	                        this.ctxNode.reload(function(callback) {
	                            this.selectInbox(account);
	                        }, this);
	                    },
	                    failure: function(exception) {
	                        this.ctxNode.getUI().removeClass("x-tree-node-loading");
	                        Tine.Felamimail.folderBackend.handleRequestException(exception);
	                    }
	                });
	            }
	        }
	    };
	    
	    // mutual config options
	    var config = {
	        nodeName: this.app.i18n.n_('Folder', 'Folders', 1),
	        scope: this,
	        backend: 'Felamimail',
	        backendModel: 'Folder'
	    };
	    
	    // system folder ctx menu
	    config.actions = [markFolderSeenAction, 'add'];
	    this.contextMenuSystemFolder = Tine.widgets.tree.ContextMenu.getMenu(config);
	    
	    // user folder ctx menu
	    config.actions = [markFolderSeenAction, 'add', 'rename', 'delete'];
	    this.contextMenuUserFolder = Tine.widgets.tree.ContextMenu.getMenu(config);
	    
	    // trash ctx menu
	    config.actions = [markFolderSeenAction, 'add', emptyFolderAction];
	    this.contextMenuTrash = Tine.widgets.tree.ContextMenu.getMenu(config);
	    
	    // account ctx menu
	    this.contextMenuAccount = Tine.widgets.tree.ContextMenu.getMenu({
	        nodeName: this.app.i18n.n_('Account', 'Accounts', 1),
	        actions: [
	            addFolderToRootAction,
	            updateFolderCacheAction,
	            editVacationAction,
	            editRulesAction,
	            editNotificationAction,
	            editAccountAction,
	            'delete'
	        ],
	        scope: this,
	        backend: 'Felamimail',
	        backendModel: 'Account'
	    });
	    
	    // context menu for unselectable folders (like public/shared namespace)
	    config.actions = ['add'];
	    this.unselectableFolder = Tine.widgets.tree.ContextMenu.getMenu(config);
	};


/***/ },

/***/ 349:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 */
	 
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.TreeLoader
	 * @extends     Tine.widgets.tree.Loader
	 * 
	 * <p>Felamimail Account/Folder Tree Loader</p>
	 * <p>
	 * </p>
	 * 
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Felamimail.TreeLoader
	 * 
	 */
	Tine.Felamimail.TreeLoader = Ext.extend(Tine.widgets.tree.Loader, {
	    
	    /**
	     * request data
	     * 
	     * @param {Ext.tree.TreeNode} node
	     * @param {Function} callback Function to call after the node has been loaded. The
	     * function is passed the TreeNode which was requested to be loaded.
	     * @param (Object) scope The cope (this reference) in which the callback is executed.
	     * defaults to the loaded TreeNode.
	     */
	    requestData : function(node, callback, scope){
	        
	        if(this.fireEvent("beforeload", this, node, callback) !== false) {
	            var fstore = Tine.Tinebase.appMgr.get('Felamimail').getFolderStore(),
	                folder = fstore.getById(node.attributes.folder_id),
	                path = (folder) ? folder.get('path') : node.attributes.path;
	            
	            // we need to call doQuery fn from store to transparently do async request
	            fstore.asyncQuery('parent_path', path, function(node, callback, scope, data) {
	                if (data) {
	                    node.beginUpdate();
	                    data.each(function(folderRecord) {
	                        var n = this.createNode(folderRecord.copy().data);
	                        if (n) {
	                            node.appendChild(n);
	                        }
	                    }, this);
	                    node.endUpdate();
	                }
	                this.runCallback(callback, scope || node, [node]);
	            }, [node, callback, scope], this, fstore);
	            
	        } else {
	            // if the load is cancelled, make sure we notify
	            // the node that we are done
	            this.runCallback(callback, scope || node, []);
	        }
	    },
	    
	    /**
	     * inspectCreateNode
	     * 
	     * @private
	     */
	    inspectCreateNode: function(attr) {
	        var account = Tine.Tinebase.appMgr.get('Felamimail').getAccountStore().getById(attr.account_id);
	        
	        // NOTE cweiss 2010-06-15 this has to be precomputed on server side!
	        attr.has_children = (account && account.get('has_children_support')) ? attr.has_children : true;
	        if (attr.has_children == "0") {
	            attr.has_children = false;
	        }
	        
	        Ext.apply(attr, {
	            leaf: !attr.has_children,
	            expandable: attr.has_children,
	            cls: 'x-tree-node-collapsed',
	            folder_id: attr.id,
	            folderNode: true,
	            allowDrop: true,
	            text: this.app.i18n._hidden(attr.localname)
	        });
	        
	        // show standard folders icons 
	        if (account) {
	            if (account.get('trash_folder') === attr.globalname) {
	                if (attr.cache_totalcount > 0) {
	                    attr.cls = 'felamimail-node-trash-full';
	                } else {
	                    attr.cls = 'felamimail-node-trash';
	                }
	            }
	            if (account.get('sent_folder') === attr.globalname) {
	                attr.cls = 'felamimail-node-sent';
	            }
	            if (account.get('drafts_folder') === attr.globalname) {
	                attr.cls = 'felamimail-node-drafts';
	            }
	            if (account.get('templates_folder') === attr.globalname) {
	                attr.cls = 'felamimail-node-templates';
	            }
	        }
	        if (attr.globalname.match(/^inbox$/i)) {
	            attr.cls = 'felamimail-node-inbox';
	            attr.text = this.app.i18n._hidden('INBOX');
	        }
	        if (attr.globalname.match(/^junk$/i)) {
	            attr.cls = 'felamimail-node-junk';
	        }
	
	        if (! attr.is_selectable) {
	            attr.cls = 'felamimail-node-unselectable';
	        }
	    }
	});


/***/ },

/***/ 350:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2009-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Felamimail');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.FilterPanel
	 * @extends     Tine.widgets.persistentfilter.PickerPanel
	 * 
	 * <p>Felamimail Favorites Panel</p>
	 * 
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Felamimail.FilterPanel
	 */
	Tine.Felamimail.FilterPanel = Ext.extend(Tine.widgets.persistentfilter.PickerPanel, {
	    filterModel: 'Felamimail_Model_MessageFilter'
	});
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.TreePanel
	 * @extends     Ext.tree.TreePanel
	 * 
	 * <p>Account/Folder Tree Panel</p>
	 * <p>Tree of Accounts with folders</p>
	 * <pre>
	 * low priority:
	 * TODO         make inbox/drafts/templates configurable in account
	 * TODO         save tree state? @see http://examples.extjs.eu/?ex=treestate
	 * TODO         disable delete action in account ctx menu if user has no manage_accounts right
	 * </pre>
	 * 
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new Tine.Felamimail.TreePanel
	 * 
	 */
	Tine.Felamimail.TreePanel = function(config) {
	    Ext.apply(this, config);
	    
	    this.addEvents(
	        /**
	         * @event containeradd
	         * Fires when a folder was added
	         * @param {folder} the new folder
	         */
	        'containeradd',
	        /**
	         * @event containerdelete
	         * Fires when a folder got deleted
	         * @param {folder} the deleted folder
	         */
	        'containerdelete',
	        /**
	         * @event containerrename
	         * Fires when a folder got renamed
	         * @param {folder} the renamed folder
	         */
	        'containerrename'
	    );
	        
	    Tine.Felamimail.TreePanel.superclass.constructor.call(this);
	};
	
	Ext.extend(Tine.Felamimail.TreePanel, Ext.tree.TreePanel, {
	    
	    /**
	     * @property app
	     * @type Tine.Felamimail.Application
	     */
	    app: null,
	    
	    /**
	     * @property accountStore
	     * @type Ext.data.JsonStore
	     */
	    accountStore: null,
	    
	    /**
	     * @type Ext.data.JsonStore
	     */
	    folderStore: null,
	    
	    /**
	     * @cfg {String} containerName
	     */
	    containerName: 'Folder',
	    
	    /**
	     * TreePanel config
	     * @private
	     */
	    rootVisible: false,
	    
	    /**
	     * drag n drop
	     */ 
	    enableDrop: true,
	    ddGroup: 'mailToTreeDDGroup',
	    
	    /**
	     * @cfg
	     */
	    border: false,
	    recordClass: Tine.Felamimail.Model.Account,
	    filterMode: 'filterToolbar',
	    
	    /**
	     * is needed by Tine.widgets.mainscreen.WestPanel to fake container tree panel
	     */
	    selectContainerPath: Ext.emptyFn,
	    
	    /**
	     * init
	     * @private
	     */
	    initComponent: function() {
	        // get folder store
	        this.folderStore = Tine.Tinebase.appMgr.get('Felamimail').getFolderStore();
	        
	        // init tree loader
	        this.loader = new Tine.Felamimail.TreeLoader({
	            folderStore: this.folderStore,
	            app: this.app
	        });
	
	        // set the root node
	        this.root = new Ext.tree.TreeNode({
	            text: 'default',
	            draggable: false,
	            allowDrop: false,
	            expanded: true,
	            leaf: false,
	            id: 'root'
	        });
	        
	        // add account nodes
	        this.initAccounts();
	        
	        // init drop zone
	        this.dropConfig = {
	            ddGroup: this.ddGroup || 'TreeDD',
	            appendOnly: this.ddAppendOnly === true,
	            notifyEnter : function() {this.isDropSensitive = true;}.createDelegate(this),
	            notifyOut : function() {this.isDropSensitive = false;}.createDelegate(this),
	            onNodeOver : function(n, dd, e, data) {
	                var node = n.node;
	                
	                // auto node expand check (only for non-account nodes)
	                if(!this.expandProcId && node.attributes.allowDrop && node.hasChildNodes() && !node.isExpanded()){
	                    this.queueExpand(node);
	                } else if (! node.attributes.allowDrop) {
	                    this.cancelExpand();
	                }
	                return node.attributes.allowDrop ? 'tinebase-tree-drop-move' : false;
	            },
	            isValidDropPoint: function(n, dd, e, data){
	                return n.node.attributes.allowDrop;
	            }
	        };
	        
	        // init selection model (multiselect)
	        this.selModel = new Ext.tree.MultiSelectionModel({});
	        
	        // init context menu TODO use Ext.apply
	        var initCtxMenu = Tine.Felamimail.setTreeContextMenus.createDelegate(this);
	        initCtxMenu();
	        
	        // add listeners
	        this.on('beforeclick', this.onBeforeClick, this);
	        this.on('click', this.onClick, this);
	        this.on('contextmenu', this.onContextMenu, this);
	        this.on('beforenodedrop', this.onBeforenodedrop, this);
	        this.on('append', this.onAppend, this);
	        this.on('containeradd', this.onFolderAdd, this);
	        this.on('containerrename', this.onFolderRename, this);
	        this.on('containerdelete', this.onFolderDelete, this);
	        this.selModel.on('selectionchange', this.onSelectionChange, this);
	        this.folderStore.on('update', this.onUpdateFolderStore, this);
	        
	        // call parent::initComponent
	        Tine.Felamimail.TreePanel.superclass.initComponent.call(this);
	    },
	    
	    /**
	     * add accounts from registry as nodes to root node
	     * @private
	     */
	    initAccounts: function() {
	        this.accountStore = this.app.getAccountStore();
	        this.accountStore.each(this.addAccount, this);
	        this.accountStore.on('update', this.onAccountUpdate, this);
	    },
	    
	    /**
	     * init extra tool tips
	     */
	    initToolTips: function() {
	        this.folderTip = new Ext.ToolTip({
	            target: this.getEl(),
	            delegate: 'a.x-tree-node-anchor',
	            renderTo: document.body,
	            listeners: {beforeshow: this.updateFolderTip.createDelegate(this)}
	        });
	        
	        this.folderProgressTip = new Ext.ToolTip({
	            target: this.getEl(),
	            delegate: '.felamimail-node-statusbox-progress',
	            renderTo: document.body,
	            listeners: {beforeshow: this.updateProgressTip.createDelegate(this)}
	        });
	        
	        this.folderUnreadTip = new Ext.ToolTip({
	            target: this.getEl(),
	            delegate: '.felamimail-node-statusbox-unread',
	            renderTo: document.body,
	            listeners: {beforeshow: this.updateUnreadTip.createDelegate(this)}
	        });
	    },
	    
	    /**
	     * called when tree selection changes
	     * 
	     * @param {} sm
	     * @param {} node
	     */
	    onSelectionChange: function(sm, nodes) {
	        if (this.filterMode == 'gridFilter' && this.filterPlugin) {
	            this.filterPlugin.onFilterChange();
	        }
	        if (this.filterMode == 'filterToolbar' && this.filterPlugin) {
	            
	            // get filterToolbar
	            var ftb = this.filterPlugin.getGridPanel().filterToolbar;
	            // in case of filterPanel
	            ftb = ftb.activeFilterPanel ? ftb.activeFilterPanel : ftb;
	
	            // remove path filter
	            ftb.supressEvents = true;
	            ftb.filterStore.each(function(filter) {
	                var field = filter.get('field');
	                if (field === 'path') {
	                    ftb.deleteFilter(filter);
	                }
	            }, this);
	            ftb.supressEvents = false;
	            
	            // set ftb filters according to tree selection
	            var filter = this.getFilterPlugin().getFilter();
	            ftb.addFilter(new ftb.record(filter));
	        
	            ftb.onFiltertrigger();
	            
	            // finally select the selected node, as filtertrigger clears all selections
	            sm.suspendEvents();
	            Ext.each(nodes, function(node) {
	                sm.select(node, Ext.EventObject, true);
	            }, this);
	            sm.resumeEvents();
	        }
	    },
	
	   /**
	     * returns a filter plugin to be used in a grid
	     * @private
	     */
	    getFilterPlugin: function() {
	        if (!this.filterPlugin) {
	            this.filterPlugin = new Tine.widgets.tree.FilterPlugin({
	                treePanel: this,
	                field: 'path',
	                nodeAttributeField: 'path',
	                singleNodeOperator: 'in'
	            });
	        }
	        
	        return this.filterPlugin;
	    },
	    
	    /**
	     * convert containerPath to treePath
	     * 
	     * @param {String}  containerPath
	     * @return {String} treePath
	     */
	    getTreePath: function(path) {
	        return '/root' + path;
	    },
	    
	    /**
	     * @private
	     * 
	     * expand default account and select INBOX
	     */
	    afterRender: function() {
	        Tine.Felamimail.TreePanel.superclass.afterRender.call(this);
	        this.initToolTips();
	        this.selectInbox();
	    },
	    
	    /**
	     * select inbox of account
	     * 
	     * @param {Record} account
	     */
	    selectInbox: function(account) {
	        var accountId = (account) ? account.id : Tine.Felamimail.registry.get('preferences').get('defaultEmailAccount');
	        
	        this.expandPath('/root/' + accountId + '/', null, function(success, parentNode) {
	            Ext.each(parentNode.childNodes, function(node) {
	                if (Ext.util.Format.lowercase(node.attributes.localname) == 'inbox') {
	                    node.select();
	                    return false;
	                }
	            }, this);
	        });
	    },
	    
	    /**
	     * called when an account record updates
	     * 
	     * @param {Ext.data.JsonStore} store
	     * @param {Tine.Felamimail.Model.Account} record
	     * @param {String} action
	     */
	    onAccountUpdate: function(store, record, action) {
	        if (action === Ext.data.Record.EDIT) {
	            this.updateAccountStatus(record);
	        }
	    },
	    
	    /**
	     * on append node
	     * 
	     * render status box
	     * 
	     * @param {Tine.Felamimail.TreePanel} tree
	     * @param {Ext.Tree.TreeNode} node
	     * @param {Ext.Tree.TreeNode} appendedNode
	     * @param {Number} index
	     */
	    onAppend: function(tree, node, appendedNode, index) {
	        appendedNode.ui.render = appendedNode.ui.render.createSequence(function() {
	            var app = Tine.Tinebase.appMgr.get('Felamimail'),
	                folder = app.getFolderStore().getById(appendedNode.id);
	                
	            if (folder) {
	                app.getMainScreen().getTreePanel().addStatusboxesToNodeUi(this);
	                app.getMainScreen().getTreePanel().updateFolderStatus(folder);
	            }
	        }, appendedNode.ui);
	    },
	    
	    /**
	     * add status boxes
	     * 
	     * @param {Object} nodeUi
	     */
	    addStatusboxesToNodeUi: function(nodeUi) {
	        Ext.DomHelper.insertAfter(nodeUi.elNode.lastChild, {tag: 'span', 'class': 'felamimail-node-statusbox', cn:[
	            {'tag': 'img', 'src': Ext.BLANK_IMAGE_URL, 'class': 'felamimail-node-statusbox-progress'},
	            {'tag': 'span', 'class': 'felamimail-node-statusbox-unread'}
	        ]});
	    },
	    
	    /**
	     * on before click handler
	     * - accounts are not clickable because fetching all messages of account is too expensive
	     * - skip event for folders that are not selectable
	     * 
	     * @param {Ext.tree.AsyncTreeNode} node
	     */
	    onBeforeClick: function(node) {
	        if (this.accountStore.getById(node.id) || ! this.app.getFolderStore().getById(node.id).get('is_selectable')) {
	            return false;
	        }
	    },
	    
	    /**
	     * on click handler
	     * 
	     * - expand node
	     * - update filter toolbar of grid
	     * - start check mails delayed task
	     * 
	     * @param {Ext.tree.AsyncTreeNode} node
	     * @private
	     */
	    onClick: function(node) {
	        if (node.expandable) {
	            node.expand();
	        }
	        
	        if (node.id && node.id != '/' && node.attributes.globalname != '') {
	            var folder = this.app.getFolderStore().getById(node.id);
	            this.app.checkMailsDelayedTask.delay(0);
	        }
	    },
	    
	    /**
	     * show context menu for folder tree
	     * 
	     * items:
	     * - create folder
	     * - rename folder
	     * - delete folder
	     * - ...
	     * 
	     * @param {} node
	     * @param {} event
	     * @private
	     */
	    onContextMenu: function(node, event) {
	        this.ctxNode = node;
	        
	        var folder = this.app.getFolderStore().getById(node.id),
	            account = folder ? this.accountStore.getById(folder.get('account_id')) :
	                               this.accountStore.getById(node.id);
	        
	        if (! folder) {
	            // edit/remove account
	            if (account.get('ns_personal') !== 'default') {
	                this.contextMenuAccount.items.each(function(item) {
	                    // check account personal namespace -> disable 'add folder' if namespace is other than root 
	                    if (item.iconCls == 'action_add') {
	                        item.setDisabled(account.get('ns_personal') != '');
	                    }
	                    // disable filter rules/vacation if no sieve hostname is set
	                    if (item.iconCls == 'action_email_replyAll' || item.iconCls == 'action_email_forward') {
	                        item.setDisabled(account.get('sieve_hostname') == null || account.get('sieve_hostname') == '');
	                    }
	                });
	                
	                this.contextMenuAccount.showAt(event.getXY());
	            }
	        } else {
	            if (folder.get('globalname') === account.get('trash_folder') || folder.get('localname').match(/junk/i)) {
	                this.contextMenuTrash.showAt(event.getXY());
	            } else if (! folder.get('is_selectable')){
	                this.unselectableFolder.showAt(event.getXY());
	            } else if (folder.get('system_folder')) {
	                this.contextMenuSystemFolder.showAt(event.getXY());
	            } else {
	                this.contextMenuUserFolder.showAt(event.getXY());
	            }
	        }
	    },
	    
	    /**
	     * mail(s) got dropped on node
	     * 
	     * @param {Object} dropEvent
	     * @private
	     */
	    onBeforenodedrop: function(dropEvent) {
	        var targetFolderId = dropEvent.target.attributes.folder_id,
	            targetFolder = this.app.getFolderStore().getById(targetFolderId);
	                
	        this.app.getMainScreen().getCenterPanel().moveSelectedMessages(targetFolder, false);
	        return true;
	    },
	    
	    /**
	     * cleanup on destruction
	     */
	    onDestroy: function() {
	        this.folderStore.un('update', this.onUpdateFolderStore, this);
	    },
	    
	    /**
	     * folder store gets updated -> update tree nodes
	     * 
	     * @param {Tine.Felamimail.FolderStore} store
	     * @param {Tine.Felamimail.Model.Folder} record
	     * @param {String} operation
	     */
	    onUpdateFolderStore: function(store, record, operation) {
	        if (operation === Ext.data.Record.EDIT) {
	            this.updateFolderStatus(record);
	        }
	    },
	    
	    /**
	     * add new folder to the store
	     * 
	     * @param {Object} folderData
	     */
	    onFolderAdd: function(folderData) {
	        var recordData = Ext.copyTo({}, folderData, Tine.Felamimail.Model.Folder.getFieldNames());
	        var newRecord = Tine.Felamimail.folderBackend.recordReader({responseText: Ext.util.JSON.encode(recordData)});
	        
	        Tine.log.debug('Added new folder:' + newRecord.get('globalname'));
	        
	        this.folderStore.add([newRecord]);
	        this.initNewFolderNode(newRecord);
	    },
	    
	    /**
	     * init new folder node
	     * 
	     * @param {Tine.Felamimail.Model.Folder} newRecord
	     */
	    initNewFolderNode: function(newRecord) {
	        // update paths in node
	        var appendedNode = this.getNodeById(newRecord.id);
	        
	        if (! appendedNode) {
	            // node is not yet rendered -> reload parent
	            var parentId = newRecord.get('parent_path').split('/').pop(),
	                parentNode = this.getNodeById(parentId);
	            parentNode.reload(function() {
	                this.initNewFolderNode(newRecord);
	            }, this);
	            return;
	        }
	        
	        appendedNode.attributes.path = newRecord.get('path');
	        appendedNode.attributes.parent_path = newRecord.get('parent_path');
	        
	        // add unreadcount/progress/tooltip
	        this.addStatusboxesToNodeUi(appendedNode.ui);
	        this.updateFolderStatus(newRecord);
	    },
	
	    /**
	     * rename folder in the store
	     * 
	     * @param {Object} folderData
	     */
	    onFolderRename: function(folderData) {
	        var record = this.folderStore.getById(folderData.id);
	        record.set('globalname', folderData.globalname);
	        record.set('localname', folderData.localname);
	        
	        Tine.log.debug('Renamed folder:' + record.get('globalname'));
	    },
	        
	    /**
	     * remove deleted folder from the store
	     * 
	     * @param {Object} folderData
	     */
	    onFolderDelete: function(folderData) {
	        // if we deleted account, remove it from account store
	        if (folderData.record && folderData.record.modelName === 'Account') {
	            this.accountStore.remove(this.accountStore.getById(folderData.id));
	        }
	        
	        this.folderStore.remove(this.folderStore.getById(folderData.id));
	    },
	    
	    /**
	     * returns tree node id the given el is child of
	     * 
	     * @param  {HTMLElement} el
	     * @return {String}
	     */
	    getElsParentsNodeId: function(el) {
	        return Ext.fly(el, '_treeEvents').up('div[class^=x-tree-node-el]').getAttribute('tree-node-id', 'ext');
	    },
	    
	    /**
	     * updates account status icon in this tree
	     * 
	     * @param {Tine.Felamimail.Model.Account} account
	     */
	    updateAccountStatus: function(account) {
	        var imapStatus = account.get('imap_status'),
	            node = this.getNodeById(account.id),
	            ui = node ? node.getUI() : null,
	            nodeEl = ui ? ui.getEl() : null;
	            
	        Tine.log.info('Account ' + account.get('name') + ' updated with imap_status: ' + imapStatus);
	        if (node && node.ui.rendered) {
	            var statusEl = Ext.get(Ext.DomQuery.selectNode('span[class=felamimail-node-accountfailure]', nodeEl));
	            if (! statusEl) {
	                // create statusEl on the fly
	                statusEl = Ext.DomHelper.insertAfter(ui.elNode.lastChild, {'tag': 'span', 'class': 'felamimail-node-accountfailure'}, true);
	                statusEl.on('click', function() {
	                    Tine.Felamimail.folderBackend.handleRequestException(account.getLastIMAPException());
	                }, this);
	            }
	            
	            statusEl.setVisible(imapStatus === 'failure');
	        }
	    },
	    
	    /**
	     * updates folder status icons/info in this tree
	     * 
	     * @param {Tine.Felamimail.Model.Folder} folder
	     */
	    updateFolderStatus: function(folder) {
	        var unreadcount = folder.get('cache_unreadcount'),
	            progress    = Math.round(folder.get('cache_job_actions_done') / folder.get('cache_job_actions_est') * 10) * 10,
	            node        = this.getNodeById(folder.id),
	            ui = node ? node.getUI() : null,
	            nodeEl = ui ? ui.getEl() : null,
	            cacheStatus = folder.get('cache_status'),
	            lastCacheStatus = folder.modified ? folder.modified.cache_status : null,
	            isSelected = folder.isCurrentSelection();
	
	        this.setUnreadClass(folder.id);
	            
	        if (node && node.ui.rendered) {
	            var domNode = Ext.DomQuery.selectNode('span[class=felamimail-node-statusbox-unread]', nodeEl);
	            if (domNode) {
	                
	                // update unreadcount + visibity
	                Ext.fly(domNode).update(unreadcount).setVisible(unreadcount > 0);
	                
	                // update progress
	                var progressEl = Ext.get(Ext.DomQuery.selectNode('img[class^=felamimail-node-statusbox-progress]', nodeEl));
	                progressEl.removeClass(['felamimail-node-statusbox-progress-pie', 'felamimail-node-statusbox-progress-loading']);
	                if (! Ext.isNumber(progress)) {
	                    progressEl.setStyle('background-position', 0 + 'px');
	                    progressEl.addClass('felamimail-node-statusbox-progress-loading');
	                } else {
	                    progressEl.setStyle('background-position', progress + '%');
	                    progressEl.addClass('felamimail-node-statusbox-progress-pie');
	                }
	                progressEl.setVisible(isSelected && cacheStatus !== 'complete' && cacheStatus !== 'disconnect' && progress !== 100 && lastCacheStatus !== 'complete');
	            }
	        }
	    },
	    
	    /**
	     * set unread class of folder node and parents
	     * 
	     * @param {Tine.Felamimail.Model.Folder} folder
	     * 
	     * TODO make it work correctly for parents (use events) and activate again
	     */
	    setUnreadClass: function(folderId) {
	        var folder              = this.app.getFolderStore().getById(folderId),
	            node                = this.getNodeById(folderId),
	            isUnread            = folder.get('cache_unreadcount') > 0,
	            hasUnreadChildren   = folder.get('unread_children').length > 0;
	            
	        if (node && node.ui.rendered) {
	            var ui = node.getUI();
	            ui[(isUnread || hasUnreadChildren) ? 'addClass' : 'removeClass']('felamimail-node-unread');
	        }
	        
	        // get parent, update and call recursivly
	//        var parentFolder = this.app.getFolderStore().getParent(folder);
	//        if (parentFolder) {
	//            // need to create a copy of the array here (and make sure it is unique)
	//            var unreadChildren = Ext.unique(parentFolder.get('unread_children'));
	//                
	//            if (isUnread || hasUnreadChildren) {
	//                unreadChildren.push(folderId);
	//            } else {
	//                unreadChildren.remove(folderId);
	//            }
	//            parentFolder.set('unread_children', unreadChildren);
	//            this.setUnreadClass(parentFolder.id);
	//        }
	    },
	    
	    /**
	     * updates the given tip
	     * @param {Ext.Tooltip} tip
	     */
	    updateFolderTip: function(tip) {
	        var folderId = this.getElsParentsNodeId(tip.triggerElement),
	            folder = this.app.getFolderStore().getById(folderId),
	            account = this.accountStore.getById(folderId);
	            
	        if (folder && !this.isDropSensitive) {
	            var info = [
	                '<table>',
	                    '<tr>',
	                        '<td>', this.app.i18n._('Total Messages:'), '</td>',
	                        '<td>', folder.get('cache_totalcount'), '</td>',
	                    '</tr>',
	                    '<tr>',
	                        '<td>', this.app.i18n._('Unread Messages:'), '</td>',
	                        '<td>', folder.get('cache_unreadcount'), '</td>',
	                    '</tr>',
	                    '<tr>',
	                        '<td>', this.app.i18n._('Name on Server:'), '</td>',
	                        '<td>', folder.get('globalname'), '</td>',
	                    '</tr>',
	                    '<tr>',
	                        '<td>', this.app.i18n._('Last update:'), '</td>',
	                        '<td>', Tine.Tinebase.common.dateTimeRenderer(folder.get('client_access_time')), '</td>',
	                    '</tr>',
	                '</table>'
	            ];
	            tip.body.dom.innerHTML = info.join('');
	        } else {
	            return false;
	        }
	    },
	    
	    /**
	     * updates the given tip
	     * @param {Ext.Tooltip} tip
	     */
	    updateProgressTip: function(tip) {
	        var folderId = this.getElsParentsNodeId(tip.triggerElement),
	            folder = this.app.getFolderStore().getById(folderId),
	            progress = Math.round(folder.get('cache_job_actions_done') / folder.get('cache_job_actions_est') * 100);
	        if (! this.isDropSensitive) {
	            tip.body.dom.innerHTML = String.format(this.app.i18n._('Fetching messages... ({0} done)'), progress + '%');
	        } else {
	            return false;
	        }
	    },
	    
	    /**
	     * updates the given tip
	     * @param {Ext.Tooltip} tip
	     */
	    updateUnreadTip: function(tip) {
	        var folderId = this.getElsParentsNodeId(tip.triggerElement),
	            folder = this.app.getFolderStore().getById(folderId),
	            count = folder.get('cache_unreadcount');
	            
	        if (! this.isDropSensitive) {
	            tip.body.dom.innerHTML = String.format(this.app.i18n.ngettext('{0} unread message', '{0} unread messages', count), count);
	        } else {
	            return false;
	        }
	    },
	    
	    /**
	     * decrement unread count of currently selected folder
	     */
	    decrementCurrentUnreadCount: function() {
	        var store  = Tine.Tinebase.appMgr.get('Felamimail').getFolderStore(),
	            node   = this.getSelectionModel().getSelectedNode(),
	            folder = node ? store.getById(node.id) : null;
	            
	        if (folder) {
	            folder.set('cache_unreadcount', parseInt(folder.get('cache_unreadcount'), 10) -1);
	            folder.commit();
	        }
	    },
	    
	    /**
	     * add account record to root node
	     * 
	     * @param {Tine.Felamimail.Model.Account} record
	     */
	    addAccount: function(record) {
	        
	        var node = new Ext.tree.AsyncTreeNode({
	            id: record.data.id,
	            path: '/' + record.data.id,
	            record: record,
	            globalname: '',
	            draggable: false,
	            allowDrop: false,
	            expanded: false,
	            text: Ext.util.Format.htmlEncode(record.get('name')),
	            qtip: Tine.Tinebase.common.doubleEncode(record.get('host')),
	            leaf: false,
	            cls: 'felamimail-node-account',
	            delimiter: record.get('delimiter'),
	            ns_personal: record.get('ns_personal'),
	            account_id: record.data.id,
	            listeners: {
	                scope: this,
	                load: function(node) {
	                    var account = this.accountStore.getById(node.id);
	                    this.updateAccountStatus(account);
	                }
	            }
	        });
	        
	        // we don't want appending folder effects
	        this.suspendEvents();
	        this.root.appendChild(node);
	        this.resumeEvents();
	    },
	    
	    /**
	     * get active account by checking selected node
	     * @return Tine.Felamimail.Model.Account
	     */
	    getActiveAccount: function() {
	        var result = null;
	        var node = this.getSelectionModel().getSelectedNode();
	        if (node) {
	            var accountId = node.attributes.account_id;
	            result = this.accountStore.getById(accountId);
	        }
	        
	        return result;
	    }
	});


/***/ },

/***/ 351:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2017 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Felamimail.sieve');
	
	 Tine.Felamimail.sieve.NotificationDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	
	    /**
	     * @private
	     */
	    windowNamePrefix: 'NotificationWindow_',
	    appName: 'Felamimail',
	    recordClass: Tine.Felamimail.Model.Account,
	    recordProxy: Tine.Felamimail.accountBackend,
	    loadRecord: true,
	    tbarItems: [],
	    evalGrants: false,
	    readonlyReason: false,
	    
	    /**
	     * overwrite update toolbars function (we don't have record grants yet)
	     * 
	     * @private
	     */
	    updateToolbars: function() {
	    },
	    
	    /**
	     * executed after record got updated from proxy
	     * 
	     * @private
	     */
	    onRecordLoad: function() {
	        // interrupt process flow till dialog is rendered
	        if (! this.rendered) {
	            this.onRecordLoad.defer(250, this);
	            return;
	        }
	
	        this.getForm().loadRecord(this.record);
	
	        var title = String.format(this.app.i18n._('Notification for {0}'), this.record.get('name'));
	        this.window.setTitle(title);
	
	        this.loadMask.hide();
	    },
	        
	    /**
	     * returns dialog
	     * 
	     * NOTE: when this method gets called, all initalisation is done.
	     * 
	     * @return {Object}
	     * @private
	     * 
	     */
	    getFormItems: function() {
	
	        return {
	            xtype: 'tabpanel',
	            deferredRender: false,
	            border: false,
	            activeTab: 0,
	            items: [{
	                title: this.app.i18n._('Notifications'),
	                autoScroll: true,
	                border: false,
	                frame: true,
	                xtype: 'columnform',
	                formDefaults: {
	                    xtype: 'textfield',
	                    anchor: '100%',
	                    labelSeparator: '',
	                    columnWidth: 1,
	                },
	                items: [[{
	                    maxLength: 256,
	                    fieldLabel: this.app.i18n._('Notification Email'),
	                    name: 'sieve_notification_email',
	                    vtype: 'email'
	                }]]
	            }]
	        };
	    }
	});
	
	/**
	 * Felamimail Edit Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Felamimail.sieve.NotificationDialog.openWindow = function (config) {
	    var window = Tine.WindowFactory.getWindow({
	        width: 320,
	        height: 200,
	        name: Tine.Felamimail.sieve.NotificationDialog.prototype.windowNamePrefix + Ext.id(),
	        contentPanelConstructor: 'Tine.Felamimail.sieve.NotificationDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

/***/ 352:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Felamimail.sieve');
	
	/**
	 * @namespace   Tine.Felamimail.sieve
	 * @class       Tine.Felamimail.sieve.RuleConditionsPanel
	 * @extends     Tine.widgets.grid.FilterToolbar
	 * 
	 * <p>Sieve Filter Conditions Panel</p>
	 * <p>
	 * mapping when getting filter values:
	 *  field       -> test_header or 'size'
	 *  operator    -> comperator
	 *  value       -> key
	 * </p>
	 * <p>
	 * </p>
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new RuleConditionsPanel
	 */
	Tine.Felamimail.sieve.RuleConditionsPanel = Ext.extend(Tine.widgets.grid.FilterToolbar, {
	    
	    defaultFilter: 'from',
	    neverAllowSaving: true,
	    showSearchButton: false,
	    filterFieldWidth: 160,
	    
	    customFilterSorting: true,
	    
	    // unused fn
	    onFiltertrigger: Ext.emptyFn,
	    
	    initComponent: function() {
	        this.app = Tine.Tinebase.appMgr.get('Felamimail');
	        this.rowPrefix = '';
	        
	        this.filterModels = Tine.Felamimail.sieve.RuleConditionsPanel.getFilterModel(this.app);
	        
	        this.supr().initComponent.call(this);
	    },
	    
	    /**
	     * gets filter data (use getValue() if we don't have a store/plugins)
	     * 
	     * @return {Array} of filter records
	     */
	    getAllFilterData: function() {
	        return this.getValue();
	    }
	});
	
	/**
	 * get rule conditions for filter model and condition renderer
	 * 
	 * @param {} app
	 * @return {Array}
	 */
	Tine.Felamimail.sieve.RuleConditionsPanel.getFilterModel = function(app) {
	    return [
	        {sort: 10, label: app.i18n._('From (Email)'),     field: 'from',     operators: ['contains', 'regex'], emptyText: 'test@example.org'},
	        {sort: 20, label: app.i18n._('From (Email and Name)'), field: 'fromheader',     operators: ['contains', 'regex'], emptyText: 'name or email'},
	        {sort: 30, label: app.i18n._('To (Email)'),       field: 'to',       operators: ['contains', 'regex'], emptyText: 'test@example.org'},
	        {sort: 40, label: app.i18n._('To (Email CC)'),    field: 'cc',       operators: ['contains', 'regex'], emptyText: 'test@example.org'},
	        {sort: 50, label: app.i18n._('Subject'),          field: 'subject',  operators: ['contains', 'regex'], emptyText: app.i18n._('Subject')},
	        {sort: 60, label: app.i18n._('Size'),             field: 'size',     operators: ['greater', 'less'], valueType: 'number', defaultOperator: 'greater'},
	        {sort: 70, label: app.i18n._('Header contains'),  field: 'header',   operators: ['freeform'], defaultOperator: 'freeform', 
	            emptyTextOperator: app.i18n._('Header name'), emptyText: app.i18n._('Header value')},
	        {sort: 80, label: app.i18n._('Header regex'),     field: 'headerregex',   operators: ['freeform'], defaultOperator: 'freeform',
	            emptyTextOperator: app.i18n._('Header name'), emptyText: app.i18n._('Header value')}
	    ];
	};


/***/ },

/***/ 353:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Felamimail.sieve');
	
	/**
	 * @namespace   Tine.Felamimail.sieve
	 * @class       Tine.Felamimail.sieve.RuleEditDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * 
	 * <p>Sieve Filter Dialog</p>
	 * <p>This dialog is editing a filter rule.</p>
	 * <p>
	 * </p>
	 * 
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010 Metaways Infosystems GmbH (http://www.metaways.de)
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new RuleEditDialog
	 */
	Tine.Felamimail.sieve.RuleEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	    /**
	     * @cfg {Tine.Felamimail.Model.Account}
	     */
	    account: null,
	    
	    /**
	     * @private
	     */
	    windowNamePrefix: 'RuleEditWindow_',
	    appName: 'Felamimail',
	    recordClass: Tine.Felamimail.Model.Rule,
	    mode: 'local',
	    loadRecord: true,
	    tbarItems: [],
	    evalGrants: false,
	    conjunctionCombo: null,
	    
	    /**
	     * overwrite update toolbars function (we don't have record grants yet)
	     * 
	     * @private
	     */
	    updateToolbars: function() {
	
	    },
	    
	    /**
	     * @private
	     */
	    onRender: function(ct, position) {
	        Tine.Felamimail.sieve.RuleEditDialog.superclass.onRender.call(this, ct, position);
	        
	        this.onChangeType.defer(250, this);
	    },
	    
	    /**
	     * Change type card layout depending on selected combo box entry and set field value
	     */
	    onChangeType: function() {
	        var type = this.actionTypeCombo.getValue();
	        
	        var cardLayout = Ext.getCmp(this.idPrefix + 'CardLayout').getLayout();
	        if (cardLayout !== 'card') {
	            cardLayout.setActiveItem(this.idPrefix + type);
	            if (this.record.get('action_type') == type) {
	                var field = this.getForm().findField('action_argument_' + type);
	                if (field !== null) {
	                    switch (type) {
	                        case 'redirect':
	                           var data = this.record.get('action_argument'),
	                               checkbox = this.getForm().findField('action_argument_redirect_copy');
	                           field.setValue(data.emails);
	                           checkbox.setValue(data.copy);
	                           break;
	                        default:
	                           field.setValue(this.record.get('action_argument'));
	                    }
	                }
	            }
	        }
	    },
	    
	    /**
	     * executed after record got updated from proxy
	     * 
	     * @private
	     */
	    onRecordLoad: function() {
	        // interrupt process flow till dialog is rendered
	        if (! this.rendered) {
	            this.onRecordLoad.defer(250, this);
	            return;
	        }
	        
	        var title = this.app.i18n._('Edit Filter Rule');
	        this.window.setTitle(title);
	        
	        this.getForm().loadRecord(this.record);
	
	        this.conditionsPanel.conjunctionOperator = this.record.get('conjunction') == 'anyof' ? 'or' : 'and';
	        
	        this.loadMask.hide();
	    },
	    
	    /**
	     * @private
	     */
	    onRecordUpdate: function() {
	        Tine.Felamimail.sieve.RuleEditDialog.superclass.onRecordUpdate.call(this);
	        
	        this.record.set('conditions', this.getConditions());
	
	        var argumentFieldName = 'action_argument_' + this.actionTypeCombo.getValue();
	            argumentField = this.getForm().findField(argumentFieldName),
	            argumentValue = (argumentField !== null) ? argumentField.getValue() : '';
	
	        // add additional action arguments
	        if (argumentFieldName === 'action_argument_redirect') {
	            argumentValue = {
	                emails: argumentValue,
	                copy: this.getForm().findField('action_argument_redirect_copy').getValue()
	            };
	        }
	        
	        this.record.set('action_argument', argumentValue);
	    },
	    
	    /**
	     * get conditions and do the mapping
	     * 
	     * @return {Array}
	     */
	    getConditions: function() {
	        var conditions = this.conditionsPanel.getAllFilterData();
	        var result = [],
	            i = 0, 
	            condition,
	            test,
	            comperator,
	            header;
	            
	        for (i = 0; i < conditions.length; i++) {
	            // set defaults
	            comperator = conditions[i].operator;
	            header = conditions[i].field;
	            test = 'header';
	
	            switch (conditions[i].field) {
	                case 'from':
	                case 'to':
	                    test = 'address';
	                    break;
	                case 'fromheader':
	                    header = 'From';
	                    break;
	                case 'size':
	                    test = 'size';
	                    comperator = (conditions[i].operator == 'greater') ? 'over' : 'under';
	                    break;
	                case 'header':
	                    header = conditions[i].operator;
	                    comperator = 'contains';
	                    break;
	                case 'headerregex':
	                    header = conditions[i].operator;
	                    comperator = 'regex';
	                    break;
	            }
	            condition = {
	                test: test,
	                header: header,
	                comperator: comperator,
	                key: conditions[i].value
	            };
	            result.push(condition);
	        }
	        
	        return result;
	    },
	    
	    /**
	     * get conditions filter data (reverse of getConditions)
	     * 
	     * @return {Array}
	     */
	    getConditionsFilter: function() {
	        var conditions = this.record.get('conditions');
	        var result = [],
	            i = 0, 
	            filter,
	            operator,
	            field;
	            
	        for (i = 0; i < conditions.length; i++) {
	            
	            field = conditions[i].header;
	            switch (field) {
	                case 'size':
	                    operator = (conditions[i].comperator == 'over') ? 'greater' : 'less';
	                    break;
	                case 'from':
	                case 'to':
	                case 'subject':
	                    operator = conditions[i].comperator;
	                    break;
	                case 'cc':
	                    field = 'cc'
	                    break;
	                default:
	                    if (field == 'From') {
	                        operator = conditions[i].comperator;
	                        field = 'fromheader';
	                    } else {
	                        operator = field;
	                        field = (conditions[i].comperator == 'contains') ? 'header' : 'headerregex';
	                    }
	            }
	            filter = {
	                field: field,
	                operator: operator,
	                value: conditions[i].key
	            };
	            result.push(filter);
	        }
	        
	        return result;
	    },
	    
	    /**
	     * sets the conjunction operator of the filtertoolbar to show the correct text for anyof or allof
	     */
	    onConjunctionChange: function() {
	        this.conditionsPanel.conjunctionOperator = this.conjunctionCombo.getValue() == 'anyof' ? 'or' : 'and';
	        this.conditionsPanel.onFilterRowsChange();
	    },
	    
	    /**
	     * returns dialog
	     * 
	     * NOTE: when this method gets called, all initialization is done.
	     * 
	     * @return {Object}
	     * @private
	     */
	    getFormItems: function() {
	        
	        this.conditionsPanel = new Tine.Felamimail.sieve.RuleConditionsPanel({
	            filters: this.getConditionsFilter()
	        });
	        
	        this.actionTypeCombo = new Ext.form.ComboBox({
	            hideLabel       : true,
	            name            : 'action_type',
	            typeAhead       : false,
	            triggerAction   : 'all',
	            lazyRender      : true,
	            editable        : false,
	            mode            : 'local',
	            forceSelection  : true,
	            value           : 'discard',
	            columnWidth     : 0.4,
	            store: Tine.Felamimail.sieve.RuleEditDialog.getActionTypes(this.app),
	            listeners: {
	                scope: this,
	                change: this.onChangeType,
	                select: this.onChangeType
	            }
	        });
	        
	        this.conjunctionCombo = new Ext.form.ComboBox({
	            hideLabel  : false,
	            width: 250,
	            fieldLabel : '<span class="felamimail-sieverule-conjunction">' + this.app.i18n._('Apply filter if') + '</span>',
	            labelSeparator: '',
	            name       : 'conjunction',
	            store      : [
	                ['allof', this.app.i18n._('all conditions match')],
	                ['anyof', this.app.i18n._('any condition matches')]
	            ],
	            value      : 'allof',
	            listeners: {
	                scope: this,
	                change: this.onConjunctionChange,
	                select: this.onConjunctionChange
	            }
	        });
	        
	        this.idPrefix = Ext.id();
	        
	        return [{
	            xtype: 'panel',
	            layout: 'border',
	            autoScroll: true,
	            items: [
	            {
	                region: 'north',
	                border: false,
	                xtype: 'panel',
	                autoScroll: true,
	                height: 200,
	                items: [{
	                    layout: 'form',
	                    labelWidth: 200,
	                    frame: true,
	                    region: 'center',
	                    autoScroll: true,
	                    border: false,
	                    items: [
	                        this.conjunctionCombo
	                    ]
	                }, this.conditionsPanel
	                ],
	                listeners: {
	                    scope: this,
	                    afterlayout: function(ct, layout) {
	                        ct.suspendEvents();
	                        if (this.conditionsPanel.getHeight() < 170) {
	                            ct.setHeight(this.conditionsPanel.getHeight() + 35);
	                        }
	                        ct.ownerCt.layout.layout();
	                        ct.resumeEvents();
	                    }
	                }
	            }, {
	                title: this.app.i18n._('Do this action:'),
	                region: 'center',
	                border: false,
	                frame: true,
	                xtype: 'panel',
	                layout: 'column',
	                items: [
	                    this.actionTypeCombo,
	                    // TODO try to add a spacer/margin between the two input fields
	                /*{
	                    // spacer
	                    columnWidth: 0.1,
	                    layout: 'fit',
	                    title: '',
	                    items: []
	                }, */{
	                    id: this.idPrefix + 'CardLayout',
	                    layout: 'card',
	                    activeItem: this.idPrefix + 'fileinto',
	                    border: false,
	                    columnWidth: 0.5,
	                    xtype: 'panel',
	                    defaults: {
	                        border: false
	                    },
	                    items: [{
	                        id: this.idPrefix + 'fileinto',
	                        layout: 'form',
	                        items: [{
	                            name: 'action_argument_fileinto',
	                            xtype: 'felamimailfolderselect',
	                            width: 200,
	                            hideLabel: true,
	                            account: this.account
	                        }]
	                    }, {
	                        // TODO add email validator?
	                        id: this.idPrefix + 'redirect',
	                        layout: 'form',
	                        items: [{
	                            name: 'action_argument_redirect',
	                            xtype: 'textfield',
	                            emptyText: 'test@example.org',
	                            width: 200,
	                            hideLabel: true
	                        }, {
	                            name: 'action_argument_redirect_copy',
	                            xtype: 'checkbox',
	                            fieldLabel: this.app.i18n._('Keep a copy')
	                        }]
	                    }, {
	                        id: this.idPrefix + 'reject',
	                        layout: 'form',
	                        items: [{
	                            name: 'action_argument_reject',
	                            xtype: 'textarea',
	                            width: 300,
	                            height: 60,
	                            hideLabel: true
	                        }]
	                    }, {
	                        id: this.idPrefix + 'discard',
	                        layout: 'fit',
	                        items: []
	                    }]
	                }]
	            }]
	        }];
	    }
	});
	
	/**
	 * Felamimail Edit Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Felamimail.sieve.RuleEditDialog.openWindow = function (config) {
	    var window = Tine.WindowFactory.getWindow({
	        width: 700,
	        height: 300,
	        name: Tine.Felamimail.sieve.RuleEditDialog.prototype.windowNamePrefix + Ext.id(),
	        contentPanelConstructor: 'Tine.Felamimail.sieve.RuleEditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};
	
	/**
	 * get action types for action combo and action type renderer
	 * 
	 * @param {} app
	 * @return {Array}
	 */
	Tine.Felamimail.sieve.RuleEditDialog.getActionTypes = function(app) {
	    return [
	        ['fileinto',    app.i18n._('Move mail to folder')],
	        ['redirect',    app.i18n._('Redirect mail to address')],
	        ['reject',      app.i18n._('Reject mail with this text')],
	        ['discard',     app.i18n._('Discard mail')]
	        //['keep',        app.i18n._('Keep mail')],
	    ];
	};


/***/ },

/***/ 354:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Felamimail.sieve');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.sieve.RulesDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * 
	 * <p>Sieve Filter Dialog</p>
	 * <p>This dialog is for editing sieve filters (rules).</p>
	 * <p>
	 * </p>
	 * 
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new RulesDialog
	 */
	Tine.Felamimail.sieve.RulesDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	
	    /**
	     * @cfg {Tine.Felamimail.Model.Account}
	     */
	    account: null,
	
	    /**
	     * @private
	     */
	    windowNamePrefix: 'RulesWindow_',
	    appName: 'Felamimail',
	//    loadRecord: false,
	    mode: 'local',
	    tbarItems: [],
	    evalGrants: false,
	    
	    //private
	    initComponent: function(){
	        Tine.Felamimail.sieve.RulesDialog.superclass.initComponent.call(this);
	        
	        this.i18nRecordName = this.app.i18n._('Sieve Filter Rules');
	    },
	
	    /**
	     * returns canonical path part
	     * @returns {string}
	     */
	    getCanonicalPathSegment: function () {
	        return ['',
	            this.appName,
	            'EditDialog',
	        ].join(Tine.Tinebase.CanonicalPath.separator);
	    },
	
	    /**
	     * overwrite update toolbars function (we don't have record grants yet)
	     * 
	     * @private
	     */
	    updateToolbars: Ext.emptyFn,
	    
	    /**
	     * init record to edit
	     * -> we don't have a real record here
	     */
	    initRecord: function() {
	        this.onRecordLoad();
	    },
	    
	    /**
	     * executed after record got updated from proxy
	     * -> we don't have a real record here
	     * 
	     * @private
	     */
	    onRecordLoad: function() {
	        // interrupt process flow till dialog is rendered
	        if (! this.rendered) {
	            this.onRecordLoad.defer(250, this);
	            return;
	        }
	        
	        var accountName = this.account ? this.account.get('name') : 'unknown',
	            title = String.format(this.app.i18n._('Sieve Filter Rules for {0}'), accountName);
	        this.window.setTitle(title);
	        
	        this.loadMask.hide();
	    },
	        
	    /**
	     * returns dialog
	     * 
	     * NOTE: when this method gets called, all initalisation is done.
	     * 
	     * @return {Object}
	     * @private
	     * 
	     */
	    getFormItems: function() {
	        this.rulesGrid = new Tine.Felamimail.sieve.RulesGridPanel({
	            account: this.account
	        });
	        
	        return [this.rulesGrid];
	    },
	    
	    /**
	     * apply changes handler (get rules and send them to saveRules)
	     */
	    onApplyChanges: function(closeWindow) {
	        var rules = [];
	        this.rulesGrid.store.each(function(record) {
	            rules.push(record.data);
	        });
	        
	        this.loadMask.show();
	        Tine.Felamimail.rulesBackend.saveRules(this.account.id, rules, {
	            scope: this,
	            success: function(record) {
	                if (closeWindow) {
	                    this.purgeListeners();
	                    this.window.close();
	                }
	            },
	            failure: Tine.Felamimail.handleRequestException.createSequence(function() {
	                this.loadMask.hide();
	            }, this),
	            timeout: 150000 // 3 minutes
	        });
	    }
	});
	
	/**
	 * Felamimail Edit Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Felamimail.sieve.RulesDialog.openWindow = function (config) {
	    var window = Tine.WindowFactory.getWindow({
	        width: 800,
	        height: 400,
	        name: Tine.Felamimail.sieve.RulesDialog.prototype.windowNamePrefix + Ext.id(),
	        contentPanelConstructor: 'Tine.Felamimail.sieve.RulesDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

/***/ 355:
/***/ function(module, exports, __webpack_require__) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2011 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.ns('Tine.Felamimail.sieve');
	
	/**
	 * @namespace Tine.Felamimail
	 * @class     Tine.Felamimail.sieve.RulesGridPanel
	 * @extends   Tine.widgets.grid.GridPanel
	 * Rules Grid Panel <br>
	 * 
	 * @author      Philipp Schuele <p.schuele@metaways.de>
	 */
	Tine.Felamimail.sieve.RulesGridPanel = Ext.extend(Tine.widgets.grid.GridPanel, {
	    /**
	     * @cfg {Tine.Felamimail.Model.Account}
	     */
	    account: null,
	    
	    // model generics
	    recordClass: Tine.Felamimail.Model.Rule,
	    recordProxy: Tine.Felamimail.rulesBackend,
	    
	    // grid specific
	    defaultSortInfo: {field: 'id', dir: 'ASC'},
	    storeRemoteSort: false,
	    
	    // not yet
	    evalGrants: false,
	    usePagingToolbar: false,
	    splitAddButton: false,
	    
	    // disable this check as records are only deleted locally
	    disableDeleteActionCheckServiceMap: Ext.emptyFn,
	    
	    newRecordIcon: 'action_new_rule',
	    editDialogClass: Tine.Felamimail.sieve.RuleEditDialog,
	    
	    initComponent: function() {
	        this.app = Tine.Tinebase.appMgr.get('Felamimail');
	        this.initColumns();
	        
	        this.editDialogConfig = {
	            account: this.account
	        };
	        
	        this.supr().initComponent.call(this);
	    },
	    
	    /**
	     * Return CSS class to apply to rows depending on enabled status
	     * 
	     * @param {Tine.Felamimail.Model.Rule} record
	     * @param {Integer} index
	     * @return {String}
	     */
	    getViewRowClass: function(record, index) {
	        var className = '';
	        
	        if (! record.get('enabled')) {
	            className += ' felamimail-sieverule-disabled';
	        }
	        
	        return className;
	    },
	    
	    /**
	     * init actions with actionToolbar, contextMenu and actionUpdater
	     * 
	     * @private
	     */
	    initActions: function() {
	        this.action_moveup = new Ext.Action({
	            text: this.app.i18n._('Move up'),
	            handler: this.onMoveRecord.createDelegate(this, ['up']),
	            scope: this,
	            iconCls: 'action_move_up'
	        });
	
	        this.action_movedown = new Ext.Action({
	            text: this.app.i18n._('Move down'),
	            handler: this.onMoveRecord.createDelegate(this, ['down']),
	            scope: this,
	            iconCls: 'action_move_down'
	        });
	
	        this.action_enable = new Ext.Action({
	            text: this.app.i18n._('Enable'),
	            handler: this.onEnableDisable.createDelegate(this, [true]),
	            scope: this,
	            iconCls: 'action_enable'
	        });
	
	        this.action_disable = new Ext.Action({
	            text: this.app.i18n._('Disable'),
	            handler: this.onEnableDisable.createDelegate(this, [false]),
	            scope: this,
	            iconCls: 'action_disable'
	        });
	        
	        this.supr().initActions.call(this);
	    },
	    
	    /**
	     * enable / disable rule
	     * 
	     * @param {Boolean} state
	     */
	    onEnableDisable: function(state) {
	        var selectedRows = this.grid.getSelectionModel().getSelections();
	        for (var i = 0; i < selectedRows.length; i++) {
	            selectedRows[i].set('enabled', state);
	        }
	    },
	    
	    /**
	     * move record up or down
	     * 
	     * @param {String} dir (up|down)
	     */
	    onMoveRecord: function(dir) {
	        var sm = this.grid.getSelectionModel();
	            
	        if (sm.getCount() == 1) {
	            var selectedRows = sm.getSelections();
	            record = selectedRows[0];
	            
	            // get next/prev record
	            var index = this.store.indexOf(record),
	                switchRecordIndex = (dir == 'down') ? index + 1 : index - 1,
	                switchRecord = this.store.getAt(switchRecordIndex);
	            
	            if (switchRecord) {
	                // switch ids and resort store
	                var oldId = record.id;
	                    switchId = switchRecord.id;
	
	                record.set('id', Ext.id());
	                record.id = Ext.id();
	                switchRecord.set('id', oldId);
	                switchRecord.id = oldId;
	                record.set('id', switchId);
	                record.id = switchId;
	                
	                this.store.commitChanges();
	                this.store.sort('id', 'ASC');
	                sm.selectRecords([record]);
	            }
	        }
	    },
	
	    /**
	     * add custom items to action toolbar
	     * 
	     * @return {Object}
	     */
	    getActionToolbarItems: function() {
	        return [
	            {
	                xtype: 'buttongroup',
	                columns: 1,
	                frame: false,
	                items: [
	                    this.action_moveup,
	                    this.action_movedown
	                ]
	            }
	        ];
	    },
	    
	    /**
	     * add custom items to context menu
	     * 
	     * @return {Array}
	     */
	    getContextMenuItems: function() {
	        var items = [
	            '-',
	            this.action_moveup,
	            this.action_movedown,
	            '-',
	            this.action_enable,
	            this.action_disable
	        ];
	        
	        return items;
	    },
	    
	    /**
	     * init columns
	     */
	    initColumns: function() {
	        this.gridConfig.columns = [
	        {
	            id: 'id',
	            header: this.app.i18n._("ID"),
	            width: 40,
	            sortable: false,
	            dataIndex: 'id',
	            hidden: true
	        }, {
	            id: 'conditions',
	            header: this.app.i18n._("Conditions"),
	            width: 200,
	            sortable: false,
	            dataIndex: 'conditions',
	            scope: this,
	            renderer: this.conditionsRenderer
	        }, {
	            id: 'action',
	            header: this.app.i18n._("Action"),
	            width: 250,
	            sortable: false,
	            dataIndex: 'action_type',
	            scope: this,
	            renderer: this.actionRenderer
	        }];
	    },
	    
	    /**
	     * init layout
	     */
	    initLayout: function() {
	        this.supr().initLayout.call(this);
	        
	        this.items.push({
	            region : 'north',
	            height : 55,
	            border : false,
	            items  : this.actionToolbar
	        });
	    },
	    
	    /**
	     * preform the initial load of grid data
	     */
	    initialLoad: function() {
	        this.store.load.defer(10, this.store, [
	            typeof this.autoLoad == 'object' ?
	                this.autoLoad : undefined]);
	    },
	    
	    /**
	     * called before store queries for data
	     */
	    onStoreBeforeload: function(store, options) {
	        Tine.Felamimail.sieve.RulesGridPanel.superclass.onStoreBeforeload.call(this, store, options);
	        
	        options.params.filter = this.account ? this.account.id : '';
	    },
	    
	    /**
	     * action renderer
	     * 
	     * @param {Object} type
	     * @param {Object} metadata
	     * @param {Object} record
	     * @return {String}
	     */
	    actionRenderer: function(type, metadata, record) {
	        var types = Tine.Felamimail.sieve.RuleEditDialog.getActionTypes(this.app),
	            result = type,
	            action_argument = record.get('action_argument');
	
	        for (i=0; i < types.length; i++) {
	            if (types[i][0] == type) {
	                result = types[i][1];
	            }
	        }
	        
	        if (action_argument && action_argument != '') {
	            result +=  true
	                ? action_argument.emails + (action_argument.copy ? ' (' + this.app.i18n._('Keep a copy') + ')' : '')
	                : action_argument;
	        }
	            
	        return Ext.util.Format.htmlEncode(result);
	    },
	
	    /**
	     * conditions renderer
	     * 
	     * @param {Object} value
	     * @return {String}
	     * 
	     * TODO show more conditions?
	     */
	    conditionsRenderer: function(value) {
	        var result = '';
	        
	        // show only first condition
	        if (value && value.length > 0) {
	            var condition = value[0];
	            
	            // get header/comperator translation
	            var filterModels = Tine.Felamimail.sieve.RuleConditionsPanel.getFilterModel(this.app),
	                header, 
	                comperator, 
	                found = false;
	            Ext.each(filterModels, function(filterModel) {
	                if (condition.header == filterModel.field) {
	                    header = filterModel.label;
	                    if (condition.header == 'size') {
	                        comperator = (condition.comperator == 'over') ? i18n._('is greater than') : i18n._('is less than');
	                    } else {
	                        comperator = i18n._(condition.comperator);
	                    }
	                    found = true;
	                }
	            }, this);
	            
	            if (found === true) {
	                result = header + ' ' + comperator + ' "' + condition.key + '"';
	            } else {
	                result = (condition.comperator == 'contains') ? this.app.i18n._('Header "{0}" contains "{1}"') : this.app.i18n._('Header "{0}" matches "{1}"');
	                result = String.format(result, condition.header, condition.key);
	            }
	        }
	        
	        return Ext.util.Format.htmlEncode(result);
	    },
	    
	    /**
	     * on update after edit
	     * 
	     * @param {String} encodedRecordData (json encoded)
	     */
	    onUpdateRecord: function(encodedRecordData) {
	        var newRecord = Tine.Felamimail.rulesBackend.recordReader({responseText: encodedRecordData});
	        
	        if (! newRecord.id) {
	            var lastRecord = null,
	                nextId = null;
	            do {
	                // get next free id
	                lastRecord = this.store.getAt(this.store.getCount()-1);
	                nextId = (lastRecord) ? (parseInt(lastRecord.id, 10) + 1).toString() : '1';
	            } while (this.store.getById(newRecord.id));
	            
	            newRecord.set('id', nextId);
	            newRecord.id = nextId;
	        } else {
	            this.store.remove(this.store.getById(newRecord.id));
	        }
	        
	        this.store.addSorted(newRecord);
	        
	        // some eyecandy
	        var row = this.getView().getRow(this.store.indexOf(newRecord));
	        Ext.fly(row).highlight();
	    },
	    
	    /**
	     * generic delete handler
	     */
	    onDeleteRecords: function(btn, e) {
	        var sm = this.grid.getSelectionModel();
	        var records = sm.getSelections();
	        Ext.each(records, function(record) {
	            this.store.remove(record);
	        });
	    }
	});


/***/ },

/***/ 356:
/***/ function(module, exports) {

	/*
	 * Tine 2.0
	 * 
	 * @package     Felamimail
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @copyright   Copyright (c) 2010-2012 Metaways Infosystems GmbH (http://www.metaways.de)
	 *
	 */
	 
	Ext.namespace('Tine.Felamimail.sieve');
	
	/**
	 * @namespace   Tine.Felamimail
	 * @class       Tine.Felamimail.sieve.VacationEditDialog
	 * @extends     Tine.widgets.dialog.EditDialog
	 * 
	 * <p>Sieve Filter Dialog</p>
	 * <p>This dialog is editing sieve filters (vacation and rules).</p>
	 * <p>
	 * </p>
	 * 
	 * @author      Philipp Schüle <p.schuele@metaways.de>
	 * @license     http://www.gnu.org/licenses/agpl.html AGPL Version 3
	 * 
	 * @param       {Object} config
	 * @constructor
	 * Create a new VacationEditDialog
	 */
	 Tine.Felamimail.sieve.VacationEditDialog = Ext.extend(Tine.widgets.dialog.EditDialog, {
	
	    /**
	     * @cfg {Tine.Felamimail.Model.Account}
	     */
	    account: null,
	    
	    /**
	     * @private
	     */
	    windowNamePrefix: 'VacationEditWindow_',
	    appName: 'Felamimail',
	    recordClass: Tine.Felamimail.Model.Vacation,
	    recordProxy: Tine.Felamimail.vacationBackend,
	    loadRecord: true,
	    tbarItems: [],
	    evalGrants: false,
	    readonlyReason: false,
	    
	    /**
	     * overwrite update toolbars function (we don't have record grants yet)
	     * 
	     * @private
	     */
	    updateToolbars: function() {
	    },
	    
	    /**
	     * executed after record got updated from proxy
	     * 
	     * @private
	     */
	    onRecordLoad: function() {
	        // interrupt process flow till dialog is rendered
	        if (! this.rendered) {
	            this.onRecordLoad.defer(250, this);
	            return;
	        }
	        
	        // mime type is always multipart/alternative
	        this.record.set('mime', 'multipart/alternative');
	        if (this.account && this.account.get('signature')) {
	            this.record.set('signature', this.account.get('signature'));
	        }
	
	        this.getForm().loadRecord(this.record);
	        
	        var title = String.format(this.app.i18n._('Vacation Message for {0}'), this.account.get('name'));
	        this.window.setTitle(title);
	        
	        this.reasonEditor.setDisabled(! this.record.get('enabled'));
	        
	        Tine.log.debug('Tine.Felamimail.sieve.VacationEditDialog::onRecordLoad() -> record:');
	        Tine.log.debug(this.record);
	        
	        this.loadMask.hide();
	    },
	        
	    /**
	     * returns dialog
	     * 
	     * NOTE: when this method gets called, all initalisation is done.
	     * 
	     * @return {Object}
	     * @private
	     * 
	     */
	    getFormItems: function() {
	        
	        this.initReasonEditor();
	        
	        var generalItems = this.getGeneralItems();
	        
	        return {
	            xtype: 'tabpanel',
	            deferredRender: false,
	            border: false,
	            activeTab: 0,
	            items: [{
	                title: this.app.i18n._('General'),
	                autoScroll: true,
	                border: false,
	                frame: true,
	                xtype: 'columnform',
	                formDefaults: {
	                    anchor: '100%',
	                    labelSeparator: '',
	                    columnWidth: 1
	                },
	                items: generalItems
	            }, {
	                title: this.app.i18n._('Advanced'),
	                autoScroll: true,
	                border: false,
	                frame: true,
	                xtype: 'columnform',
	                formDefaults: {
	                    anchor: '100%',
	                    labelSeparator: '',
	                    columnWidth: 1
	                },
	                items: [[{
	                    fieldLabel: this.app.i18n._('Only send all X days to the same sender'),
	                    name: 'days',
	                    value: 7,
	                    xtype: 'numberfield',
	                    allowNegative: false,
	                    minValue: 1
	                }]]
	            }]
	        };
	    },
	    
	    /**
	     * init reason editor
	     */
	    initReasonEditor: function() {
	        var reg = this.app.getRegistry(),
	            readonly = reg.get('config').vacationMessageCustomAllowed && reg.get('config').vacationMessageCustomAllowed.value === 0;
	        
	        this.reasonEditor = new Ext.form.HtmlEditor({
	            fieldLabel: this.app.i18n._('Incoming mails will be answered with this text:'),
	            name: 'reason',
	            allowBlank: true,
	            disabled: true,
	            height: 220,
	            readOnly: readonly,
	            getDocMarkup: function() {
	                var markup = '<html><body></body></html>';
	                return markup;
	            },
	            plugins: [
	                new Ext.ux.form.HtmlEditor.RemoveFormat()
	            ]
	        });
	    },
	    
	    /**
	     * get items for general tab
	     * 
	     * @return Array
	     */
	    getGeneralItems: function() {
	        var items = [[{
	            fieldLabel: this.app.i18n._('Status'),
	            name: 'enabled',
	            typeAhead     : false,
	            triggerAction : 'all',
	            lazyRender    : true,
	            editable      : false,
	            mode          : 'local',
	            forceSelection: true,
	            value: 0,
	            xtype: 'combo',
	            store: [
	                [0, this.app.i18n._('I am available (vacation message disabled)')], 
	                [1, this.app.i18n._('I am not available (vacation message enabled)')]
	            ],
	            listeners: {
	                scope: this,
	                select: function (combo, record) {
	                    this.reasonEditor.setDisabled(! record.data.field1);
	                }
	            }
	        }]];
	        
	        // add vacation template items if needed
	        var templates = this.app.getRegistry().get('vacationTemplates');
	        if (templates.totalcount > 0) {
	            items = items.concat(this.getTemplateItems(templates));
	        }
	        
	        items.push([this.reasonEditor]);
	        
	        return items;
	    },
	    
	    /**
	     * get items for vacation templates
	     * 
	     * @param Object templates
	     * @return Array
	     * 
	     * TODO use grid panel for x representatives?
	     */
	    getTemplateItems: function(templates) {
	        Tine.log.debug('Tine.Felamimail.sieve.VacationEditDialog::getTemplateItems()');
	        Tine.log.debug(templates);
	        
	        var commonConfig = {
	                listeners: {
	                    scope: this,
	                    select: this.onSelectTemplateField
	                },
	                columnWidth: 0.5
	            },
	            items = [[Ext.apply({
	            fieldLabel: this.app.i18n._('Start Date'),
	            emptyText: this.app.i18n._('Set vacation start date ...'),
	            name: 'start_date',
	            xtype: 'datefield'
	        }, commonConfig), Ext.apply({
	            fieldLabel: this.app.i18n._('End Date'),
	            emptyText: this.app.i18n._('Set vacation end date ...'),
	            name: 'end_date',
	            xtype: 'datefield'
	        }, commonConfig)], [
	            new Tine.Addressbook.SearchCombo(Ext.apply({
	                fieldLabel: this.app.i18n._('Representative #1'),
	                emptyText: this.app.i18n._('Choose first Representative ...'),
	                blurOnSelect: true,
	                name: 'contact_id1',
	                selectOnFocus: true,
	                forceSelection: false,
	                allowBlank: true
	            }, commonConfig)),
	            new Tine.Addressbook.SearchCombo(Ext.apply({
	                fieldLabel: this.app.i18n._('Representative #2'),
	                emptyText: this.app.i18n._('Choose second Representative ...'),
	                blurOnSelect: true,
	                name: 'contact_id2',
	                selectOnFocus: true,
	                forceSelection: false,
	                allowBlank: true
	            }, commonConfig))
	        ], [{
	            fieldLabel: this.app.i18n._('Message Template'),
	            xtype: 'combo',
	            mode: 'local',
	            listeners: {
	                scope: this,
	                select: this.onTemplateComboSelect
	            },
	            displayField: 'name',
	            name: 'template_id',
	            valueField: 'id',
	            triggerAction: 'all',
	            emptyText: this.app.i18n._('Choose Template ...'),
	            editable: false,
	            store: new Ext.data.JsonStore({
	                id: 'timezone',
	                root: 'results',
	                totalProperty: 'totalcount',
	                fields: ['id', 'name', 'type'], // TODO use Tine.Filemanager.Model.Node or generic File model?
	                data: templates
	            })
	        }]
	        ];
	        
	        return items;
	    },
	    
	    /**
	     * template field has been selected, check if new vacation message needs to be fetched
	     * - do this only if template has already been selected
	     */
	    onSelectTemplateField: function() {
	        if (this.record.get('template_id') !== '') {
	            this.getVacationMessage();
	        }
	    },
	    
	    /**
	     * template combo select event handler
	     * 
	     * @param {} combo
	     * @param {} record
	     * @param {} index
	     */
	    onTemplateComboSelect: function(combo, record, index) {
	        Tine.log.debug('Tine.Felamimail.sieve.VacationEditDialog::onTemplateComboSelect()');
	        Tine.log.debug(record);
	        
	        if (record.data && record.get('type') === 'file') {
	            this.getVacationMessage();
	        } else {
	            // TODO do something?
	        }
	    },
	    
	    /**
	     * get vacation with template replacements message from server
	     */
	    getVacationMessage: function() {
	        this.loadMask.show();
	        this.onRecordUpdate();
	        Tine.Felamimail.getVacationMessage(this.record.data, this.onGetVacationMessage.createDelegate(this));
	    },
	    
	    /**
	     * onGetVacationMessage
	     * 
	     * @param {} response
	     */
	    onGetVacationMessage: function(response) {
	        Tine.log.debug('Tine.Felamimail.sieve.VacationEditDialog::onGetMessage()');
	        Tine.log.debug(response);
	        this.loadMask.hide();
	        
	        if (response.message) {
	            this.reasonEditor.setValue(response.message);
	        }
	    },
	    
	    /**
	     * generic request exception handler
	     * 
	     * @param {Object} exception
	     */
	    onRequestFailed: function(exception) {
	        this.saving = false;
	        Tine.Felamimail.handleRequestException(exception);
	        this.loadMask.hide();
	    },
	    
	    /**
	     * executed when record gets updated from form
	     */
	    onRecordUpdate: function() {
	        Tine.Felamimail.sieve.VacationEditDialog.superclass.onRecordUpdate.call(this);
	        
	        var contactIds = [];
	        Ext.each(['contact_id1', 'contact_id2'], function(field) {
	            if (this.getForm().findField(field) && this.getForm().findField(field).getValue() !== '') {
	                contactIds.push(this.getForm().findField(field).getValue());
	            }
	        }, this);
	        this.record.set('contact_ids', contactIds);
	    }
	});
	
	/**
	 * Felamimail Edit Popup
	 * 
	 * @param   {Object} config
	 * @return  {Ext.ux.Window}
	 */
	Tine.Felamimail.sieve.VacationEditDialog.openWindow = function (config) {
	    var window = Tine.WindowFactory.getWindow({
	        width: 640,
	        height: 550,
	        name: Tine.Felamimail.sieve.VacationEditDialog.prototype.windowNamePrefix + Ext.id(),
	        contentPanelConstructor: 'Tine.Felamimail.sieve.VacationEditDialog',
	        contentPanelConstructorConfig: config
	    });
	    return window;
	};


/***/ },

/***/ 572:
/***/ function(module, exports, __webpack_require__) {

	exports = module.exports = __webpack_require__(1)();
	// imports
	
	
	// module
	exports.push([module.id, ".felamimail-action-encrypt{background-image:url(" + __webpack_require__(763) + ")!important}.x-btn-medium .felamimail-action-encrypt{background-image:url(" + __webpack_require__(1136) + ")!important}.x-btn-large .felamimail-action-encrypt{background-image:url(" + __webpack_require__(1502) + ")!important}.felamimail-action-decrypt{background-image:url(" + __webpack_require__(762) + ")!important}.x-btn-medium .felamimail-action-decrypt{background-image:url(" + __webpack_require__(1135) + ")!important}.x-btn-large .felamimail-action-decrypt{background-image:url(" + __webpack_require__(1501) + ")!important}.action_email_flag{background-image:url(" + __webpack_require__(785) + ")!important}.x-btn-medium .action_email_flag{background-image:url(" + __webpack_require__(1153) + ")!important}.x-btn-large .action_email_flag{background-image:url(" + __webpack_require__(1517) + ")!important}.action_email_reply{background-image:url(" + __webpack_require__(804) + ")!important}.x-btn-medium .action_email_reply{background-image:url(" + __webpack_require__(1171) + ")!important}.x-btn-large .action_email_reply{background-image:url(" + __webpack_require__(1532) + ")!important}.action_email_replyAll{background-image:url(" + __webpack_require__(803) + ")!important}.x-btn-medium .action_email_replyAll{background-image:url(" + __webpack_require__(1170) + ")!important}.x-btn-large .action_email_replyAll{background-image:url(" + __webpack_require__(1531) + ")!important}.action_email_forward{background-image:url(" + __webpack_require__(798) + ")!important}.x-btn-medium .action_email_forward{background-image:url(" + __webpack_require__(1165) + ")!important}.x-btn-large .action_email_forward{background-image:url(" + __webpack_require__(1526) + ")!important}.action_update_cache{background-image:url(" + __webpack_require__(802) + ")!important}.x-btn-medium .action_update_cache{background-image:url(" + __webpack_require__(1169) + ")!important}.x-btn-large .action_update_cache{background-image:url(" + __webpack_require__(1530) + ")!important}.action_mark_read{background-image:url(" + __webpack_require__(800) + ")!important}.x-btn-medium .action_mark_read{background-image:url(" + __webpack_require__(1167) + ")!important}.x-btn-large .action_mark_read{background-image:url(" + __webpack_require__(1528) + ")!important}.action_file{background-image:url(" + __webpack_require__(8) + ")!important}.x-btn-medium .action_file{background-image:url(" + __webpack_require__(10) + ")!important}.x-btn-large .action_file{background-image:url(" + __webpack_require__(12) + ")!important}.FelamimailIconCls{background-image:url(" + __webpack_require__(65) + ")!important}.x-btn-medium .FelamimailIconCls{background-image:url(" + __webpack_require__(83) + ")!important}.x-btn-large .FelamimailIconCls{background-image:url(" + __webpack_require__(101) + ")!important}.action_folder_emptytrash{background-image:url(" + __webpack_require__(779) + ")!important}.x-btn-medium .action_folder_emptytrash{background-image:url(" + __webpack_require__(1149) + ")!important}.x-btn-large .action_folder_emptytrash{background-image:url(" + __webpack_require__(1513) + ")!important}.x-btn .action_saveAsDraft{background-image:url(" + __webpack_require__(147) + ")}.x-btn-medium .action_saveAsDraft{background-image:url(" + __webpack_require__(161) + ")}.x-btn-large .action_saveAsDraft{background-image:url(" + __webpack_require__(173) + ")}.x-btn .action_saveAsTemplate{background-image:url(" + __webpack_require__(146) + ")}.x-btn-medium .action_saveAsTemplate{background-image:url(" + __webpack_require__(160) + ")}.x-btn-large .action_saveAsTemplate{background-image:url(" + __webpack_require__(172) + ")}.x-btn .action_email_download{background-image:url(" + __webpack_require__(18) + ")}.x-btn-medium .action_email_download{background-image:url(" + __webpack_require__(73) + ")}.x-btn-large .action_email_download{background-image:url(" + __webpack_require__(91) + ")}.action_new_rule{background-image:url(" + __webpack_require__(807) + ")!important}.x-btn-medium .action_new_rule{background-image:url(" + __webpack_require__(1175) + ")!important}.x-btn-large .action_new_rule{background-image:url(" + __webpack_require__(1536) + ")!important}.action_move_up{background-image:url(" + __webpack_require__(752) + ")!important}.x-btn-medium .action_move_up{background-image:url(" + __webpack_require__(1126) + ")!important}.x-btn-large .action_move_up{background-image:url(" + __webpack_require__(1492) + ")!important}.action_move_down{background-image:url(" + __webpack_require__(751) + ")!important}.x-btn-medium .action_move_down{background-image:url(" + __webpack_require__(1125) + ")!important}.x-btn-large .action_move_down{background-image:url(" + __webpack_require__(1491) + ")!important}.felamimail-action-reading-confirmation{background-image:url(" + __webpack_require__(801) + ")!important}.x-btn-medium .felamimail-action-reading-confirmation{background-image:url(" + __webpack_require__(1168) + ")!important}.x-btn-large .felamimail-action-reading-confirmation{background-image:url(" + __webpack_require__(1529) + ")!important}.felamimail-action-sieve-notification{background-image:url(" + __webpack_require__(753) + ")!important}.x-btn-medium .felamimail-action-sieve-notification{background-image:url(" + __webpack_require__(1127) + ")!important}.x-btn-large .felamimail-action-sieve-notification{background-image:url(" + __webpack_require__(1493) + ")!important}.flag_unread td{font-weight:700}.flag_flagged{color:red}.flag_deleted td{text-decoration:line-through;color:#aaa}.FelamimailFlagIcon{width:12px;height:12px}.preview-panel-felamimail{padding:5px;overflow:hidden}.preview-panel-felamimail-headers{background-color:#ddd;overflow:hidden}.preview-panel-felamimail-attachments{margin-top:5px;background-color:#e8e8e8;width:100%}.felamimail-message-body-html,.preview-panel-felamimail-body{overflow:auto;font-size:13px}.preview-panel-felamimail-body ul{list-style:circle outside;margin-left:20px}.preview-panel-felamimail-body ol{list-style:decimal outside;margin-left:20px}.preview-panel-felamimail-body strong{font-weight:700;font-style:inherit}.preview-panel-felamimail-body em{font-style:italic;font-weight:inherit}.preview-panel-felamimail-body .x-form-textarea{margin-top:5px;font:normal 13px courier;border:0}.felamimail-edit-text-plain .x-form-textarea{font-size:13px;padding-top:5px;padding-left:5px}.felamimail-node-unread span{font-weight:700}.felamimail-node-trash img.x-tree-node-icon{background-image:url(" + __webpack_require__(1121) + ")}.x-btn-medium .felamimail-node-trash img.x-tree-node-icon{background-image:url(" + __webpack_require__(1488) + ")}.x-btn-large .felamimail-node-trash img.x-tree-node-icon{background-image:url(" + __webpack_require__(1848) + ")}.felamimail-node-trash-full img.x-tree-node-icon{background-image:url(" + __webpack_require__(1120) + ")}.x-btn-medium .felamimail-node-trash-full img.x-tree-node-icon{background-image:url(" + __webpack_require__(1487) + ")}.x-btn-large .felamimail-node-trash-full img.x-tree-node-icon{background-image:url(" + __webpack_require__(1847) + ")}.felamimail-node-sent img.x-tree-node-icon{background-image:url(" + __webpack_require__(1114) + ")}.x-btn-medium .felamimail-node-sent img.x-tree-node-icon{background-image:url(" + __webpack_require__(1481) + ")}.x-btn-large .felamimail-node-sent img.x-tree-node-icon{background-image:url(" + __webpack_require__(1841) + ")}.felamimail-node-inbox img.x-tree-node-icon{background-image:url(" + __webpack_require__(1113) + ")}.x-btn-medium .felamimail-node-inbox img.x-tree-node-icon{background-image:url(" + __webpack_require__(1480) + ")}.x-btn-large .felamimail-node-inbox img.x-tree-node-icon{background-image:url(" + __webpack_require__(1840) + ")}.felamimail-node-drafts img.x-tree-node-icon{background-image:url(" + __webpack_require__(147) + ")}.x-btn-medium .felamimail-node-drafts img.x-tree-node-icon{background-image:url(" + __webpack_require__(161) + ")}.x-btn-large .felamimail-node-drafts img.x-tree-node-icon{background-image:url(" + __webpack_require__(173) + ")}.felamimail-node-templates img.x-tree-node-icon{background-image:url(" + __webpack_require__(146) + ")}.x-btn-medium .felamimail-node-templates img.x-tree-node-icon{background-image:url(" + __webpack_require__(160) + ")}.x-btn-large .felamimail-node-templates img.x-tree-node-icon{background-image:url(" + __webpack_require__(172) + ")}.felamimail-node-junk img.x-tree-node-icon{background-image:url(" + __webpack_require__(1116) + ")}.x-btn-medium .felamimail-node-junk img.x-tree-node-icon{background-image:url(" + __webpack_require__(1483) + ")}.x-btn-large .felamimail-node-junk img.x-tree-node-icon{background-image:url(" + __webpack_require__(1843) + ")}.felamimail-node-unselectable img.x-tree-node-icon{background-image:url(" + __webpack_require__(41) + ");opacity:.5}.x-btn-medium .felamimail-node-unselectable img.x-tree-node-icon{background-image:url(" + __webpack_require__(87) + ");opacity:.5}.x-btn-large .felamimail-node-unselectable img.x-tree-node-icon{background-image:url(" + __webpack_require__(105) + ");opacity:.5}.felamimail-node-intelligent-marked img.x-tree-node-icon{background-image:url(" + __webpack_require__(1112) + ")}.x-btn-medium .felamimail-node-intelligent-marked img.x-tree-node-icon{background-image:url(" + __webpack_require__(1478) + ")}.x-btn-large .felamimail-node-intelligent-marked img.x-tree-node-icon{background-image:url(" + __webpack_require__(1838) + ")}.felamimail-node-intelligent-unread img.x-tree-node-icon{background-image:url(" + __webpack_require__(1111) + ")}.x-btn-medium .felamimail-node-intelligent-unread img.x-tree-node-icon{background-image:url(" + __webpack_require__(1477) + ")}.x-btn-large .felamimail-node-intelligent-unread img.x-tree-node-icon{background-image:url(" + __webpack_require__(1837) + ")}.felamimail-node-account img.x-tree-node-icon{background-image:url(" + __webpack_require__(1118) + ")}.x-btn-medium .felamimail-node-account img.x-tree-node-icon{background-image:url(" + __webpack_require__(1485) + ")}.x-btn-large .felamimail-node-account img.x-tree-node-icon{background-image:url(" + __webpack_require__(1845) + ")}.felamimail-node-statusbox{padding-right:5px;position:absolute;right:0}.felamimail-node-statusbox-progress{width:16px;height:16px;margin-top:1px;background-repeat:no-repeat;vertical-align:top;margin-right:5px}.felamimail-node-statusbox-progress-pie{background-image:url(" + __webpack_require__(720) + ")}.felamimail-node-statusbox-progress-loading{background-image:url(" + __webpack_require__(734) + ")}.ext-gecko .felamimail-node-statusbox-unread{-moz-border-radius:8px}.felamimail-node-statusbox-unread{border-radius:8px;background-color:#d9e8fb;color:#000;line-height:16px;margin-top:1px;padding:0 5px}.x-tree-selected .felamimail-node-statusbox-unread{background-color:#fff}.felamimail-node-accountfailure{position:absolute;right:5px;width:16px;height:16px;background-image:url(" + __webpack_require__(725) + ");margin-right:10px}#felamimail-attachment-grid .x-grid3-hd-row,.felamimail-recipient-grid .x-grid3-hd-row{display:none}.felamimail-recipient-grid .x-grid3{background-color:#dfe8f6}.felamimail-recipient-grid tr{border-color:#dfe8f6}.felamimail-body-blockquote{margin:5px 10px 0 3px;padding-left:10px;border-left:2px solid #008}.x-fmail-uploadrow .x-grid3-cell-inner{background-image:url(" + __webpack_require__(15) + ");background-repeat:no-repeat;padding-left:19px}.felamimail-recipient-grid .x-grid3-td-type{background-color:#dfe8f6}.felamimail-recipient-grid .x-grid3-td-address{background-color:#fff;border:1px solid #b5b8c8}.felamimail-recipient-grid .x-grid3-td-address-editing{background-color:transparent;border:0}.felamimail-no-email{color:#999}.felamimail-recipient-grid{background-image:url(" + __webpack_require__(15) + ");background-repeat:no-repeat}.felamimail-sieverule-disabled{color:#aaa}.felamimail-sieverule-conjunction{color:#15428b;font:700 11px tahoma,arial,verdana,sans-serif}", ""]);
	
	// exports


/***/ },

/***/ 659:
/***/ function(module, exports, __webpack_require__) {

	// style-loader: Adds some css to the DOM by adding a <style> tag
	
	// load the styles
	var content = __webpack_require__(572);
	if(typeof content === 'string') content = [[module.id, content, '']];
	// add the styles to the DOM
	var update = __webpack_require__(2)(content, {});
	if(content.locals) module.exports = content.locals;
	// Hot Module Replacement
	if(false) {
		// When the styles change, update the <style> tags
		if(!content.locals) {
			module.hot.accept("!!../../Tinebase/js/node_modules/css-loader/index.js!./Felamimail.css", function() {
				var newContent = require("!!../../Tinebase/js/node_modules/css-loader/index.js!./Felamimail.css");
				if(typeof newContent === 'string') newContent = [[module.id, newContent, '']];
				update(newContent);
			});
		}
		// When the module is disposed, remove the <style> tags
		module.hot.dispose(function() { update(); });
	}

/***/ },

/***/ 720:
/***/ function(module, exports) {

	module.exports = "data:image/gif;base64,R0lGODlhsAAQAPcAAOzs7evr7Ofn6OTk5eHh4tzc3dLS08fHyMLCw8HBwr+/wLu7vLq6u7e3uLS0tbOztK6ur62trqioqaWlpqSkpZ+foJycnZmZmpiYmZeXmIiIiWhpbHN0d3BxdI6PkoCBhKKjppGSlWprbXx9f3R1d3JzdXBxc4+Qko6PkY2OkIWGiLy9v7Cxs6ipq6anqaWmqKKjpZ6foZeYmsjJy21vcmpsb3p8f4iKjYWHioSGiYOFiIKEh4GDhn1/gnx+gZCSlY6Qk42PkoyOkYuNkGttb3p8fnZ4enJ0doyOkIeJi4WHiYKEhn+Bg31/gXx+gJ6gopWXmZSWmJOVl5CSlJucnZmam5CRko+QkYyNjomKi4iJioGCg9DR0s7P0MzNzr6/wL2+v7y9vru8vbq7vLGys7CxsqusrXp9f3l8fnh7fXR3eXJ1d4SHiX+ChH6Bg3l7fI6QkY2PkImLjLm7vLW3uKmrrIuOj5mcnZGUlfj5+fDx8ejp6eTl5d3e3s7Pz83OzsnKyra3t7O0tLKzs66vr62urqusrKmqqqWmpqSlpaOkpKGioqChoZ6fn5ydnZqbm5iZmZeYmI6Pj4qLi/////z8/Pv7+/n5+fb29vT09PDw8O3t7erq6t7e3tzc3NfX19bW1sHBwcDAwL+/v76+vry8vLu7u7q6uqqqqqampqKioqCgoMDAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAEAAKwALAAAAACwABAAAAj/AFkJHEiwoMGDCBMqXMiwocOHECNKVDjKQaNGDkZRtGghQimFChYQqgDhY8KKjRwVMokQpUqWB12u3Jhy5kmLL2nmvFkTpsFShRztPJiKTIFLlwqQSYWw6NEqkrYsQijITAJQH5yMUNTU6CUQMrJMJeoVrNiuR82ONej0a9i1BduqRev27EFEZd8iVGUlxou5BUVR0UOpsGE9VEQRFEy4cBAPQgwkJhhqkh/DOTI30aJxIGPDj3+cwNJZ4GfHHkSTXjwYdOrRpVmdphQaNuvGtF+v9twaterYo66Icf2bYHAXT6QAqb1bIIZMhqNTyoSB4PPoPHismF59oIQ+2LPz/2hywTp0w9l14FiSwXx49ezdo+cBv/3A6/Pryy+cfr195+fxR59/BEUCAxQzCKjfQAZCccMO4i3IyiiDSCfdIJ1RKJ0bd1RSGIYCjULIhm6U6MYbC4RYYXQmtnGiKSqS6IaLb8A44YqGtfhijCyWSKONGvY4446skIJjYTrWKJApckShxBIDUJKkjUw6yYSJPhJpCCcWRseJIQJtKd0OARj2pUCBACKdD2wOMUYDgYTJZXRs+tCEDzYkIueabN6Z55509omnnqyIGaidgwJqWJ1+EjrBCwdosqigf7IyQQhJ9ODDFJcwmqilmGpaJ6WEQtKldJAIZKp0XaAq0CGeSP9nxxx8FObJIapamMauvHa3anS89pqrdMHu6quuxR5LbLLOIeFGGnh8AUCxaXSHgbO81kGttdhSKywrv55KSargimsYubCae+uw0e0hBhxGxKtsdC3Ea++8htl7L7uF/aGvvOwKMEYK/xphrQpFFKzvwQkrDDArGCDs8MOGnnpmoXNaDCYraZoLSJwYn7oJGHFQoGhhebCxxspHmBxydCvH3LKim5wRM8suG8IFHSrfLLPLFKChhs83z8xK0EMTjbNASCu99I3mZsTjqVJPOKK4ZWR4pIUOkDK1YQRw0EEHJTDwNSVjp102j5WgkLbaZrNiCglv10123AzQbTfcAuX/vTffrPj99933YXIqJt05Z3iXiBP03al9SGDd4hY2XriFYdBAw38QU06J5qBzjoHhLIBuOucZmK765gSlvnrorb8O+0Cuy875bIdNxhtuuSs2UGWXSefHJKHcZiFivpvWW3QnaOD17obVID0RzrPmhfTY10D98wKRogER2U9f/UDegx/+9gSVH77243f//frox0VGJ5ZY0slSXdFvP/4HVYXAJ59AgBkEkb/63Y8pZNHf/RBRwA2IwASrQAgjTCCCDTgQgghZBQUt+MAIHkSDFbygBw0CQg5i8IMbFOFJHiCUB8TGIKNgoSNcSBFTFKIQpnhhQWLYQh0aR4Y0XKEjKx6BilMo5BSoeAQRjZgQJCqxiEdM4hKj+EQmIsSJU5yIFrfIxS568YtgDAgAOw=="

/***/ },

/***/ 725:
/***/ function(module, exports) {

	module.exports = "data:image/gif;base64,R0lGODlhEAAQAIcAAAAAAHBQEHBYEEBAQGRiYkD/QIBYEJBwEJBoIJBwIJB4IKB4EKB4IKCAELCIIMCYENCQENCgINCoMOCoAOCwAOC4AOC4EPC4MOC4UODAEODIEPDAEPDIEPDQEPDYEPDQIPDYIPDQMPDgIPDoIPDoMODAUPDoQPDwUPDwYPDwcIWEgIWPm42VnZCYnpSboJieoZqfqaCquKWwuq21u7S2tra5tre9tra9ub2+t77EutPOsvDIgPD4gPD4kPD4oMDAwMfLxc3Uz8/Uz9LSwdDVz9XVydbY0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACH5BAMAAAUALAAAAAAQABAAAAidAAsIHEiwoMECQSRAyHGQoJASPVI8uNGwAJESOwgQuNBgxsEhJXwQ+EFgAIkGMgrqCNlj5AAAI0QsiDHQCEseGl+K6KDhAAyBGHz04IHiBwAAPzxwsDAhgMAiEVKgOGGCAIAMSykIWDEQiAMTJkL8+LEhA4UAKgriYEDix8sfZ1kctKEAhNWmLSrWSPChQgAXFQXSQGDgReDDiAsGBAA7"

/***/ },

/***/ 734:
/***/ function(module, exports) {

	module.exports = "data:image/gif;base64,R0lGODlhEAAQALMMAKqooJGOhp2bk7e1rZ2bkre1rJCPhqqon8PBudDOxXd1bISCef///wAAAAAAAAAAACH/C05FVFNDQVBFMi4wAwEAAAAh+QQFAAAMACwAAAAAEAAQAAAET5DJyYyhmAZ7sxQEs1nMsmACGJKmSaVEOLXnK1PuBADepCiMg/DQ+/2GRI8RKOxJfpTCIJNIYArS6aRajWYZCASDa41Ow+Fx2YMWOyfpTAQAIfkEBQAADAAsAAAAABAAEAAABE6QyckEoZgKe7MEQMUxhoEd6FFdQWlOqTq15SlT9VQM3rQsjMKO5/n9hANixgjc9SQ/CgKRUSgw0ynFapVmGYkEg3v1gsPibg8tfk7CnggAIfkEBQAADAAsAAAAABAAEAAABE2QycnOoZjaA/IsRWV1goCBoMiUJTW8A0XMBPZmM4Ug3hQEjN2uZygahDyP0RBMEpmTRCKzWGCkUkq1SsFOFQrG1tr9gsPc3jnco4A9EQAh+QQFAAAMACwAAAAAEAAQAAAETpDJyUqhmFqbJ0LMIA7McWDfF5LmAVApOLUvLFMmlSTdJAiM3a73+wl5HYKSEET2lBSFIhMIYKRSimFriGIZiwWD2/WCw+Jt7xxeU9qZCAAh+QQFAAAMACwAAAAAEAAQAAAETZDJyRCimFqbZ0rVxgwF9n3hSJbeSQ2rCWIkpSjddBzMfee7nQ/XCfJ+OQYAQFksMgQBxumkEKLSCfVpMDCugqyW2w18xZmuwZycdDsRACH5BAUAAAwALAAAAAAQABAAAARNkMnJUqKYWpunUtXGIAj2feFIlt5JrWybkdSydNNQMLaND7pC79YBFnY+HENHMRgyhwPGaQhQotGm00oQMLBSLYPQ9QIASrLAq5x0OxEAIfkEBQAADAAsAAAAABAAEAAABE2QycmUopham+da1cYkCfZ94UiW3kmtbJuRlGF0E4Iwto3rut6tA9wFAjiJjkIgZAYDTLNJgUIpgqyAcTgwCuACJssAdL3gpLmbpLAzEQA7"

/***/ },

/***/ 751:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGKSURBVHja3ZMxS1xBFIXPvDfDblBXxWTFP5HKVkgTQgSNi1X+gOg/kCBoYZPCwlrRNmWSJhZGxSLlaiMIi5gUurPv5e0qb2dXnff2ODzQyiiSQvC7XLgwcDicO1eQxP/guX5aAQmHcGACeTyGr7igIxPAGBZHh0c/WWFhXMV+DOO7SRrURAAUAHSJzG+RRfRe9qEyUlkBMJUJwGBJ/9XTpVKpX59rUTVVaKsReiFqrAGvALxk5rehI+K3Z3CVzt9mwJ+slw/Lb7d2tqySCspTkEJCdRRwBaDluu46AAZqxTQIgxJnWb3JIIM/WBYfxHR3b/dKYajgq1TBT314TQ8dV2g7I3YwDY7DOS7YzTu3wG9c39jdWI3rcSoTCa/tQZ5LIAJ6okLS/GO+pwuXn+9do31tZ7Z/be+xxVRdKLBO5M5ySSfiUZvNyQf/AefJ+CR+t3ew35AtSUakSnLGNOI3dG8PCtyEGgbB+xN9anMqnzQbrXEuU+MO7r0F8VFM4oWvuJZ8wT94Bsd0DZAkw9ttdAnRAAAAAElFTkSuQmCC"

/***/ },

/***/ 752:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAFhSURBVHja3ZM/L0NhFMaf577vRd17e/VviujSgVEbg5i0OrAgTEYJs8FgRTr4BsR3EGIRsUgTX8BHMEjqz6JBm/e997olTFTFIn5PznSSX05OzmEQBPgNBoA/LOASF/ObYytow5c74ALHhuLZC094vA5q5WBfVTuegFOMp2Lpk8HEgHlzVZO23XvMNWY6EnCLdDLOaX54NKYjmkyR6qlpWa5z3up9KzAvzd3ieDFPi0L1KDBJNKNNaUjmIrQP2go4x+XpiekVJ+4IbWr4tg/taiAF1KMP0k5as2Kze+NTAWdYKBaKe7nhnNDUUFLB6/bg9/lAAkAauHVrwne9Citm+UPwvrTCSOGsNFkyla/QijZCiakAB0CsJXgrM2uIdCJ9yB32I0SihYX1TDITr15U8RimLutoyAaeu54REb0QTwLCkJBSQgSCsahr3zfutgGsvt4BQzCPHvyEIzSCkH/wTC+gE20yagg4lwAAAABJRU5ErkJggg=="

/***/ },

/***/ 753:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAK8SURBVDiNjZPNb1RVGMZ/7/2czhdMp/PdUWpMJI1xgRvCDlY0ukAWsNSlRqMbE0JcoImu/ANMhAVqYiHGhRsKYQEJhoXWIVqpWtPqqNNSRzKt83HvzLn3HBeWZigufFbP4j3P++TN74gxhnG9WysfS/j++5OF8pO5cjUdjsL+/Y0/Vu+3/3z9XGvzFnsk4wHvTVc+rxVqL8weOiT5x+oka1X8chl3MscvV6+ZhUuffHZmZe30eID1wLxdK31c8rMnD05NSVopZHub4crPqFaLcHWNQr0ux48cPfXOdOnCIw3O1AqHK9q7fdD1JJfP4yiF9PtYUYR4HnalgjczQ/D3Nr81GrpRGBw/12hf3w14q1q8Mktirmbb+Bh8M1YNMICxLDarETfKIZnpx8n4/Xuu2nzRAfCwns5Y/z6xdk4ijk1ubg61sUF3cRGjNTcSf3H2jefxiwfwivXy7zc/OOsA2Eb2u7K7Cw2sR4r28jIpW0gYQ+QbhloxMVqieXsBN5Xny++CwxZAiG7FgN6J0IAoxeVvFrm3dBcDyEioTyYYBQNy+9P0ul0Wf+ytWQAB8VcDrYmNQQHaQM52mUsmSdoWMYI2MNvaR/NOQGujE99sxIOKqJ4F0E1GrzW1ChUwApQAAiXXI2M7KAxKYKIjLH3k9r+4mqjIIKsTfbVgAXy4utX91Rq+0jaxCYEQGIoQiaBEGIoQAD2MaajwpWeenX0501/3w4j5h0h8dTr/3FPG/3RG3Kw9RpkG1ok6yxKcrh/1vs0m9y3nOysXT1w2b4oxhvP1A4lOcap/ZKtn9aKIH0Y9BibGAYJYY7ShKA5Vf4K859OMR+ZKtpme/94MHABljF3abFupZJqUbVPy/Ycgkj0fyEQjuXQXPQ84ADGwrWMU/09bcbzrdxoQ/xQEPOF6e0blPxx8nZp4gAv/ABGSO6pm4y57AAAAAElFTkSuQmCC"

/***/ },

/***/ 762:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGaSURBVHjatZLBSgJhFIXPP83YjEFmRKESbdoUbaLa6DME9QQ9QVt9BaFV4iv4AG5aKSYt3IgYliCMYBYMaGWKZE45tzuQNDZiEHTggztnzn/mMvwgIhesQDQaPctms9f5fP4mFoudAwhOy7qMUCi0ncvlmo1Gg8rlslWtVqnX61GxWHzkdzszC1hyKpW6rNfrlEwmbyORyFE4HD6Mx+OlQqFAmUymaGdmFWxUKpU+rz1SFGVz7PO8ziX9Uqn0amecZyRMakXTNG+tVjNM09THJs/3zWYzbRhG28448q4NDnRdp0QioU/5sTKzyChOn023VFWlnx6HPwD0fvqC6Dt7kTyh/b07tB+6aLVMPD0PIUDwLc5jLaQgsL2Lq2wHx6dpgS9NbGARh30GlIEOGhAWJMCrAppG8K9K8Ae3OGPBKQlTZWFuTmA0EmDxDMiyBSHgkGsDd4kk4VfNjMiy/fU/FTj1zwXyRJsQ6HYDaD950Xox0ekM2SMs+TzoSx4El1V+Hky/B0IIDwDVwTyjMIKxmHdmyLx9MbAv1yfAGx6me2xH6AAAAABJRU5ErkJggg=="

/***/ },

/***/ 763:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAGuSURBVHjatZJPa9pwGMe/T0xsUiW2g7W03U6DwQZCS+tLkA48ed5hr8B3UvCy4nHgGxAv20FEYeB1OIYg5iIU2ympNahp2pmnj+DAJGWe9oEvJD8+v+/vyR9iZoQhIjOXy33M5/MfNE1Ty+Xyt3q9XhbXiciyGIhwVK1Wf/T7fbYsi3u9Hg8GA242mxaAV2FfDZ2slEqly3Q6fVyr1W4ajcbFYrHgTCZTyGazbyqVyhdxzmWj/+wEwut2u+20Wi0/mUym/64nEom3xWLR7XQ686WzvkdBkJciJ7vd7u/pdPoLK2azWc+27Z+e5+lLZ82PFMQk5DjOjIW1KdkwDHc+n9PSCRVE0XWdEcI0Tcj7iLiBz/j18yc+O+1jdDXBcPgA+9YDgZEyt7B/pOHg/Qm+18fIF6qEFYGv4LPIqWtorgV2GQkF2NYBw2Ds7inYPXwnjo+NjyBViMVIRiYIcg2oqg+igBSeIFqiKNjIPxVVXZ6+qWAj/7lADbQRYTI5wMjexvDuAeOxJ2uMnVQcUyWOwxe63LvP/wdEFAegr2VLoklI4kseJZ7kfhVX9v55AgNx3j3S4ISxAAAAAElFTkSuQmCC"

/***/ },

/***/ 779:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJ0SURBVDiNfZK/S1tRFMc/973kvuQl1l+QRNSCFaz4C4eWlna12MnB0dlB6L/goDiIu90Eh7qJmyBSoVOgpUMHdTBYRaE2qaJJ9D3Ney/3djBPI5UeOHCH7/mc8z33CK01YfwaGemWmcy7aDrdLzOZgSspBwGSnrft5fM7fqGw6+Xzn9u3tn6GNSIEHA4MTAYtLR+/FAoyYhhUq1UsKRGA5/tI0yRpmvQ2NXmxi4sPXTs7Sw8AB/39hU+Ok7I8D1NKhJQYlgWAqlTQnofyPBricd7HYn+e7e6mHwB+pNM3T/r6rO/ABVBSipLnAdAoJY2GQTPwErjY3q68ODuLAURCL065fB7J5dredHZid3QQ7+rC6ulBK4W7t4ezv8/l0RH5w0N81z0P6+4AAsqqUmmrnJxgFItEDg4gm8V1HBzHwXVdXNcluL4GIcphncF9lAGEEJiGgWhvRy4sYC8sYMRiGEIgQqXWjwJK4UNpTXxmBpXNEuRyNMzP46dSPKa9B9RRq5kM1dNTjPV1vM1NVLmMeXZ2JxW1aR8Car4qnZ2Yg4ME09O3Szo5wZmdpXFujmo0etvrMYAQogRgtLTQPDWFMs36jkQaGoiNj4fify3omgU5NERxeRl8H7RGa42fSlHa2CDe3f3fCYoA/toaybEx7NVV1MQEaniY9pUVGkdHKS4u1rasind14SVmbftp0ra/JhKJtkQiQdK2sSwLx3UpCcFNoYDjOFy6zu/AD16PaH0MdYf01nWPv7W29l6Z1clmUw2aQvVEBc+raAL3aq8YUbliVG03+8HSq7ofu5tACCGBWF1aQLS2QwX4QAW4qeW11jr4CzA/IOTGcotSAAAAAElFTkSuQmCC"

/***/ },

/***/ 785:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,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"

/***/ },

/***/ 798:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAKuSURBVHjajVNbSBRhGD3/zOyo7OC64yVYUpOkiNIeEpIg06ik9DGRnmqjDJ+yIOolXe0hEgIjH4pCeyoWoggvUA+KPWUkGEJWSGHBauu6ujuzO3uZS9+MRmIEHuZwZub/Luf7mGGWZWEjGvfcLiDpIDYwxmTGIIMhxMCCpMHRmes/sQFOgfVEgYI7i3yeK0eaqiRfmYy8PBG6biKpprAcVjAxPGOtRNTuoelr3f8UOLnvzkDdqb3+6gPlSKsZGJRomkTDgmkRDQM5+bmYm13E+7Evg+Su7eWHqzoHQlN1b9eho7v9Oyu3IR5RoSXS0JIZR2vqK5DN6M5zNBRDkdeNmsOVfo5nnY6D5v29pXKxNH+suZrpWbvjWmfDtJBOZXH5ViPZVzHybBrLi4rjhvEcZmdCaiyilAocx1rLK4qZEtOQSGgwyKpu2ycmNQ02CksknGmvxaunU/g8tQgaCL6yQkmJJjoEjuda3TRbOLyCQH8L/geXKOD0uYN4t+Or40aQJNAYDeSA86VTOpRYAltBbf0ukGuMDs2B5zhZ4HkWXVqI+2JqHFvBxJtPeNL/Fsx02Q5k20E0Eo5Bp8WdqArQAg0YlunoamwFHxceguAs9G7gBSbHvsPr8cBiOmj8kEBVxhljdSJttqSoBIzBAb2zLcLGj29LuNE+ACMpQvZ6nTO2FhTkCH00U5ynAqREDs49zyCKORh+Pom2lvsQzXxItLg/cdTdIg06X+LZ4w96GHDTrgznWtNMNg1NS8Fb4KFmHDYh8GjkQrcAgKyyHorYTvn+nFwRbrcIMVeAS6Bj6mY3MXQD6bSO1eUECIN2MghOgYHXl3SS8xebHs/rWb3LtFzMK7tRUOiGIPBQlRQivxRiPA7gHrFn08/0F1SklKR1nT5idJ3jxD7qvIoN+A1OGiwcyVC6/QAAAABJRU5ErkJggg=="

/***/ },

/***/ 800:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAG7AAABuwE67OPiAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAANtQTFRF////AAAABQUFAAAAAAAAAgICBAQEAAAABAQEAAAAAAAAAwMDBQUFJCQknJycjo6OkpifoaSopKeqqaqqq7C2tsfat7e3t7i4uLi4ubm5urq6vMbRvczdwcXMxcXFy8vLzc3Nz9DQ0NDQ0dHR0tvn093p1eL01uDs1+Dr2NjY2ODp29vb2+b13Nzc3OTu3d3d39/f4ODg4eHh4uv24+Pj5OTk5eXl5ezz5ubm6Ojo6enp6evu6e/36+/07/P48fHx8/X29fX19fb39vf5+fn5+vr6/Pz8/f39/v7+smD1KwAAABB0Uk5TABQbHjQ5Oj9ASktPcobi7Oqt4PkAAACySURBVBgZBcHNSgJRGADQc+d+zmChkJSCRi7E3qKnb9sLtMvAheImKFHn53ZOALIeCFVOqlFS2kHphzB+A8D7X+BUtbkb9Y3LgpCGPi4PM5gMSUQujyYKkCNyKqeqzW091C6LlMP8eLjvkpRnftN8F+phehrlZDhfn4ZaaDTT4zkpd0sIY6w/a7c1CBXX/WvovlYNwsi+2qLeHn5WhPL9HMCy270I7QZA3pzF7UMCoNz+ATSsPCOcl9KGAAAAAElFTkSuQmCC"

/***/ },

/***/ 801:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIwSURBVDiNrZPNS1RxFIaf351756ozzvgxeC0dqWYhVLrIj0qikiijhZiEQdA/UIsWLaRatGgXRRAE9kW1aRNJ+DFJYY6Q1sCA0qRTLgydTBvG1LFxruOduS20yCih7Kzf5z2Hc84rTNNkPSWti/4fBgKwA9v/kX8rAxWjn2Z8xS7bX5Efo3G2bMzdLwPiSxyGxsLs2VqAqljWBBeXUrwcjrDBlQcgZACnzYrTVkhfKEKBw0JpkfO38PuJOSKxFFq+giNLAVaWqCoCVRGUezTUDDveQJhYXMcwDAzDIBbX8QbCqBl2Rqd9HH1Qw4mWg5BNpgygyuJHl8LcTLQcD7c7fVR63AgEI5MJmmq30RFo5dbwVS40nadvqI/AgVdnZQDrTwYLi0tcfHiJ7qlHeEeKuX78Do2b3LR47/NkvIXGqgZ0XSeVSGOz25zS9wlUWTAZjdEz+ILeyGMaqo+gubM413oaX+g5HaM32VdWTTK9QP9gL/6gn3hP/IoEYJppRsLTFLmyyHMq2Cwqs4kpCrUcHJrBte7LVJRvJinm+TDxjkAwSPuZDpjgs7w8dooyjwZA3Y46uga66A89o6TUgXAtUeIwGdffkJ5RCYdSPG3uxGV3A8uf6AJ2rrqXQEi10qmq3SWH83fNi3SmgTSVbfrbv85Pv55tZozwitIv/pRGUS+EVSj3airdJ4urhdR1Nzob1ef2mm1mcJVurTiLeiHJaemGZMiHktbkMbPNHPhV8w3lhszbfg/zbwAAAABJRU5ErkJggg=="

/***/ },

/***/ 802:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAG7AAABuwE67OPiAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAATtQTFRF////apWVZ5GfVnaBZ5KfapWjZ4+eZ5CeTKYqeqOuMkZMMUVKMUNKMURKUG53lrnCZoaNb4iNmNLVsMjMg8HEbrW4UpmCVZuHZK6xu9XZTYaJUJqTUpqNUpyVVJyQgbaiibys2Ons4u/wWKWo3PDx6/b2RICCqc67qs+93/HyEVs0Els1KHgscIKDd4eIt8LD4O/wEFokEVwmF2IhGWMiInMiJnUkJnYoK30jL38mMXUyMXYxM4clNogoO5EnPpEqRJwpSZwuSosjTKYqTZEpUpUnVJcsaaMuaqMybq0sc7IufYWGgq5ZhK9ajLJykbV+lLVzlbZzlpycm8F4n8GCoKSkpa+vqK6uqq6uqsSOq8SOyNiuyNmu0tLS2NjY3+jP4eHh5eXl8PDw8fHx8vLy9/f3+Pj4+/v7////HT95ZwAAADF0Uk5TAAwlRE1vdHyAp6mqq6u10djy8vX3+Pn5+fn6+vr6+vr6+/v8/Pz9/f39/v7+/v7+/lCM06oAAADGSURBVBgZXcHLTsJAFIDh/8xMBSZYL4AxGN2Y1J0Ltvr6vgfiqnipgKYtnTljCju/TzgYPvHS0LMcPN/l+ZKeA04EDaID0h4cmJthpyp6mzWvigPrSqa1hC8mVnHgzXwUg8R7s/EbLHKRZteXTZz5tjK/WNz0p5LkTP2+bMc7NWS5pLLqwudaJc9w+EI/wrqVbZdNirfaUhTzq28bgx0tHvy2dKweJV/sgPFpk1Y4kkXPzoG0NyQcaqCjJ4Ii2IEIRxLbyH9/GNJPjjumNRwAAAAASUVORK5CYII="

/***/ },

/***/ 803:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAMCSURBVHjafZNfaFtlFMB/33dvs6xJujTGtIRkzK1L/cccnYXW2amDqSh9mbBUULbswbkNdRVFGHS1A0WZwoYirg8duMEoTNS34dzWIcpetocVIcPObnW2WWez/GmTJs3N5zG0Uhj4g8P3Xe65v3M4nKuMMSxHtb3jB3UAZT2HtgJKWQG5Tyqth+Ucdn7t/5Nl/CdQm961JeFQNBzsffWlDu/aSBPe+hUsOFWy+SKTd3Oc/nHUTM0UBhZGegfuE+iOvqEdL7Ynutpi5IsVHMdQqVZrpyM5cmWVx8XV6yl++OXmCSn2RunsropGsJ7+qL97a3vi8dgaUpl5coUyG9Y2imgBkdWivTXI7ZkioYCfFzpjCVXnOYSg7Wc+j0bCTf2PrIuSmS1RkZbjWx6iuyNCJu9Idc2ubS1s3xwVsWFmrkqDp55I0wO99a+c9du6zhOPrYmqrFQNBzzsebmFkN/NyZFpmYHFwZ5Ha88IdzJFbJeHqoF10aA3NZs9YNmt8WMbYqHw1iea2d8dQ2vNvuM3KJSrfLLzYXz1dSzR9ViQgFcxmS4x77iYuKc07u4zfx05kzRLvH70utn79e/m/yiWHbN/MGm8O0d/0zKM9NC5KT4YusZ82WFwXwtg2Ht8jGKpwnIc6R3BXad5flMETDWotQgmsi6+/GmWp96/xHhqjq/2rGdzq5eOt78jeXuWJZrjJ9nWd4kj398k5FMol/fOvx1clMByNTCWa6br4BW+Of8Hrz3bTDIFW/pGOXVhHISybuRKZiMfn/Nx+nIBU5o7r3yJpF/W9RbaapATlMYpZ+hpK3Hq53u4Q09SLaXp2Zhn+HIO68FOkDylMIXxkc7aJvrfnDqstNWH0tReShhTQaGR7hA5YgUMyl7JIh/OfDvwaU0QeCtry4eDkphoWGnh99h43ZoVNlia2hrLfJE9YyINwom/P2M3go2Q/mJVBdgdfI9bcwv0+wxqdQBWN1KTTOfhxl0YmyYHHAMO3/czLSGSKBBfjDCQXoyLwFGpnGEZ/wDYc1Xe08V51wAAAABJRU5ErkJggg=="

/***/ },

/***/ 804:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJvSURBVHjapZPNS1RhFMaf896vcpwxnVHHIDIYjCKwEBJykSIUROQmRaNoYYsS+g+yTYsWUlBBiSXZSsUWSYRE5SIQdwmDEgPVJj9Gm8ukM2Nz5+Oe3rnz4Ve7ftyHB87hPu/LuecSM+N/ULELujBlwPOnl4ToOVjlqrWBivBG+isDYyBjgl+1m9jGjhtQ99sOX4U+eKnJ7z9xyANdEwAIqSxjfjGBybmIacazHTzSNrMngK5OtQT8ZdOXT9fpqiIAIkgKTo5nbMbrL2bqWyTVxYNnJksBdP2T1+tWQhdPVns1Nf+yYKD9MOPDT7UY4Fg6C7xb2AhHku56fhywRH4S1Hmk1u01NxnhmI1YwsKNZje62o4hHLcRTth5jzPMJFBf4/JDxHtLQ9R0oweKilUZECi38LCrAX6fGxKnJindAMSAUKGpxhUAT52ANKkNwdU0bjYCA9dOQdcUFPl4qx6LaxuYXviFl/OExaSO38ks0kKr2vqMihZNsfAnMxnsxuPah+NHcqrBuUYTzUMmUqQDKlVCUpiBbkLVMBRyofVBECuRGIpU94dwdiCIvpEgBBGen1dyB0qpoa0ARR+VchqzUQ+anixhdmEJOSJ2GT6vV+HZdx8aXyRgZRjyMCljbCsgJYZlcTnf0LGSLUfrOGPofQiFmuObogyP5oD9umJCNyZ2LtKd5Q4QjUsZ+YkLKIKQW6q0zZBPEUv22rm/cmbvKt9bawGLNwTy1bkF6soFql2E1TjjRzSLdYuXAfTxXe/k7lUuQfdjXmSsTjB1E+EoAVGb2QTRKA5Eh/l2wPrnz0QSaYqUKIgcz8MF2dvFkr/Zuvmi+se0ZgAAAABJRU5ErkJggg=="

/***/ },

/***/ 807:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAALKSURBVDiNZZNPaGNVFIe/++5L8jJNmjApIQmxtOCMtmD/WC0BZ6GL6kLoysEi6HI2FqRLabddF7fuXKiMuDMgs5iFRaQDUjMlg06D2FQqvo4kbZImNy+597qY5jG0B35wFr/zncPhHGGt5WpUq9W7Usq7SqmSEMJ2u93q2NjYd/Pz819d9YoXAQcHB8VIJPIglUrNep5HNBpFCIEQAq01h4eHp8CdpaWl2qjGGSX7+/uv9Hq9PxOJxGw8HkdKyQhurUVKyczMTDafz/++s7Pz3jWAEOKHTCYTjcViz4swPDl7zJPGY876zXDK8fFxubKy8vX09HQsBOzt7X1qrb3leV7YcaCH+J1/Ob3wuQguMMaEE01OTmbW19fvh4BWq/Wh67qhwRiD0ZpOv01btQkGCq01xpiwQalUui2ESLkAJycnr01NTRGYgId//4iDg0DQCTpIJAf+bxz+9xSJ5NXsLLlEgVwulwNuuZVKRSilkkoprNHs1h/SD/qofh/V72G0JSY9POERl3E+mPuI9Es3GQ6H6WQy+bKzsLBgG41G8+zsjG6nR1KnyDhZcpE8p+c+z859ojrKRDTLmEhiAkOn06HVav3Tbrc7LsDExMQfWus7N7jBvdnPcByHnu7xqP4LVlvemVrh3dvv4zgOQgiCIKDZbNaAugPQ7Xa/Pz4+ZjAYhIvCWszwuV48VmMMQRCwu7tbBY4dgI2NjS/q9frTIAhQSmGtxXVc3iyUeKNQIpfIh9tXSuH7/q/b29s/WWvP3RG5Vqt9kk6nHywuLqaFEMRiMTbe+hwpJQCDwYDhcEi73X62tbX1LVC+9gvLy8tLq6urX87Nzb2ezWZxXTcEXP7Cz5ubm98cHR3dt9Y2rgEuTzq1trb2caFQeLtYLBYjkYj1ff+vSqVyVC6Xy8Aja60O/SOAEMIFvCu6CbhAF2gBfUBdqmetNf8DvDpoXqgWRFEAAAAASUVORK5CYII="

/***/ },

/***/ 1111:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAH+SURBVHjapZO9axRhEMZ/77vv7e5tcsslMZcopokSSYKVjSGFSsBKLATFThEh+AH24p9gYykWEQJapYyljYkiaSSgoKAJEs3HmVw+du+Wu90dc4eceBxi8AfTzTPMPA+jRIT/wQBMz5eeGy1XAQSKe2UuTU50z/EPNDZ4/LI4ZxvG+UUqiiQV/kaSqtlbE4cuqNtTn+/HcXJPJC1wAJTSG8ZYj8x2OTOZMXZecTBEyAdlmTSdnhdYmoPRPINgf4AbKoR2aGKypkYYZ2mHoEKTy5oglQTaxHm5+yG+38PT5Zsk6FYT0MoKTIdHEMdKtepPyDNGBodAO5wNZ5nfvdiiV8qY+gmuFVZrqRZROFLklDPDYH4LP9eDZSmobXH6sMNw1xM+lgq8i86TKK+xgJ2xwn0PVFiJtEYEr1pitH+FDi8CNiCJQCscN0/BP0auc5OVT4vsuWONHLOuCnXOoew5SnmuBn+Yt0sFqtESqEUwXyGzA06NuLbO68XvJF3j1HvrmrrWLK/thlbGbppYsu8wuj5N31CJBmIB71n90seH3AsIqk0Tf2yHoQI8YAxoZrW5kJvpHlF2UgG0xrKFlYV4c+BceJ3fVIA3bb9x9VVfsRYnlWAtmnJt/I6jmWsSpd/6z+ycpBUR+aMAdfeK3wvkgSPAAND74IZ3HDCt/T8BDe7X5F5/ONEAAAAASUVORK5CYII="

/***/ },

/***/ 1112:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIHSURBVHjapZM/aBRBGMXfNzO3d7d3e5yJMQlBSWIVEe0Cp2hh1EItNIV/QhQ5kUMbe7EVKwtLCcZCiaVaWISAfyAholgcKoJoULEQL5g17m4uud35nFtjTCSIR37wGBjmfbw38BEzYy0oGG5NzNxRgo/DwEDlR4D+Ul/TOP6DOMH1h5VxS2EnFtFMiPS/k0WaHpzrW3+Izt98fzEMowvMegMagEh8VUpeU26QKCWUlSc0BjPyXsAllbVtTwo0TlwDnhmQ8gmr993zcQRah3jcdWr1FCBfOWnlaY7iTMuRnyex/c1EPPpZqgvo3P33J0CQ9FTGhheGRMv9vlvB0U9jmD3cDx1FOPb0CUZatyCTb/njNyhVr5CS/kJNC2b61SusoXXmOXIc4XXCgpYaPeE8Nrsv4LbshxByKYCVkL7I2uSnk0LYSUJdqE5jV3kMubMlOI4Tyz5dxA5zR/Pf8Pud8cRe5SQREBMBhDpb3VewmpthdXSgqVaD1hqJ9nbITRtRcF/iXdu+pRZZ41Ufvsz60kQFM1K0gOyNq2i7dx8kJYIggDRnHefEAL4PnsTclQKqbMUdpl3fJwC2UcEo/ehM8fK6cnlb7sBBWMwQWgNGzIyqOSujo/B6e8t7h4YuAZgzmlyxjW+Hh4+EU1ODSaWQMbKlhEWEIAzhL4q7u2/3FIt3VyzTWvgJvDrSue43EysAAAAASUVORK5CYII="

/***/ },

/***/ 1113:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAG7AAABuwE67OPiAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAALdQTFRF////AAAAFhYWnJychISEAAAAAAAAAAAAIyMjTExMmJiYsbGxwMDAX19fkJCQtLS0uLi4bm5uZWdqcXR3eHh5fn5/hZSoiIiIj4+PmK/InJydn5+foKGhpqenpq+8rMHarrK2rsHVs7Ozs8fes8jetLS0vLy8vMravcPNzdro0dzq0tLS0uDx2NjY2uPt4Ojz4eHh5eXl5+ru7e3t8PDw8fHx8vLy8vT38/Pz+Pj4+fn5+/v7////TOpnCAAAABJ0Uk5TABofK3R7fX6AqL/CzNDm8vj8GXUSWwAAAJBJREFUeNqdyNkWQlAYQGFzZqEIZWgyc9Ak5/2fqz+di9bqru9ub+o/6pJQP83kTyJn5sGFTnwGsRNy85CLO1HI89CrqH+APqr0d7Nm1h7TYUgPbWayMBR3bTeJ5yWNvXIVGAYed1bg+4G1HbEBQyvr634DTre61GBICHUTBlOHkARDvHwRYdC8sCAEnqZ+vABANRRmqx+LYgAAAABJRU5ErkJggg=="

/***/ },

/***/ 1114:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAA3XAAAN1wFCKJt4AAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAANJQTFRF////AAAAQYfbAAAAAAAAAAAAAAAAAAAASYzcQojbRInbhrPnQojbQYfbQG+oQYfbQofbRInbRorcSIzdSo3dTI7eT3itT5DfUZHfU5PgVZTgbZzSdJCzdZG0eJW2fZe4g5u5iaC7jrHcj7Lgmb/vn7zhrsbmrsfmr8vusMzut87puM7pvs/kwNTswNXswdjxwtLmw9nyxNryzt3w1eLy2uHq2+Xx3Of04unw5uzy5+736fD48PDx8PX68fX68vb69/n7+fn6+/z9/P3+/v//////RWvz5wAAAA50Uk5TAB8iMEhub4bL+vv7/P5tb7nIAAAAmElEQVQYGQXBwUoCYRQG0PM515gRHYRWEUTr3v9pwm1RCykS00mdv3MAAGS4w/Q3A1T33Gmv/RKgMoUnAO/ZAgAq9wBgX2kHAGxSmV46ALddKjn0Q0A7nZNKfP1se5y/5z6pRWpzeqsHH5f1WhaVdNd5PO6sxmurpJK5bZbjr5XLdU4q+8chjKh22a/rswYAajomXQSgtds/6oowTfCXFEYAAAAASUVORK5CYII="

/***/ },

/***/ 1116:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJISURBVDiNdZPNShtRFMd/d2ZEpyOJJNUkLqaDhCpo3GRjcSE+govsXBRc9kVKd9IXyMqlDb6AYHFRIRvpxqCCNB9Ip42FSchw597bRZ0YP3rgwjnn/s+Pwzn3CmMMqWmts2EYfnAcp3J5eflueXm5oLUWwK2U8ptS6rxQKHy2LOtPWiNSwN3d3VtjTNPzvFkhBM1mk7m5OQBGoxGrq6sYYxgMBpHWuprP51sAVkpqNpsfbdueTZIEKSW+74/PwsICUkqSJMG27dmzs7NPaZ2TOp1O59RxnJ0gCHBdF8dxiKLon+jeHwwGXFxc0O/3vz4DWJZ1m8lkSJIEpRRhGDIajXBdF9d1McYgpaRYLNLv92/HdTzYLwDP8ygWi+TzeSzLIpvN4vs+i4uLZDKZR9pHHQghfk7AuLq6otVq0ev12NjYoFqtju8syxprxx3Yth1qrQEwxnB8fIzWmnK5TLfbZTgcpqvGGBO+CEhXenJyQhAEVCoVNjc3sW2bw8PDMdy27eeAWq0WKaVigOvra4wxCCGI45jt7W1KpRIASqm4VqtFLw2RJEluALa2tvA8j6OjI05PT9nf32dmZiYF3EzWOJOBUuoceLu0tEQURcRxjO/7rK2tUS6XiaIo1TwMdDLodrud1J+fn2dlZYUgCFhfX2dqagqAdrv947+ARqNxLqVMpJQ8tfsnnjQaje+TeTH5G4UQr/b29t7v7u7uTE9Pv9Fal3K5HECv3W7fHBwcfKnX63VjzPBFwATIAnLA6/tUCPw2xuin2r8fLxn7+isgOQAAAABJRU5ErkJggg=="

/***/ },

/***/ 1118:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAAN1wAADdcBQiibeAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAF7SURBVDiNpZLBK6xhFMZ/57zv980nMyN1TSlkYSXKhpQdZX03utlZ+wvsbFnKH8DOwn+AWEgJC+V2EzfKVUp3LAylMZ/X4vXNfJiMeFbve85zTs9zzhHnHN+BHZv/W3aOIB2MAjl4eHS/Nmd6zho1kNG508rsz4IxKgA4B9sn95XNP3fET9iGCpxDb0oxIrVgb3vG9rZnGspfWC9iBWRxo9iQXFc+YFVhYujHlxqs7v3Hqgg4OLx4eJUMrTAxmPPE/RLlyuttDXRFqAhWVRCFbJOpJgs5w+RwnkLex7rbQlZ2b7kuxTX5CqqCVQEVIRd5cn9HyHhfM0GtH4W8YXqslbXf9xxdlgFfo4K3YANDtsmTz4sxYaq4asn4XKLUBsZbMCqERslFKfbLTpd37gCYGskCVFX6hopJLESBIqlDSF7Zl4K3f4CMTSyoEGWUKHU3a8feZ0uzqftPUB3i0tbVe9OfgIpX1w10AnVG9yFi4J8AAWCpWf0sHFB5BhXSVe4J2niCAAAAAElFTkSuQmCC"

/***/ },

/***/ 1120:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAABuwAAAbsBOuzj4gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJmSURBVDiNdZO/T1NhFIaf2/ZKf1ARQwtdatMUrAgupRHDQBgddMHAwuDgwOhf4KazTVxciMGBkBAGEgyDFEJog0kDRGMoJKAl0gu3haCUys29vZ8Lt2mhvtPJyfs+Oec7+SQhBJYODg5a0un0u1ttHU90bM1Nbo+9raUZt2yrHBfU9VKplHK/f/2xaWb5W0wIHcBWE+6anp4uRqPRMd3QW7xO2Z7L55lfWODP/lt7V9iMf0l/fnn+NJjZenw3YeUcVrG2tvYmk8k4stksw8PD/D075ffPbbY3N3h0f535T9sEfDKpDU3qGnvVbuWqEySTyeWRkRG6u7spFAooioKqqui6wfrXEDccD7jp7ePewxesrq4uXZvAMIwjVVXp6+ujs7OT09NT4vE4LpcLm82Gpmmoqko2m6VSqRxdA0iSdALgcrnw+/1UKhUURcHr9dLR0YGu61xcXNR56wCmaR5To93dXXZ2dlAUhf7+fmKxGI281TeQZbnaFEKwtLSEaZpEIhHy+TzlcplG3irg7OysOtbKygqhUIje3l4GBgaw2+3Mzs7SyFsFTE5OngMawN7eHkIIJElC0zSGhoYIBAKWVbv01gMu9QNgcHAQj8fD3NwcqVSKRCKB0+ms81hyXAFsAtFwOEypVELTNILBID09PUQiEXK5HJIkbf4XUCwWf1m1z+cjGo3i9/urZwQoFAr7tZm6FRYXF78bhmFY966Vpmnoum4kk8mt2r5U+xslSXKPjo4+Hx8ffybL8h0hRHtraytCiKPDw8PcxMTEzNTU1AchRLkhoAZkA24DbdZ2wIkQwrzq/Qfd7x1dB5fQRwAAAABJRU5ErkJggg=="

/***/ },

/***/ 1121:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAADddAAA3XQEZgEZdAAAAB3RJTUUH1woWEBA3EnSC+wAAAllJREFUeNp9U82O0mAUPf2hLUOHH0PFyRjCamblqGGJLNSEB5iMK018A3/eQGN8C/UhZjNjjDs1LoZZ6cZkQAeF0IL9oUBbaPH2m9SQgN7k5vtK7zn33MMth6U4On4rmr+HDdd17+Ryud1isVigjCRJ0k3T/Doej4+6ff3zwwf3kcRfglev3+zYlnXoedNdURShaRpKpRJLIkC/30e73Ua3232fyxf2nz557ICCTwhs23pkGPruZDKB53nwfZ+d0+kU1Bmj0QiO48QEd0euu89AywTValUql8sg+bAsC4PBALquo9frxSB2j8mv37iJg4N7UoITk4uUSqHRaKBerzOwYQwgKzJkWYYoiChd2YK6mcXU88FxHFYIkiBArAZnZy0UyQeBwB6NwxMojCL4wYzOcD1BRAWzGRWEIYIgwGKxAAV7ntE7nhcoOURh9H+C+XwOh0yb//yFYDanEQRks5tIp9OkhGdKkuDXELDurjtms2pakUl2HJveL8DxPFO0loA6MwLbtqlojtJlDZfyeWbicGgSQXgxwj8UsM5+bBh1EUWBeUBJ0hV65kHXixHCVRNZYbI8pIKdHfIgJcloff8BlUgiqiEFpHQNAS2JTDMzICWbv1DIY2MjQ4QB6BuhJhFTp+t9eWWEVqsl0crGm8jW1/d8KJIENZNBJp1mv5GJTF3z5CSV4IQlgm+qqlZpkbYUReGMgYHt7atQ0gp1N2mcTrwHwaePHw5fPH/2koycJF/jcmQrlcqtWq12WxCEnWt7e3n676Pz886Aun5pnjbfWaZ5CsBLAH8ADJhdk0mN9bIAAAAASUVORK5CYII="

/***/ },

/***/ 1125:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJBSURBVHja7ZXPaxNBFMe/b3bSJrE/Ulsai/oPiBf9H7x4UEGoYA/1IEiPvUgRRRAvHizo2bvQgxDag1baQj146cHaiiQqSi21bUiz2U2aze7sPl8SLQTBBKW37vDh7ezMfHg8ZmaJmXEYjxKOxIcr1r9f6DLdl3Dm4Gtc6G5EQowULCjEQNAStWr2hUZfyThJi7DGt4PJFvFAcuDmxLWJU1WucrlW5lJQIjd0yWUXDjuoddWQ9bNALwkR0APAEpUDpL00pbwByn7/chbAZEspim5xfP7NfDAyMkKDQ4Oqv6+fkskkYt2SZheBNQNdAOISk8IxIcFK+movKmCvaBv44a0/asxzvLiSW5laWFxgrTQOIEGaEgcCAL6wLziCLVSAITuNfD7/iO+YTEuND+SzPE2X6HzqeGps+PQwrHpjIbKaYu/XChZqzThcPoHtHzsv+V5w9++7wsWNzOvMql2wuZFrJIQa5BNon+rjQEkoAv12ikub7md+F1xpu914iY1neRdnX80WTNVwPVvLSMa+gt7XgNMUJ9wEhzuRW9uqXOAZ9jvaxzJxy3bs0eW3y0YZxXUxeQRVVg2xdjXH3G5T3q2M8VP+1v6AtNZ7aXN7c2o99wGWb0F7GsY2gA30hH1wdpyH/NjM/dPJ4xc8/elr7nkhX2jIQztEr+6D7ZQy/CR88H9Hehfjaxvrq37F53gU5yq8j6iGo+2WdXQf01U6GU8l3odWhCCqneNnvNGpuL38OqVhQDzD253MP/qDHL74JzdHEezitqjtAAAAAElFTkSuQmCC"

/***/ },

/***/ 1126:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIHSURBVHja7dRNaxNRFAbg9733zmTSySQzhJRoWxBLG8WqlSoIQhGaKkiIH4uiv8CFiwp25Upd2P4FV1rciAt1oeLHr3Chv0FLFyqBJO39cNppLN1YautC6L28nHM3DwcOXDrn8C+OSLMP7wzmDKtDt4YG9xTmFQ4GYf7zqdrEF97koT2BeZqeLKo3tWg0+fjufUH5/lvO0N81jGEsHq+OnfDzPju2Q91ePYoD8vmuYF7lnZGB0evlchkmMJCxBNoOcb7U5Ky891cwL3NqoH9gfmzkGIxvoH0NlSigBLS6P1EsF+/ytmruAM6WFYfxs8mzk8p6lsYzcIGDjSwQAzrSXJVdVegPn3KWh7eFe8vyhf+6caFR9vIejTRYg21goUMNFLGOt8M2ZSSiXDX8wEvMbQvjIJ40p5onk3JCTQ0t0kgN5zu4gsvgUob/KHxnqRIN85z36o8wm5ybPjN9o3akBu00DMxv2OYs0Acg2oCTLEuFr3B99iIfePNb4U20Pj48/rBer9PYFLQ6w5ny0sBKCwTYxOONFAGvKlCpVOZ4X13rearXJGHyuHG+4S0vLbtWt+VaKy12TIcODjK9OZlDIAJIKggpIH0JQWGlS+uKYMxYGWsfAXixBZ4YmXi5sLhQ1UY7KGTT5dYr4TGVIOCBUF0BJdbeWVQaQfGNy4TFp563/9H/x/AvF1KgMifkizUAAAAASUVORK5CYII="

/***/ },

/***/ 1127:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAARaSURBVDiNhZVLbBtFHMZ/szu7fsXxKw/HeSjNg1ZIaalaIQGipRUHrhygvXDjgoRUiUvFAVAPbSVQQRSpUoXEo0cOQMUNgcKrIBJBo9JX2pImxU0c24nztL3x7gwHx5ukbeB/Ga1m5zfffPPfb4XWmu3qdFfHK0JzNBwMDyXbO9J2OCzm87n8wlz+ihB8cTyb+3S7teJR4PfSnSktGe7u6Rvq2zNEoqubUCqJnUhiJeIgJbOjo3z32Se3VGnp0LHc9PT/gk90th9J2ZELfX0DdjqTIZJKYscT2PEYMhZDRqOY4RBISaVQ4I/PL7h/Xr/8+tvZ2fPbgk+3pVuC0rzf35a2021thOJx7HgMO9qMGQohmyKYsRhCShQad3mFSqHI2MWv3atLxcET2dxkgyU37+JZDLdow47VaojVVTzPozwxwerCAsJxADDCYeyebgI7d6INk7W5Ij2pFplbnP8e6H9I8ZuZ1lc7VeDjHVISMQTBUAijUkFqjQDEJgEa0IaB7OmmKl0mU5MsBT2qpjvW1mW+9PLJ2Ts++K1M+/BjBJ7LmCYWYKGxNRjrUOEjRR0MVBKKH/Y6HDy8h917nwDD5cblS5U743ePGA0VAW3sigjhQwy9oQ40aL0utY7VwC99yxw+0MtT+wcRlsRKdLHvhRdDu3vl+77HNqJFisaShq7G2TWxA8/SfOgQ90+ewnNdMODOnMOxXovFf0YoFGYxI220de9iR3fzgA8WYDzoo6JuxbznMTUygnHtGi21GkEhaDTT4lwWK+ASFBX06gTlySxTeZRvRRlVUo2L8S2oj7YQFEslrkz8TUUpf74/EmB4ZBmBINoUwrYl84tr3MvVxn3FVdRtR+tUEIEHeAjEekcEDJOklERNEykEHgI0PDMR5eemJc4vlEiEHfb1C7JzIYqlpjVf8Srqm1WlUGg8NC4aJUChUWjS0qJVWgQMw3/HrAieHo3Rm4uQzMe5e7O9+NdvZZKB5Lc++OxM8dSkqN2vaE0NqAFrgCfqJ0AIgobhe6+EoAZ4GlruWRQuWcXU47tL3QlJter87oMBCkbt+Zz2PHcTeA1whahvIASuENSEwGnMBRQrZaG8J6MflG5dG+zobBm/Onb7qy3gc9n5m+M478woVzXADlBdHxvPzqZNy2g16lTODB0eeC1czjO/Jo+/+6tWW8AAH04XT45R3X9DOfnNtjiPgE5RK/5UKx88+Ma+nvEfL3WpeMeXR8/dvQibskIIIc+kM/mdsUQ06DjUlOK6WzY8rY0IgqSQGMAiHqv1btH9ZtALmKawDMMcc1e8iXS59ezIQgm2pptlQqKQSbMnOwNAwrJZ9VwqnseK5+JqRath0WWaRKQUEVNKQ9Q/q1oZ46PRRefsOswHZzII5WofCmAbBrZhk7AeNOzhcpWmvX0jBLfkcVkrqv/xD9yuaqaJqxWmuREwPnh6Gj3eXFHx5YWHLhS25vGDlRsc4N7MlJ4uboD/BXCY+952gYFGAAAAAElFTkSuQmCC"

/***/ },

/***/ 1135:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIMSURBVHjatVNNi9NQFL3vI/3SAQtxCtJFGRF/gILgUHDVghTBnb9gNlIEhW4c3MzOnRsHwUV/QlcWF911OUtn0b1dJB2myaTT2Gbyrve1gYCSzCTohZP7Xl7uOefd98IQEdKi3++/aDQaR9Vq9X6xWFSr1WpiWdZhq9X6nlaXSjwcDo855wfL5ZITYUjEjAS4aZpqPp9/ajabb5NqedLCeDx+yRg7sG07mM1mrxeLRYUEbtH4w2Qy0SJvRqPR86R6mbSAiO9d1+WO47zrdrufIY6jwWBgTafTL/V6/ZDm3zI5VkrtkcuV7/vHf7mR8qvneQHlB3qelbi6Xq+dXq+n/lzrdDqqVqvVqe9P87QC0qLdbtuU7MyOddABQd7gKY6zEqff47PTV+ifn8KPk0s4dyoQBAZcXUlQYIDgHIwCwu2ygMqOgN1dH/ae7IN1JuDho4/s2h6bJsL+45/guSFcuAjeBSNyBgWDQ4k2US4B7NxFuHMPQZrPiFjd7PA439wKoCcgMpCSAdduJYIQ+j0DtvGHhFDPE4gTyIWgslBjK6IUp/dIQkjEGH2X6fDiAsPQLjEiBQo9TiGNHacHY1uCQiEkp3oX2zljua7b9WKI+hz+JXHcKkKuHyRGLuHk7cZAzC4kb9rTWCzDL/0/Qm6dMEGpSCgTShrRuBLnDTghICwJfpR/6XGUL6Mc/AaqBN4de9xzmAAAAABJRU5ErkJggg=="

/***/ },

/***/ 1136:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAIESURBVHjarVQ9axtBEJ3dO90XkTmwLkW6FCaQRkUCgaRxIVCjH+BCjX5AIE0ECSYEAokIKUT+jSK16lLG4EaFIKiQHKPLSdHH6XY8e1oQGFbyBg883mpG83Z4N3cMEWFfdDqdiuM4nz3Pe8o5Z6vV6nIwGLxrNBo/9vXtFe71ei2iZhzHbDabYZZl4Loui6II6ZLvlUrlja6X6wrdbrdKQm8nkwmkafrBsqwjIcRRkiTvh8OhoNrrfr9f1fXb2oJtfxyPx5wEWvV6/RPs4ku73Raj0ahVLpdlvmM0MWPsZDqdYhiG57dr6/X6G02+oTgxtoI8PF4sFptarZbdrjWbzQwRY6qHxsLKDm0tCAIgz+G/hIvForZG65ezubCaShe+74PRHl9dnOHy+gJ+/ZzDn2lAq1aAzcYGAQXpO7gFeSGHB0UO0cMlPH7xCsZXFjx59pUdXLfjEsLL578hiTP4GyPMEkZ+MijYHBwS9j2yKUIIHyHYpVMSFnfbY54bJIAx2cDAshidOTEStjmWz4eEjMA0whpxCUQJkUMITjmkbUESRvU/84enGnMRJSoz8qwR1UyseQO3Ao6T0aRAVsjfed583Q5ftrVIiHsQ1jwDc2HEHQ6F4ddtB0Tzi+y7eqpYQhOaV/q+w1YfdYvIJfgET0Kdgx3n4ISU8I+wULyUZ8VzxekNW/DUt8P9FQAAAAAASUVORK5CYII="

/***/ },

/***/ 1149:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAN1SURBVDiNjZXPaxtHGIaf2d2RtJLttWzHSmtDjKlCfrWHUopxQhzahBJobqWHnvMP9NpLQs45mVyKg29JaQ45lGJifAgJ1LgN7smkhjqm1IlBlhzLXu+upFnt9JCVI8mS3ReGD2a/95n5vp1hhNaao+TeupWTg4M5a3BwGCAslbbU9nah986dwlE+0Qn85tq1ixv1+vd7lnVFW9ZgpDWqViNhGPTbNikpMcKwKILg6YDW0yMLC78dC356+vTPT8rlbzNaM2LbmFJiSImQEgCtFJFSB7FHSk6l0z9NrK5+1xX8Mpe7Mav1L/1hSDqZRMTAbmCtFLpWo8+2mVTqxvlC4dcGy2pe5e3u7uiVfJ4l36cSBBiAgIMIoIGoEYVAOA5nMxl21tZONLNawCoMCx9sbvJNPs+fqRSb1SpblQqhEJjiHbouJZbWDKdSfJhM8onrUl1dpapUoSvYEMJVtRpyfZ0vBgboGR0ldeYMUTZLKZmkHkX07uygikXKa2vsrazgBgEAphBuV7AWwhWAEIKwUqG6uYlVLmOYJrbn4QUBRd/HDwJ834coevejYm/LJtvBjUTTMJCGgTRNkqaJoTUiirCEwAJMrRFNvY+UOgJcq+3TQeULFxhaXGRkcZG9kyc7paChxdsCVuDSpi0pGbp7l63bt3kzM8P47Cwb+Tzt1ypo87aAhzqA9c2b+MvLWAsLuI8f44yPMzA1ddACAAHR11r7zb5DN+/33t5qJp1OhKkUoePg9PczJCW6VML1fYqeRzGbxc3lGH7+vAHemwpDp+uOY7kAb22bj+bmiC5dIh0fKQFkgMzVq1y8d4/d+GzrDpUeBmvtAvhRRLKnh2Bp6fDSDx9iOw47ly/HdYv/AY6TwmyW7fV1eg0DL5FAAZHWFCcmqIyNUXr1CrW/37KZZlntE8TH5uNikb8fPOCzmRnsvj5K09N48/N8fv8+Gy9e8NejR4wtL7d4jgMXG6Wcn5+n/uwZFcAMAnpqNf6YmiKzsUG/5xG995SObUU9in6E9x5pmshEAtOyEMCJ7e12S1QXYvZY8KTnzf2TDq9XRLTSoZoWVQ298q8jrn+p1JP2bx2fpoZmJ0+d+xTnq7RhjdaD6rDnB+wE3pargterwp3/4bV+2c0rtNYIIUwgCdhAKh5200jH0QRqQAXwgSAelTg25tR/JvaZF69rksEAAAAASUVORK5CYII="

/***/ },

/***/ 1153:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,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"

/***/ },

/***/ 1165:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANISURBVHjatZVvaBtlGMB/9y/JJW2SNUkba+1Kta0bsmIzahFZv+jATUGYfqqCwhx+VxEFcV9URETwk6P7JAqKU/TDFLaVWbUWq3bTbW6dXVm7JW1nm+SSuyTXNne+ZNhzo5Xi7A+eO46X98dzzz3PvZLrumwGMpuFyHhTnBKgA51cR7pVJ9e5qAI7rYr9rV9V+D+wV6qEAv5dKiD/PJknGZbZ2ljPrTB9rchcwQGQVYBEpI7S8go//D5Pb1cc6T+8/9jEAluiUeGqKaldNQURKqGmGCd/m6enPUI46GMjFEpLjE8ZdLU2IkkSgCdWFWn1293TnuSP+Ry6bNLVEuHfmLhqUHbU2p4b8TK+gbuat2CYNkOnMzywPYGqyADMCdGxI+eoViF+WwS7vEwoouPbsUJrR2ItscTN6H4Fo1TlxPgMqY5Gjn30K6dG0/Q/1k2yLYY/oFKxbCqmzZeDI9zd08qegdRapfDImzbjF9I80tuMpsgcem+Eq+dz7H26j+WlKguzBq7j4lQdHMdhR38nY8cnsEW9n3jufm+kNcWLbKHE5cwCu3e2EPBpzExmOTs8Q8+uOzFyFmahgiWit68VBSgVbLLzBTq6b+eX76bIzRmeWGRci8yCSalUpm9bUjwrKCJGh6a4ozNB2VrCzJexjDLZawaxeJB9A/fSmKyryYu5Es3tcb7+5LRXChmXSxmD+qBGm2i5fzI+cpmm9gaeOnAfqioD4OKi675aez3+ZIrh4+c5eXQCf9DPlUuLnvhiOi+mLkwwoHEzYi+5RQM9qKGuM/b9D22jKRnhi49PYZr2qtjdvjWBLEusRX1EZ3pmFtdhXTJXcnzw/jdk0xXq6gMArgREgW7W4dHegy8FtejDlZVSrQMcV3RFbpEjJ16lpS3OV5/9xOF3hgjXRZFlGcOa+/Tz7187oLqumxe1GmYdIqFEWqxf8AV8irgjAUui5cximYPPf8iZ0VkaojEAxLrbEG5+q+bcyI/+md2H3kbihb/FRcsEzSasx1BkBcdZdbwyeHT/mwAbPvP27xl8WYhfB6TUg534/D4kCYw/i5z7cboKvCukLwJ44g3y7N7DKWDAH9T2hcK6ZuXLWbuyPAa8IaST4PEX6m9JXVybms4AAAAASUVORK5CYII="

/***/ },

/***/ 1167:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAN2AAADdgF91YLMAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAV9QTFRF////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHx8fWFhYoqKiaWlpjJuujo+QkJCQkJGTnZ2dnqKnoqKiorDDo6Ojo6WopqampqiqqKioqaywqq60rLnHra2tr6+vsbGxtMHQtMHRtbW1tra2t7e3uLi4ubm5urq6u7u7u8zgvLy8vb29vr6+v7+/wMDAwM/gwcvXwsLCw8PDw8XIxM7fxsbGx8fHydXlys/VzMzMzNrpzs7Oztrpz8/P0tLS09PT19fX2ODo2uX129vb2+Ps3ODk3OX03eXs3efx3ej23uTr3un24OPn4Or24eHh4uLi5Oz25ubm5u335+736urq6vD37vL47+/v8PHx8fHx8vLy8vP09PT09Pb49vb29/f3+Pj4+fn5/Pz8/v7+kG8n8wAAAB10Uk5TAAIDBAUGCQoMDhwfIyU6PD9BQ0ZHS0xPV1h9reVTlVm8AAABKUlEQVR42m3I918BcRzH8Y+RPe7cGRlpqESkIqNhXIokV5IcLXTGyaH+/0ffo4dCz5/e7xf8EongD7F0aUyp1SonSyoGkKh1GIIbrXa71YgLW6eWgEw/WqCXgQxbzJiQh8NC5CxyH46fvAwnUJZjg4nuYAqTg8LE86Hj1G38JnoUvg5QFzzPmxSgsfELbBowBDmOOr06pKOBSIqiqBDHcUEDkI76+5y6gwQy7aRfZ9DONMrFsnfV5d/b8uxuuDzUuj/sLRdRZpha1l2gaV8y6aPpS3e2xjAoPyN3a9srD+320+b5zqPwUX4T5PY7XaRzkBtflJvNZiNW/fhRjTVQIIFg2Uqix0/1EhWWJYBo5UujGaV8C+VM/3NOP0MA/vUPHFRmy/Ici1n1DTRohrGHlc4EAAAAAElFTkSuQmCC"

/***/ },

/***/ 1168:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAOPSURBVDiNtZTfb5NVGMc/5z3v2x9raem6jqYj3VbmmhkgONGNBR0ky6aoARMcDi/0H8C/gMR44QV/gDfGhAtjnNMb/BETISnG7WJjEmyihBVwZWNb19KuXfuub9u3rxfLGDA0M7IneW7OeZ5Pvuc553uEZVnsRCg7QgXYCcWWZSGABqDzGbNnVOBwqWz8YlflMyEaNROXw96vAsr07RWCHoXW5l3/C5pcXmWpUAdQVICA141erTHxZ4qeaBPiPwItYPJWhsbduwl4VQBUAE2CJlVce/zE4im6I148DbZtQQt6het380TDzQixKUkFUOXGgmB/JEgilcOpFInu9f4r9NZ8nrW6yv5IcMuesql4MztCPtxuD1duLGBUqpim+VgalSpXbizgdnvoCPnQJCiKSdHIoslHFGty61RdTpV8qcbl63O8+FyAJo8DgEyhzPRMmkpdxeVU0aRgqbDAa2NHCTWFOO4betoo1iNfMrh2c563elrQpMLvdzMkUwUAHHYbb/a2UzXrxOL3aA/bOPPDEIOtg/RF+zgfOw9neE8AxwqlcmwDuryyxuxilpc6AwggkU4weW+Sgfa3AQg2uh4KyJQecGL0DQ41HWSoZ4g6dZLJJBeuXsgrG4pVKVh8UGK1pHOkK4gqJVPJKU5+dZLxpV859+MHtAQ8SCmRUlIoFxgefYcDjV0c7uxmOZNi4f4iY9fGMNLGfQVACvhrYQWnJugK+5FSMrM8w8jouwy29xPxt2BJg7MXz65DjQLDF4fpbArzfGsHudUMuZU0l6a+QVQFfM45df3Z5Ag3e3A5tIfHnEhM8EJzJw0OGwUjy4FwGzfvzDL86TDp1TSRVj+hYCN5PY1lKsQTcfTVKl++f5nuj/bWBdBfrZlXpfL4Bc6mZznySS+90X349wRQ7AKHBrfjGXxeO/6Ij0rNRFZtzM0tMjufY/rjaaSioanymAB8wEHY6mQZlW3+Vxs/O97XoVmuOnXNxCkFZatM0dBRKiZmahe//bGUzYxmRizdqrDu8LiwLAvxqBefCOdp5yGf2zvZd9Sn5fzzSLtASNDqGrZEiPHJVEY39Ejx22Jxo8eyLEts56N3n3K/7HG4x18/3axlW+ewqxpyuoWff5rPrZlrbcVLxcKTPdsCA7hOuF7xaq7YyIdhWVqCr7+4kzdsRkT/Ts8+rX7bYADHgGPAhfN7o1bVa6LWVY6Vl/+p9m/ziWkepGoiFAAAAABJRU5ErkJggg=="

/***/ },

/***/ 1169:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAN2AAADdgF91YLMAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAlVQTFRF////Z5CfZ5CfZ5CfZ5CfZ5CfbbxAZ5CfZ5CfZ5CfmNB5UnN/Tm14Z5CfZ5CfZ5CfZ5CfZaK8a63KbK3IZqnGZ5CfdLXOZKaxZ6yybLO2gr3SToqiUo2lVJeDVZWWWHeBW3uEZK6wZK6xcba7c6S2f6Svgb/HgqexhKmzP1liQFliQFpjQVtkSYefUI98PHeKRIObVJ2dVJ6eW6irZJirb7FLdpujeZ+merKwr8vTL2RMNG9VN3CFRX+BR4VTjrG2jrG3mcvbm8zco8HLqNLewtzhG0ouP4F9QHp8QYSAVaGkfq+8gK68hqOslMjYl8rao8/cqcXKqsXKsMnOts3SvdjeETEaF0AoLVwoL2ZjMWctMWdlNGlrN3ByN3BzQnpISINKTYBPn7q9o7zCrL6/1uDi2uTl2+Tl3eXmDykXGTIcHjoYLEcgLFEhLVoiMFMlMFsjM2AkNGEpNVsqNWEkNmMsN2wqOm8oQWowQnsrQ3YlQ30bR203R4YuSHwjSYQ3S2w3S4cbTYkeT4cjU5AfU5AgU5c0VpMhV6E2W5UpXJEyX5E5YINDYZ4mY6ApZJBEZJc8ZZc7ZaMnZodFZ7JCZ7NCaJVGapJPapdHbZVQbawsb5ZRcKwwc5ZcdLMudZlddppedptLeJ1heaNbebcxfKZafaJOgsI2g6Jsg6Zvg6lmhalsiJycipydlKOllbB+lp+hl6GhmKGhp72Prb7AuLq6ur+/vb29v7+/wMDAxNasysrKys7O0t3f1NTU1N/g1+Hi2OLj2dnZ2uPk3t7e6enp8/Pzs1sdKgAAAGl0Uk5TABozRG2Gh5aXnJydoMDX2Oj29vb39/f4+Pj4+fn5+fn5+fn5+fn5+fn6+vr6+vr7+/v7+/v7+/v7+/z8/Pz8/Pz8/Pz8/P39/f39/f39/f39/f39/f3+/v7+/v7+/v7+/v7+/v7+/v7+y2sCggAAAWNJREFUGNNjYIACLlMgYGNAB1N3AcEUDOGOzUDQhizCKQoEteuBoBLE4oSIMmkcBYLyFUBQAmJpMIGFWUPShYWECufOXzA/V0hILCOEFSzMf9hSUESkYPrM2TNzRESkXA/zg81QP6piV1ZU3z9txrSK/Lx4l6PqIFNYg1NlElauXtU9YWLX0sWLEp3SgkGm8B9wlpaLqqpuam1vaayLsHAMPQA0hUn1qImuuGxpc3vvpN7OYj01/4CjqkwMrIF7DQwkJK1r+mbNm9NgJans53cwiJWBb7+vjb6SkqJbz5Llk8MVlZS8fZL38zGIAj2wwdbY2Chs4bJMQ2Nj23VAAVEGgW07d27f5OHl5ZmV7e7l5bF2386d2wQYeLfs3r17x8aY2LjoyNjYmDWHgNwUXgaOpH1AsPUoFOwB8ZLYGVjsj2AABxYGZrOjGMCcmYFR/hgGUGBkYODR1tLSRAZaOtwMOAAAd66sZhBAcvgAAAAASUVORK5CYII="

/***/ },

/***/ 1170:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANySURBVHjatZRfbFNVHMc/597btb39C+voZmfHtq7dBlvixGVsmcgDBuMUo1E0jX/ig7yo8UENavxDgn+iUV70QYwxUfFBghAJL6ARiVZEdMIMsoqUkTrZ1u5P13br3+vNTcmiAQRxn+R7kpOc88nvfB+O0DSNxUBisdAnXhSnAKxAEAzE1TrBIKoAqzLzuUNmReb/IFcsYbOYb1QA6eipaWqdEg3LHFwNI+OznEuVASQFoMZlJ1soEjkxRnfIg/gP7z8ynGCJ2627DCXGapLRo2DzVvPV8TG6mlw41Souh1Q2z0+nZwj5lyGEAFgQK7IAA8HKplp+G5vCKqUJ1bu4FMPxGebKinHn7yxMbHBmNMkHeyKUytBwzVI+mc1R41bp6/DR2ezhPEX9wDcnJmhdXofPbga4mFiwZft+Dnx/mvsHugn4PagWE7PZPDOZPC9+eIz+Di9P3NlOMjXP0eg4ea0Kq1k27l5U/Panh/XykzwWXku5DEJI/HJmCoe1ikSqwC29bew8NMLw6CCP3t7IrT1NFPSpvz4ep6vVh/sCU0v41wXf2xdlfd8KJjNFBnqbsKtm5gsSG9cGmEzDSDJP90ofh2MCt8OJLMtYqkzcvKpery/BZCpr1FlJRexdva49cC3ZvMQ9NwX0fjX2ROJsGgix1FFFMg3JjMRYShBs8PDmvgS62Iiip6etlmx2jtFEWt8LIxhiZ2N/Xc0SHlrfgs2ssPn9QZ7e2Em9x4osCVa32bFbFZJZBavVxuBZqSJeSMhfjWqWiI1OI6FVOjY5pdt6/XQsdxF+PcKG/haCPhsAki5+fEMQgJ9jabbsSjGTLxiyf1JX7cBlKxD9Y7oysWRNP78jRuTXaV4Kd7Jt9xBDZ+cAjFre2n2Sz74bx6kqdDXbkM0OQ3yhOGwW2htqADTBHd9+jMkWVqU0e59bgdVU4u7XfmD/1jU0e81YHo5DuYRUznHfmjp2fBHbya7r3uHSHBPcGw0gKScRQla1CfZubuHA4J98dPAcX27tofUFAUIGTcNmKmqZsnoD28WP//ofG8uDiTd0+ZMAqjZOX7uLg0NTNHpVfs/49Uo4z7Pau7zKZWCIAcQjpWcQ8sugiQd6ithNGghBfErw+ZBSArbp0qcArkhsbDZxPRB2WLS7PHZME7NiMp3jCPCKLj3FFfAXzKI09VGVmk8AAAAASUVORK5CYII="

/***/ },

/***/ 1171:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANfSURBVHjatZRbaBxVHIe/c2ZmZ++7yW6atNsm7XbJzVax1lCpMX2wKlh9UARFrdSH+uKDDxW0KKJ4eZDgkw+pD4IPfQkUEYqiSLVqb1RbI9R2U7MmxNDd7G73vtnZyzgZXIRQa2vNB78/nGHOx++cgRGmabIaSFYLq/GqOAXgAvrBRtyqE2ziKrC9vFQ7rqsK/we1RhOPU79PBeTZyzl6/JK+NT5uhdlUkSuFFoBUAboCXir1BicuJBkZCCP+w/nPXErTEQxaLluJPTVlOSqe7hDHppJsiwbwux3cCIWKwU8zeQZ61yCEoI1qD6X9QLAl2sN08iouWWJgfYDrcWk+T7Wl2ntW0m5s8/tCho8/PUGzBX3rOjlcrNEVdLNza4TbN4dp07Be+P7CIoMb1xLx6gD/JBa8eehLvjo9w7N7Roj1hnE7NYoVg3zZ4I1PfmZ0azcvPTZMprDE2XgKw3Tg0hV777UQwNjrE8e++fx0gr0Pb6NWb1mNwOfRyOQNGi1w6w4mj88S7Xbw4qObuCMapm61/nb5ewxGCK5oHfI7d0l6d/d/dDTOQztvI2mJ0sUGVcPkibEYmZJJtgSzGYORLRFOJQRBnx9FUXA6NB7Yvt66vjTZQgVNoR0bSfc9u4djG8hVIJVvMr9YYf+eITq8DpLFFpmysCJJFgT9fWHGj6aXxXZUKzuGeqhUqiykS9Za2MEW+zeNdgYDpAomv13J89ozdxIJu1Ck4N6hAG6nJF1WyVY1XC4P5+bkX+K/M9Abwq1LEgs5JCYAKppfFhsauUyR5x+MMbjBD4CUwrrPfgDOJ0rsm0jh9+nkjYYtW8nakI+Ap078jxwAEukq/bpgklry89bhKc4lCgA0WybjRy5y5FSSoEdl365OfpjRUHSfLb5WfB4nw31dAKaKI3ByLq9HESqYUe5/5Qu+G3+Ezd06ByYNkEVkM81TY+vIGh6yi9OTUoY+5PpMCZ6Mx5DqRYSi2PJmlYg+zddvjzJ4sABaB5gtPJpJ2fSYwN0cEj/+6//YHs+l37fkByw5y3KFKlHvAnNGjAZOmi3aHDQneI8bwBYDiP3NVy3xO4DYu6OOVzNBCOavCj77RW0CH1jSlwFuSmwvXuAu4Gmf03w87EVbLIpsqcYZ4F1Lepmb4E+38T2qMZlFIgAAAABJRU5ErkJggg=="

/***/ },

/***/ 1175:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAARJSURBVDiNdZVNSFxXFMd/9743bz6MidoaJVEiGoshWbmxWmhKSSBQErpoF22Km0AhFJJCV1lkU4SuGgLdBdKQtlCyKdIGulDaxsZUBWk21hLzoRJNapxROzp35n3c00VmXmaqOY/D5XL5/8//nnfOuUpEeJlNTEwkwjAcKBaLH9bX1/cBdnNzc2J1dfXHpqamX48fP156GVbtRDwzM6OMMV9mMplzzc3Njuu6OI6D4ziICCJCLpez09PTN3p7e093dHRsI9lGPDU1dXBra+uX7u7u9nQ6jeu6aK1RSsUOoJTCWsvs7Oza+Pj4O+fPn/+jmkdXb27dunXA9/2/Ojs721OpFFrXHNeYiKCU4tChQ40nT54cGxwcfLv63K3eOI5zs6WlJZFKpV5cSSn+DdZZ83MoNJ7jsb+uvSbI3r173bNnz36jlOoVkZUaxXfu3DlXV1d3JJ1O14CstawX13mcX2Rpc5Hl/GOstVSnUEQ4fPjw/suXL1/Zlor5+fkvEolEjVIRwVpLEPkUggIFv4AJTPwDrbU15EePHj2RTqffiIlHR0c7GxoaMul0OlZirY2VBVGA8QsY32D8Qs1ZNXlLS0tyYGDgWJzjBw8enOjp6YmVPDXLrPtrKBRaa7JmFeMbNIpQhdzLzqKURiuNQtHZdBARIZFI0NfX16aUqnfL1369El1EuLfxN/P5+yjRaDQOTqwsqVNML0+hK59yaN99AEc9r/G2trY2oNktV0NzPp/HGIO1lofP7jP5z218v4Txi5SCIoHvIxaUKDzl4TkpkjpJ0knxVvsxPJ0kCAJSqdRuoNEF2NjYmHMc50RjYyNRFFE0hq3CJhKBthodaWwkYAGBhJtEAsGIoWiL+KWACIsxhmw2uwiUXICVlZXpXbt2xT/lvc7TvN/1UdxpP93/gRsz3yKRsMfbw5V3v6vpRKUUpVIJEWFubu4RkNPlGv69UCiItZYoioiiqKaWEUGiF/5/q2CiKGJkZOQxsKYBxsbGHuZyuZnl5WXCMCQMw1qk5QWx3cYbY2ZnZ+/Oz88/FRETN8jk5OS5bDZrgiAgCAJ834+BWjll0nKeq8z3fXzfxxizdenSpWvAn1A13ZRS6uLFi191dHR80t3dTTKZxPM8PM9DaUUxNAAkHI9UIoWIxEp932d4ePja0NDQ9yIyEjfI8zSKKKU+v3DhwhGt9ZtdXV2qUtuu65LQ3vNpJ1AqlbDWVohlfHx8dGho6GfgdoWvZrqJyIpS6oMzZ858XCgUPm1tbW1obW3FdV2UUvEYrXTo0tLS2vDw8NfXr18fA34TEVPh2vEFUUrV9fT09J86deqzffv2dTQ1Ne3PZDL1juMQhmF+fX194cmTJ4tXr169ubCwMAXcFZGaUtqRuCrAq0Ab8Ep/f/9rIuJMTEwsAlvAM+CRiOR3xJZfAgdIAmkgVV4rnimviXLqQqAEFABT5cVywCLg/weZQHHBsyN/AgAAAABJRU5ErkJggg=="

/***/ },

/***/ 1477:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAL5SURBVHjatZVLaFxVGIC//9wz985MbMhM3hAD2tYXXRQFXZVmIRhpli7UVcG6EoSKCxERdwXdKF3pVnwUBBdSLK5am4UoqMU01jZtiC15NDSdJnemk5l7zu8ZmoYpdBqR8YOPe+He8/Fzn6Kq/B9YAh98R/GRvrWPBAbYYtPJ9OsTpeP8R1oT8/EPN14e6eUr2tDgzap+0sj4kX+JRlHt6POlU9vhD0+uvjLwEF/SBSqpmXrrUP9JO3ls9onhUrK/t0BXWK9zcPLYymU58tn8fJyL+ozQRxfwSqXRdBVbdzmXIT6E6VLYZ844W0iSamRMSVC6gSI476u2kM+HsNCt51mkFdYQzpmqGHYMj9kZBno2+f3WMzuG1UtrYlMDxXmhE73M8+r4CZLCKFXtZeH2Y3QiMgJIzRZjST2Ic/cPC55D9n36Rg8jxjK5foIv3Ltkau8fjkQMktp8YqpOVTKntJPodUayMzwanWXPky9gZB2yOoODQ0zpp8xtPstcYz+emHZsGDm0qzYfm5r3joYILYw2OMA77B0fw+bLRLnnMH4NmgvgqsS2wONjg+zRi2TNGf5YzPilcRiVhEA4DsaYcCkSrTWdBNgiDoNZ4nydyPwGzoCvAQ6iCCQlsknYzWGL/fRcORPOTdhenRPJRVoz4ealSSwS5K6zhaMszU3jaAUvg1kFWwneChLM8LLJ0vlvOJd7o7WmXWk1jQ1jK2IRw11dPMbPvMfGtfNgrgQv3tlGi2CuBVeo/D3NT9kRsuJTtK9ttVpNe+HC7KVN2YVX77iH3RzQlYiYgAMlcDN4NfgXa8u7mKnvc1QWaceEeKIblwTIBSfgno+QDJWI/zw1/Hl5321QQdUgBEQBw9WzjXT8xfQ12Ea5QyV4uuOvKRyylfLuRnH0hqQLntUFnU+s9vTvlaHiw7D6q78+cjAdpgOWTkxotvx16dv6uWhueSX7fvLtjdPH35Tk6aX8S+VSeQpJdWSHX9MD3/tAFIy3lGAj2Axm+oDF/wDAYDYNbtISewAAAABJRU5ErkJggg=="

/***/ },

/***/ 1478:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAMISURBVHjatZVLaFNBFIb/mUxy701uYoJvLYKiUikUXyvRmmKQ4gt8ohsVqYrgA7sUERdCRV1YXAgiiu+NaKGUSkGsoiCIbtQatFJQwUfRtia5jUlmxjPBSiRSReIHP5kMnO9OzkzuMK01/gcCxOE2BKdGvxxnwBj84Jtk97fHY6fwjxRXfLLz88YJEVxDCZrSn9EtuQLu4S/RPp+3PxG79VN8rL1v0xgXV1EBBtJ8RdPy0e2iobm7enzMmh1xUBG+ZrG4ofnja9Z4prc34PdFOUMUFUBpDOTyckBkpV8WwBSJUSGxKkguhWNZGR/nMQaNSqDBIJXKCMe2Sczwp/M8nb2BoUdPwUgwZsSaxH6eYRwjiq3BJNZ1NsPQEt8HNXbuiGKtmFkx90gLqRh+RzYziLWfbiM/qQpKa2wcfIhLkWlw3Bh+B/16o/dEMMDSikZSlou1VnA/3MGoB12QR45CSonwoQMYl6hCLroKjPFysc/MsrSwLZ6RWrOCLG/Fu+Qj7O57DrFsJTqfPCm2a0nDcqx+/wyn7SmYOGNeWY2gJZM7w+0A9xw/YAn2S3KpPsTdFNjLJNz1G2BZVjHOmrWQL7pRF+qHHBosqzMu4+RBS3tWgDGLJoYjWB62TqOm6yYiO3aCkzAcDsN1XfBAAMGt2zDrbisCsh8BoVFaa1zGyWnz0uYLBcNx6LHx1Avk3r2Fu6gOnHOEQiEjLo6dBQug6LN+qAfUSlNTGmacQnDuZaEFSjZiFPeAY4dQdfmKOT7F1NbW/nIkg5u3IL13DyJn6/BVB0v/IEWnSCa7X31jYSitJAhGWfb4Ao/U17NgTc1PWUdHBxzHQSKRKM7ZM2fCP3sOJt9o0U/nb1HDj+SMw9KpV8bjp8QpURDNTU0L4+fP7R1NG+ZUV0OQRICQEqCxApBXCjlKKplEqq0NXY2NLQdPnHgw/OakdJVdTS9bW1d5Fy9cL3hDftv0luIwBjP2GanWyJLUM6Fx3rbzoV27VlcvXdpedoP8CeqxDcClGNJUk/2rq+l/8B01Pjm+wuYWjgAAAABJRU5ErkJggg=="

/***/ },

/***/ 1480:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAMAAADzapwJAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAN2AAADdgF91YLMAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAVBQTFRF////AAAAAAAAAAAAAAAAAAAAqampAAAAQkJCAAAAAAAAPj4+cXFxiIiIhISEQ0NDn5+fn5+fubm5urq6p6encHBwrq6ur6+v1dXVc3NzRUVFU1NTurq6b29vcnJyfX19gouWhY2YlaW4mZ6jmrHLm6m5m7DJnbPNnqGlobXLo6Wno7PFpbvVpqeoqaqsqbfGqb3Vqb/Zqqqqqqusq6urq6usq8Lcra+yrbO7rcDWr7Cyr8TesLGysra8s8bdusvfu7u8vb29v7+/wMDAwcHBwc3bwsLCw8zVw8zXw9bsxNXox8nKx9DcysrKytTeytvty8zMzMzMzNvtztnkztvq0dHS1NTU1eDu197o1+P02dnZ2eX12uTz2+Tv3OTu3t7e3+n24On04+v25evy5e335+ns6enp6uzt6+vr6/H47+/v8fP08/Pz9fb29vf59/f3D03UJwAAAB90Uk5TAAMgJy0xTFxcXmBhaX2Dh6ipvb7T1O7v9/v9/f3+/rF8XdAAAADaSURBVBjTY2CgKWDkcXNBAm48jGBhluQ8FBDLAhZm1VYNCIQDbyV9VrAwP5rqOH6wsCi6alGwsCS6akmQKJu8p31uPhxk2/nLswGFhWSjI80icqAg2Do6Rk4YKCwh5eGT4GWZngUEqQZBCT7u0hJA4bS0ND2LlEQdv4wMV8OkFAtzoABQWMbZ2dHYNjNERVNNPTzT1irM2VkGKCzu6+vrZKqgYaKla6SsaBMF5IoBhUXCgMAhDQpCQTwRoLBgPAYQAArzpWEAXqAwdw4G4AAKM3NyoQF2JlxRAwAjtGDXDOb8egAAAABJRU5ErkJggg=="

/***/ },

/***/ 1481:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAALVSURBVHja7ZRLT1NBGIbfb27nQqEtFFvBSwUjxopuTIyaGF1rXBjjir0xLl2Y+A+MS5fwC9zpxo2JLiSBxMiCFBQBCYUIVcqlXHo940zNIRIVI+rO5+RNTufM+5w5M0lJa41/ATP5L24gwps7AxPjhY3q8fC35/BCe8K78uDG4SHsge3D63s0Vr56JqmUZLBMLWzizdSKfaqJAARhg0zCugbZi6gh8RRbGrjVk9yxYs4YiBFCulO+DSHU/IJAazwZXmz7biuk5FSpaQSBxl6wNSklQqj37pB5mSb8RezWCCJQ36Ujqy2+inKGP6IeAPOF0vLT4dmYkJwHI7PVetQXYKT/TKwJaxt1LbkIhJKySsS46ypUNlfwaWYUe6E93QvPj6G4VeaOElXhOrJEAPMUR34ii4e3z6Mz0YTfYf7zBu73D+FQ5iII2ojllvAcWSQErY4kSA4sbQDZmRwuZPbBMQO7Ua7WMZjNI9Xe2ui6ihpi31EF0eSqZcYo4TlGbOTRJmWSwuB4HskWjmOdUfyIiflVLK7V0ZNOwWK71kEE8l25xJpcmWcE5koGyQmO/JpT3UkoN4Jnr3PmQEqo1Wo29t6O2Wd2Tji/0bUOMi4jXhC+w+c3y1VyFaA44AhCSCruIRnrxuMXWfTs92B593ELNy9nrGAHtmsdDJoiDp81W8E/lCoV5ogAgmuob8TmhRibXsD1cwexsl6GJZNOYHRyDie6UvAdiRAhNBwTxuyK2ZTwXP6WFzXjKEOy6vaKZxZWoYMazh5PwtIS8UKHGfOQ+1TEKhNIp6KwSKqCowRG2myvyIr8u8Ecbz+NwnoFa1s1aB1gcm4Z6f0tUILjZ3R1xFGp1fE+t4SjB+K223BwRph7++o9e/m8f6Sj1a3Hm2OIRZrN59dx0hxKxPeglNo1do6dazu2ax2dbW5t4N61qcb/MRGdAtBrErGLwd6YNimajBjn+Bft+/995aw3+QAAAABJRU5ErkJggg=="

/***/ },

/***/ 1483:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAOjSURBVDiNjZXNTiNHEIC/mTHGHmNjBoyQxRL+DMohCCROEQcOYCDn5EFy4bQ5bc55Ar/AnrhAgqIVEkJIRmhBK4QtFO/FYNACi/wzg8cz09M5BDvGxLtpqaWpUtXX1VXVNYqUks7l+35MCJGu1+s/Oo6zIIRI9Pf3R2u1GrFYzLRt+05K+SESibzVNO1PVVWrnQylE1wul3/WNO3XYDCoa5rGwcEBqqoSj8dbNqFQiMnJSXzfp9FoPLqu+8vg4OBvXcHlcnkjEAj8HgwGW7qLiwvGxsZQFAUAKSXFYpHZ2dmWjeM4OI7zg2EYfzR1avsp2Wz2ted5tO9QKEQgEGjtnp4egsEgruu2bIQQHB4evm5nBdqFUqn0LpfLfT89PY2qqiiKgmEY2Lb9LF1DQ0PYto2UEt/3OTs74+Hh4V1XsKqqn1RV5fz8nL6+PuLxOLqu/5u3p3T4vo9pmtze3mJZFoZhoCjKp65gRVE+K4rC6OgohmGg6zqlUolKpUKj0UDXdSKRCH19fSQSCQzDoFKpUC6XAT53BUsp79uLGQqFMAwDgGq1Sn9/P4ZhEI1GsW0b0zSbfiiKcv/s9h2puP2vvr65ueHq6oq9vT329/fptJFSEggEbrtGHA6H74QQz5xKpRJbW1tMTEwAcHBwgO/7rKystGw8z0PTtLuu4OHh4XvP856BT05OkFIyNTWFpml4nkcikaBcLtPsdyEEw8PD3VOxvLzsCSFqzesdHR0hhCCdTjMyMsLMzAxra2tsb2+zu7vbHnFteXnZ6wp+MnqAf1orn8+Ty+WaVQcgmUwyPj5OoVDAcZxmxA+dnECnwnXdB+AbAF3XmZiYYH5+nkqlguu6ZLNZlpaWSKVS9PT0UK/Xmz5fBnueVwAWANbX1zk9PSWTyeC6LgsLC+RyOTRNY2Njo/VgXNctfBUshPgA/AQQi8WYnZ0ln89Tq9VIJpM0Gg1SqRSLi4tYltXu82Wwpmmn7XJvby+rq6tUq1UGBgaYn58nkUg8mx+qqp52cl4Ub2dn52Nny7WvUCj0TPY8j52dnY9fBWcyGVksFgumaeL7ftcDfN/HsiyKxWIhk8m8eK4vwEBxc3PzzeXl5XvTND3btluz13Ec6vU6lmXx+PjoXV1dvd/c3HwDFDshL35NAIqiaMC34XA4lU6nv5ubm3uVTCZfRaNRrq+vL4+Pjy+3t7fP6vX6X0BeSin+F/gJ3vwMAjoQeZIt4BFwgBcDqbn+BvgF2D0RQFuwAAAAAElFTkSuQmCC"

/***/ },

/***/ 1485:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAJeSURBVDiN1ZS7a1RBFMa/c+Z57waTGE220YABN4IPfICFTQSxUBEFKx+tFgEb/wDrQCpt8z9ILKxSBGySZrHQSAJBExSjuHkYk33c7ByL5e5m8yYhhR8MzDkz34+ZOTNDIoLDEB8K9b8E67TTPzT1eX4l6U3jyKn548ei2wMPusf2A6a0eI9fT5TvXOmy1tQ2MT23ivz0ogggRABC6iCAUruAQCAiAYDIcmHoWa6racWKGcR1B3qyMXqyMWEdZicFEQyP/+xI4zrYGEWVNUEI+7t+QQBjTD2mcy/GgojsaVV7FRGJJgI9uX5q6UhsWtUB8VUBvhVKC2/HZ9u0USrkZyrV1liB6WCvsCqEPytVMUoHbY1JiFh5b0HYGtzRwrh/yQMA3uRLKPwNW84TEJaLZeWsTrR3pkQAR1Zh47+hFdCXs+g7baBVLZfrasHoVILRyQrWqhvRBIIoZ01RR84sE8JRZ6jpRuSyCrfOOrRnmg9eK+DGGYPLJzXefSxjcq5BZ66BY2fnOePtAjNx5AjONtqjq34TdL3aM7U56z2RIxCBYm8KnPHmFxPYG4YzVG+DI8VtoakGR4pNHm8YRODYmzkdO/V9tZyQtwAn25UPeDVaAgA87/P1nNWNHREAawCGUItTszrj1ZdSpcJOB0C2rjYAOL15rClHgNUAMzj2PK0jR5OKhBXKcLzRHDcgXN4hV5MCg0k44/UnejowfI07L77vPeFprXqwB6IVYWKmJOH3hxz13rwbP+wfWurOtundrbvr64/F5OW9Tk8iAiI6D+AC9vhF7qAAIC8iE/8AjRC6yKJc/awAAAAASUVORK5CYII="

/***/ },

/***/ 1487:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAACYQAAAmEBwTBV+gAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAPjSURBVDiNhZVLaxtXGIaf0V0TS4ndqqjyBcmuZbckqQLpzmACvhYvDW3qZtE/0E2hK4MhXmRX6K6LLApdlRICRU6VEIJkgzEqvpDEii9yL7EV2YkzkmYSSZZGc7qoDLrY8Qtn8X0z7zPfvDOHIwkhaNTu7q57fX39W5tT/sbhPOez2Ww2m8ViMpkkrBaTIYFWLBZjLpfrF4vF8qCzs1NtZEiN4KWlpelEIjHT3d1jeaEcEQx8yELegafFSf8HFzhvM+OySphKef5KbrEcn6+M5uZTWz8/+eHznX9/POZYaqGvXr0av3Pnzuzk5CRlvYyeT7P859/Yyjr7xSLRjU2C7Um+Hn2K7p3lt1+fcC301PzTeqXr+nefflTLMtUWsVjse0VRmJ6e5n7kPv6uAGOjY6RSKZwOB8Ko8CJT4lz/De5HInzinef3BzoXL11k4/wXl04FR6PRyNTUFIODg2QyGQ4PD1FVFb/fj6Zp5PN5lAzcu7dF5p9NVrZb+erLITyBCRYXF/+oZdVFYRjGy9XVVfr7+5mYmKCjowNVVQkGgxwcHOD3+3n/vQt83NeNdK2FnZ0dkskk2ewWQoiX7wIrkiRht9txOp3Iskw2m8XtduN0OmlpacFutyNMDmxWK+3t7bx584ZcLodhGMqpYCHE69ra4XDQ1tYGgKqqyLJMW1sbLpeLYrGIpmmneusytlgsdRePlU6n2dvb49GjR8RiMU769xu9jVE0gVOpFHfv3iUQCACwsLCAYRgMDQ3xLm8d2Ov11uUEsLKyghCCnp4ezGYzuq7j8XjIZrO8y1sXxczMjA6oAEII4vE4lUqFkZERvF4vwWCQ0dFRwuEwkUik1qpWvSeDq3oNIEkSiUSCRCJRN53P58Pv95NMJimVSlSHaIrQ0tgADoEAgCzLBAIBQqEQuVyOcrnM0tISAwMD9Pb2YrVaqQ5xeCZYkqQN4DOAsbEx1tbWuH37NuVymStXrpBIJDCbzYyPjyNJ0rFt40ywEGINuAHgdrvp6+vj2bNnaJqGz+fj6OiI3t5erl69ysHBwbFt7UywYRiPa2u73c7w8DCqqtLa2kooFMLj8VAsFmtve0yDmj5eNBp93tirlcPhaOo9fPiwyVMHliRJmpubQ1GU7bdv31KpVE59QKVSQdM0FEXZnpubQ6oJvAks/t+re7du3bqZTqeXM5mMrmkahUIBXdcpFAqoqkomkyGXy+n7+/vLs7OzN4E90bDPm46m6uQ2oE+W5Z6RkZGLly9f7vT5fF0ul4t0Ov08Ho/vhsPhp/l8fgfYFEKUmhgngY9jASTABsjVBZCvrlL1JU8E/AcoO8xIAvtLRQAAAABJRU5ErkJggg=="

/***/ },

/***/ 1488:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABYAAAAWCAYAAADEtGw7AAAACXBIWXMAADddAAA3XQEZgEZdAAAAB3RJTUUH1woWEBAN1HhbSQAAAAZiS0dEAP8A/wD/oL2nkwAAA35JREFUeNqVlctPE1EUxs9Mp0/oFFpegsrDsBABFdnowo3RRtmbGBckLN2oW5f+A+oKqVsMqYpb3UlQ1pBW3kbe0Ja+S2k7M53xnANtjFCE25zMndfvnvudb04lOGa893+E5oa6tmg0elsQhCsOh6PZiUOW5aKjqiqpKsq6oqrTJpNpsqe7O3kc4wjY7/fficZ2X26vr94qFovgcrmgtrYWEAJWqxXMZjPkcjmIxWKQSCQUn883jtdfDA4OrlYEj/h8D5eXl8cMwxAxU4bh/Ejouk5HWsASDocf7e7u3nv1+k3/82dPV48F7+/nHqfTaZGAoiiCJElgs9kgn89T4P19oAWz2SxkMhkKnsfjcU9re8d9RAwfC77a22vK4cuh0A6DSwsQjAZKU14gmUwSmOd9N/rhrtdrqiQF6ifBwMADBIdhfn4Otra2CMBb1zQNCoUC7YAk4N00NjVBT+818NTVgyiIJxaPM+zruw4XL17gwsXiccjuZcHusAMYAALtBKEEkl0ybO+EUW8ddIyTwKXisAxoL0il0mC2mKGl5TyoqgZoM1AUhdxBcJYJXwFDN04EE7S0dTqirhrP/xp8LhxId6i/cNqMGUzFomN5nkqnSCo+pzStuo3BxNbPkDGHiltfW98EUbJAQVHZFVbM1ONx03PljA2cnwmcwcJpRY3d0FBfD0u/fuO2DS6o7JRLGdO1/0pRgrKtsC8gwAnNTY1cuEvtrTA7Owfk9zpcqORx/RQZU9XLvlU1dAEeySWSblC/IMuRQygJBuPvVBmTjqQtwdhSVVWO0m1etMYloxR7QKhDiU+lMUlwKEcRXSBAOBKFre2Dz3xlbQNCO9vgcbvLGdMoVgZztmQrypZDUQp0Ti+zLKgBFlIH7MnsYePAFRQkV0WwCfsC1slJHausdQHDZrNCR3sbF0+WnbC0uEBysXcFUeBnV1ZWaiqBpVAoZLbb7YCtk/RlqIawHEJwcJHsNhte02hRBkqixNItLizYK4GV0dHRt0NDQ5dx2y6LxcIFYssd/aRJGoarqgKzwcDiu5HhD5XAxuTk5FggEIh4vd4nXV1dN6urne5sdl/IF/LYjFJkKbZZOpOGSCSiTUx825z68f3L5/FP1OBnT3KFgjp/xf+9KZx3eDye3s7Ozi5sn+ci4YgDNdaTiUQqGAyuz8xM/8QCE2wDIw//jD+Yo29rbcKa4QAAAABJRU5ErkJggg=="

/***/ },

/***/ 1491:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANrSURBVHja7ZfdaxxVGMafc87uJmlTEwspRa/qhXjhlR/0TxAEsUjbmyKUouh/4IWotZQ21EKvbPDaG0n6QRuhH7QIxY9AsVkIsR+alBjSJk2yO5mdMzNnzjnzejJnsVujpWZJvXD35QfvDLvzPHPmmXPOMiLCf/nhjo6BjoH/t4FS6wH7gAk8wDMbqrgNIX1Fdo0BtpdxpKgCePmhI0fXo7AKBysx3wvfM+4ocUAAjDF/Hsz33PXECuCI8savAF5cOwKLji3oP/zeYQzsGEAUR4hVjCiN0MgaiG2MxCSIXUlXEUUQ3QLXG9eBzQzYRA40+xwwDGi0EDK8VHkBUi1t/dsM0HeUg/D+ka+PpMvzyzBkkOUZVK6Q2QypSRHpCGEWIkgD1LM66qoOYw201avfKVBGIVUpksyZ1c6slsXvKtSFiXvT+peZ+Q//MYQ0ShfjJD409M0Q5VkOzjkEExBcgK8WdzRLuAIByB3WYRzakTpkE+XP9ea90AFRKpMT9Kk59di3gL6lo7OLsyPD54dRRtmLMk+ruMgFmGVeOCvw4nGLgQQoZ2V013oRypUr9In+6Mlew9/x7vid8eq1H675u/cGvDC5Y+IFLGePiidNA5FD+n7rygCWastTGDNvPfE8QFXK0IVdl3+6vHD3t7tenAp5cPI9txxcc0D9RVw+NLBNbseD+UUXGP0GnSf1ryYiGqEZEPafuXQmDZdDP/jUxHpIUzHESFoNePqSfgT3Qk1BfoCO09Q6ZkIfSq3156OXRskqC55zhxcXRoAUgSu+Rrwn7YFZIsrC9As6Zs62NRU7E4O1sDZy9furq+JF+IQV4IaDZcwbaBEvxSVUZA/kSnSBBu3H7a8FzVDOzs1WqxNVcMs92kMxeQNNE1uoDyuN8DYm7TvtL0atoSxj1+T05MLc/Tlwwz2aw0r7p3hfuR/1KKghMG/60LVnYG0oNfb/fPtGKhuyeAxCC9jIFuKb+GZInWQIcIC+pOkNWY7pLF20yhy6MTVOpKjIAEWESl6B7SYyoR6kIXNuQ/cDNExHYxmfvnn/VjECJVWCeLYMJZNROmk/ezobklu0rxbVJiKSeOW1V2HJ3sSPtOcp7Yh8KLt45e1ABzPPbX9+YeeO13cXQV3XxYjWzcHhg6WxO2M97Vyj88+oY6Bj4A/5Q1lRvUR0ZwAAAABJRU5ErkJggg=="

/***/ },

/***/ 1492:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAMcSURBVHja7dffaxxVFAfw7/feO3dmdmYTs2k2DRo2IVVsYyNR+6AGZUFKI7ZWY1MR+ty0TwoBbSkREQSfBUGoFMS3QhUs9klQ/wqhxQftg0iRWrO63dl7r/Mj7A9LKNU0Qdhz+LLzdj6cObAMnXPYyRJpBoAB4P8LYJ2ifrKudgTANzg99lj12uSB2vXqavXhbQVwNzUEv9wlR6d/vv7T+I31377gLPW2AfA8P69ElbkYMb7/5jto6Fk8x4vbAuAyz4RR+Nq+sb2wnoULHcwvCbySf5in5Xv3FcBXuCh9tfbk1BOkJpx2YEy0ZRvyJqmGvHe4oo7eFwCPcQoeLhyYeSqI4ghGGRjPQMYSKAFN8xfapqUxgk+5wpktBeQHluDS/un94xMTE7DS5uu3yhaACEWaDjCugoq6zBfpbxkAM/is9mBtfm52Dlbkg4toC5YIlNBBKE+gHMWP4nF5aUsAfIlnKkOV5foz9Xy4kSZLDnCeg/VtBugg2mEbiWwiLJcW+bb84D8BeJiLWuu1IwePUPoyAxSRNr8BBoQNbN8GEAPNoAkVk3o4WOWqWvpXAL7KKRAXlg4uBeWRMmzWzAGdDVATiU6AED2IIn/4tzC0K/ZYEef5JvfcA6B7dIeePjRem6nlgw0N0i4Q0nYOEQEyQD8iLnJD/woX2AdQ9a5sdpRis6Obf2R+fuHZBRhnYJ2FxQZCmM5rcMoBPoCgF9AfrypQGR7ZgwX11V0A3aObHJtcPv7ycSQuyYZ3kje7ECccoNGL6G4gKkBJkOD2UANxVH6B73sfbgLoHl0pLK2dev0UqQlrLYw1xRaK7tsGJACVxkuj+xBFwgLXUA14ZTKIwrf4rjqGnlK9/+2I8cnZE2eD0d2jWP9zHVpq+MJHS7YQpO3oQEWItGXWfpqWBD3mCPoESyx+DQECwgigDZgkwdToQ94PuPYRgIt3APAt3MrHK7z641WcO39uQ5XG/0eyYWpjmBKgFIAgoNJIFs9CACwAoAQcYEA0/N+z51voqb7vAi5ToIFhaGx9tVDU17jpeoYOPkwGgAFgxwF/A9z/FVdEAW5kAAAAAElFTkSuQmCC"

/***/ },

/***/ 1493:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,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"

/***/ },

/***/ 1501:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64, "

/***/ },

/***/ 1502:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAOZSURBVHja3Va/SxxBFP5mdvd++DN3BjmQ2NiGNEIMmDRBC9PEYGVjn0LRIoWkTBswRWzyH1ilVQwW0aQIpAgxIBIEQxCJoPHO+6G7M5P39mbZQws9byEkD76b2ZnZe998772ZFcYY/E1z0aStrKzcrVQqj1Op1INsNntHCIFSqfR1f39/I5PJvJ2amvqEJqwZBeTq6uoL13Wf5XI57/T0FEdHR1BKoVAohNjd3Q0ILycnJ58D0EkSkGtrax/J+dDJyQkODw9BCkBrDVaA/6NcLiMIAoyMjGBnZ+fz6Ojo3auQkLiCkfNFcjS0t7cXOvI8b4ucjgPoo+e+4+PjcVLiW3d3N5aWltDT0zO4vr6+mIgCy8vL92m37yju6WKxiHQ6/XpiYmIGwPkXxcLCwityPsNKDA4O+qTWw+Hh4Y2WFKjVavO0+/TBwQFL/DN2fsHM3NzcLCmyTWT5PQ/AfMshoLj3c6w56To7O5+ec36BBK2blVKiWq1ybvQnQeAW7QYMKrP3uMQcx/ng+z7nCr/bOgGSv5t3o5QyY2NjRVxi09PTRVLApxJlMl2JVAGFgJMPVzRWigmDLRECHFM69XBVs2v/LwIcgmYItH4XfF+fNL03U/j1Q6P420OpDFQqZ2F51QjVaiUqNT6Ww7hnsm2h87a2NLq6JPKFduQHBrC9uYV7j96Ipm/DjtwhPP8LCh17OKspFEsCJyUXlbKL2qkDbQSkEMhmFNIpg0xKob0rQFveoCOv4fQ+gblxG9i85nWsdR1KuQQB/4z6gQKMgSt9CCHhOS71QdAQELQ+RdMBAIfBFXT97wEp63CcgKBASiPwBYw24bgQiggozhGal/RsCAhhjE7ugyRWwmnos0OAfrnlVUSC80HDdbnP5BWMlK0TECKC4ic7Fjlh1EkFAeCTQq4vw74IyeokCQhbuXUF2GQDGddlaHie4T4Ta10BraWF4dwjcKtZXuuUCcRrg0AQOQatsetbIiClhiHIEHWHyo3mQlUIsHO8RtpbMVYt0a9iY1h+Rj3ujjDcskXJSLBzSR3FsUU7EqHcgOTWlh2inUfJmVwZGiNCKMUxDkcIksPCzhoSU1hldGPsk6gCw+DDqJ4DAeB52uZADLt7O97ibdhMeVpcyyQSs3+TgP0eiDOcCXkWbtQ2wLGQFo3CG4K2UBZBA/yoZZBfjSgJhT1jI6fnkLJtmvuMc+NocHZm4XMbIyYakWSXTOIP+ovMDFckBwoAAAAASUVORK5CYII="

/***/ },

/***/ 1513:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64, "

/***/ },

/***/ 1517:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64, "

/***/ },

/***/ 1526:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAUYSURBVHja7ZdrTJNXAIZ12bL9W7bfS8zcluzP3CBzi9NphhcQHJu6kS2bYzqcU9QZEVRuMkHu0oIpd6hSYQhi5SbXlltLaS0djEsRLPdrgdJCr4zw7hyyYqEwZKL740meEtJz3uc9J1/y9awD8L/yvMDzAnMfZKwnvPiMWU/d5vEqYRPB5h9snyI21EWdZvlLhC0zMzN4llAndZsL7Ejnd6B3eAImk+mpQh3URZ0LCjR2TiKvrh/5oofQ6vQwGAxrCs2k2dRBXNYFWvt0aOnVQtymQlJhC9q6R6DT6dYEmkUzaTZ1EJd1gfYBHczIyaSsKgVu8VsxPqHG5OTkf4KupRk0i2ZaOKwLKIb1sOThkI40HkP0HRlkbX1Qq9Wrgq6ha2kGzVqUb12gW6nHUnT0T+Emrw3sogYMjYxBpVL9K3QOnUvX0LXL5FoX6B/TYzl6lTqIWoYRnC6CsEGBsbGxJSksacJx19sI9ygFhynGrVgpEoMEyEltxJ9NSstM6wJDKgNWomtoEkkFTYjKqkNnzwCUSuUcUnEH3Fx+x+Ht15GZKENZfgdqyrtQWdqJkrvtyM1ogfc3XPi7FkDRo6FZ1gWUagNWYpA059a0I/SmAD6JPJTVteJ2Xj0ObEpAaoQIJTly5KY0gJskQ058PbJZUmRdkyIzRoL89BbcYEjh6XwH8tZR6wKqSSOWY1xjQEefGmnFzbjf0jW3a0V3PxgcAQ5tZSM1XIQ7CbJHwmgJMhgSpEeKwYmoQ1pYHa4H1+LGFRHYIWKctsvC269vdVlQQKM1YilUGj1qm/uRJ5BjRLnwIbzkmouos+XzwpuLhOygWqQG1iIlQIBkfwES/WqQQIjxrMa37zELFhTQ6k1YzMi4FgXCdsg7h6DRaBagkA/CbQsHnEhLoZAIhQuED2TDSPETIO5CNWI9qxDrUYV4bwE87XP/+tEm/p35AkajCWYMBhPae0ZRKVNgQq3B1NSUFdms+wj4rgApl4VIJsIk8w59qhFPZHHnqxF9hgc6xoe0SA+R4NrpSsScqkCMewUY7lU480lO3HwB88tCpzNC1NSLnsFx6PX6ZfF3yQfjV96ckOVZCeZZPqJOlSHyRAnCj91DiNs9BHx/F+YxbZpBXmIjon4m8qMViDsngteOPL7FCRgxqFRD9mCQnIBxxbeat3Mu2QUPzNM8rGbI+D1g/MRH8kUxfOwK6+cLyLuVGJ3QPvb7PPSHUlw9xkOoWzFWO5pFA0g6L8Zvu4sV5gLbZmdnsRpYJ6vh61gIL8ecVcklpV3w3JmNwD1lCHIo/4MWeIHwBmEfYf/j4mrLLPLanodzn3Jx/KN0HNvMwdEP2ThsmwzXDxJw6P1Y7H0r8NEzYJhBgm85PLZlI8SRjzCnCgLfex0Ac4mXLXhlJdw2s971/qxw2tfuHvx2FsF/ZzECdpWQYy3FZbK7QPsyHLFNBB2DnRPwcE4j8/IRsa8KkZ9XI8q5BowvBG8+0U/qS7uKkwN2lxBhKRXSI0WwAw8he/kIdazAiY/TUMFtxi9b2Qh14lOhJUVPfC8Isi/fcMWBN2IWhjlVItK5CoyDNYj+WoCwL8vhtycX0V/VgnlAaClvI7y2JheTcKfKjeRY266SY004IgL7pAQ3PKTgeBEu1NO/c/+nukvM8hHCxjW9GdHdEIqY+4VIOipGhk89uJGN4EY1IvOSDKmkVPRB4TSZk0zY8NSuZvShIlwkyAgPCVICj8Ci3y215m/s5zuAqCs1PQAAAABJRU5ErkJggg=="

/***/ },

/***/ 1528:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAN2AAADdgF91YLMAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAfVQTFRF////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAALS0tQ0NDrq6ua4Wfip2zjIyNlJSVoaGhoqKiorjUo6OjpaWlpaamp7zTqKioqampqquuqq2wq6urq66xrK2vrLC3ra2trq6vr7G0sLCwsLa+sbGxscXcsrKys8XYtLS0tMXatbW1tra2t8TWuLi4ubm5ucHOurq6u7u7vLy8vL7CvL/Hvb29vr6+vsjUv7+/wMDAwcHBwsLCwtDfw8PDxMTExcXFxsbGxtTkx8fHx8rPyMjIyNTjysrKy8vLy8vMzMzMzc3Nzs7Oztnmz8/Pz9fkz9nj0dLS0tLS0+Hy0+H01NTU1dXV1uP11+Dq2eHp2uHq2uHr2uX129vb2+Pw3Nzc3Ob13d3d3ej23t7e39/f4ODg4Or24eHh4uLi4ufu4+Pj4+ju4+z35OTk5Oz25eXl5ujr5urw5uz25+736e306e/46urq6vD36+vr6+/07e3t7e7w7fH37u7u7vH27vL47+/v8PDw8fT48vLy8vP08/Pz9PT09Pb59fX19fX49vb29/f39/f5+Pj4+Pj5+fn5+vr6+/v7/Pz8/f39/v7+OoLMYQAAAB90Uk5TAAECAwQFBwgJCgwSHCIkJSg3Ojw/Q0RGR0pMUXWi2KeMyXsAAAIaSURBVHjafdD3W9NAGMDxNNIIhSKjTFkOiggqCiLL0kKKlWApSpACZSmjDEVUHAhYQBCQobEYg6W5kvbv9O4yFCF+nufuee69b+6HEP8gSeIEA3lGFWdKTjbFaUfSgL9JNJ9TpKTmFRTkpaaoZ3Miei8+LaYrLR4FFv3AogYghhYUUW6kGNCCBEs0Ouh23X9Hu3toh4d1ezsGmfGHTue3aNSSoARSGK4g3BAJLbRrgSSxd3sesfUe9kg6DgemnCNdOSb4m8z5EV35ZgNhzLABwAO0IAHIQvLRlmEkjNklIdDHNNOv7cxju62tg2Ef9Dmfuh2OTRAqyUZBYxXHc4LAf+Z+BAVB4Hi48QLcuapGHIyOVF8pg0+U2e2MrZ520s+/IJtPqkdGceD3+4euvXwfwD4EXrwJBOYCS3M3huAFDp5Bszcv3LHeuu25fKnNer221nr14r1ZNMfBK2yyvH9sXDHWXz4pT3HwVrbYVen1+Xp7fT5vZdeiMsTBR9VChaulqKjFVbGgjXDwSbPeVNjaWti0/meCgw3Vak3p8u7ucmnNqjbCwVfZzkzxMIcNF8/sKEMcfMf2Ouu2g4rtus49eYqDn8hawxT/l6mGNTxGQZYoiofT7fu/jtlvnz6EF1koAOCgez58wnz3AQA4CK8MiJFTiAMrYRRkTmxJOrYmMmGQHvuPdCNBJuWe15WbRBIESVHU2dNRFEn8Bq9AjjHOohkaAAAAAElFTkSuQmCC"

/***/ },

/***/ 1529:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,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"

/***/ },

/***/ 1530:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,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"

/***/ },

/***/ 1531:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAVCSURBVHja7Zd9TBNnAMZPN+OWbTFbsrglS4yaLS5ZnJolTmOC2UfiMkJmoi5bZrb5hQtDnYJTcIogjphhBIQhRbZBEXHomDoxgCgDpAYsH23p9VroN22vH/T7A5Fn713BogXRDd0/Psnvrpfe+zzP++ZN7o4C8L/ypMCTAvyBaBrh6cfMNC57VLMICwmLR1jyCFnMZ/GZYc0gLBsaGsLjhMvks0cOMeUNSujMAwiFQo8SPoPL4jLvKtDV58Z5kQEXWlXw+vwIBAJTCvHkvPkMkhVdoEfvg0znxQ3aAcFfMtAaC3w+35RAvHhP4s1nkKzoAozRh1Hk5KYzjb2obOiBfcAJt9v9ryBjeQ/ixXtGMsYp0Gv2Yywqk480tiHnnBhiWg+n0/lQkDH8WOLBe93jH11Aw/oxHkqDB8IrNH6p6YTJYoPD4bgv5B7+XjKGHzuBb3QBg82PUa4r7IgXdGDTCTHSqmgcrmaQ+KsEGwtEOPu3AjabbVxaOntxuLwVrTIzdKyP85qI6AImRwBtKgc+z23H/G11+LFaidJGPapEJlS29KPkqh65l7VYli7CgqQGdNA6sCzL06c14ugZEQQXJVCb3CBekxFdgAufvbUWu4U9ENRrcaRahcPnVDhUpcTB35XYf4ZBaiWDnBotkitUeHV7I0rrJKgT9SC16AqyhM34o4lBP5kd6wxMwr0FXn4z9o2ka9hFwjNJKBd4VWZH6mkGeyoUuChmsVOowI5SBRJ/o/EtIaGMwazEZqQLW9GrMfAr0SZTo/SyFEq9E3ZXAA53cCLuKbCu8sa6vC7sGwms7baB03YSVNZkBKf4k3JsImwopvGlQI71Ahqr8+X4glyP3YQW1obzzXJclxrgcPnh8gbHJVJg7anXX0poRFJ5eIaXOqzgJGIGkFXN4PbwMDitze3EZ4VyrPtZjjUFND7Jp/FpkQKvpEjQrbHD5XLdhbzPhIstDCx2L7z+UBSRAl/X71uacRPxJTSq2y3g1KV1IamsG6FbtzGqD7LaEJcnx8e5NFbl0PjwmALvEWJylNh8SgOPxxPFgNOFa+JeMForAoEQgsEIkQJbmjricqSoamPBSWn2YUthO7zBIYxV3iUGGWfJ0hd2Y2mWBMuzFVj6E4NVBWqszFfD7/dPiLbfjlaJDj5f8M5DKVLgG1FvmSgcbhwIYv3xdtg8IdxP12gHFmVK8VaWCrECHZYc0076FAwEghAr+tHPOskKjN0DCe03S5rDBQyOINYcFcHqDmEynWwy4d1jfYg9acT8I4YHfg+wDngh17BjCiR2NszeK0F2rQGcJHoPPsq8Crf/FsYq8/RNZP8pQ72EhdUzCG5vrsjrA5Wix+LjFnI9/FCQ8BXhAjukBdTOHlDfSZF2XgtOdTI73k+rR2AwsgmpjQ2g9mpAJTGgdkqxQahGRq0V1A8mUOurhMRs9UMQS3iNMJ2ikhRzqWRmkEpWgtolJyU04FQhMiMuqxFDt4fDBeKvg9pnJIH9oPab+PM7uQZQaaREQtMCYvbMAzJzhOmRt+I9fcXUHjWZoRbUbhXSLmjDoVtb8FVRV/j3tg5QBywkkAV10MbzwiELd67576/lKbo5VKrBMjJDvsjBSwbMTJbh+QM6pJxT47nvaTybacOMDCsXOgpNeHFKPkyo/eZ5ZIY0dYDF3GwWi3JMWFZgwsoiC2IKjIg5YcbyQgsW5t1ZAQth3pR+GXGzIdQ8lW7D/KNWrCo2YWOFCZtPmxBXYsbbJHxGum2Q3FNMmPPIPs2I+VzCXoKYoCK0E64Q8rn/pvLT7B/1WUIpQMdGKgAAAABJRU5ErkJggg=="

/***/ },

/***/ 1532:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAATUSURBVHja7ZdtTFtVGMdPdImJn9wMLnMxDXxwqCMx0U/O0ET3DU2UD7pFYyQS4xjKJrCCsLFJxoDGvTlkGxOdRAhDvxiR4YajaGCwUla6vr8XSldoS8tLeSnj73NPKOm4o2zA5hdP8uvtOec5z///3HNuci8D8J/yvwH+Q01CSB8xklgDqXjEjWvGGJBqnWOYnJ572LpcQ9ASNO8y0KYeQbtmBFbPBObuzK+3Ls9JubkGaYkNdBkCIIRJYhje4PR6afNclJPnjuqIDKjtIURRWoJoVnrxt86/pm2htTwH5eI5YzS4AdEZWEqXPoCGjkFoHGMPtC0Uy9fQWp7jHrnFBoyD47gXhoFx/NnnxcW/XBj0Ta0oTjE8ltbwtcvkFRsQDkg8dK4x1FNFddcGMOQXG6ExPkcxPHaFfGIDruEw4mF2T6Be4cTPChdO/GaB4pYPkbl5Dv3nYzQnxPDYFfKJDQgVLIfGHkSDwoE+6+ji2GWVF6VNRg79j47zGIrla+LkFBsYpkclitISQEZ1L14v6UDy/qvYsqcV2w+0o6jRACUJROMGRsIC0X7M+CRalG46gCPwjvIxESIDgfFZqB0hfHimF1uzWrGbrvn1OpxosRF25DcYsPs7NZ7JvoY3K5SwecOgNXFRW/1Q9HvgCUyJ5kQGNM4Qtu69gjR5D8poPyubbQvYUfmHgINT9rsDaSfVeLG4GxrXOMbDkbh4/JO4rvPQvt8Vu8RAwgtvJecrsKvqJmSNRsgumQgzcuv1kDVZFrBC9ouADbJfbdh13oDNeT0weiYxNTMXl4mpWRhdfljdowhPR4SxJQbea+yWHruBzFodMn8g6PpRdR8utRuR8b0WmRdNhBmZPxF1lgVskB7XIYOukbk794UvOAm724/wVMwWsI+vJm7K7kD6GQ3Sq27h3W/perwHHWonhPY23e70swaknzMSJnDOW5BeI2DF5sJ+2HwzuN82G4nA6xuNMfBJe+G24h5I5f1ILb+Jd+SdMA/4EW2vlfUi9RstpCcNhJEwQXrKDOlpC2fbUSOymtx4kDY/Px9j4NN/VJLCXrxUosQHpzoRGAsjtuXWdiOtohPbv+7D9qN6pJSbkFJhRkqlhSMpNeONaufqX0jYnm4L++w6smtu8H1arg14Q9hbq8aWYh2ePWJGQokZTxSYwPKJHJVx1a9kLLtXybKUyKpRcgMrtX0NJjyWZwQ7YAGTWcEKbITDsuqXUvaFuo3l9IN9rsLO8i7RFpxt1qLHMESPToT3ZyJzeEVOBgrtYF85iQGwokHV6g3s11axL3VguXqwfVo8X0TPdswhZDkaMKp4Q54eO471wTYUhH4wRAYcYMVDYAc9YIduF67aACVPpH2cZflm4bZyNsrUuKJycQN8vIhXSdW68HSxHgqtF4lyN1jJMNjhEbAjvsS1fRcU2C6wAjtV5RRESMyFDflGVLWawfuHeJUk6OX/JWU2vF83SOLDgnjLmj9MSERCFXpZMVV1cPG2gvcPL1YZhY89J78tjBuov3GtBjgkmEQVGqK3dVOlH8lVo9hRG8TOupBw5f2nKvxRI14iaV2/DYVqiBYCT5b5kXR6FK/WBJH6YwgvnwsiQR7A46W+WZq/QEge2sepcKiIQkJFWAgl0UZUiQ7cGvkXNaImu8Ch0UQAAAAASUVORK5CYII="

/***/ },

/***/ 1536:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAbQSURBVFiFpVdbaBzXGf7+MzO7OytFu9pdXVytlTYhiVCaNbLdQkigVsEttVuKnkrbpzoGvfQlhhZcTBz8YOQ8FhdTPbQUGwdMDW2wK8mxhcF+UwhyZVpVl8ZSdLGk1WpXl73MnDl/H3ZmvDc1dnvg5z8zc87/fec7/zlzDjEzXqSMjY0dFEKcKBQKfaZpvszMqlgsfrm7uztTLBY/OXXq1NyLxKPnITA+Ph4UQnxARKe6uro6Y7EYhBAQQpSDEIGZsbW1hZWVlfSTJ0/+nEgkzhw/frzwfxO4ffv2z4UQv0ulUpFgMAhN06DrOojINz8YEZRSsG0bU1NTexMTEx+dOXPmwv9E4O7du9rCwsJfDh8+/MOOjg4Eg8E6YA+8lgQAKKWwubmJhw8ffnb16tX+kZGR3ecmMD4+Hkqn05N9fX1vhMNhhEIhCCFARL7fj0BtsSwLExMTqxcuXHjnwYMHX9R+F406zc7OfppKpd4IBAIIBAJ1o3uRYhgGjh49emBwcPBvRNRR+12vfXHjxo0PDh069K5hGAgGgw2DOkpiMf8EBIBIgEAI603oCB+oauepaxgGjh071nPx4sVhIvoZM+81JDA2NtYeCATORSIRhEKhOmAvoKUsPM2vgEAQJEAQeMloQbvZCaCxUpFIBCdOnDh5586dAQDXvPdVU7C3t/f77u5uo1L2SnDPlGKUZAmWtFxfgi0tKKWq2nlEvOfu7m7t9OnTvyaiV+sUGB0dbbZt+0feMqtNTu+5TEDBkiV39ASCBktY+/bxRysEent7v9nX1/cugPkqBebm5t6Lx+NarXweYJUCrNzRl82SRdiOXdXGs9pYbW1t1N/f/30iSlYpYJrmj0OhEEzTbBjEk9TbbCxZAvwcINhavQLeDlk5DaZpoqen5y0AXQCWfAKZTOYtr4NSCpqmwVY2HmU+KwcrpxwEEaRyUJIlEIT3FltqC58/nSivDAgQAQICLwVb8Gr89Spi7e3tSQAxXwEiarp06VJzrdx7chfT2X+UYbgMTuxuRC6wV7OlhbnSrk/S+xoNteKV2GtVimqaFgbQQkRBHQBSqVQrgJCUsibbFbaLWeRLeUjHhu1IOI6EdM2W5XnXoUMXOnQyYAgDGukIagE0B1vwcitVDcqtB5LJZOvS0pKpA8Da2hoD4FwuR+FwGLquwzAMrJeeYnxuDKzcjFaoqTPAZc8MQDFYAeCyZ8X4eusr6D94HMwMx3HgOA4AoFAoAIAhXALScZxCLpdDoVCAZVnw1fCAXF+us19nD1Q9a8s15ADAcRxYloVisQgpZWFzc3MXgOMloSWl3JFShiunoMM8gF+++SsoVgDDn/tcKYs/PLryDEABB5q/hp+mflHOCSKAAYCRaGqrWgXMjGKxuAOgBMDyCORbW1sf2bb9PaUUPGPFOBQ/UvXXIyKk8+tlRfjZ6E29Gd9Ovl33l/SWrZcHSilkMpkvAOwAKAiXXWlxcfHTUqmEdDqNShKNCgN10kPtf7BxHMePl06nMT09/XcAWWZ2/J3w2rVrI/l8vpDP56GU8hNmXxIN5rtRqYzlOA52dnZKN2/enASQBiq24tXV1S+FEDfz+TwymQwcx4GU0k/GegIVK0E9S7aqNsyQUvrg2WwWs7Oz91dXV+cBrFQRYObt4eHh325vb+/lcjm/U0MS/pKryHxuDF5pGxsbe5cvX74FYIWZ80DNeWB+fv5f6XT6I9M0P1xeXqZkMuknEjND13Xouo54OI733zkLqaS/OhJN7VWyV45cSomlpSW+f//+x8vLy4/h/gnrCDDzNhH9aWhoqDebzf5ECIGuri6fgGdCCHwr+XbVsRwoJ5uX6ZXzvry8jMePH9+5cuXKJwD+7Y2+joBLYoGIPjx79mwbgO8yM5LJZNUyEkJA07Q6At53zzzwmZmZh+fPnx8GMMPMi5V4+x7Liajn3Llz77e1tb0XjUa1SCSCeDwOXdf9S0ktgco9P5PJIJvNqsnJyb8ODQ39EcAsM0/X4fy3iwkRfWNgYOA7R44c+U0ikXitqakJ4XAYsVgMgUDAJ+CRkFJic3MTxWIRGxsbc7du3fp4dHR0HMACM9cdyb+SgBs4BuDg4ODgDzo7OwcSiUSvaZrNhmH4FxXA3+v31tfX/zk1NfXw+vXrIwDWACwy89a+8Z/3ckpE7QDiuq7HTp48+WY0Gn09Go12AhC5XG59bW1t6d69e1OWZe0A2AKwwczpr4zb4BhloJycnvdMcy0IoAWA6bYRABQAG0ABQA6ABcBxTVaYDcBmZllFgMo66hXAgQofrPCV5pEilLcmxwUuur7kmtXAbACSmZ3/AJwevLMl6FAnAAAAAElFTkSuQmCC"

/***/ },

/***/ 1837:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAATZSURBVHjaxddNaBxlHMfx7/95npmdbpLdJJvGtlZqWxUNValULKj1BXvRilpsFRSvouDBF6jiqYqoV4vgQQ8i9GD1IIiKFEG9+E5rqy0aWou1aWyS5mVnNrOz8/zddCskIaUr0vQDPwbmsP/fPM/ODCOqysVkuMgcZ+3aO/pwOTLviFBkFlXytK6fDo7Ko69v65m4YCtgYGMh8MXQeWanec6WOnTL6or/eMee0+ULtgJZDmmmnEsx5JY1ffn4W1+M8n8Y0Xra4IGnNvd9MqdAPfOtAudbLuH/CusZdwJzC5ycqHWPJ8piSBv0cpbs2H3s647IXAsSCVpgESiSgk7H0/6AOzKSr3JWEyNYY1iUAt6TeSXJGn6VC4MgdtaWjYAIi0IVvIIxeexCFybOmrKgi1pAEYzYxAVBkATW0Dqli1MAAQQxPnFR4GJrLaiii1RAaO23PbMFgYmtEVThv76YlodHqSypcnDi2v9WQORMcmPi5hZI4gx4VdTTti49xvbSkwTW4szL/DK1vv0CRjEiNLzMbIFJjID3gje0RVA28zRLVz2CDfvYdHw3R2oDNIhohxHBGMFps0DoJDYC+UwBT1sG8je58rLVhKUrAOjt7mez/5C944+2V8AIthmvxCZwkgSB4JyIc3C+VMxvbCy+T8eKuyE/DX6CqHITa+UzVhcHcY42IjIzc2a2ixwxRjCI5CLMJ5pRyX9kqf+KS81+LulM6L3iOaxMgabga5jGBKWVd3HX0C5ORZdzojHAYHoDNfpZiDUizRLgNXZBKIkgCIjJZe5S13ayruN7OpfdTFAewJhrsBakMQR5tZkEfAwKoZlu/idupMcvYW02zE1TuxgZG+Ng/W6O2S1zC1gkcIJC4gpWYsy/DwZltp6pbymvvo8oyiD/DjKFBi0+Ac1ADIgAKdKYJCisbaZM1HM7UWWK8a9f4q8Vcws4I4SBgCd2USCJF0G9zGC2w6XX6D30OCuv24ZjAowCDfA1EGkNR1qRJRCsAFMHRvGNiOHD7zDY9QKBlfkFJHSCURIThBKHDpxVCSzMTla8nn36DKcOvE9DO0GGgWZM3IqtNjNzzCAogJkGJvHNMqcOvctPk7dSq2xl7u+2ZoUOZma7JYEkmUI9x4oX5ov7H+LXEz9x/eCXVK7qRBgGKcxKR+vqqYJY1FQYO/wR+4aWUV3zAm7B2xB75i4QEpcr1am6SHUapyysWnmF5SOb6IwbRKUEqMG/VEAjMEWgl3R8GYN/Vjl66S6osyAB541IOdSq8xEH//z92GTY0b0MlHPJNAAZA5cxh0Jr0iRwkjwZpRYMkEznQMLChPGRk1Nd6y47KKqKiGwDNgAlWoR59r9XefjqO005LDXmFRBmi4eKfPbB0NEHX8w/Z2F6tu0PqrrH0fJBK+e2tK9rq4lGwCkg5KmSjuQYB4WKQyxnmGCa9Vf5w8ATbX8XaBPnMfz52m4pFEnHlfi4MvZHjaQqPweh9pW7/YquNRHFlTlSCBGfdajWtb0CbRFJq/b08b09/WMT9RO1Wrbn79Phe/c/P/7jzu0SbthU2n7J0PRjvb2FOzq6xKW51GiTnO/iRcQC0atPl271Kf073578rl4nBCIgBAyQA+m9txWX3nOL2RhPZd8++0b6DZAAqTa1WWDx/QP5LPeMc+QzFwAAAABJRU5ErkJggg=="

/***/ },

/***/ 1838:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAAVJSURBVHja7VdbbFRVFF3n3HPvTGc6nQeF8EghIjQQ6AfSD6sQC2nFEBLASFITUhEDGlONJBoSf0k0fPijkhhA4kdFE4hSxWoABVE+EDABGkyINpQiqYW+pjN3Hvfl3jczDS3TBzGUH9fMmrvn3Hv2WmfvcyYZ4XkeHiUkHjFUMfjoVF9TNCg/FQIh3AMqkJPLe9//2Se27t0SH3pYFeDgyYDuhgzl4l7SmFYR9jY8NsM9vvvIQPShVcBygJzlYTyEDKxaWOkMfvJT339bsfDyORub32isbB9lIG+5bGDycgn8Vxh5C2sBjDbQM5SJDZoepgNUgUQxFrsPd/0SDsoaCoMCXgDTAA8iR5/ZdNa9qjrvOguU5plSQJMS02LAdWG5HkzLdhcoQ9fTStOiZACCOB3wPMAlSumklaEMU2kyKuBNpwFWgxSaqXRdN3VNwh8iPlgiFwIPXjpWAlFI11RBXaU1TfNt0WvqSSwTq2I90JTC6d4YNCMyZSNF05rfAl2mNSlYnzg1A/lMCk8ZV/D0vr1gmC+24Hy2FsHy+NQMCOHTkTJNLRCmkoDLFXAxKRw7DwxeQ/3dn5E1TTAaOy/hXNCDWLgayiib3ID0IMmA7QpTBnVpGkrA0AR0NTHpuMIc+BubK/uROXUS2pu7IFreQubkCTQtcDF85waUdCfNw1qsydqKgrQUgOMKuJNUIDOcRFnyCh4/fwLOkqVQq5+BS5Oy7d9h4Y/HEVnSADszG6GKGZgIkgQ1oushLcmRSW2AUkIoBYxHuFn0/HURL1c6yFz7A2WvvY6DBw/i0KFDCOx8lcauYftMD/90/u4/O1Eu1mJN1pZBhXShBULXBEpRg4PknS6srApAHf0CgcZ1UIsWI5lMYmhoyI+1tQ3Q6F7t/CBSfbegCRfj5WMt1mRtqRvCNPzeoKQBJUFlTcJJ9eLZnqtw0mmUb3/F38WRSITpx6GXtsEaTtEzHfRML9x8mueWNqHgG2BtGdBE2tALm0zHWBJyMEn8ueoo8t+0IbK1GSqRgJQS5eXlbMCPtXgcZU1NyLZ9jXWLIsik7tC4XTIna7Ema9MpKFSAylJq9Z6VwbyZUVQd+wwiEUf0hS0syKv2DYTDYY79sfCmzUA8gfk/fIk5iXJ4drZ0BQotYG1uAe0B8BEjA8BYRioqUJe/gYEDBxBr3gbaPUVBFh8xwJSGgciOHcj8eg519k0yGEapnKzFmqytysiF5QF5h/eNwGgIJAwLzq53EV6zBvENG/jY8S+mz5qaGr764kWU1dVhaPFiOB++hzkfHEVfTmEsuGN8CuhtKsdDajgvRCoL5d0nTyLnDiN16RKWX7g4svIiDFoxg02wsaK5yM6d6G5owNzTn6OrdhvI4pi8UK4UImp4KekG0dHd1ZVMmxmYpjmK89weZPfuwSw656Fly9jAiAnm/v370drayvEI+X7Z0qWoaG6G+f4eznFfXta6dfPmMGuLQgm3AKglVhRNVlVVBb/duHFrat/HWs1vFxBesYJXN4r9/f08l/cBr34UzcuX0dXYiPKWFmdTW1trd3d3FvDhEZPEi5TjSNGAwBhcv359092VT3xl09l2uNzEYIGBwndFlESXaBHzRFbJETNEf97s2ag8e/b56urqYxgDj6CKAcags7Ozo+Ltd27nOzrmgvwZxKCUfPUZoFhxO1iIplvEPK1cp6tBV6MwZixfflvTtI5SGowJ/5yeOXNGxWKxWe3t7bGBgQGD+qfbtq3ncjlF1KnUCgD33g4EAhbRVkpZoVDIisfj+fXr1w8Seuvr622Mg///Hf8Lnhxf6mVDJD0AAAAASUVORK5CYII="

/***/ },

/***/ 1840:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAN2AAADdgF91YLMAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAVlQTFRF////AAAAAAAAAAAAAAAAioqKAAAAAAAAAAAAAAAAAAAAp6enISEhJycnJycnAAAAZGRkpqamAAAAAAAAbm5ufn5+tra2iIiIuLi4jIyMkJCQycnJm5ubPDw8QEBAREREXV1doaGhjo6Oe3t7mJiYp6enubm529vbhJOnkZOWkqK3lJWWlKzGla7LmJmamZmampydmqWzm5yem6Osm7DIn5+goKGhoKWsobfRo6ispLvWpamsqsLcq7/Yr6+vssfit7e3uLi4ucncusnZvLy8vr6+wMDAxMTExsbGxtPhyNjuydnrzs7Oztzq0Njh0tzo09PT1dXV1uP119fX2ub029vb29/j2+f13OXx3d3d3uj04OTo4Or24enz4er14+fq5Obo5eXl5efp5e335uzz6enp6vD37Ozs7O/x7e3t7fL37+/v8fP38fT38vLy9PT09fX1+Pj4+/v7qpx/5wAAACh0Uk5TAAECBg4ZMjM3Pj9KTXJzgoaGiYqfprDK1tzl7PX6+vr6+vv8/f39/vRPmCIAAAFGSURBVHjazdPZVwFhHMZxikkoTPZ9J0slZE9oFEIJM1nLnrT+/xcNvc15zyxX3fS5fM73zPldvMP7N/jbLPhQIECQHRoEEUCBaPnKsBRBgdgbvqAJe8VwsPpiWMGB1Be6ogn5pFCg7D4ydJVQoGO7QQcFNrYbbDyKxMl2g1NCBWoH2w0ONRUYrNn6J009azXwAKHH0ihnFh+QRabcsHiEIFC4zTjeTJfeKKV0E8fNbgUItHYTQXR6lfjwZWMYr/Q6BGGya0EwJZ3F+uNBsjAnFZKDcT92sl5BkMMw7DKamMyqwUC7HQhWZ5PE0S055kDguiZh0VS+Nh9FIqN5LZ86vl9vLhAYb9aKp/5zwH/Y2kxGEOjvNopTSutn0YNA88BBAwLVEwcVCOTPHOTgze+9c9jngxcpQ9EDBhSV7f7+NlscwAf+6BtuZ65bCqVrAAAAAABJRU5ErkJggg=="

/***/ },

/***/ 1841:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAA3NCSVQICAjb4U/gAAAACXBIWXMAAAN2AAADdgF91YLMAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAjpQTFRFAAAA////AAAAAAAAAAAAAAAAAAAAAAAAVnSTAAAAi7nxAAAAAAAAXZPiZJjkAAAAi7z4AAAAAAAAiLj2AAAAhLb1gLPzAAAAfLDwdKrtbqTrYJbjZp/oX5nkaZ3lWJTiUY/eNXjMWpbjXpnmS4rbYZzpYJrmZp/ra6Twcqn0e6/1hLb3jb34ZJ7slcL5YpjjaqLsnsn7bqXtp8/7r9b9cqjtqs73rtX9rtX9RYXXdartrdT8eKzurcrveq7vq9P8r8zwfLDwP4HTYpjje67xp8v1eq7yYZvmZqDqa6Tvcqjzeq70grX2irv2ea3zj8L0ksD3msb5OXvPea71osz5h7f3qdL7rsvwh7f3qND6qdH7M3fMp9D6LnPIXpXjYpjkYpzmZ4y5Z6DqaI26apC2bKTubpC6cajzc5W7dpa8eZm8eangeq7zfZy8fpy8fp28gK7mgbT1ibr2iqG9jL/xjcDyjcDzkb/2k7nplrzpmcX4mr7pm7TQnrLKocProcv5pc75pr7Yps75ps/5ps/6p8/5p8/6p9D5p9D6qL/aqMjsqND6qNH6rsvvscLVscbgtsfattX7t9b8uMzmusrcvMravs/kv9Dhw9HiytXizNfkz97y0N7v1Nng1uP12ODq2OLs2+b13OLo3+n24OXp4+v25Onu5Oz25efp6e706e/36u3x6u3y6+zs7Ozs7fL47+/v8PP28vLy8vX49fX19vb29vj59/j49/n7+Pj4+fn5+vr6+/v7/v7+BGROPQAAAF10Uk5TAAACCgwQFBcXNj0+P0dMUVFYZGVmeIqMm6q4usXQ2drj6enq6+vs7Ozs7Ozs7e3u7u7v7+/w8PDx8vLy8/P09fX29/f39/j5+fn5+fn5+vr6+vv7+/z8/P39/f7+Mtr6HwAAAaFJREFUeNq1zE1rE3EQx/HfPPzDapvYQBTsk11BsOBNvBShQs/6CvTV9TV468GDB4kHEY+CJn2waK1Zm9hNsrszpisEWdnc/NyG+c4QYTHGfw8UWN3DzPtPo7pg7wFm1rpvhzUBytPwaN1R9eqoDIpykHX848l+GSRYgOLHWOS17vTkKep0v+xoeqIfUCc5uakJEaMOUaIpk9QHnOrZtXzBh+hMcylCfSC5OtOCgF1NiGBDQxU3GSSmHiYBg2dLqPr1sg0JrsYi4MMQV/afMxYQmzpzAC8Vb+61gLmLj6sNDhB2daFmFkS2vv7YnO8Psy0gRIHF2UTcnJk7UTexUtKNOszs5iqmzlQYFIBuH3+/Q/B+ts24YoWzs0ViDrkS4uhgMDiI4lCOcJPIuAhq5qF07ru93q6fh5Kb3Q+FTnnlp6cK4PK0s4yHwNqof/s6gHREFKZq/edwF+Db5C7+aLVO01vAjQ3COyNpRMSyXxy1Z1dzl4MNeVGYj6fqWUGILoYx/tZYOW6Ox3Bz9SIHdLmNis0snwAEIsxog1Dl0xwzvwHqLakweUxeCgAAAABJRU5ErkJggg=="

/***/ },

/***/ 1843:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,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"

/***/ },

/***/ 1845:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAADdgAAA3YBfdWCzAAAABl0RVh0U29mdHdhcmUAd3d3Lmlua3NjYXBlLm9yZ5vuPBoAAANMSURBVHja7ZfPixxFGIbft+qr7skOye6aiBGMawKCByMhhuDBk+BJQTwEFfwXBG/+DZ69ePGSg5e9Br2EePCiREKCOSiGNRrBRbLJJtnu7PRM1WdVQTM/YDosYWcveXo+pumi+Z5+v56CoariIDE4YKQ9+ery1sfLPfMNiSVMoAo/aPT7W1v89MsLqw/2LQEDvFW6sFRIwGTFa/ZIX98/eTRc+mL9/vK+JTD0wGComMdSgbdPHfPbX1/ZwtNgqM1ghA8/e/fYd1MCzTC0At1xEU9L0QzxDoBpgc0Hj1e2a8UiiAk8157z84u3f+yX5jSJHogSi0AxUMVuNQi/yq3//Jq1WlsDaxYkEBRDH1B7H9bkUOEqa82yIZBqQQK5okAlZVnUEgVIgFDsBRIZ1b1OgPmekQ91TCALANA9Caz2Dc6fLJC4+meDe1XYkwDAVkDiCCySUjqeRHI9/ZLgteMWhswpfLDq8Nu/I9y4M8Io4IkQzPF57yspnKmsyZHE6hZ4ccXg3CsOh8vcOGOIfH7mZcGrL1j8vDHEP/e7LUjm8sZU4hxrMUBICcy5r+eIs7HB2lGbm+XC5DeRKB3x3hslNu76LPJ4zsZGozm9UWAtPWdqQyAEIpjZqIBTz1ucOSEohYhMCrQSs9fTePJ9V28P8fumnx1sbm4MIRoFCmGVBHwSCMAsf98LsRp8cr6EGT/xVAKYSKTl4k+7SIglZsjNbaygqMQJa2MAejIExRxyc2c5Hf9sAsjkF1EEc8gCFJsfOI5AUMEQBkwOHQJEYQFMCUyPpR1bUM2y87BJQAgEjQkUrIl0gMazc9ORcQL5BVu/NkDLR28W6BfM680I3QIWdEIoUEtpmRMACBrtFHB2fF4qIQ6Z9hcgFmA21LQ2FzFE4QgEVNJzrAMJDUx0J2DaERCU6ZhLm9bb/YFprUuAhRBGUacRVKqA99rVH5x4o5nnmJpMJCDjzUmR5Lp2U40COa1KDjnWQwUaD8sw3+CHjRFmESFavr3ezF2bxRhY54j4qcUrdh415M4uRLEYCEgw5HKhOxJ6uHnnj78eFv2V48DiFLbvbj46/PqJm1RVkLwA4FysI2PJfUNjPYz1i6qutwLEAaCRZ/8Nnwn8D6f3N2HXa5rcAAAAAElFTkSuQmCC"

/***/ },

/***/ 1847:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,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"

/***/ },

/***/ 1848:
/***/ function(module, exports) {

	module.exports = "data:image/png;base64,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"

/***/ }

/******/ })
});
;