").attr("name",c.submitButton.name).val(a(c.submitButton).val()).appendTo(c.currentForm)),!c.settings.submitHandler||(e=c.settings.submitHandler.call(c,c.currentForm,b),d&&d.remove(),void 0!==e&&e)}return c.settings.debug&&b.preventDefault(),c.cancelSubmit?(c.cancelSubmit=!1,d()):c.form()?c.pendingRequest?(c.formSubmitted=!0,!1):d():(c.focusInvalid(),!1)})),c)},valid:function(){var b,c,d;return a(this[0]).is("form")?b=this.validate().form():(d=[],b=!0,c=a(this[0].form).validate(),this.each(function(){b=c.element(this)&&b,b||(d=d.concat(c.errorList))}),c.errorList=d),b},rules:function(b,c){var d,e,f,g,h,i,j=this[0];if(null!=j&&(!j.form&&j.hasAttribute("contenteditable")&&(j.form=this.closest("form")[0],j.name=this.attr("name")),null!=j.form)){if(b)switch(d=a.data(j.form,"validator").settings,e=d.rules,f=a.validator.staticRules(j),b){case"add":a.extend(f,a.validator.normalizeRule(c)),delete f.messages,e[j.name]=f,c.messages&&(d.messages[j.name]=a.extend(d.messages[j.name],c.messages));break;case"remove":return c?(i={},a.each(c.split(/\s/),function(a,b){i[b]=f[b],delete f[b]}),i):(delete e[j.name],f)}return g=a.validator.normalizeRules(a.extend({},a.validator.classRules(j),a.validator.attributeRules(j),a.validator.dataRules(j),a.validator.staticRules(j)),j),g.required&&(h=g.required,delete g.required,g=a.extend({required:h},g)),g.remote&&(h=g.remote,delete g.remote,g=a.extend(g,{remote:h})),g}}}),a.extend(a.expr.pseudos||a.expr[":"],{blank:function(b){return!a.trim(""+a(b).val())},filled:function(b){var c=a(b).val();return null!==c&&!!a.trim(""+c)},unchecked:function(b){return!a(b).prop("checked")}}),a.validator=function(b,c){this.settings=a.extend(!0,{},a.validator.defaults,b),this.currentForm=c,this.init()},a.validator.format=function(b,c){return 1===arguments.length?function(){var c=a.makeArray(arguments);return c.unshift(b),a.validator.format.apply(this,c)}:void 0===c?b:(arguments.length>2&&c.constructor!==Array&&(c=a.makeArray(arguments).slice(1)),c.constructor!==Array&&(c=[c]),a.each(c,function(a,c){b=b.replace(new RegExp("\\{"+a+"\\}","g"),function(){return c})}),b)},a.extend(a.validator,{defaults:{messages:{},groups:{},rules:{},errorClass:"error",pendingClass:"pending",validClass:"valid",errorElement:"label",focusCleanup:!1,focusInvalid:!0,errorContainer:a([]),errorLabelContainer:a([]),onsubmit:!0,ignore:":hidden",ignoreTitle:!1,onfocusin:function(a){this.lastActive=a,this.settings.focusCleanup&&(this.settings.unhighlight&&this.settings.unhighlight.call(this,a,this.settings.errorClass,this.settings.validClass),this.hideThese(this.errorsFor(a)))},onfocusout:function(a){this.checkable(a)||!(a.name in this.submitted)&&this.optional(a)||this.element(a)},onkeyup:function(b,c){var d=[16,17,18,20,35,36,37,38,39,40,45,144,225];9===c.which&&""===this.elementValue(b)||a.inArray(c.keyCode,d)!==-1||(b.name in this.submitted||b.name in this.invalid)&&this.element(b)},onclick:function(a){a.name in this.submitted?this.element(a):a.parentNode.name in this.submitted&&this.element(a.parentNode)},highlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).addClass(c).removeClass(d):a(b).addClass(c).removeClass(d)},unhighlight:function(b,c,d){"radio"===b.type?this.findByName(b.name).removeClass(c).addClass(d):a(b).removeClass(c).addClass(d)}},setDefaults:function(b){a.extend(a.validator.defaults,b)},messages:{required:"This field is required.",remote:"Please fix this field.",email:"Please enter a valid email address.",url:"Please enter a valid URL.",date:"Please enter a valid date.",dateISO:"Please enter a valid date (ISO).",number:"Please enter a valid number.",digits:"Please enter only digits.",equalTo:"Please enter the same value again.",maxlength:a.validator.format("Please enter no more than {0} characters."),minlength:a.validator.format("Please enter at least {0} characters."),rangelength:a.validator.format("Please enter a value between {0} and {1} characters long."),range:a.validator.format("Please enter a value between {0} and {1}."),max:a.validator.format("Please enter a value less than or equal to {0}."),min:a.validator.format("Please enter a value greater than or equal to {0}."),step:a.validator.format("Please enter a multiple of {0}.")},autoCreateRanges:!1,prototype:{init:function(){function b(b){!this.form&&this.hasAttribute("contenteditable")&&(this.form=a(this).closest("form")[0],this.name=a(this).attr("name"));var c=a.data(this.form,"validator"),d="on"+b.type.replace(/^validate/,""),e=c.settings;e[d]&&!a(this).is(e.ignore)&&e[d].call(c,this,b)}this.labelContainer=a(this.settings.errorLabelContainer),this.errorContext=this.labelContainer.length&&this.labelContainer||a(this.currentForm),this.containers=a(this.settings.errorContainer).add(this.settings.errorLabelContainer),this.submitted={},this.valueCache={},this.pendingRequest=0,this.pending={},this.invalid={},this.reset();var c,d=this.groups={};a.each(this.settings.groups,function(b,c){"string"==typeof c&&(c=c.split(/\s/)),a.each(c,function(a,c){d[c]=b})}),c=this.settings.rules,a.each(c,function(b,d){c[b]=a.validator.normalizeRule(d)}),a(this.currentForm).on("focusin.validate focusout.validate keyup.validate",":text, [type='password'], [type='file'], select, textarea, [type='number'], [type='search'], [type='tel'], [type='url'], [type='email'], [type='datetime'], [type='date'], [type='month'], [type='week'], [type='time'], [type='datetime-local'], [type='range'], [type='color'], [type='radio'], [type='checkbox'], [contenteditable], [type='button']",b).on("click.validate","select, option, [type='radio'], [type='checkbox']",b),this.settings.invalidHandler&&a(this.currentForm).on("invalid-form.validate",this.settings.invalidHandler)},form:function(){return this.checkForm(),a.extend(this.submitted,this.errorMap),this.invalid=a.extend({},this.errorMap),this.valid()||a(this.currentForm).triggerHandler("invalid-form",[this]),this.showErrors(),this.valid()},checkForm:function(){this.prepareForm();for(var a=0,b=this.currentElements=this.elements();b[a];a++)this.check(b[a]);return this.valid()},element:function(b){var c,d,e=this.clean(b),f=this.validationTargetFor(e),g=this,h=!0;return void 0===f?delete this.invalid[e.name]:(this.prepareElement(f),this.currentElements=a(f),d=this.groups[f.name],d&&a.each(this.groups,function(a,b){b===d&&a!==f.name&&(e=g.validationTargetFor(g.clean(g.findByName(a))),e&&e.name in g.invalid&&(g.currentElements.push(e),h=g.check(e)&&h))}),c=this.check(f)!==!1,h=h&&c,c?this.invalid[f.name]=!1:this.invalid[f.name]=!0,this.numberOfInvalids()||(this.toHide=this.toHide.add(this.containers)),this.showErrors(),a(b).attr("aria-invalid",!c)),h},showErrors:function(b){if(b){var c=this;a.extend(this.errorMap,b),this.errorList=a.map(this.errorMap,function(a,b){return{message:a,element:c.findByName(b)[0]}}),this.successList=a.grep(this.successList,function(a){return!(a.name in b)})}this.settings.showErrors?this.settings.showErrors.call(this,this.errorMap,this.errorList):this.defaultShowErrors()},resetForm:function(){a.fn.resetForm&&a(this.currentForm).resetForm(),this.invalid={},this.submitted={},this.prepareForm(),this.hideErrors();var b=this.elements().removeData("previousValue").removeAttr("aria-invalid");this.resetElements(b)},resetElements:function(a){var b;if(this.settings.unhighlight)for(b=0;a[b];b++)this.settings.unhighlight.call(this,a[b],this.settings.errorClass,""),this.findByName(a[b].name).removeClass(this.settings.validClass);else a.removeClass(this.settings.errorClass).removeClass(this.settings.validClass)},numberOfInvalids:function(){return this.objectLength(this.invalid)},objectLength:function(a){var b,c=0;for(b in a)void 0!==a[b]&&null!==a[b]&&a[b]!==!1&&c++;return c},hideErrors:function(){this.hideThese(this.toHide)},hideThese:function(a){a.not(this.containers).text(""),this.addWrapper(a).hide()},valid:function(){return 0===this.size()},size:function(){return this.errorList.length},focusInvalid:function(){if(this.settings.focusInvalid)try{a(this.findLastActive()||this.errorList.length&&this.errorList[0].element||[]).filter(":visible").focus().trigger("focusin")}catch(b){}},findLastActive:function(){var b=this.lastActive;return b&&1===a.grep(this.errorList,function(a){return a.element.name===b.name}).length&&b},elements:function(){var b=this,c={};return a(this.currentForm).find("input, select, textarea, [contenteditable]").not(":submit, :reset, :image, :disabled").not(this.settings.ignore).filter(function(){var d=this.name||a(this).attr("name");return!d&&b.settings.debug&&window.console&&console.error("%o has no name assigned",this),this.hasAttribute("contenteditable")&&(this.form=a(this).closest("form")[0],this.name=d),!(d in c||!b.objectLength(a(this).rules()))&&(c[d]=!0,!0)})},clean:function(b){return a(b)[0]},errors:function(){var b=this.settings.errorClass.split(" ").join(".");return a(this.settings.errorElement+"."+b,this.errorContext)},resetInternals:function(){this.successList=[],this.errorList=[],this.errorMap={},this.toShow=a([]),this.toHide=a([])},reset:function(){this.resetInternals(),this.currentElements=a([])},prepareForm:function(){this.reset(),this.toHide=this.errors().add(this.containers)},prepareElement:function(a){this.reset(),this.toHide=this.errorsFor(a)},elementValue:function(b){var c,d,e=a(b),f=b.type;return"radio"===f||"checkbox"===f?this.findByName(b.name).filter(":checked").val():"number"===f&&"undefined"!=typeof b.validity?b.validity.badInput?"NaN":e.val():(c=b.hasAttribute("contenteditable")?e.text():e.val(),"file"===f?"C:\\fakepath\\"===c.substr(0,12)?c.substr(12):(d=c.lastIndexOf("/"),d>=0?c.substr(d+1):(d=c.lastIndexOf("\\"),d>=0?c.substr(d+1):c)):"string"==typeof c?c.replace(/\r/g,""):c)},check:function(b){b=this.validationTargetFor(this.clean(b));var c,d,e,f,g=a(b).rules(),h=a.map(g,function(a,b){return b}).length,i=!1,j=this.elementValue(b);if("function"==typeof g.normalizer?f=g.normalizer:"function"==typeof this.settings.normalizer&&(f=this.settings.normalizer),f){if(j=f.call(b,j),"string"!=typeof j)throw new TypeError("The normalizer should return a string value.");delete g.normalizer}for(d in g){e={method:d,parameters:g[d]};try{if(c=a.validator.methods[d].call(this,j,b,e.parameters),"dependency-mismatch"===c&&1===h){i=!0;continue}if(i=!1,"pending"===c)return void(this.toHide=this.toHide.not(this.errorsFor(b)));if(!c)return this.formatAndAdd(b,e),!1}catch(k){throw this.settings.debug&&window.console&&console.log("Exception occurred when checking element "+b.id+", check the '"+e.method+"' method.",k),k instanceof TypeError&&(k.message+=". Exception occurred when checking element "+b.id+", check the '"+e.method+"' method."),k}}if(!i)return this.objectLength(g)&&this.successList.push(b),!0},customDataMessage:function(b,c){return a(b).data("msg"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase())||a(b).data("msg")},customMessage:function(a,b){var c=this.settings.messages[a];return c&&(c.constructor===String?c:c[b])},findDefined:function(){for(var a=0;aWarning: No message defined for "+b.name+""),e=/\$?\{(\d+)\}/g;return"function"==typeof d?d=d.call(this,c.parameters,b):e.test(d)&&(d=a.validator.format(d.replace(e,"{$1}"),c.parameters)),d},formatAndAdd:function(a,b){var c=this.defaultMessage(a,b);this.errorList.push({message:c,element:a,method:b.method}),this.errorMap[a.name]=c,this.submitted[a.name]=c},addWrapper:function(a){return this.settings.wrapper&&(a=a.add(a.parent(this.settings.wrapper))),a},defaultShowErrors:function(){var a,b,c;for(a=0;this.errorList[a];a++)c=this.errorList[a],this.settings.highlight&&this.settings.highlight.call(this,c.element,this.settings.errorClass,this.settings.validClass),this.showLabel(c.element,c.message);if(this.errorList.length&&(this.toShow=this.toShow.add(this.containers)),this.settings.success)for(a=0;this.successList[a];a++)this.showLabel(this.successList[a]);if(this.settings.unhighlight)for(a=0,b=this.validElements();b[a];a++)this.settings.unhighlight.call(this,b[a],this.settings.errorClass,this.settings.validClass);this.toHide=this.toHide.not(this.toShow),this.hideErrors(),this.addWrapper(this.toShow).show()},validElements:function(){return this.currentElements.not(this.invalidElements())},invalidElements:function(){return a(this.errorList).map(function(){return this.element})},showLabel:function(b,c){var d,e,f,g,h=this.errorsFor(b),i=this.idOrName(b),j=a(b).attr("aria-describedby");h.length?(h.removeClass(this.settings.validClass).addClass(this.settings.errorClass),h.html(c)):(h=a("<"+this.settings.errorElement+">").attr("id",i+"-error").addClass(this.settings.errorClass).html(c||""),d=h,this.settings.wrapper&&(d=h.hide().show().wrap("<"+this.settings.wrapper+"/>").parent()),this.labelContainer.length?this.labelContainer.append(d):this.settings.errorPlacement?this.settings.errorPlacement.call(this,d,a(b)):d.insertAfter(b),h.is("label")?h.attr("for",i):0===h.parents("label[for='"+this.escapeCssMeta(i)+"']").length&&(f=h.attr("id"),j?j.match(new RegExp("\\b"+this.escapeCssMeta(f)+"\\b"))||(j+=" "+f):j=f,a(b).attr("aria-describedby",j),e=this.groups[b.name],e&&(g=this,a.each(g.groups,function(b,c){c===e&&a("[name='"+g.escapeCssMeta(b)+"']",g.currentForm).attr("aria-describedby",h.attr("id"))})))),!c&&this.settings.success&&(h.text(""),"string"==typeof this.settings.success?h.addClass(this.settings.success):this.settings.success(h,b)),this.toShow=this.toShow.add(h)},errorsFor:function(b){var c=this.escapeCssMeta(this.idOrName(b)),d=a(b).attr("aria-describedby"),e="label[for='"+c+"'], label[for='"+c+"'] *";return d&&(e=e+", #"+this.escapeCssMeta(d).replace(/\s+/g,", #")),this.errors().filter(e)},escapeCssMeta:function(a){return a.replace(/([\\!"#$%&'()*+,.\/:;<=>?@\[\]^`{|}~])/g,"\\$1")},idOrName:function(a){return this.groups[a.name]||(this.checkable(a)?a.name:a.id||a.name)},validationTargetFor:function(b){return this.checkable(b)&&(b=this.findByName(b.name)),a(b).not(this.settings.ignore)[0]},checkable:function(a){return/radio|checkbox/i.test(a.type)},findByName:function(b){return a(this.currentForm).find("[name='"+this.escapeCssMeta(b)+"']")},getLength:function(b,c){switch(c.nodeName.toLowerCase()){case"select":return a("option:selected",c).length;case"input":if(this.checkable(c))return this.findByName(c.name).filter(":checked").length}return b.length},depend:function(a,b){return!this.dependTypes[typeof a]||this.dependTypes[typeof a](a,b)},dependTypes:{"boolean":function(a){return a},string:function(b,c){return!!a(b,c.form).length},"function":function(a,b){return a(b)}},optional:function(b){var c=this.elementValue(b);return!a.validator.methods.required.call(this,c,b)&&"dependency-mismatch"},startRequest:function(b){this.pending[b.name]||(this.pendingRequest++,a(b).addClass(this.settings.pendingClass),this.pending[b.name]=!0)},stopRequest:function(b,c){this.pendingRequest--,this.pendingRequest<0&&(this.pendingRequest=0),delete this.pending[b.name],a(b).removeClass(this.settings.pendingClass),c&&0===this.pendingRequest&&this.formSubmitted&&this.form()?(a(this.currentForm).submit(),this.submitButton&&a("input:hidden[name='"+this.submitButton.name+"']",this.currentForm).remove(),this.formSubmitted=!1):!c&&0===this.pendingRequest&&this.formSubmitted&&(a(this.currentForm).triggerHandler("invalid-form",[this]),this.formSubmitted=!1)},previousValue:function(b,c){return c="string"==typeof c&&c||"remote",a.data(b,"previousValue")||a.data(b,"previousValue",{old:null,valid:!0,message:this.defaultMessage(b,{method:c})})},destroy:function(){this.resetForm(),a(this.currentForm).off(".validate").removeData("validator").find(".validate-equalTo-blur").off(".validate-equalTo").removeClass("validate-equalTo-blur")}},classRuleSettings:{required:{required:!0},email:{email:!0},url:{url:!0},date:{date:!0},dateISO:{dateISO:!0},number:{number:!0},digits:{digits:!0},creditcard:{creditcard:!0}},addClassRules:function(b,c){b.constructor===String?this.classRuleSettings[b]=c:a.extend(this.classRuleSettings,b)},classRules:function(b){var c={},d=a(b).attr("class");return d&&a.each(d.split(" "),function(){this in a.validator.classRuleSettings&&a.extend(c,a.validator.classRuleSettings[this])}),c},normalizeAttributeRule:function(a,b,c,d){/min|max|step/.test(c)&&(null===b||/number|range|text/.test(b))&&(d=Number(d),isNaN(d)&&(d=void 0)),d||0===d?a[c]=d:b===c&&"range"!==b&&(a[c]=!0)},attributeRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)"required"===c?(d=b.getAttribute(c),""===d&&(d=!0),d=!!d):d=f.attr(c),this.normalizeAttributeRule(e,g,c,d);return e.maxlength&&/-1|2147483647|524288/.test(e.maxlength)&&delete e.maxlength,e},dataRules:function(b){var c,d,e={},f=a(b),g=b.getAttribute("type");for(c in a.validator.methods)d=f.data("rule"+c.charAt(0).toUpperCase()+c.substring(1).toLowerCase()),this.normalizeAttributeRule(e,g,c,d);return e},staticRules:function(b){var c={},d=a.data(b.form,"validator");return d.settings.rules&&(c=a.validator.normalizeRule(d.settings.rules[b.name])||{}),c},normalizeRules:function(b,c){return a.each(b,function(d,e){if(e===!1)return void delete b[d];if(e.param||e.depends){var f=!0;switch(typeof e.depends){case"string":f=!!a(e.depends,c.form).length;break;case"function":f=e.depends.call(c,c)}f?b[d]=void 0===e.param||e.param:(a.data(c.form,"validator").resetElements(a(c)),delete b[d])}}),a.each(b,function(d,e){b[d]=a.isFunction(e)&&"normalizer"!==d?e(c):e}),a.each(["minlength","maxlength"],function(){b[this]&&(b[this]=Number(b[this]))}),a.each(["rangelength","range"],function(){var c;b[this]&&(a.isArray(b[this])?b[this]=[Number(b[this][0]),Number(b[this][1])]:"string"==typeof b[this]&&(c=b[this].replace(/[\[\]]/g,"").split(/[\s,]+/),b[this]=[Number(c[0]),Number(c[1])]))}),a.validator.autoCreateRanges&&(null!=b.min&&null!=b.max&&(b.range=[b.min,b.max],delete b.min,delete b.max),null!=b.minlength&&null!=b.maxlength&&(b.rangelength=[b.minlength,b.maxlength],delete b.minlength,delete b.maxlength)),b},normalizeRule:function(b){if("string"==typeof b){var c={};a.each(b.split(/\s/),function(){c[this]=!0}),b=c}return b},addMethod:function(b,c,d){a.validator.methods[b]=c,a.validator.messages[b]=void 0!==d?d:a.validator.messages[b],c.length<3&&a.validator.addClassRules(b,a.validator.normalizeRule(b))},methods:{required:function(b,c,d){if(!this.depend(d,c))return"dependency-mismatch";if("select"===c.nodeName.toLowerCase()){var e=a(c).val();return e&&e.length>0}return this.checkable(c)?this.getLength(b,c)>0:b.length>0},email:function(a,b){return this.optional(b)||/^[a-zA-Z0-9.!#$%&'*+\/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$/.test(a)},url:function(a,b){return this.optional(b)||/^(?:(?:(?:https?|ftp):)?\/\/)(?:\S+(?::\S*)?@)?(?:(?!(?:10|127)(?:\.\d{1,3}){3})(?!(?:169\.254|192\.168)(?:\.\d{1,3}){2})(?!172\.(?:1[6-9]|2\d|3[0-1])(?:\.\d{1,3}){2})(?:[1-9]\d?|1\d\d|2[01]\d|22[0-3])(?:\.(?:1?\d{1,2}|2[0-4]\d|25[0-5])){2}(?:\.(?:[1-9]\d?|1\d\d|2[0-4]\d|25[0-4]))|(?:(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)(?:\.(?:[a-z\u00a1-\uffff0-9]-*)*[a-z\u00a1-\uffff0-9]+)*(?:\.(?:[a-z\u00a1-\uffff]{2,})).?)(?::\d{2,5})?(?:[\/?#]\S*)?$/i.test(a)},date:function(a,b){return this.optional(b)||!/Invalid|NaN/.test(new Date(a).toString())},dateISO:function(a,b){return this.optional(b)||/^\d{4}[\/\-](0?[1-9]|1[012])[\/\-](0?[1-9]|[12][0-9]|3[01])$/.test(a)},number:function(a,b){return this.optional(b)||/^(?:-?\d+|-?\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/.test(a)},digits:function(a,b){return this.optional(b)||/^\d+$/.test(a)},minlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d},maxlength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e<=d},rangelength:function(b,c,d){var e=a.isArray(b)?b.length:this.getLength(b,c);return this.optional(c)||e>=d[0]&&e<=d[1]},min:function(a,b,c){return this.optional(b)||a>=c},max:function(a,b,c){return this.optional(b)||a<=c},range:function(a,b,c){return this.optional(b)||a>=c[0]&&a<=c[1]},step:function(b,c,d){var e,f=a(c).attr("type"),g="Step attribute on input type "+f+" is not supported.",h=["text","number","range"],i=new RegExp("\\b"+f+"\\b"),j=f&&!i.test(h.join()),k=function(a){var b=(""+a).match(/(?:\.(\d+))?$/);return b&&b[1]?b[1].length:0},l=function(a){return Math.round(a*Math.pow(10,e))},m=!0;if(j)throw new Error(g);return e=k(d),(k(b)>e||l(b)%l(d)!==0)&&(m=!1),this.optional(c)||m},equalTo:function(b,c,d){var e=a(d);return this.settings.onfocusout&&e.not(".validate-equalTo-blur").length&&e.addClass("validate-equalTo-blur").on("blur.validate-equalTo",function(){a(c).valid()}),b===e.val()},remote:function(b,c,d,e){if(this.optional(c))return"dependency-mismatch";e="string"==typeof e&&e||"remote";var f,g,h,i=this.previousValue(c,e);return this.settings.messages[c.name]||(this.settings.messages[c.name]={}),i.originalMessage=i.originalMessage||this.settings.messages[c.name][e],this.settings.messages[c.name][e]=i.message,d="string"==typeof d&&{url:d}||d,h=a.param(a.extend({data:b},d.data)),i.old===h?i.valid:(i.old=h,f=this,this.startRequest(c),g={},g[c.name]=b,a.ajax(a.extend(!0,{mode:"abort",port:"validate"+c.name,dataType:"json",data:g,context:f.currentForm,success:function(a){var d,g,h,j=a===!0||"true"===a;f.settings.messages[c.name][e]=i.originalMessage,j?(h=f.formSubmitted,f.resetInternals(),f.toHide=f.errorsFor(c),f.formSubmitted=h,f.successList.push(c),f.invalid[c.name]=!1,f.showErrors()):(d={},g=a||f.defaultMessage(c,{method:e,parameters:b}),d[c.name]=i.message=g,f.invalid[c.name]=!0,f.showErrors(d)),i.valid=j,f.stopRequest(c,j)}},d)),"pending")}}});var b,c={};return a.ajaxPrefilter?a.ajaxPrefilter(function(a,b,d){var e=a.port;"abort"===a.mode&&(c[e]&&c[e].abort(),c[e]=d)}):(b=a.ajax,a.ajax=function(d){var e=("mode"in d?d:a.ajaxSettings).mode,f=("port"in d?d:a.ajaxSettings).port;return"abort"===e?(c[f]&&c[f].abort(),c[f]=b.apply(this,arguments),c[f]):b.apply(this,arguments)}),a});!function(e){var n;if("function"==typeof define&&define.amd&&(define(e),n=!0),"object"==typeof exports&&(module.exports=e(),n=!0),!n){var t=window.Cookies,o=window.Cookies=e();o.noConflict=function(){return window.Cookies=t,o}}}(function(){function e(){for(var e=0,n={};e
PuTTY là một phiên bản miễn phí của giao thức SSH (và telnet) để truy cập VPS Linux. Bạn sẽ thấy PuTTY hữu ích nếu muốn truy cập vào một tài khoản trên hệ thống Unix hoặc hệ thống đa người dùng khác từ một máy tính. Hãy tìm hiểu những hữu ích nó đem lại cùng Tothost nhé!
Mục lục
Mục lục
1. PuTTY là gì?
PuTTY (https://www.putty.org/) là một phần mềm Telnet và SSH miễn phí và mã nguồn mở, được phát triển để cung cấp khả năng kết nối mạng an toàn và tin cậy. Telnet và SSH đều là giao thức truyền thông phổ biến trong việc quản lý và kiểm soát từ xa các máy chủ và thiết bị mạng. PuTTY đã trở thành một công cụ không thể thiếu đối với các nhà quản trị hệ thống và lập trình viên vì tính ổn định, dễ sử dụng và đa nền tảng của nó.
1.2. Lịch sử của PuTTY
PuTTY, được sáng tạo bởi Simon Tatham vào cuối năm 1998, là một sản phẩm mang tính đột phá. Ban đầu, phần mềm này được viết bằng ngôn ngữ lập trình C và chỉ hỗ trợ trên hệ điều hành Windows, với khả năng kết nối các giao thức quan trọng của Internet. Ngày 8/1/1999, PuTTY chính thức được công bố và phân phối rộng rãi cho người dùng.
Vào tháng 10/2000, PuTTY đã bổ sung hỗ trợ cho giao thức SSH-2. Từ đó, người dùng có thể an toàn kết nối với các máy chủ trên hệ điều hành Windows thông qua SSH, đảm bảo an ninh cho việc truyền dữ liệu và thông tin.
Hiện tại, PuTTY vẫn đang trong giai đoạn thử nghiệm, tuy nhiên, ngôn ngữ C vẫn có sẵn trên Unix, Linux và Symbian. Mặc dù việc phát triển của phần mềm này diễn ra chậm rãi và giao diện người dùng cũng như các tính năng chưa có nhiều thay đổi trong vài năm qua, nhưng những tính năng nổi bật này vẫn còn rất hữu ích và được kích hoạt thông qua các thành phần cấu trúc đặc biệt trong phần mềm.
1.3. Đặc tính cơ bản của PuTTY
Cửa sổ giao diện
Giao diện luôn là điều mà người dùng chú ý và nhớ đầu tiên. Vì vậy, cửa sổ giao diện là một phần quan trọng của PuTTY. Giao diện của nó được đánh giá cao trong phần mềm PuTTY. Nó như một giao diện được cấu hình tốt, hỗ trợ các thuật toán SSH, mã hóa, Telnet và các giao thức TCP/IP đơn giản.
Truyền tải tệp tin
Để truyền tệp tin, PuTTY cung cấp các thành phần PSFTP và PSCP để sử dụng. PSFTP là một giao thức cho phép người dùng tải xuống dữ liệu từ máy chủ một cách an toàn và mã hóa các lệnh, trong khi PSCP là một phương pháp truyền và gửi tệp tin từ xa được bảo mật bằng giao thức SSH, cho phép truyền tệp mà không làm lộ thông tin.
Ngoài ra, khi bạn đã biết về PuTTY, bạn cũng có thể sử dụng WinSCP và FileZilla kết hợp với PuTTY để truyền tệp tin. Tuy nhiên, hai chương trình này yêu cầu bạn đăng nhập để thực hiện việc truyền tệp.
Xác minh khóa công khai
Người dùng có thể sử dụng công cụ PuTTYgen để tạo khóa mới và chuyển đổi giữa các tệp .ppk lưu trữ khóa SSH và các định dạng khóa khác. Quản lý khóa SSH là điều người dùng cần làm để ngăn chúng bị tấn công và thu thập thông tin bởi phần mềm độc hại. Vì vậy, nhà phát triển đã cung cấp giải pháp tốt nhất là cài đặt Universal SSH Key Manager trên máy tính của bạn để hỗ trợ tệp .ppk.
Vì PuTTY được phát triển từ một Telnet client, nên nó hỗ trợ giao thức Telnet. Tuy nhiên, giao thức Telnet thường gặp vấn đề mất tên người dùng và mật khẩu. Đó là lý do vì sao giao thức SSH đã được phát triển để giải quyết vấn đề này. Trong các quốc gia không cho phép mã hóa, phần mềm hiện tại sử dụng công cụ PuTTYtel. Mặt khác, hầu hết các quốc gia hiện nay đều sử dụng SSH để đảm bảo an ninh và ngăn chặn rủi ro bảo mật của Telnet.
PuTTY hỗ trợ cả hệ điều hành Windows 32-bit và 64-bit, đáp ứng nhu cầu của người dùng trên cả hai phiên bản này. Người dùng có thể dễ dàng kết nối và điều khiển nhiều máy tính trong cùng một phạm vi thông qua PuTTY. Hơn nữa, PuTTY cung cấp khả năng truyền dữ liệu giữa các máy tính này.
Đối với việc điều khiển SSH, PuTTY hỗ trợ các khóa mã hóa và giao thức như SSH1, SSH2, cùng với các thuật toán mã hóa như Arcfour, 3DES, DES, Blowfish và khóa công khai xác thực. Nó cung cấp các tính năng xác thực Active Directory/Kerberos và Public key để đảm bảo an ninh và đáng tin cậy.
Người dùng có thể sử dụng chương trình câu lệnh riêng biệt để truyền tệp mà không cần tích hợp các tính năng truyền tệp vào PuTTY. Tuy nhiên, để kết hợp với PuTTY, người dùng có thể sử dụng WinSCP để thực hiện truyền tệp và thực hiện các tác vụ liên quan đến tệp tin.
Mặc dù PuTTY không hỗ trợ việc chạy các script trực tiếp, người dùng vẫn có thể kết hợp sử dụng PuTTY và WinSCP để thực hiện các tác vụ liên quan đến script.
Với hệ thống mạng LAN, PuTTY có thể được sử dụng để kết nối thông qua cổng nối tiếp, giúp người dùng tiếp cận và quản lý các máy tính trong mạng một cách dễ dàng và thuận tiện.
3. Cấu trúc của PuTTY
Cấu trúc của PuTTY được tổ chức thành nhiều thành phần khác nhau, mỗi thành phần có chức năng riêng để triển khai các tính năng của phần mềm. Dưới đây là mô tả chi tiết về mỗi thành phần này:
PuTTY: Đây là thành phần chính của PuTTY và bao gồm Rlogin, Telnet và SSH Client. Điều này cho phép người dùng kết nối với các máy chủ thông qua cổng nối tiếp và sử dụng các giao thức như Rlogin, Telnet và SSH để truy cập và quản lý các máy tính từ xa.
PSCP (còn được gọi là client SCP): Công cụ dòng lệnh dùng để sao chép tệp tin một cách an toàn qua giao thức SCP (Secure Copy Protocol). PSCP cho phép người dùng sao chép và chuyển đổi tệp tin giữa các máy tính một cách bảo mật.
PSFTP: SFTP (SSH File Transfer Protocol) cung cấp một phiên giao diện dòng lệnh tương tự như FTP (File Transfer Protocol). PSFTP cho phép người dùng truyền tải và quản lý các tệp tin thông qua kết nối bảo mật SFTP.
PuTTYtel: Giao thức truyền thông thông qua mạng máy tính. PuTTYtel cho phép người dùng kết nối và tương tác với các máy chủ sử dụng giao thức Telnet.
Plink: Là một giao diện dòng lệnh dùng để khởi động PuTTY và tương tác với các máy chủ thông qua các lệnh và kịch bản. Plink giúp người dùng thực hiện các tác vụ tự động hoặc tự động hóa các tương tác với máy chủ.
Pageant: Là SSH (SSH agent) cho PSCP, PuTTY và Plink. Pageant giữ và quản lý các khóa SSH để đảm bảo an ninh và xác thực cho các phiên kết nối SSH.
PuTTYgen: Tiện ích quan trọng cho việc tạo và quản lý các khóa RSA và DSA. PuTTYgen cho phép người dùng tạo ra các khóa SSH mới và chuyển đổi giữa các định dạng khóa khác nhau.
Sau khi tìm hiểu PuTTY là gì, hãy đến với hướng dẫn tải và cài đặt phần mềm này nhé!
4. Hướng dẫn tải và cài đặt PuTTY trên một số HĐH phổ biến
Bước 2: Sau khi tải xuống hoàn tất, hãy bắt đầu cài đặt phần mềm.
Khi màn hình hiển thị cấu hình chào mừng, hãy nhấp vào Next.
Tiếp tục nhấp vào Next khi được yêu cầu chọn thư mục đích để cài đặt phần mềm.
Sau đó, bạn chọn các tính năng sản phẩm bạn muốn cài đặt.Cuối cùng, chỉ cần nhấp vào Install để bắt đầu cài đặt phần mềm.
Bước 3: Khi cài đặt xong, màn hình hiển thị thông báo thành công. Sau đó nhấn Finish để xác nhận hoàn thành cài đặt và thoát. Sau khi cài đặt thành công, mở cửa sổ PuTTY Configuration bằng cách nhấp vào phần mềm.
4.2. Linux
Với hệ điều hành Linux, cách để cài đặt PuTTY là gì? Để cài đặt trên Linux, trước tiên hãy bật universe store và sau đó chạy các lệnh sau:
Bước 1: Khi universe store được kích hoạt, hãy chạy bản cập nhật sudo apt để cập nhật hệ điều hành Linux của bạn.
Bước 2: Sử dụng lệnh sudo Install putty để cài đặt Putty.
Sau khi cài đặt, bạn truy cập phần mềm thông qua menu của máy tính và nó hiển thị một cửa sổ tương tự như ở hệ điều hành Windows.
4.3 MacOS
Bước 1: Tải xuống và cài đặt Xcode.
Bước 2: Tải xuống Command Line Tools từ Apple Account của bạn.
Bước 3: Khởi chạy Terminal, điều hướng đến thư mục/Applications/Utilities và nhập lệnh sau: Xcode => Select => Install.
Bước 4: Tải và cài đặt Quartz.
Bước 5: Tải và cài đặt MacPorts.
Bước 6: Chạy lệnh sau: sudo port -v selfupdate
Bước 7: Chạy lệnh sau: sudo port install putty
Bước 8: Trong Terminal, gõ Putty.
Bước 9: Tạo lối tắt đến một thư mục phần mềm để truy cập nhanh.
5. Cách sử dụng phần mềm PuTTY
Bước 1: Hãy cài đặt SSH Client trên máy tính bạn đang sử dụng. Bạn có thể mở phần mềm Putty mà không cần phải cài đặt lại sau khi quá trình tải xuống hoàn tất.
Bước 2: Bạn đăng nhập vào máy chủ linux. Tại mục Hostname trên màn hình chính của phần mềm PuTTY, hãy nhập địa chỉ IP hoặc tên miền được sử dụng để truy cập máy chủ linux.
Bước 3: Sau khi bạn đã đăng nhập, hãy nhấp vào Open để bắt đầu kết nối. Sử dụng chức năng Saved session nếu bạn có nhiều máy chủ và không muốn nhập lại thông tin nhiều lần. Sau đó, bạn nhấp vào Save để lưu và Load các phiên bản đã lưu hoặc Delete để xóa chúng.
Bước 4: Màn hình Console hiện ra, bạn nhập mật khẩu và nhấn Enter là xong. Sau khi đăng nhập thành công, hệ thống sẽ thông báo ngày giờ đăng nhập, cũng như địa chỉ IP của máy.
Như vậy chỉ với vài bước đơn giản với PuTTY, bạn đã có thể truy cập được server. Nếu bạn đang có nhu cầu sử dụng server, hãy tham khảo VPS TOT M hoặc VPS TOT K.
6. Lời kết
Với tất cả những thông tin về phần mềm PuTTY là gì mà Tothost cung cấp trên đây, hy vọng các bạn đã hiểu hơn về phần mềm cũng như biết cách cài đặt và sử dụng nó cho công việc của mình.
Năm 2024 chứng kiến không ít sự cố của các ông lớn công nghệ khiến hàng trăm triệu người dùng bao gồm cả cá nhân và doanh nghiệp bị ảnh hưởng. Cùng TotHost điểm danh những sự cố nổi cộm ngành công nghệ 2024 trong bài viết sau đây nhé!
Việc thay đổi mật khẩu là biện pháp quan trọng để tăng cường bảo mật và tránh được những rủi ro không mong muốn. Do đó, bước đầu tiên nên làm sau khi đăng ký dịch vụ là đổi mật khẩu. Bạn hãy làm theo hướng dẫn của TotHost để thay đổi mật khẩu trên server Linux nhé!
Ứng dụng Điện toán đám mây (Cloud Computing) là sử dụng công nghệ đám mây phục vụ cho nhiều công việc khác nhau, được kết nối qua internet. Đám mây mang lại lợi thế bao gồm khả năng mở rộng, tính linh hoạt, hiệu quả chi phí, bảo mật và đổi mới cho các tổ chức ở mọi quy mô và lĩnh vực. Do đó, nó được các tổ chức áp dụng để đạt được mục tiêu và giải quyết các vấn đề của họ.Dưới đây là Top 10 ứng dụng phổ biến nhất của điện toán đám mây.
Nếu bạn đang thắc mắc liệu có nên chuyển đổi sang Điện toán đám mây (Cloud Computing) hay vẫn nên chọn on-premise thì bài viết này sẽ giúp bạn hiểu rõ hơn về những lợi ích của việc chuyển đổi này.
Khi bạn kết nối máy tính hoặc thiết bị của mình với internet, bạn cần có địa chỉ IP. Địa chỉ IP có hai loại phân bổ: động và tĩnh. Tại bài viết này, TotHost sẽ hướng dẫn bạn Cách kiểm tra địa chỉ IP bạn đang sử dụng là động hay tĩnh.
cPanel là một control panel – hệ thống quản trị web hosting phổ biến và mạnh mẽ nhất hiện nay, hoạt động dựa trên nền tảng Linux. Nó có giao diện đơn giản, linh hoạt hỗ trợ quản trị hosting và website một cách dễ dàng. Tại đây, TotHost sẽ hướng dẫn bạn cách tạo Backup và Restore trên cPanel.