foop
Version:
interfaces that describe their intentions.
222 lines (210 loc) • 15.6 kB
JavaScript
/* eslint dot-notation: "OFF" */
/**
* @since 2.0.0
*/
var isUndefined = require('../deps/is/undefined')
var isFunction = require('../deps/is/function')
var hasOwnPropertyFlipped = require('../deps/flipped/hasOwnPropertyFlipped')
var identity = require('../deps/fp/identity')
var defaultToNoop = require('../deps/flipped/defaultToNoop')
var hasMeta = hasOwnPropertyFlipped('meta')
/**
* @class Shorthands
* @member Shorthands
* @extends {ChainedMap}
* @extends {DotProp}
* @memberOf compose
* @category Chainable
*
* @param {Class | Composable} Target composable class
* @return {Shorthands} class
*
* @tests Shorthands
* @types Shorthands
*
* @see ChainedMap
* @see DotProp
* @see deps/matcher
* @see deps/traversers/eq
* @see deps/traverse
* @see DotProp
*
* {@link https://github.com/ReactiveX/rxjs/blob/master/src/Subscriber.ts reactivex}
* {@link https://github.com/sindresorhus/awesome-observables awesome-observables}
* {@link https://medium.com/@benlesh/learning-observable-by-building-observable-d5da57405d87 building-observables}
* @see {@link reactivex}
* @see {@link awesome-observables}
* @see {@link building-observables}
*
* @example
*
* const {compose} = require('chain-able')
* const {DotProp} = compose
* new DotProp()
* //=> DotProp
*
*/
module.exports = function (Target) {
var Shorthands = (function (Target) {
function Shorthands(parent) {
Target.call(this, parent)
this.debug(hasMeta(parent) ? parent.meta.debug : false)
}
if ( Target ) Shorthands.__proto__ = Target;
Shorthands.prototype = Object.create( Target && Target.prototype );
Shorthands.prototype.constructor = Shorthands;
return Shorthands;
}(Target));
// const constructs = defaultToNoop(Target.prototype.construct)
/**
* @version 2.0.0 <- was constructor
* @version 5.0.0 <- made as construct, meta check as call method > set
*
* @param {*} parent @see Chainable
* @return {void}
*/
// Target.prototype.construct = function(parent) {
// constructs.call(this, parent)
// // this.debug(hasMeta(parent) ? parent.meta.debug : false)
// }
/**
* @desc sets on store not this.set for easier extension
*
* @since 4.0.0 <- moved from Extend to Shorthands
* @since 0.2.0
*
* @param {boolean} [should=true] shouldDebug
* @return {Chainable} @chainable
*
* @NOTE is inherited by any chain with a parent with .meta.debug
*
* @example
*
* const Chain = require('chain-able')
* const chain = new Chain()
* chain.debug()
*
* chain.get('debug')
* //=> true
*
* // not in entries
* chain.entries()
* //=> {}
*
*/
Shorthands.prototype.debug = function(should) {
// @NOTE if this is trying to inherit,
// and we have shorthands above ChainedMap somehow
// because of the `construct`, error, lame
if (!this.meta) { return this }
this.meta.debug = isUndefined(should) ? true : should
return this
}
/**
* @desc sets a value **only** when .has is false
* aka set if the value has not been set
*
* @memberOf ShorthandChain
* @since 1.0.2
* @version 4.0.0 <- changed to be prototype method (not extension prototype)
* @version 3.0.0 <- changed to use `this.has` vs `isFalse(this.has)`
* @version 2.0.0 <- fixed but forgot to return conditionally
*
* @param {Primitive} name key to set if it has not been done so already
* @param {any} value value to set when key has not been already set
* @return {ShorthandChain} @chainable
*
* @see ChainedMapBase.set
*
* @example
*
* const chain = new Chain()
*
* chain.set('eh', true)
*
* // eh is already set ^, ignored
* chain.setIfEmpty('eh', false)
*
* chain.get('eh')
* //=> true
*
* @example
*
* new Chain().setIfEmpty('canada', true).entries()
* //=> {canada: true}
*
* @example
*
* // longhand way to do the same thing
* if (chain.has('eh') === false) {
* chain.set('eh', false)
* }
*
* // or using .when
* chain.when(!chain.has('eh'), instance => instance.set('eh', false))
*
*/
Shorthands.prototype.setIfEmpty = function(name, value) {
if (this.has(name)) { return this }
else { return this.set(name, value) }
}
/**
* @desc returns any value passed in
* return a value at the end of a chain regardless
*
* @memberOf ShorthandChain
* @since 3.0.0
*
* @see fp/identity
* @param {any} value value to return at the end of a chain
* @return {any} value
*
* @example
*
* const chain = new Chain()
*
* const saveAndDebug = env => chain
* .from({env: env.NODE_ENV})
* .return(JSON.stringify(env))
*
* console.log(saveAndDebug(process.env))
* //=> value of process.env
*
*/
Shorthands.prototype['return'] = identity
/**
* @desc wrap a value, if it's a Function call it, return this
* aka execute something and return this
*
* @memberOf ShorthandChain
* @since 2.0.0
* @param {Function | any} fn function to call, or just any value
* @return {ShorthandChain} @chainable
*
* @example
*
* const {eh} = chain.wrap(chain => chain.eh = true)
* //=> true
*
* @example
*
* new Chain()
* .wrap(encased => encased.fn = arg => {
* throw new Error('encased yo')
* })
* .method('fn')
* .encase()
* .catch(error => {
* //=> Error('encasedYo')
* })
* .build()
* .fn(true)
*
*/
Shorthands.prototype.wrap = function(fn) {
if (isFunction(fn)) { fn.call(this, this) }
return this
}
return Shorthands
}
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiU2hvcnRoYW5kcy5qcyIsInNvdXJjZXMiOlsiU2hvcnRoYW5kcy5qcyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKiBlc2xpbnQgZG90LW5vdGF0aW9uOiBcIk9GRlwiICovXG5cbi8qKlxuICogQHNpbmNlIDIuMC4wXG4gKi9cbmNvbnN0IGlzVW5kZWZpbmVkID0gcmVxdWlyZSgnLi4vZGVwcy9pcy91bmRlZmluZWQnKVxuY29uc3QgaXNGdW5jdGlvbiA9IHJlcXVpcmUoJy4uL2RlcHMvaXMvZnVuY3Rpb24nKVxuY29uc3QgaGFzT3duUHJvcGVydHlGbGlwcGVkID0gcmVxdWlyZSgnLi4vZGVwcy9mbGlwcGVkL2hhc093blByb3BlcnR5RmxpcHBlZCcpXG5jb25zdCBpZGVudGl0eSA9IHJlcXVpcmUoJy4uL2RlcHMvZnAvaWRlbnRpdHknKVxuY29uc3QgZGVmYXVsdFRvTm9vcCA9IHJlcXVpcmUoJy4uL2RlcHMvZmxpcHBlZC9kZWZhdWx0VG9Ob29wJylcblxuY29uc3QgaGFzTWV0YSA9IGhhc093blByb3BlcnR5RmxpcHBlZCgnbWV0YScpXG5cbi8qKlxuICogQGNsYXNzIFNob3J0aGFuZHNcbiAqIEBtZW1iZXIgU2hvcnRoYW5kc1xuICogQGV4dGVuZHMge0NoYWluZWRNYXB9XG4gKiBAZXh0ZW5kcyB7RG90UHJvcH1cbiAqIEBtZW1iZXJPZiBjb21wb3NlXG4gKiBAY2F0ZWdvcnkgQ2hhaW5hYmxlXG4gKlxuICogQHBhcmFtICB7Q2xhc3MgfCBDb21wb3NhYmxlfSBUYXJnZXQgY29tcG9zYWJsZSBjbGFzc1xuICogQHJldHVybiB7U2hvcnRoYW5kc30gY2xhc3NcbiAqXG4gKiBAdGVzdHMgU2hvcnRoYW5kc1xuICogQHR5cGVzIFNob3J0aGFuZHNcbiAqXG4gKiBAc2VlIENoYWluZWRNYXBcbiAqIEBzZWUgRG90UHJvcFxuICogQHNlZSBkZXBzL21hdGNoZXJcbiAqIEBzZWUgZGVwcy90cmF2ZXJzZXJzL2VxXG4gKiBAc2VlIGRlcHMvdHJhdmVyc2VcbiAqIEBzZWUgRG90UHJvcFxuICpcbiAqIHtAbGluayBodHRwczovL2dpdGh1Yi5jb20vUmVhY3RpdmVYL3J4anMvYmxvYi9tYXN0ZXIvc3JjL1N1YnNjcmliZXIudHMgcmVhY3RpdmV4fVxuICoge0BsaW5rIGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvYXdlc29tZS1vYnNlcnZhYmxlcyBhd2Vzb21lLW9ic2VydmFibGVzfVxuICoge0BsaW5rIGh0dHBzOi8vbWVkaXVtLmNvbS9AYmVubGVzaC9sZWFybmluZy1vYnNlcnZhYmxlLWJ5LWJ1aWxkaW5nLW9ic2VydmFibGUtZDVkYTU3NDA1ZDg3IGJ1aWxkaW5nLW9ic2VydmFibGVzfVxuICogQHNlZSB7QGxpbmsgcmVhY3RpdmV4fVxuICogQHNlZSB7QGxpbmsgYXdlc29tZS1vYnNlcnZhYmxlc31cbiAqIEBzZWUge0BsaW5rIGJ1aWxkaW5nLW9ic2VydmFibGVzfVxuICpcbiAqIEBleGFtcGxlXG4gKlxuICogICAgY29uc3Qge2NvbXBvc2V9ID0gcmVxdWlyZSgnY2hhaW4tYWJsZScpXG4gKiAgICBjb25zdCB7RG90UHJvcH0gPSBjb21wb3NlXG4gKiAgICBuZXcgRG90UHJvcCgpXG4gKiAgICAvLz0+IERvdFByb3BcbiAqXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gVGFyZ2V0ID0+IHtcbiAgY2xhc3MgU2hvcnRoYW5kcyBleHRlbmRzIFRhcmdldCB7XG4gICAgY29uc3RydWN0b3IocGFyZW50KSB7XG4gICAgICBzdXBlcihwYXJlbnQpXG4gICAgICB0aGlzLmRlYnVnKGhhc01ldGEocGFyZW50KSA/IHBhcmVudC5tZXRhLmRlYnVnIDogZmFsc2UpXG4gICAgfVxuICB9XG4gIC8vIGNvbnN0IGNvbnN0cnVjdHMgPSBkZWZhdWx0VG9Ob29wKFRhcmdldC5wcm90b3R5cGUuY29uc3RydWN0KVxuXG4gIC8qKlxuICAgKiBAdmVyc2lvbiAyLjAuMCA8LSB3YXMgY29uc3RydWN0b3JcbiAgICogQHZlcnNpb24gNS4wLjAgPC0gbWFkZSBhcyBjb25zdHJ1Y3QsIG1ldGEgY2hlY2sgYXMgY2FsbCBtZXRob2QgPiBzZXRcbiAgICpcbiAgICogQHBhcmFtICB7Kn0gcGFyZW50IEBzZWUgQ2hhaW5hYmxlXG4gICAqIEByZXR1cm4ge3ZvaWR9XG4gICAqL1xuICAvLyBUYXJnZXQucHJvdG90eXBlLmNvbnN0cnVjdCA9IGZ1bmN0aW9uKHBhcmVudCkge1xuICAvLyAgIGNvbnN0cnVjdHMuY2FsbCh0aGlzLCBwYXJlbnQpXG4gIC8vICAgLy8gdGhpcy5kZWJ1ZyhoYXNNZXRhKHBhcmVudCkgPyBwYXJlbnQubWV0YS5kZWJ1ZyA6IGZhbHNlKVxuICAvLyB9XG5cbiAgLyoqXG4gICAqIEBkZXNjIHNldHMgb24gc3RvcmUgbm90IHRoaXMuc2V0IGZvciBlYXNpZXIgZXh0ZW5zaW9uXG4gICAqXG4gICAqIEBzaW5jZSA0LjAuMCA8LSBtb3ZlZCBmcm9tIEV4dGVuZCB0byBTaG9ydGhhbmRzXG4gICAqIEBzaW5jZSAwLjIuMFxuICAgKlxuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFtzaG91bGQ9dHJ1ZV0gc2hvdWxkRGVidWdcbiAgICogQHJldHVybiB7Q2hhaW5hYmxlfSBAY2hhaW5hYmxlXG4gICAqXG4gICAqIEBOT1RFIGlzIGluaGVyaXRlZCBieSBhbnkgY2hhaW4gd2l0aCBhIHBhcmVudCB3aXRoIC5tZXRhLmRlYnVnXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGNvbnN0IENoYWluID0gcmVxdWlyZSgnY2hhaW4tYWJsZScpXG4gICAqICAgIGNvbnN0IGNoYWluID0gbmV3IENoYWluKClcbiAgICogICAgY2hhaW4uZGVidWcoKVxuICAgKlxuICAgKiAgICBjaGFpbi5nZXQoJ2RlYnVnJylcbiAgICogICAgLy89PiB0cnVlXG4gICAqXG4gICAqICAgIC8vIG5vdCBpbiBlbnRyaWVzXG4gICAqICAgIGNoYWluLmVudHJpZXMoKVxuICAgKiAgICAvLz0+IHt9XG4gICAqXG4gICAqL1xuICBTaG9ydGhhbmRzLnByb3RvdHlwZS5kZWJ1ZyA9IGZ1bmN0aW9uKHNob3VsZCkge1xuICAgIC8vIEBOT1RFIGlmIHRoaXMgaXMgdHJ5aW5nIHRvIGluaGVyaXQsXG4gICAgLy8gYW5kIHdlIGhhdmUgc2hvcnRoYW5kcyBhYm92ZSBDaGFpbmVkTWFwIHNvbWVob3dcbiAgICAvLyBiZWNhdXNlIG9mIHRoZSBgY29uc3RydWN0YCwgZXJyb3IsIGxhbWVcbiAgICBpZiAoIXRoaXMubWV0YSkgcmV0dXJuIHRoaXNcbiAgICB0aGlzLm1ldGEuZGVidWcgPSBpc1VuZGVmaW5lZChzaG91bGQpID8gdHJ1ZSA6IHNob3VsZFxuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICAvKipcbiAgICogQGRlc2Mgc2V0cyBhIHZhbHVlICoqb25seSoqIHdoZW4gLmhhcyBpcyBmYWxzZVxuICAgKiAgICAgICBha2Egc2V0IGlmIHRoZSB2YWx1ZSBoYXMgbm90IGJlZW4gc2V0XG4gICAqXG4gICAqIEBtZW1iZXJPZiBTaG9ydGhhbmRDaGFpblxuICAgKiBAc2luY2UgMS4wLjJcbiAgICogQHZlcnNpb24gNC4wLjAgPC0gY2hhbmdlZCB0byBiZSBwcm90b3R5cGUgbWV0aG9kIChub3QgZXh0ZW5zaW9uIHByb3RvdHlwZSlcbiAgICogQHZlcnNpb24gMy4wLjAgPC0gY2hhbmdlZCB0byB1c2UgYHRoaXMuaGFzYCB2cyBgaXNGYWxzZSh0aGlzLmhhcylgXG4gICAqIEB2ZXJzaW9uIDIuMC4wIDwtIGZpeGVkIGJ1dCBmb3Jnb3QgdG8gcmV0dXJuIGNvbmRpdGlvbmFsbHlcbiAgICpcbiAgICogQHBhcmFtIHtQcmltaXRpdmV9IG5hbWUga2V5IHRvIHNldCBpZiBpdCBoYXMgbm90IGJlZW4gZG9uZSBzbyBhbHJlYWR5XG4gICAqIEBwYXJhbSB7YW55fSB2YWx1ZSB2YWx1ZSB0byBzZXQgd2hlbiBrZXkgaGFzIG5vdCBiZWVuIGFscmVhZHkgc2V0XG4gICAqIEByZXR1cm4ge1Nob3J0aGFuZENoYWlufSBAY2hhaW5hYmxlXG4gICAqXG4gICAqIEBzZWUgQ2hhaW5lZE1hcEJhc2Uuc2V0XG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGNvbnN0IGNoYWluID0gbmV3IENoYWluKClcbiAgICpcbiAgICogICAgY2hhaW4uc2V0KCdlaCcsIHRydWUpXG4gICAqXG4gICAqICAgIC8vIGVoIGlzIGFscmVhZHkgc2V0IF4sIGlnbm9yZWRcbiAgICogICAgY2hhaW4uc2V0SWZFbXB0eSgnZWgnLCBmYWxzZSlcbiAgICpcbiAgICogICAgY2hhaW4uZ2V0KCdlaCcpXG4gICAqICAgIC8vPT4gdHJ1ZVxuICAgKlxuICAgKiBAZXhhbXBsZVxuICAgKlxuICAgKiAgIG5ldyBDaGFpbigpLnNldElmRW1wdHkoJ2NhbmFkYScsIHRydWUpLmVudHJpZXMoKVxuICAgKiAgIC8vPT4ge2NhbmFkYTogdHJ1ZX1cbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAvLyBsb25naGFuZCB3YXkgdG8gZG8gdGhlIHNhbWUgdGhpbmdcbiAgICogICBpZiAoY2hhaW4uaGFzKCdlaCcpID09PSBmYWxzZSkge1xuICAgKiAgICAgY2hhaW4uc2V0KCdlaCcsIGZhbHNlKVxuICAgKiAgIH1cbiAgICpcbiAgICogICAvLyBvciB1c2luZyAud2hlblxuICAgKiAgIGNoYWluLndoZW4oIWNoYWluLmhhcygnZWgnKSwgaW5zdGFuY2UgPT4gaW5zdGFuY2Uuc2V0KCdlaCcsIGZhbHNlKSlcbiAgICpcbiAgICovXG4gIFNob3J0aGFuZHMucHJvdG90eXBlLnNldElmRW1wdHkgPSBmdW5jdGlvbihuYW1lLCB2YWx1ZSkge1xuICAgIGlmICh0aGlzLmhhcyhuYW1lKSkgcmV0dXJuIHRoaXNcbiAgICBlbHNlIHJldHVybiB0aGlzLnNldChuYW1lLCB2YWx1ZSlcbiAgfVxuXG4gIC8qKlxuICAgKiBAZGVzYyByZXR1cm5zIGFueSB2YWx1ZSBwYXNzZWQgaW5cbiAgICogICAgICAgcmV0dXJuIGEgdmFsdWUgYXQgdGhlIGVuZCBvZiBhIGNoYWluIHJlZ2FyZGxlc3NcbiAgICpcbiAgICogQG1lbWJlck9mIFNob3J0aGFuZENoYWluXG4gICAqIEBzaW5jZSAzLjAuMFxuICAgKlxuICAgKiBAc2VlIGZwL2lkZW50aXR5XG4gICAqIEBwYXJhbSAge2FueX0gdmFsdWUgdmFsdWUgdG8gcmV0dXJuIGF0IHRoZSBlbmQgb2YgYSBjaGFpblxuICAgKiBAcmV0dXJuIHthbnl9IHZhbHVlXG4gICAqXG4gICAqIEBleGFtcGxlXG4gICAqXG4gICAqICAgIGNvbnN0IGNoYWluID0gbmV3IENoYWluKClcbiAgICpcbiAgICogICAgY29uc3Qgc2F2ZUFuZERlYnVnID0gZW52ID0+IGNoYWluXG4gICAqICAgICAgLmZyb20oe2VudjogZW52Lk5PREVfRU5WfSlcbiAgICogICAgICAucmV0dXJuKEpTT04uc3RyaW5naWZ5KGVudikpXG4gICAqXG4gICAqICAgIGNvbnNvbGUubG9nKHNhdmVBbmREZWJ1Zyhwcm9jZXNzLmVudikpXG4gICAqICAgIC8vPT4gdmFsdWUgb2YgcHJvY2Vzcy5lbnZcbiAgICpcbiAgICovXG4gIFNob3J0aGFuZHMucHJvdG90eXBlWydyZXR1cm4nXSA9IGlkZW50aXR5XG5cbiAgLyoqXG4gICAqIEBkZXNjIHdyYXAgYSB2YWx1ZSwgaWYgaXQncyBhIEZ1bmN0aW9uIGNhbGwgaXQsIHJldHVybiB0aGlzXG4gICAqICAgICAgIGFrYSBleGVjdXRlIHNvbWV0aGluZyBhbmQgcmV0dXJuIHRoaXNcbiAgICpcbiAgICogQG1lbWJlck9mIFNob3J0aGFuZENoYWluXG4gICAqIEBzaW5jZSAyLjAuMFxuICAgKiBAcGFyYW0gIHtGdW5jdGlvbiB8IGFueX0gZm4gZnVuY3Rpb24gdG8gY2FsbCwgb3IganVzdCBhbnkgdmFsdWVcbiAgICogQHJldHVybiB7U2hvcnRoYW5kQ2hhaW59IEBjaGFpbmFibGVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgY29uc3Qge2VofSA9IGNoYWluLndyYXAoY2hhaW4gPT4gY2hhaW4uZWggPSB0cnVlKVxuICAgKiAgICAvLz0+IHRydWVcbiAgICpcbiAgICogQGV4YW1wbGVcbiAgICpcbiAgICogICAgbmV3IENoYWluKClcbiAgICogICAgICAud3JhcChlbmNhc2VkID0+IGVuY2FzZWQuZm4gPSBhcmcgPT4ge1xuICAgKiAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlbmNhc2VkIHlvJylcbiAgICogICAgICB9KVxuICAgKiAgICAgIC5tZXRob2QoJ2ZuJylcbiAgICogICAgICAuZW5jYXNlKClcbiAgICogICAgICAuY2F0Y2goZXJyb3IgPT4ge1xuICAgKiAgICAgICAgLy89PiBFcnJvcignZW5jYXNlZFlvJylcbiAgICogICAgICB9KVxuICAgKiAgICAgIC5idWlsZCgpXG4gICAqICAgICAgLmZuKHRydWUpXG4gICAqXG4gICAqL1xuICBTaG9ydGhhbmRzLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24oZm4pIHtcbiAgICBpZiAoaXNGdW5jdGlvbihmbikpIGZuLmNhbGwodGhpcywgdGhpcylcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgcmV0dXJuIFNob3J0aGFuZHNcbn1cbiJdLCJuYW1lcyI6WyJjb25zdCIsInN1cGVyIl0sIm1hcHBpbmdzIjoiQUFBQTs7Ozs7QUFLQUEsR0FBSyxDQUFDLFdBQVcsR0FBRyxPQUFPLENBQUMsc0JBQXNCLENBQUM7QUFDbkRBLEdBQUssQ0FBQyxVQUFVLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixDQUFDO0FBQ2pEQSxHQUFLLENBQUMscUJBQXFCLEdBQUcsT0FBTyxDQUFDLHVDQUF1QyxDQUFDO0FBQzlFQSxHQUFLLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQztBQUMvQ0EsR0FBSyxDQUFDLGFBQWEsR0FBRyxPQUFPLENBQUMsK0JBQStCLENBQUM7O0FBRTlEQSxHQUFLLENBQUMsT0FBTyxHQUFHLHFCQUFxQixDQUFDLE1BQU0sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFzQzdDLE1BQU0sQ0FBQyxPQUFPLEdBQUcsVUFBQSxNQUFNLENBQUEsQ0FBQyxBQUFHO0VBQ3pCLElBQU0sVUFBVSxHQUFlO0lBQUMsQUFDOUIsbUJBQVcsQ0FBQyxNQUFNLEVBQUU7TUFDbEJDLE1BQUssS0FBQSxDQUFDLE1BQUEsTUFBTSxDQUFDO01BQ2IsSUFBSSxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsS0FBSyxDQUFDO0tBQ3hEOzs7O2tEQUFBLEFBQ0Y7OztJQUx3QixNQUt4QixHQUFBOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBd0NELFVBQVUsQ0FBQyxTQUFTLENBQUMsS0FBSyxHQUFHLFNBQVMsTUFBTSxFQUFFOzs7O0lBSTVDLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLEVBQUEsT0FBTyxJQUFJLEVBQUE7SUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxLQUFLLEdBQUcsV0FBVyxDQUFDLE1BQU0sQ0FBQyxHQUFHLElBQUksR0FBRyxNQUFNO0lBQ3JELE9BQU8sSUFBSTtHQUNaOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBOENELFVBQVUsQ0FBQyxTQUFTLENBQUMsVUFBVSxHQUFHLFNBQVMsSUFBSSxFQUFFLEtBQUssRUFBRTtJQUN0RCxJQUFJLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBQSxPQUFPLElBQUksRUFBQTtTQUMxQixFQUFBLE9BQU8sSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLEVBQUUsS0FBSyxDQUFDLEVBQUE7R0FDbEM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7RUF5QkQsVUFBVSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsR0FBRyxRQUFROzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBK0J6QyxVQUFVLENBQUMsU0FBUyxDQUFDLElBQUksR0FBRyxTQUFTLEVBQUUsRUFBRTtJQUN2QyxJQUFJLFVBQVUsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFBLEVBQUUsQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxFQUFBO0lBQ3ZDLE9BQU8sSUFBSTtHQUNaOztFQUVELE9BQU8sVUFBVTtDQUNsQjsifQ==