UNPKG

trivialmodels

Version:

A trivial javascript model system, designed to be easy to build backends for.

3 lines (2 loc) 28.7 kB
'use strict';var _createClass=function(){function defineProperties(target,props){for(var i=0;i<props.length;i++){var descriptor=props[i];descriptor.enumerable=descriptor.enumerable||false;descriptor.configurable=true;if("value" in descriptor)descriptor.writable=true;Object.defineProperty(target,descriptor.key,descriptor);}}return function(Constructor,protoProps,staticProps){if(protoProps)defineProperties(Constructor.prototype,protoProps);if(staticProps)defineProperties(Constructor,staticProps);return Constructor;};}();Object.defineProperty(exports,"__esModule",{value:true});var _lodash=require('lodash');var _lodash2=_interopRequireDefault(_lodash);var _bluebird=require('bluebird');var _bluebird2=_interopRequireDefault(_bluebird);var _types=require('./types');var _types2=_interopRequireDefault(_types);var _errors=require('./errors');var _errors2=_interopRequireDefault(_errors);var _simpleDriver=require('../drivers/simpleDriver');var _simpleDriver2=_interopRequireDefault(_simpleDriver);var _trivialdbDriver=require('../drivers/trivialdbDriver');var _trivialdbDriver2=_interopRequireDefault(_trivialdbDriver);function _interopRequireDefault(obj){return obj&&obj.__esModule?obj:{default:obj};}function _classCallCheck(instance,Constructor){if(!(instance instanceof Constructor)){throw new TypeError("Cannot call a class as a function");}}var TrivialModel=function(){function TrivialModel(initialData){_classCallCheck(this,TrivialModel);if(!this.constructor.schema){throw new Error("A schema must be set on the model.");}if(!this.constructor.driver){throw new Error("A driver must be set on the model.");}this.$dirty=true;this.$exists=false;this.$values={};_lodash2.default.assign(this,initialData);}_createClass(TrivialModel,[{key:'$duplicate',value:function $duplicate(){return _bluebird2.default.resolve(new this.constructor(_lodash2.default.cloneDeep(_lodash2.default.omit(this.$values,this.constructor.pk))));}},{key:'$reload',value:function $reload(){var _this=this;var driver=this.constructor.driver;return driver.get(this.$pk,this).then(function(results){if(_lodash2.default.isArray(results)){throw new _errors2.default.MultipleDocuments(_this.$pk,_this.constructor.name);}else if(!results){throw new _errors2.default.DocumentNotFound(_this.$pk,_this.constructor.name);}else {_this.$exists=true;_this.$values={};_lodash2.default.assign(_this,results);_this.$dirty=false;}});}},{key:'$validate',value:function $validate(){var _this2=this;var schema=this.constructor.schema;return new _bluebird2.default(function(resolve){_lodash2.default.mapValues(schema,function(value,key){if(value.$isType){return value.validate(_this2,key);}});resolve(true);});}},{key:'$save',value:function $save(){var _this3=this;var driver=this.constructor.driver;return this.$validate().then(function(){return driver.set(_this3.$pk,_this3.$values,_this3).then(function(id){_this3.$values[_this3.constructor.pk]=id;}).then(function(){return _this3;});});}},{key:'$delete',value:function $delete(){var _this4=this;if(this.$exists){var pkFieldName=this.constructor.pk;var driver=this.constructor.driver;var query={};query[pkFieldName]=this.$pk;return driver.remove(query,this).then(function(){_this4.$pk=undefined;});}else {return _bluebird2.default.reject(new Error("Cannot delete a model that has not been saved yet!"));}}},{key:'toJSON',value:function toJSON(){var _this5=this;function _filterObject(object){return _lodash2.default.transform(object,function(results,value,key){if(_lodash2.default.isPlainObject(value)){results[key]=_filterObject(value);}else if(!(typeof key==='string'&&key.charAt(0)==='$')){results[key]=value;}return results;});}var schema=_filterObject(this.constructor.schema);return _lodash2.default.transform(schema,function(results,value,key){results[key]=_this5[key];});}},{key:'$pk',get:function get(){return this.$values[this.constructor.pk];},set:function set(val){this.$values[this.constructor.pk]=val;this.$dirty=true;this.$exists=false;}}],[{key:'_makeModel',value:function _makeModel(item){var inst=new this(item);inst.$dirty=false;inst.$exists=true;return inst;}},{key:'get',value:function get(pk){var _this6=this;return this.driver.get(pk,this).then(function(results){if(_lodash2.default.isArray(results)){throw new _errors2.default.MultipleDocuments(pk,_this6.name);}else if(!results){throw new _errors2.default.DocumentNotFound(pk,_this6.name);}else {return _this6._makeModel(results);}});}},{key:'all',value:function all(){var _this7=this;return this.driver.getAll(this).map(function(item){return _this7._makeModel(item);});}},{key:'filter',value:function filter(predicate){var _this8=this;return this.driver.filter(predicate,this).map(function(item){return _this8._makeModel(item);});}},{key:'query',value:function query(queryFunc){var _this9=this;return this.driver.query(queryFunc,this).then(function(items){return _lodash2.default.filter(items,function(item){return _lodash2.default.isPlainObject(item)&&!_lodash2.default.isEmpty(item);});}).map(function(item){return _this9._makeModel(item);});}},{key:'remove',value:function remove(predicate){return this.driver.remove(predicate,this);}},{key:'removeAll',value:function removeAll(){return this.driver.removeAll(this);}},{key:'setSchema',value:function setSchema(schema){var _this10=this;_lodash2.default.forIn(schema,function(value,key){if(value.$isType){Object.defineProperty(_this10.prototype,key,{get:function get(){return value.get(this,key);},set:function set(val){value.set(this,key,val);},enumerable:true});if(value.isPrimaryKey){_this10.pk=key;}}else {_this10.prototype[key]=value;}});if(!this.pk){this.pk='id';schema.id=new _types2.default.String({pk:true});Object.defineProperty(this.prototype,'id',{get:function get(){return schema.id.get(this,'id');},set:function set(val){schema.id.set(this,'id',val);},enumerable:true});}this.schema=schema;}},{key:'setDriver',value:function setDriver(driver){if(driver==undefined){throw new Error("Driver not specified.");}if(_lodash2.default.isString(driver)){driver={name:driver};}if(_lodash2.default.isPlainObject(driver)&&driver.name){var DriverClass;switch(driver.name){case 'Simple':DriverClass=_simpleDriver2.default;break;case 'TrivialDB':DriverClass=_trivialdbDriver2.default;break;default:throw new Error('Unknown Driver \''+driver.name+'\'!');break;}driver=new DriverClass(driver.options);}driver.init(this);this.driver=driver;}}]);return TrivialModel;}();exports.default=TrivialModel; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYmFzZU1vZGVsLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJ5MENBa0JNLFlBQVksWUFDZCxTQURFLFlBQVksQ0FDRixXQUFXLENBQ3ZCLHNCQUZFLFlBQVksRUFJVixHQUFHLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQzNCLENBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyxvQ0FBb0MsQ0FBQyxDQUFDLENBQ3pELEFBR0QsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUMzQixDQUNJLE1BQU0sSUFBSSxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQyxDQUN6RCxBQUVELElBQUksQ0FBQyxNQUFNLENBQUcsSUFBSSxDQUFDLEFBQ25CLElBQUksQ0FBQyxPQUFPLENBQUcsS0FBSyxDQUFDLEFBQ3JCLElBQUksQ0FBQyxPQUFPLENBQUcsRUFBRSxDQUFDLEFBRWxCLGlCQUFFLE1BQU0sQ0FBQyxJQUFJLENBQUUsV0FBVyxDQUFDLENBQUMsQ0FDL0IsYUFwQkMsWUFBWSwrQ0FrQ2QsQ0FDSSxPQUFPLG1CQUFRLE9BQU8sQ0FBQyxJQUFJLElBQUksQ0FBQyxXQUFXLENBQUMsaUJBQUUsU0FBUyxDQUFDLGlCQUFFLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFFLElBQUksQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FDeEcseUNBR0QsZ0JBQ0ksSUFBSSxNQUFNLENBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxNQUFNLENBQUMsQUFDckMsT0FBTyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUUsSUFBSSxDQUFDLENBQzVCLElBQUksQ0FBQyxTQUFDLE9BQU8sQ0FDZCxDQUNJLEdBQUcsaUJBQUUsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUNyQixDQUNJLE1BQU0sSUFBSSxpQkFBTyxpQkFBaUIsQ0FBQyxNQUFLLEdBQUcsQ0FBRSxNQUFL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LENBQ25CLENBQUMsQ0FBQyxDQUNOLEFBRUQsSUFBSSxDQUFDLE1BQU0sQ0FBRyxNQUFNLENBQUMsQ0FDeEIsNENBRWdCLE1BQU0sQ0FDdkIsQ0FDSSxHQUFHLE1BQU0sRUFBSSxTQUFTLENBQ3RCLENBQ0ksTUFBTSxJQUFJLEtBQUssQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQzVDLEFBRUQsR0FBRyxpQkFBRSxRQUFRLENBQUMsTUFBTSxDQUFDLENBQ3JCLENBQ0ksTUFBTSxDQUFHLENBQUUsSUFBSSxDQUFFLE1BQU0sQ0FBRSxDQUFDLENBQzdCLEFBRUQsR0FBRyxpQkFBRSxhQUFhLENBQUMsTUFBTSxDQUFDLEVBQUksTUFBTSxDQUFDLElBQUksQ0FDekMsQ0FDSSxJQUFJLFdBQVcsQ0FBQyxBQUNoQixPQUFPLE1BQU0sQ0FBQyxJQUFJLEVBRWQsS0FBSyxRQUFRLENBQ1QsV0FBVyx1QkFBZSxDQUFDLEFBQzNCLE1BQU0sQUFFVixLQUFLLFdBQVcsQ0FDWixXQUFXLDBCQUFrQixDQUFDLEFBQzlCLE1BQU0sQUFFVixRQUNJLE1BQU0sSUFBSSxLQUFLLHFCQUFxQixNQUFNLENBQUMsSUFBSSxPQUFNLENBQUMsQUFDdEQsTUFBTSxDQUNiLEFBRUQsTUFBTSxDQUFHLElBQUksV0FBVyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUM1QyxBQUdELE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQUFFbEIsSUFBSSxDQUFDLE1BQU0sQ0FBRyxNQUFNLENBQUMsQ0FDeEIsV0F2VEMsWUFBWSxxQkE0VEgsWUFBWSIsImZpbGUiOiJiYXNlTW9kZWwuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vLyBUcml2aWFsTW9kZWxcbi8vL1xuLy8vIEBtb2R1bGVcbi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5pbXBvcnQgXyBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0IFByb21pc2UgZnJvbSAnYmx1ZWJpcmQnO1xuXG5pbXBvcnQgdHlwZXMgZnJvbSAnLi90eXBlcyc7XG5pbXBvcnQgZXJyb3JzIGZyb20gJy4vZXJyb3JzJztcblxuLy8gRHJpdmVyc1xuaW1wb3J0IFNpbXBsZURyaXZlciBmcm9tICcuLi9kcml2ZXJzL3NpbXBsZURyaXZlcic7XG5pbXBvcnQgVHJpdmlhbERCRHJpdmVyIGZyb20gJy4uL2RyaXZlcnMvdHJpdmlhbGRiRHJpdmVyJztcblxuLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmNsYXNzIFRyaXZpYWxNb2RlbCB7XG4gICAgY29uc3RydWN0b3IoaW5pdGlhbERhdGEpXG4gICAge1xuICAgICAgICAvLyBDaGVjayB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhIHNjaGVtYVxuICAgICAgICBpZighdGhpcy5jb25zdHJ1Y3Rvci5zY2hlbWEpXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkEgc2NoZW1hIG11c3QgYmUgc2V0IG9uIHRoZSBtb2RlbC5cIik7XG4gICAgICAgIH0gLy8gZW5kIGlmXG5cbiAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIHdlIGhhdmUgYSBkcml2ZXJcbiAgICAgICAgaWYoIXRoaXMuY29uc3RydWN0b3IuZHJpdmVyKVxuICAgICAgICB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJBIGRyaXZlciBtdXN0IGJlIHNldCBvbiB0aGUgbW9kZWwuXCIpO1xuICAgICAgICB9IC8vIGVuZCBpZlxuXG4gICAgICAgIHRoaXMuJGRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy4kZXhpc3RzID0gZmFsc2U7XG4gICAgICAgIHRoaXMuJHZhbHVlcyA9IHt9O1xuXG4gICAgICAgIF8uYXNzaWduKHRoaXMsIGluaXRpYWxEYXRhKTtcbiAgICB9IC8vIGVuZCBjb25zdHJ1Y3RvclxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBQcm9wZXJ0aWVzXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIGdldCAkcGsoKXsgcmV0dXJuIHRoaXMuJHZhbHVlc1t0aGlzLmNvbnN0cnVjdG9yLnBrXTsgfVxuICAgIHNldCAkcGsodmFsKXsgdGhpcy4kdmFsdWVzW3RoaXMuY29uc3RydWN0b3IucGtdID0gdmFsOyB0aGlzLiRkaXJ0eSA9IHRydWU7IHRoaXMuJGV4aXN0cyA9IGZhbHNlOyB9XG5cbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICAgIC8vIEluc3RhbmNlIEFQSVxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbiAgICAkZHVwbGljYXRlKClcbiAgICB7XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobmV3IHRoaXMuY29uc3RydWN0b3IoXy5jbG9uZURlZXAoXy5vbWl0KHRoaXMuJHZhbHVlcywgdGhpcy5jb25zdHJ1Y3Rvci5waykpKSk7XG4gICAgfSAvLyBlbmQgJGR1cGxpY2F0ZVxuXG4gICAgJHJlbG9hZCgpXG4gICAge1xuICAgICAgICB2YXIgZHJpdmVyID0gdGhpcy5jb25zdHJ1Y3Rvci5kcml2ZXI7XG4gICAgICAgIHJldHVybiBkcml2ZXIuZ2V0KHRoaXMuJHBrLCB0aGlzKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdHMpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoXy5pc0FycmF5KHJlc3VsdHMpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5NdWx0aXBsZURvY3VtZW50cyh0aGlzLiRwaywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZighcmVzdWx0cylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuRG9jdW1lbnROb3RGb3VuZCh0aGlzLiRwaywgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kZXhpc3RzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy4kdmFsdWVzID0ge307XG4gICAgICAgICAgICAgICAgICAgIF8uYXNzaWduKHRoaXMsIHJlc3VsdHMpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuJGRpcnR5ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfSAvLyBlbmQgaWZcbiAgICAgICAgICAgIH0pO1xuICAgIH0gLy8gZW5kICRyZWxvYWRcblxuICAgICR2YWxpZGF0ZSgpXG4gICAge1xuICAgICAgICB2YXIgc2NoZW1hID0gdGhpcy5jb25zdHJ1Y3Rvci5zY2hlbWE7XG5cbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PlxuICAgICAgICB7XG4gICAgICAgICAgICBfLm1hcFZhbHVlcyhzY2hlbWEsICh2YWx1ZSwga2V5KSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgcnVuIHZhbGlkYXRpb24gaWYgaXQncyBhIHR5cGUgZnJvbSBvdXIgdHlwZSBzeXN0ZW0uXG4gICAgICAgICAgICAgICAgaWYodmFsdWUuJGlzVHlwZSlcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24gaWYgaXQgZmFpbHMgdG8gdmFsaWRhdGUuXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS52YWxpZGF0ZSh0aGlzLCBrZXkpO1xuICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgLy8gSWYgd2UgZ2V0IGhlcmUsIHdlJ3JlIHZhbGlkLlxuICAgICAgICAgICAgcmVzb2x2ZSh0cnVlKTtcbiAgICAgICAgfSk7XG4gICAgfSAvLyBlbmQgJHZhbGlkYXRlXG5cbiAgICAkc2F2ZSgpXG4gICAge1xuICAgICAgICB2YXIgZHJpdmVyID0gdGhpcy5jb25zdHJ1Y3Rvci5kcml2ZXI7XG4gICAgICAgIHJldHVybiB0aGlzLiR2YWxpZGF0ZSgpXG4gICAgICAgICAgICAudGhlbigoKSA9PlxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHJldHVybiBkcml2ZXIuc2V0KHRoaXMuJHBrLCB0aGlzLiR2YWx1ZXMsIHRoaXMpXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKChpZCkgPT5cbiAgICAgICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy4kdmFsdWVzW3RoaXMuY29uc3RydWN0b3IucGtdID0gaWQ7XG4gICAgICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAgICAgICAgIC50aGVuKCgpID0+XG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0gLy8gZW5kICRzYXZlXG5cbiAgICAkZGVsZXRlKClcbiAgICB7XG4gICAgICAgIGlmKHRoaXMuJGV4aXN0cylcbiAgICAgICAge1xuICAgICAgICB2YXIgcGtGaWVsZE5hbWUgPSB0aGlzLmNvbnN0cnVjdG9yLnBrO1xuICAgICAgICB2YXIgZHJpdmVyID0gdGhpcy5jb25zdHJ1Y3Rvci5kcml2ZXI7XG5cbiAgICAgICAgdmFyIHF1ZXJ5ID0ge307XG4gICAgICAgIHF1ZXJ5W3BrRmllbGROYW1lXSA9IHRoaXMuJHBrO1xuXG4gICAgICAgIC8vIFJlbW92ZSB0aGlzIGluc3RhbmNlXG4gICAgICAgIHJldHVybiBkcml2ZXIucmVtb3ZlKHF1ZXJ5LCB0aGlzKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICB0aGlzLiRwayA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2VcbiAgICAgICAge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihcIkNhbm5vdCBkZWxldGUgYSBtb2RlbCB0aGF0IGhhcyBub3QgYmVlbiBzYXZlZCB5ZXQhXCIpKTtcbiAgICAgICAgfSAvLyBlbmQgaWZcbiAgICB9IC8vIGVuZCAkZGVsZXRlXG5cbiAgICB0b0pTT04oKVxuICAgIHtcbiAgICAgICAgLy8gUmVtb3ZlIGFsbCBrZXlzIHRoYXQgYmVnaW4gd2l0aCBgJGAuXG4gICAgICAgIGZ1bmN0aW9uIF9maWx0ZXJPYmplY3Qob2JqZWN0KVxuICAgICAgICB7XG4gICAgICAgICAgICByZXR1cm4gXy50cmFuc2Zvcm0ob2JqZWN0LCAocmVzdWx0cywgdmFsdWUsIGtleSkgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBpZihfLmlzUGxhaW5PYmplY3QodmFsdWUpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trZXldID0gX2ZpbHRlck9iamVjdCh2YWx1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYoISh0eXBlb2Yga2V5ID09PSAnc3RyaW5nJyAmJiBrZXkuY2hhckF0KDApID09PSAnJCcpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0c1trZXldID0gdmFsdWU7XG4gICAgICAgICAgICAgICAgfSAvLyBlbmQgaWZcblxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHRzO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gLy8gZW5kIF9maWx0ZXJPYmplY3RcblxuICAgICAgICB2YXIgc2NoZW1hID0gX2ZpbHRlck9iamVjdCh0aGlzLmNvbnN0cnVjdG9yLnNjaGVtYSk7XG5cbiAgICAgICAgcmV0dXJuIF8udHJhbnNmb3JtKHNjaGVtYSwgKHJlc3VsdHMsIHZhbHVlLCBrZXkpID0+IHsgcmVzdWx0c1trZXldID0gdGhpc1trZXldOyB9KTtcbiAgICB9IC8vIGVuZCB0b0pTT05cblxuICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gQ2xhc3MgQVBJXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuICAgIHN0YXRpYyBfbWFrZU1vZGVsKGl0ZW0pXG4gICAge1xuICAgICAgICAvLyBSZXR1cm4gYSBuZXcgaW5zdGFuY2Ugb2YgdGhpcyBNb2RlbCwgcG9wdWxhdGVkIHdpdGggdGhlIGRhdGEgZnJvbSB0aGUgZHJpdmVyLlxuICAgICAgICB2YXIgaW5zdCA9IG5ldyB0aGlzKGl0ZW0pO1xuXG4gICAgICAgIC8vIFRoZSBpbnN0YW5jZSBpc24ndCBkaXJ0eSwgYXMgd2UndmUganVzdCBsb2FkZWQgaXQgZnJvbSB0aGUgREIuXG4gICAgICAgIGluc3QuJGRpcnR5ID0gZmFsc2U7XG5cbiAgICAgICAgLy8gVGhlIGluc3RhbmNlIGV4aXN0cyBpbiB0aGUgZGF0YWJhc2UuIChSZXF1aXJlZCBmb3Igc29tZSBkcml2ZXJzLilcbiAgICAgICAgaW5zdC4kZXhpc3RzID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gaW5zdDtcbiAgICB9IC8vIGVuZCBtYWtlTW9kZWxcblxuICAgIHN0YXRpYyBnZXQocGspXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5kcml2ZXIuZ2V0KHBrLCB0aGlzKVxuICAgICAgICAgICAgLnRoZW4oKHJlc3VsdHMpID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgaWYoXy5pc0FycmF5KHJlc3VsdHMpKVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IGVycm9ycy5NdWx0aXBsZURvY3VtZW50cyhwaywgdGhpcy5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZighcmVzdWx0cylcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBlcnJvcnMuRG9jdW1lbnROb3RGb3VuZChwaywgdGhpcy5uYW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZVxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VNb2RlbChyZXN1bHRzKTtcbiAgICAgICAgICAgICAgICB9IC8vIGVuZCBpZlxuICAgICAgICAgICAgfSk7XG4gICAgfSAvLyBlbmQgZ2V0XG5cbiAgICBzdGF0aWMgYWxsKClcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyaXZlci5nZXRBbGwodGhpcylcbiAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VNb2RlbChpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0gLy8gZW5kIGFsbFxuXG4gICAgc3RhdGljIGZpbHRlcihwcmVkaWNhdGUpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5kcml2ZXIuZmlsdGVyKHByZWRpY2F0ZSwgdGhpcylcbiAgICAgICAgICAgIC5tYXAoKGl0ZW0pID0+XG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuX21ha2VNb2RlbChpdGVtKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0gLy8gZW5kIGZpbHRlclxuXG4gICAgc3RhdGljIHF1ZXJ5KHF1ZXJ5RnVuYylcbiAgICB7XG4gICAgICAgIHJldHVybiB0aGlzLmRyaXZlci5xdWVyeShxdWVyeUZ1bmMsIHRoaXMpXG4gICAgICAgICAgICAudGhlbigoaXRlbXMpID0+IHsgcmV0dXJuIF8uZmlsdGVyKGl0ZW1zLCAoaXRlbSkgPT4gXy5pc1BsYWluT2JqZWN0KGl0ZW0pICYmICFfLmlzRW1wdHkoaXRlbSkpOyB9KVxuICAgICAgICAgICAgLm1hcCgoaXRlbSkgPT5cbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5fbWFrZU1vZGVsKGl0ZW0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSAvLyBlbmQgcXVlcnlcblxuICAgIHN0YXRpYyByZW1vdmUocHJlZGljYXRlKVxuICAgIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZHJpdmVyLnJlbW92ZShwcmVkaWNhdGUsIHRoaXMpO1xuICAgIH0gLy8gZW5kIHJlbW92ZVxuXG4gICAgc3RhdGljIHJlbW92ZUFsbCgpXG4gICAge1xuICAgICAgICByZXR1cm4gdGhpcy5kcml2ZXIucmVtb3ZlQWxsKHRoaXMpO1xuICAgIH0gLy8gZW5kIHJlbW92ZUFsbFxuXG4gICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAgICAvLyBNb2RlbCBDbGFzcyBjcmVhdGlvbiBBUElcbiAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4gICAgc3RhdGljIHNldFNjaGVtYShzY2hlbWEpXG4gICAge1xuICAgICAgICAvLyBCdWlsZCB0aGUgc2NoZW1hXG4gICAgICAgIF8uZm9ySW4oc2NoZW1hLCAodmFsdWUsIGtleSkgPT5cbiAgICAgICAge1xuICAgICAgICAgICAgaWYodmFsdWUuJGlzVHlwZSlcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAvLyBEZWZpbmUgdGhlIGdldHRlci9zZXR0ZXJzIGZvciB0aGUgbW9kZWwgZmllbGRzXG4gICAgICAgICAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMucHJvdG90eXBlLCBrZXksIHtcbiAgICAgICAgICAgICAgICAgICAgZ2V0OiBmdW5jdGlvbigpIHsgcmV0dXJuIHZhbHVlLmdldCh0aGlzLCBrZXkpOyB9LFxuICAgICAgICAgICAgICAgICAgICBzZXQ6IGZ1bmN0aW9uKHZhbCkgeyB2YWx1ZS5zZXQodGhpcywga2V5LCB2YWwpOyB9LFxuICAgICAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBpZih2YWx1ZS5pc1ByaW1hcnlLZXkpXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBrID0ga2V5O1xuICAgICAgICAgICAgICAgIH0gLy8gZW5kIGlmXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm90b3R5cGVba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfSAvLyBlbmQgaWZcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRW5zdXJlIHdlIGFsd2F5cyBoYXZlIGEgcHJpbWFyeSBrZXlcbiAgICAgICAgaWYoIXRoaXMucGspXG4gICAgICAgIHtcbiAgICAgICAgICAgIHRoaXMucGsgPSAnaWQnO1xuXG4gICAgICAgICAgICAvLyBBZGQgdGhlIGlkIGZpZWxkIHRvIHRoZSBzY2hlbWFcbiAgICAgICAgICAgIHNjaGVtYS5pZCA9IG5ldyB0eXBlcy5TdHJpbmcoeyBwazogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgLy8gQnVpbGQgdGhlIGdldHRlci9zZXR0ZXJcbiAgICAgICAgICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLnByb3RvdHlwZSwgJ2lkJywge1xuICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBzY2hlbWEuaWQuZ2V0KHRoaXMsICdpZCcpOyB9LFxuICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24odmFsKSB7IHNjaGVtYS5pZC5zZXQodGhpcywgJ2lkJywgdmFsKTsgfSxcbiAgICAgICAgICAgICAgICBlbnVtZXJhYmxlOiB0cnVlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSAvLyBlbmQgaWZcblxuICAgICAgICB0aGlzLnNjaGVtYSA9IHNjaGVtYTtcbiAgICB9IC8vIGVuZCBzZXRTY2hlbWFcblxuICAgIHN0YXRpYyBzZXREcml2ZXIoZHJpdmVyKVxuICAgIHtcbiAgICAgICAgaWYoZHJpdmVyID09IHVuZGVmaW5lZClcbiAgICAgICAge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRHJpdmVyIG5vdCBzcGVjaWZpZWQuXCIpO1xuICAgICAgICB9IC8vIGVuZCBpZlxuXG4gICAgICAgIGlmKF8uaXNTdHJpbmcoZHJpdmVyKSlcbiAgICAgICAge1xuICAgICAgICAgICAgZHJpdmVyID0geyBuYW1lOiBkcml2ZXIgfTtcbiAgICAgICAgfSAvLyBlbmQgaWZcblxuICAgICAgICBpZihfLmlzUGxhaW5PYmplY3QoZHJpdmVyKSAmJiBkcml2ZXIubmFtZSlcbiAgICAgICAge1xuICAgICAgICAgICAgdmFyIERyaXZlckNsYXNzO1xuICAgICAgICAgICAgc3dpdGNoKGRyaXZlci5uYW1lKVxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNhc2UgJ1NpbXBsZSc6XG4gICAgICAgICAgICAgICAgICAgIERyaXZlckNsYXNzID0gU2ltcGxlRHJpdmVyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGNhc2UgJ1RyaXZpYWxEQic6XG4gICAgICAgICAgICAgICAgICAgIERyaXZlckNsYXNzID0gVHJpdmlhbERCRHJpdmVyO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcblxuICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBEcml2ZXIgJyR7IGRyaXZlci5uYW1lIH0nIWApO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH0gLy8gZW5kIHN3aXRjaFxuXG4gICAgICAgICAgICBkcml2ZXIgPSBuZXcgRHJpdmVyQ2xhc3MoZHJpdmVyLm9wdGlvbnMpO1xuICAgICAgICB9IC8vIGVuZCBpZlxuXG4gICAgICAgIC8vIEluaXRpYWxpemUgdGhlIGRyaXZlclxuICAgICAgICBkcml2ZXIuaW5pdCh0aGlzKTtcblxuICAgICAgICB0aGlzLmRyaXZlciA9IGRyaXZlcjtcbiAgICB9IC8vIGVuZCBzZXREcml2ZXJcbn0gLy8gZW5kIFRyaXZpYWxNb2RlbFxuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZXhwb3J0IGRlZmF1bHQgVHJpdmlhbE1vZGVsO1xuXG4vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiJdfQ==