2018-02-12 16:01:20 +00:00
|
|
|
/**
|
|
|
|
* @author Richard Davey <rich@photonstorm.com>
|
|
|
|
* @copyright 2018 Photon Storm Ltd.
|
|
|
|
* @license {@link https://github.com/photonstorm/phaser/blob/master/license.txt|MIT License}
|
|
|
|
*/
|
|
|
|
|
2018-01-10 16:29:37 +00:00
|
|
|
var Class = require('../utils/Class');
|
2018-01-30 00:55:27 +00:00
|
|
|
|
2018-03-19 21:43:48 +00:00
|
|
|
/**
|
|
|
|
* @callback DataEachCallback
|
|
|
|
*
|
2018-04-02 17:01:17 +00:00
|
|
|
* @param {*} parent - The parent object of the DataManager.
|
|
|
|
* @param {string} key - The key of the value.
|
|
|
|
* @param {*} value - The value.
|
2018-03-28 15:00:19 +00:00
|
|
|
* @param {...*} [args] - Additional arguments that will be passed to the callback, after the game object, key, and data.
|
2018-03-19 21:43:48 +00:00
|
|
|
*/
|
|
|
|
|
2016-12-07 01:40:56 +00:00
|
|
|
/**
|
2018-02-12 22:16:18 +00:00
|
|
|
* @classdesc
|
|
|
|
* The Data Component features a means to store pieces of data specific to a Game Object, System or Plugin.
|
|
|
|
* You can then search, query it, and retrieve the data. The parent must either extend EventEmitter,
|
|
|
|
* or have a property called `events` that is an instance of it.
|
|
|
|
*
|
|
|
|
* @class DataManager
|
|
|
|
* @memberOf Phaser.Data
|
|
|
|
* @constructor
|
|
|
|
* @since 3.0.0
|
|
|
|
*
|
2018-04-02 15:32:21 +00:00
|
|
|
* @param {object} parent - The object that this DataManager belongs to.
|
|
|
|
* @param {Phaser.Events.EventEmitter} eventEmitter - The DataManager's event emitter.
|
2018-02-12 22:16:18 +00:00
|
|
|
*/
|
2018-01-30 00:55:27 +00:00
|
|
|
var DataManager = new Class({
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2017-06-30 14:47:51 +00:00
|
|
|
initialize:
|
2017-01-30 00:00:45 +00:00
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
function DataManager (parent, eventEmitter)
|
2017-06-30 14:47:51 +00:00
|
|
|
{
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* The object that this DataManager belongs to.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @name Phaser.Data.DataManager#parent
|
2018-03-20 16:15:49 +00:00
|
|
|
* @type {*}
|
2018-02-12 22:16:18 +00:00
|
|
|
* @since 3.0.0
|
|
|
|
*/
|
2017-06-30 14:47:51 +00:00
|
|
|
this.parent = parent;
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* The DataManager's event emitter.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @name Phaser.Data.DataManager#events
|
2018-03-29 12:12:07 +00:00
|
|
|
* @type {Phaser.Events.EventEmitter}
|
2018-02-12 22:16:18 +00:00
|
|
|
* @since 3.0.0
|
|
|
|
*/
|
2018-01-30 00:55:27 +00:00
|
|
|
this.events = eventEmitter;
|
|
|
|
|
|
|
|
if (!eventEmitter)
|
|
|
|
{
|
|
|
|
this.events = (parent.events) ? parent.events : parent;
|
|
|
|
}
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 17:01:17 +00:00
|
|
|
* The data list.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @name Phaser.Data.DataManager#list
|
2018-03-27 12:19:42 +00:00
|
|
|
* @type {Object.<string, *>}
|
2018-02-12 22:16:18 +00:00
|
|
|
* @default {}
|
|
|
|
* @since 3.0.0
|
|
|
|
*/
|
2017-06-30 14:47:51 +00:00
|
|
|
this.list = {};
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* Whether setting data is blocked for this DataManager.
|
|
|
|
*
|
|
|
|
* Used temporarily to allow 'changedata' event listeners to prevent
|
|
|
|
* specific data from being set.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @name Phaser.Data.DataManager#blockSet
|
|
|
|
* @type {boolean}
|
|
|
|
* @default false
|
|
|
|
* @since 3.0.0
|
|
|
|
*/
|
2018-01-30 00:55:27 +00:00
|
|
|
this.blockSet = false;
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* Whether setting data is frozen for this DataManager.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @name Phaser.Data.DataManager#_frozen
|
|
|
|
* @type {boolean}
|
|
|
|
* @private
|
|
|
|
* @default false
|
|
|
|
* @since 3.0.0
|
|
|
|
*/
|
2017-06-30 14:47:51 +00:00
|
|
|
this._frozen = false;
|
2018-01-31 03:38:10 +00:00
|
|
|
|
2018-04-20 12:34:45 +00:00
|
|
|
if (!parent.hasOwnProperty('sys') && this.events)
|
2018-04-14 16:39:24 +00:00
|
|
|
{
|
|
|
|
this.events.once('destroy', this.destroy, this);
|
|
|
|
}
|
2017-06-30 14:47:51 +00:00
|
|
|
},
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
|
|
|
* Retrieves the value for the given key, or undefined if it doesn't exist.
|
|
|
|
*
|
|
|
|
* @method Phaser.Data.DataManager#get
|
|
|
|
* @since 3.0.0
|
|
|
|
*
|
2018-04-02 15:32:21 +00:00
|
|
|
* @param {string} key - The key of the value to retrieve.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
2018-04-02 15:32:21 +00:00
|
|
|
* @return {*} The value belonging to the given key.
|
2018-02-12 22:16:18 +00:00
|
|
|
*/
|
2016-12-07 01:40:56 +00:00
|
|
|
get: function (key)
|
|
|
|
{
|
|
|
|
return this.list[key];
|
|
|
|
},
|
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* Retrieves all data values.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Data.DataManager#getAll
|
|
|
|
* @since 3.0.0
|
|
|
|
*
|
2018-04-02 15:32:21 +00:00
|
|
|
* @return {Object.<string, *>} All data values.
|
2018-02-12 22:16:18 +00:00
|
|
|
*/
|
2016-12-07 01:40:56 +00:00
|
|
|
getAll: function ()
|
|
|
|
{
|
|
|
|
var results = {};
|
|
|
|
|
|
|
|
for (var key in this.list)
|
|
|
|
{
|
2018-03-19 18:03:00 +00:00
|
|
|
if(this.list.hasOwnProperty(key))
|
|
|
|
{
|
|
|
|
results[key] = this.list[key];
|
|
|
|
}
|
2016-12-07 01:40:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return results;
|
|
|
|
},
|
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* Queries the DataManager for the values of keys matching the given search string.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Data.DataManager#query
|
|
|
|
* @since 3.0.0
|
|
|
|
*
|
2018-04-02 15:32:21 +00:00
|
|
|
* @param {string} search - The search string.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
2018-04-02 15:32:21 +00:00
|
|
|
* @return {Object.<string, *>} The values of the keys matching the search string.
|
2018-02-12 22:16:18 +00:00
|
|
|
*/
|
2016-12-07 01:40:56 +00:00
|
|
|
query: function (search)
|
|
|
|
{
|
|
|
|
var results = {};
|
|
|
|
|
|
|
|
for (var key in this.list)
|
|
|
|
{
|
2018-03-19 15:37:01 +00:00
|
|
|
if (this.list.hasOwnProperty(key) && key.match(search))
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
|
|
|
results[key] = this.list[key];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return results;
|
|
|
|
},
|
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* Sets the value for the given key.
|
|
|
|
*
|
|
|
|
* Emits the 'changedata' and 'setdata' events.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Data.DataManager#set
|
|
|
|
* @since 3.0.0
|
|
|
|
*
|
2018-04-02 15:32:21 +00:00
|
|
|
* @param {string} key - The key to set the value for.
|
|
|
|
* @param {*} data - The value to set.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @return {Phaser.Data.DataManager} This DataManager object.
|
|
|
|
*/
|
2016-12-07 01:40:56 +00:00
|
|
|
set: function (key, data)
|
|
|
|
{
|
|
|
|
if (this._frozen)
|
|
|
|
{
|
|
|
|
return this;
|
|
|
|
}
|
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
if (this.events.listenerCount('changedata') > 0)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
2018-01-30 00:55:27 +00:00
|
|
|
this.blockSet = false;
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
var _this = this;
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
var resetFunction = function (value)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
2018-01-30 00:55:27 +00:00
|
|
|
_this.blockSet = true;
|
|
|
|
_this.list[key] = value;
|
|
|
|
_this.events.emit('setdata', _this.parent, key, value);
|
|
|
|
};
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
this.events.emit('changedata', this.parent, key, data, resetFunction);
|
2017-01-30 00:00:45 +00:00
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
// One of the listeners blocked this update from being set, so abort
|
|
|
|
if (this.blockSet)
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
2018-01-30 00:55:27 +00:00
|
|
|
return this;
|
2016-12-07 01:40:56 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
this.list[key] = data;
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
this.events.emit('setdata', this.parent, key, data);
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
return this;
|
2016-12-07 01:40:56 +00:00
|
|
|
},
|
|
|
|
|
|
|
|
/**
|
2018-02-12 22:16:18 +00:00
|
|
|
* Passes all data entries to the given callback. Stores the result of the callback.
|
|
|
|
*
|
|
|
|
* @method Phaser.Data.DataManager#each
|
|
|
|
* @since 3.0.0
|
|
|
|
*
|
2018-03-19 21:43:48 +00:00
|
|
|
* @param {DataEachCallback} callback - The function to call.
|
2018-03-27 12:19:42 +00:00
|
|
|
* @param {*} [scope] - Value to use as `this` when executing callback.
|
2018-03-28 15:00:19 +00:00
|
|
|
* @param {...*} [args] - Additional arguments that will be passed to the callback, after the game object, key, and data.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @return {Phaser.Data.DataManager} This DataManager object.
|
|
|
|
*/
|
2016-12-07 01:40:56 +00:00
|
|
|
each: function (callback, scope)
|
|
|
|
{
|
|
|
|
var args = [ this.parent, null, undefined ];
|
|
|
|
|
|
|
|
for (var i = 1; i < arguments.length; i++)
|
|
|
|
{
|
|
|
|
args.push(arguments[i]);
|
|
|
|
}
|
|
|
|
|
|
|
|
for (var key in this.list)
|
|
|
|
{
|
|
|
|
args[1] = key;
|
|
|
|
args[2] = this.list[key];
|
|
|
|
|
|
|
|
callback.apply(scope, args);
|
|
|
|
}
|
2018-01-30 00:55:27 +00:00
|
|
|
|
|
|
|
return this;
|
2016-12-07 01:40:56 +00:00
|
|
|
},
|
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* Merge the given data object into this DataManager's data object.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Data.DataManager#merge
|
|
|
|
* @since 3.0.0
|
|
|
|
*
|
2018-04-02 15:32:21 +00:00
|
|
|
* @param {Object.<string, *>} data - The data to merge.
|
|
|
|
* @param {boolean} overwrite - Whether to overwrite existing data. Defaults to true.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @return {Phaser.Data.DataManager} This DataManager object.
|
|
|
|
*/
|
2016-12-07 01:40:56 +00:00
|
|
|
merge: function (data, overwrite)
|
|
|
|
{
|
|
|
|
if (overwrite === undefined) { overwrite = true; }
|
|
|
|
|
|
|
|
// Merge data from another component into this one
|
|
|
|
for (var key in data)
|
|
|
|
{
|
2018-03-19 15:37:01 +00:00
|
|
|
if (data.hasOwnProperty(key) && (overwrite || (!overwrite && !this.has(key))))
|
2016-12-07 01:40:56 +00:00
|
|
|
{
|
2018-03-16 08:57:25 +00:00
|
|
|
this.list[key] = data[key];
|
2016-12-07 01:40:56 +00:00
|
|
|
}
|
|
|
|
}
|
2018-01-30 00:55:27 +00:00
|
|
|
|
|
|
|
return this;
|
2016-12-07 01:40:56 +00:00
|
|
|
},
|
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* Remove the value for the given key.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Data.DataManager#remove
|
|
|
|
* @since 3.0.0
|
|
|
|
*
|
2018-04-02 15:32:21 +00:00
|
|
|
* @param {string} key - The key to remove
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @return {Phaser.Data.DataManager} This DataManager object.
|
|
|
|
*/
|
2016-12-07 01:40:56 +00:00
|
|
|
remove: function (key)
|
|
|
|
{
|
|
|
|
if (!this._frozen && this.has(key))
|
|
|
|
{
|
2018-01-30 00:55:27 +00:00
|
|
|
var data = this.list[key];
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
delete this.list[key];
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
this.events.emit('removedata', this, key, data);
|
2016-12-07 01:40:56 +00:00
|
|
|
}
|
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
return this;
|
2016-12-07 01:40:56 +00:00
|
|
|
},
|
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* Retrieves the data associated with the given 'key', deletes it from this Data store, then returns it.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Data.DataManager#pop
|
|
|
|
* @since 3.0.0
|
|
|
|
*
|
2018-04-02 15:32:21 +00:00
|
|
|
* @param {string} key - The key of the value to retrieve and delete.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
2018-04-02 15:32:21 +00:00
|
|
|
* @return {*} The value of the given key.
|
2018-02-12 22:16:18 +00:00
|
|
|
*/
|
2016-12-07 01:40:56 +00:00
|
|
|
pop: function (key)
|
|
|
|
{
|
|
|
|
var data = undefined;
|
|
|
|
|
|
|
|
if (!this._frozen && this.has(key))
|
|
|
|
{
|
|
|
|
data = this.list[key];
|
|
|
|
|
|
|
|
delete this.list[key];
|
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
this.events.emit('removedata', this, key, data);
|
2016-12-07 01:40:56 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
return data;
|
|
|
|
},
|
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* Determines whether the given key is set in this Data store.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Data.DataManager#has
|
|
|
|
* @since 3.0.0
|
|
|
|
*
|
2018-04-02 15:32:21 +00:00
|
|
|
* @param {string} key - The key to check.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
2018-04-02 15:32:21 +00:00
|
|
|
* @return {boolean} Whether the key is set.
|
2018-02-12 22:16:18 +00:00
|
|
|
*/
|
2016-12-07 01:40:56 +00:00
|
|
|
has: function (key)
|
|
|
|
{
|
|
|
|
return this.list.hasOwnProperty(key);
|
|
|
|
},
|
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* Freeze or unfreeze this Data store, to allow or prevent setting its values.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Data.DataManager#setFreeze
|
|
|
|
* @since 3.0.0
|
|
|
|
*
|
2018-04-02 15:32:21 +00:00
|
|
|
* @param {boolean} value - Whether to freeze the Data store.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @return {Phaser.Data.DataManager} This DataManager object.
|
|
|
|
*/
|
2018-01-30 00:55:27 +00:00
|
|
|
setFreeze: function (value)
|
|
|
|
{
|
|
|
|
this._frozen = value;
|
|
|
|
|
|
|
|
return this;
|
|
|
|
},
|
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* Delete all data in this Data store and unfreeze it.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Data.DataManager#reset
|
|
|
|
* @since 3.0.0
|
2018-03-19 15:37:01 +00:00
|
|
|
*
|
2018-02-12 22:16:18 +00:00
|
|
|
* @return {Phaser.Data.DataManager} This DataManager object.
|
|
|
|
*/
|
2016-12-07 01:40:56 +00:00
|
|
|
reset: function ()
|
|
|
|
{
|
|
|
|
for (var key in this.list)
|
|
|
|
{
|
|
|
|
delete this.list[key];
|
|
|
|
}
|
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
this.blockSet = false;
|
2016-12-07 01:40:56 +00:00
|
|
|
this._frozen = false;
|
2018-02-12 22:16:18 +00:00
|
|
|
|
|
|
|
return this;
|
2017-06-30 14:47:51 +00:00
|
|
|
},
|
2016-12-07 01:40:56 +00:00
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* Destroy this data manager.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @method Phaser.Data.DataManager#destroy
|
|
|
|
* @since 3.0.0
|
|
|
|
*/
|
2017-09-08 00:59:53 +00:00
|
|
|
destroy: function ()
|
|
|
|
{
|
|
|
|
this.reset();
|
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
this.events.off('changedata');
|
|
|
|
this.events.off('setdata');
|
|
|
|
this.events.off('removedata');
|
2017-09-08 00:59:53 +00:00
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
this.parent = null;
|
2017-09-08 00:59:53 +00:00
|
|
|
},
|
|
|
|
|
2016-12-07 01:40:56 +00:00
|
|
|
/**
|
2018-04-02 15:32:21 +00:00
|
|
|
* Freeze this Data component, so no values can be set.
|
2018-02-12 22:16:18 +00:00
|
|
|
*
|
|
|
|
* @name Phaser.Data.DataManager#freeze
|
|
|
|
* @type {boolean}
|
|
|
|
* @since 3.0.0
|
|
|
|
*/
|
2016-12-07 01:40:56 +00:00
|
|
|
freeze: {
|
|
|
|
|
|
|
|
get: function ()
|
|
|
|
{
|
|
|
|
return this._frozen;
|
|
|
|
},
|
|
|
|
|
|
|
|
set: function (value)
|
|
|
|
{
|
|
|
|
this._frozen = (value) ? true : false;
|
|
|
|
}
|
|
|
|
|
|
|
|
},
|
|
|
|
|
2018-02-12 22:16:18 +00:00
|
|
|
/**
|
|
|
|
* Return the total number of entries in this Data component.
|
|
|
|
*
|
|
|
|
* @name Phaser.Data.DataManager#count
|
|
|
|
* @type {integer}
|
|
|
|
* @since 3.0.0
|
|
|
|
*/
|
2016-12-07 01:40:56 +00:00
|
|
|
count: {
|
|
|
|
|
|
|
|
get: function ()
|
|
|
|
{
|
|
|
|
var i = 0;
|
|
|
|
|
|
|
|
for (var key in this.list)
|
|
|
|
{
|
|
|
|
if (this.list[key] !== undefined)
|
|
|
|
{
|
|
|
|
i++;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
return i;
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
});
|
|
|
|
|
2018-01-30 00:55:27 +00:00
|
|
|
module.exports = DataManager;
|