diff --git a/endpoints/README.md b/endpoints/README.md index 3bd6ee33..4dfe4880 100644 --- a/endpoints/README.md +++ b/endpoints/README.md @@ -85,6 +85,111 @@ import { localStorageIO } from 'type-r/endpoints/localStorage' } ``` +### websocketIO( url, options? ) + +Basic WebSocket endpoint for collection live updates. It implements `subscribe()` and `unsubscribe()` and does not implement REST-like CRUD/list methods. Use it when a collection is loaded by another endpoint or when you only need live updates. + +Several collections using the same `url`, `WebSocket` constructor, and `protocols` share one WebSocket connection. Each collection still sends its own subscribe/unsubscribe messages. + +```javascript +import { websocketIO } from '@type-r/endpoints' + +@define class User extends Model { + static endpoint = websocketIO( 'ws://localhost:3000/live', { + subscribeMessage : () => ({ + type : 'subscribe', + channel : 'users' + }), + + unsubscribeMessage : () => ({ + type : 'unsubscribe', + channel : 'users' + }), + + // Route only messages for this collection. + match : message => message.channel === 'users' + }); + + static attributes = { + name : '' + } +} + +const users = new User.Collection(); +users.liveUpdates( true ); +``` + +Supported update messages: + +```javascript +{ + channel : 'users', + type : 'updated', + payload : { + id : '1', + name : 'Ann' + } +} +``` + +Supported remove messages: + +```javascript +{ + channel : 'users', + type : 'removed', + payload : '1' +} +``` + +Compact envelopes are also supported: + +```javascript +{ updated : { id : '1', name : 'Ann' } } +{ removed : '1' } +``` + +`websocketIO()` is intentionally small. It does not provide reconnect, heartbeat, subscribe acknowledgements, cursors, event replay, or resync. + +### restfulWebsocketIO( url, websocketUrl, options? ) + +Combined endpoint using `restfulIO` semantics for CRUD/list operations and basic WebSocket subscription for collection live updates. + +```javascript +import { restfulWebsocketIO } from '@type-r/endpoints' + +@define class User extends Model { + static endpoint = restfulWebsocketIO( + 'http://localhost:3000/api/users', + 'ws://localhost:3000/live', + { + subscribeMessage : () => ({ + type : 'subscribe', + channel : 'users' + }), + + unsubscribeMessage : () => ({ + type : 'unsubscribe', + channel : 'users' + }), + + match : message => message.channel === 'users' + } + ); + + static attributes = { + name : '' + } +} + +const users = new User.Collection(); + +// Fetches the REST snapshot and enables WebSocket live updates. +users.fetch({ liveUpdates : true }); +``` + +When `fetch({ liveUpdates : true })` is used, Type-R subscribes to live updates first and then performs the REST `list()` request. The basic WebSocket endpoint considers subscription ready when the socket is open and the subscribe message has been sent. + ### attributesIO() Endpoint for I/O composition. Redirects model's `fetch()` request to its attributes and returns the combined abortable promise. Does not enable any other I/O methods and can be used with `model.fetch()` only. @@ -186,4 +291,4 @@ const abortablePromise = createIOPromise( ( resolve, reject, onAbort ) =>{ reject( 'I/O Aborted' ); }); }); -``` \ No newline at end of file +``` diff --git a/endpoints/WEBSOCKET.md b/endpoints/WEBSOCKET.md new file mode 100644 index 00000000..7a86255b --- /dev/null +++ b/endpoints/WEBSOCKET.md @@ -0,0 +1,134 @@ +# Basic WebSocket endpoints + +`@type-r/endpoints` includes a small WebSocket endpoint intended for simple live collection updates. + +Use it when you need: + +- one WebSocket connection shared by several collections; +- simple `subscribe` / `unsubscribe` messages; +- `updated` and `removed` events applied to a collection; +- no reconnect, replay, heartbeat, cursor, or protocol versioning. + +Production realtime protocols can add reconnect, `since`, event replay, heartbeat, structured errors, and resync on top of this basic endpoint. + +## Basic collection endpoint + +```ts +import { auto, CollectionConstructor, define, Record } from '@type-r/models' +import { websocketIO } from '@type-r/endpoints' + +@define +class User extends Record { + static Collection: CollectionConstructor + + static endpoint = websocketIO('ws://localhost:3000/live', { + subscribeMessage: () => ({ + type: 'subscribe', + channel: 'users' + }), + + unsubscribeMessage: () => ({ + type: 'unsubscribe', + channel: 'users' + }), + + match: message => message.channel === 'users' + }) + + @auto name: string +} + +const users = new User.Collection() + +await users.liveUpdates(true) +``` + +Supported update envelope: + +```json +{ + "channel": "users", + "type": "updated", + "payload": { + "id": "1", + "name": "Ann" + } +} +``` + +Supported remove envelope: + +```json +{ + "channel": "users", + "type": "removed", + "payload": "1" +} +``` + +Compact envelopes are supported too: + +```json +{ "updated": { "id": "1", "name": "Ann" } } +``` + +```json +{ "removed": "1" } +``` + +## REST + basic WebSocket + +`restfulWebsocketIO` combines REST CRUD with basic WebSocket live updates. + +```ts +import { restfulWebsocketIO } from '@type-r/endpoints' + +static endpoint = restfulWebsocketIO( + 'http://localhost:3000/api/users', + 'ws://localhost:3000/live', + { + subscribeMessage: () => ({ type: 'subscribe', channel: 'users' }), + unsubscribeMessage: () => ({ type: 'unsubscribe', channel: 'users' }), + match: message => message.channel === 'users' + } +) +``` + +`fetch({ liveUpdates: true })` subscribes first, then performs the REST list request. The basic endpoint resolves subscription as soon as the WebSocket is open and the subscribe message has been sent. + +```ts +const users = new User.Collection() + +await users.fetch({ liveUpdates: true }) +``` + +## Options + +```ts +interface WebSocketEndpointOptions { + WebSocket?: WebSocketConstructor + protocols?: string | string[] + match?: (message: any, collection?: any) => boolean + subscribeMessage?: object | ((collection?: any) => any) + unsubscribeMessage?: object | ((collection?: any) => any) +} +``` + +`match` is important when several collections share the same socket. Without it, every message is delivered to every subscription on that socket. + +The basic endpoint uses JSON messages only: outgoing subscribe/unsubscribe messages are encoded with `JSON.stringify()`, and incoming string messages are decoded with `JSON.parse()`. + +## Limitations + +The basic endpoint intentionally does not implement: + +- subscribe acknowledgements; +- reconnect and resubscribe; +- heartbeat; +- `since` cursors; +- event log replay; +- out-of-order detection; +- structured protocol errors; +- server shutdown handling. + +Use a custom endpoint when you need these features. diff --git a/endpoints/dist/index.js b/endpoints/dist/index.js index f558cc44..4c8f33bb 100644 --- a/endpoints/dist/index.js +++ b/endpoints/dist/index.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports,require("@type-r/models")):"function"==typeof define&&define.amd?define(["exports","@type-r/models"],e):e((t=t||self).restfulIO={},t.Nested)}(this,function(t,s){"use strict";var r=function(t,e){return(r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,e){t.__proto__=e}||function(t,e){for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r])})(t,e)};var u=function(){return(u=Object.assign||function(t){for(var e,r=1,n=arguments.length;rs[0]&&e[1]s[0]&&e[1]= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { IOEndpoint, IOPromise, createIOPromise } from '@type-r/models'\r\n\r\ntype Index = ( number | string )[];\r\n\r\nexport function memoryIO( init = [], delay = 50 ){\r\n return new MemoryEndpoint( init, delay );\r\n}\r\n\r\nexport class MemoryEndpoint implements IOEndpoint {\r\n resolve( value ){\r\n return createIOPromise( ( resolve, reject ) => {\r\n setTimeout( () => resolve( value ), this.delay );\r\n });\r\n }\r\n \r\n reject( value ){\r\n return createIOPromise( ( resolve, reject ) => {\r\n setTimeout( () => reject( value ), this.delay );\r\n });\r\n }\r\n\r\n constructor( init : object[], public delay : number ){\r\n for( let obj of init ){\r\n this.create( obj, {} );\r\n }\r\n }\r\n\r\n index : Index = [ 0 ];\r\n items = {};\r\n\r\n generateId( a_id ){\r\n // Update index counter...\r\n const id = Number( a_id );\r\n if( !isNaN( id ) ){\r\n this.index[ 0 ] = Math.max( this.index[ 0 ] as number, id );\r\n }\r\n\r\n // Return id...\r\n return a_id || String( ( this.index[ 0 ] as number ) ++ );\r\n }\r\n\r\n create( json, options ) {\r\n const id = json.id = this.generateId( json.id );\r\n this.index.push( id );\r\n this.items[ id ] = json;\r\n return this.resolve({ id });\r\n }\r\n\r\n update( id, json, options ) {\r\n this.items[ id ] = json;\r\n return this.resolve( {} );\r\n }\r\n\r\n read( id, options ){\r\n const existing = this.items[ id ];\r\n return existing ?\r\n this.resolve( existing ) : \r\n this.reject( \"Not found\" );\r\n }\r\n\r\n destroy( id, options ){\r\n const existing = this.items[ id ];\r\n if( existing ){\r\n delete this.items[ id ];\r\n this.index = this.index.filter( x => x !== id );\r\n return this.resolve( {} );\r\n }\r\n else{\r\n return this.reject( \"Not found\" );\r\n }\r\n }\r\n\r\n list( options? : object ) {\r\n return this.resolve( this.index.slice( 1 ).map( id => this.items[ id ]) );\r\n }\r\n\r\n subscribe( events ) : any {}\r\n unsubscribe( events) : any {}\r\n}","import { IOEndpoint, IOOptions, Model, Collection, log, isProduction, Transactional } from '@type-r/models'\r\nimport { memoryIO, MemoryEndpoint } from './memory'\r\n\r\nexport type UrlTemplate = ( options : any, model? : any ) => string\r\n\r\nexport function create( url : string | UrlTemplate, fetchOptions? : Partial ){\r\n return new RestfulEndpoint( url, fetchOptions );\r\n}\r\n\r\nexport { create as restfulIO }\r\n\r\nexport type HttpMethod = 'GET' | 'POST' | 'UPDATE' | 'DELETE' | 'PUT'\r\n\r\nexport interface RestfulIOOptions extends IOOptions {\r\n params? : object,\r\n options? : RequestInit\r\n}\r\n\r\nexport type RestfulFetchOptions = /* subset of RequestInit */{\r\n cache?: RequestCache;\r\n credentials?: RequestCredentials;\r\n mode?: RequestMode;\r\n redirect?: RequestRedirect;\r\n referrerPolicy?: ReferrerPolicy;\r\n mockData? : any\r\n simulateDelay? : number \r\n}\r\n\r\nexport class RestfulEndpoint implements IOEndpoint {\r\n constructor( public url : string | UrlTemplate, { mockData, simulateDelay = 1000, ...fetchOptions } : RestfulFetchOptions = {}) {\r\n this.fetchOptions = fetchOptions\r\n this.memoryIO = mockData && !isProduction ? memoryIO( mockData, simulateDelay ) : null;\r\n\r\n if( mockData && isProduction ){\r\n log( 'error', 'Type-R:RestfulIO', `Mock data is used in production for ${url}`);\r\n }\r\n }\r\n\r\n fetchOptions : RestfulFetchOptions\r\n memoryIO : MemoryEndpoint\r\n\r\n public static defaultFetchOptions : RestfulFetchOptions = {\r\n cache: \"no-cache\",\r\n credentials: \"same-origin\",\r\n mode: \"cors\",\r\n redirect: \"error\",\r\n }\r\n\r\n create( json, options : RestfulIOOptions, model ) {\r\n const url = this.collectionUrl( model, options );\r\n return this.memoryIO ?\r\n this.simulateIO( 'create', 'POST', url, arguments ) :\r\n this.request( 'POST', url, options, json );\r\n }\r\n\r\n update( id, json, options : RestfulIOOptions, model ) {\r\n const url = this.objectUrl( model, id, options )\r\n return this.memoryIO ?\r\n this.simulateIO( 'update', 'PUT', url, arguments ) :\r\n this.request( 'PUT', url, options, json );\r\n }\r\n\r\n read( id, options : IOOptions, model ){\r\n const url = this.objectUrl( model, id, options );\r\n return this.memoryIO ?\r\n this.simulateIO( 'read', 'GET', url, arguments ) :\r\n this.request( 'GET', url, options );\r\n }\r\n\r\n destroy( id, options : RestfulIOOptions, model ){\r\n const url = this.objectUrl( model, id, options );\r\n return this.memoryIO ?\r\n this.simulateIO( 'destroy', 'DELETE', url, arguments ) :\r\n this.request( 'DELETE', url, options );\r\n }\r\n\r\n list( options : RestfulIOOptions, collection ) {\r\n const url = this.collectionUrl( collection, options );\r\n return this.memoryIO ?\r\n this.simulateIO( 'list', 'GET', url, arguments ) :\r\n this.request( 'GET', url , options );\r\n }\r\n\r\n subscribe( events ) : any {}\r\n unsubscribe( events ) : any {}\r\n\r\n async simulateIO( method : string, httpMethod : string, url : string, args ){\r\n log( isProduction ? \"error\" : \"info\", 'Type-R:SimulatedIO', `${httpMethod} ${url}`);\r\n return this.memoryIO[ method ].apply( this.memoryIO, args );\r\n }\r\n\r\n protected objectUrl( model : Transactional, id : string, options : RestfulIOOptions = {} ){\r\n return UrlBuilder\r\n .from( this.url, model, options )\r\n .modelId( model )\r\n .params( options.params )\r\n .toString()\r\n }\r\n\r\n protected collectionUrl( collection : Transactional, options : RestfulIOOptions = {} ){\r\n return UrlBuilder\r\n .from( this.url, collection, options )\r\n .params( options.params )\r\n .toString()\r\n }\r\n\r\n protected buildRequestOptions( method : string, options? : RequestInit, body? ) : RequestInit {\r\n const mergedOptions : RequestInit = {\r\n ...RestfulEndpoint.defaultFetchOptions,\r\n ...this.fetchOptions,\r\n ...options\r\n };\r\n\r\n const {headers, ...rest} = mergedOptions,\r\n resultOptions : RequestInit = {\r\n method,\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n ...headers\r\n },\r\n ...rest\r\n };\r\n\r\n if( body ) {\r\n resultOptions.body = JSON.stringify( body );\r\n }\r\n return resultOptions;\r\n }\r\n\r\n protected request( method : HttpMethod, url : string, {options} : RestfulIOOptions, body? ) : Promise {\r\n return fetch( url, this.buildRequestOptions( method, options, body ) )\r\n .then( response => {\r\n if( response.ok ) {\r\n return response.json()\r\n } else {\r\n throw new Error( response.statusText )\r\n }\r\n } );\r\n }\r\n}\r\n\r\nexport class UrlBuilder {\r\n static from( url : string | UrlTemplate, object : Transactional, options : RestfulIOOptions = {} ){\r\n // Resolve URL template \r\n let rootUrl = typeof url === 'function' ?\r\n url( options, object instanceof Model ? object : null )\r\n : url;\r\n \r\n // Resolve relative URL\r\n if( rootUrl.indexOf( './' ) === 0 ){\r\n const owner = object.getOwner() as Model,\r\n ownerUrl = ( owner.getEndpoint() as any ).objectUrl( owner, options );\r\n \r\n rootUrl = removeTrailingSlash( ownerUrl ) + '/' + rootUrl.substr( 2 )\r\n }\r\n\r\n return new UrlBuilder( rootUrl );\r\n }\r\n\r\n constructor( private url : string ){}\r\n\r\n modelId( model : Transactional ){\r\n return model instanceof Model && !model.isNew()\r\n ? this.append( model.id )\r\n : this;\r\n }\r\n\r\n append( id : string ){\r\n return new UrlBuilder( removeTrailingSlash( this.url ) + '/' + id );\r\n }\r\n\r\n params( params : object ){\r\n var esc = encodeURIComponent;\r\n return params ?\r\n new UrlBuilder(\r\n this.url + '?' + Object.keys( params )\r\n .map( k => esc( k ) + '=' + esc( params[ k ] ) )\r\n .join( '&' )\r\n ):\r\n this;\r\n }\r\n\r\n toString(){\r\n return this.url;\r\n }\r\n}\r\n\r\nfunction removeTrailingSlash( url : string ) {\r\n const endsWithSlash = url.charAt( url.length - 1 ) === '/';\r\n return endsWithSlash ? url.substr( 0, url.length - 1 ) : url;\r\n}","import { define, isProduction, log, Model } from '@type-r/models';\r\nimport { HttpMethod, RestfulEndpoint, RestfulFetchOptions, RestfulIOOptions, UrlTemplate } from './restful';\r\n\r\n/**\r\n * Implement custom model.fetch() according to the given rules.\r\n * All other I/O methods are not supported, this is read-only model.\r\n * \r\n * @param method HTTP Method to use\r\n * @param url template function to generate the URL\r\n * @param options options coming from `model.fetch( options )`\r\n */\r\nexport function fetchModelIO( method : HttpMethod, url : string | UrlTemplate, options? : RestfulFetchOptions ){\r\n return new ModelFetchEndpoint( method, url, options );\r\n}\r\n\r\nfunction notSupported( method ){\r\n throw new ReferenceError( `Method ${method} is not supported. modelFetchIO supports only model.fetch().` );\r\n} \r\n\r\n@define class ModelFetchEndpoint extends RestfulEndpoint {\r\n constructor(\r\n public method : HttpMethod,\r\n public url : string | UrlTemplate,\r\n { mockData, ...options } : RestfulFetchOptions = {}\r\n ){\r\n super( '', mockData ? { mockData : [ mockData ], ...options } : options );\r\n }\r\n\r\n async list(){ notSupported( 'collection.fetch()') }\r\n async destroy(){ notSupported( 'model.destroy()') }\r\n async create(){ notSupported( 'model.save()') }\r\n async update(){ notSupported( 'model.save()') }\r\n\r\n async read( id, options : RestfulIOOptions, model : Model ){\r\n const url = this.collectionUrl( model, options );\r\n\r\n if( this.memoryIO ){\r\n log( isProduction ? \"error\" : \"info\", 'Type-R:SimulatedIO', `GET ${url}`);\r\n return ( await this.memoryIO.list( options ) )[ 0 ];\r\n }\r\n else{\r\n return this.request( this.method, url, options );\r\n }\r\n }\r\n}","import { IOEndpoint, Record } from '@type-r/models';\r\n\r\nconst parseOptions = { parse : true, strict : true };\r\n\r\nexport function proxyIO( record : typeof Record, options : ProxyIOOptions = {} ){\r\n return new ProxyEndpoint( record, options );\r\n}\r\n\r\nexport interface ProxyIOOptions {\r\n createAttrs? : string\r\n updateAttrs? : string\r\n}\r\n\r\nexport interface ProxyIOInternalOptions {\r\n createAttrs? : string[]\r\n updateAttrs? : string[]\r\n}\r\n\r\n\r\nexport class ProxyEndpoint implements IOEndpoint {\r\n Record : typeof Record\r\n get endpoint(){\r\n return ( this.Record.prototype as any )._endpoint;\r\n }\r\n\r\n options : ProxyIOInternalOptions = {}\r\n\r\n constructor( record : typeof Record, options : ProxyIOOptions = {} ){\r\n this.Record = record;\r\n\r\n if( options.createAttrs ){\r\n this.options.createAttrs = options.createAttrs.split( /\\s+/ );\r\n }\r\n\r\n if( options.updateAttrs ){\r\n this.options.updateAttrs = options.updateAttrs.split( /\\s+/ );\r\n }\r\n\r\n // Create proxy methods...\r\n const source = Object.getPrototypeOf( this.endpoint );\r\n\r\n Object.keys( source ).forEach( key => {\r\n if( !this[ key ] && typeof source[ key ] === 'function' ){\r\n this[ key ] = function(){\r\n return source[ key ].apply( this.endpoint, arguments );\r\n }\r\n }\r\n });\r\n }\r\n\r\n async subscribe( events, target ){\r\n return this.endpoint.subscribe( events, target );\r\n }\r\n\r\n unsubscribe( events, target ){\r\n this.endpoint.unsubscribe( events, target );\r\n }\r\n\r\n async list( options ){\r\n const coll = new this.Record.Collection();\r\n await coll.fetch( options );\r\n return coll.toJSON();\r\n }\r\n\r\n async update( id, json, options ){\r\n json.id = id;\r\n const doc : any = this.Record.from( json, parseOptions );\r\n await doc.save( options );\r\n const res = { _cas : doc._cas };\r\n\r\n fillAttrs( res, doc, this.options.updateAttrs );\r\n \r\n return res;\r\n }\r\n\r\n async create( json, options ){\r\n const doc : any = this.Record.from( json, parseOptions );\r\n await doc.save( options );\r\n const res = { id : doc.id, _cas : doc._cas, _type : doc._type };\r\n \r\n fillAttrs( res, doc, this.options.createAttrs );\r\n \r\n return res;\r\n }\r\n\r\n async read( id, options : object ){\r\n const doc = new this.Record({ id });\r\n await doc.fetch( options );\r\n return doc.toJSON();\r\n }\r\n\r\n async destroy( id : string, options : object ){\r\n return this.endpoint.destroy( id, options )\r\n }\r\n}\r\n\r\nfunction fillAttrs( res : object, doc : Record, attrs : string[] ){\r\n if( attrs ){\r\n const json = doc.toJSON();\r\n for( let key of attrs ){\r\n res[ key ] = json[ key ];\r\n }\r\n }\r\n}","import { IOEndpoint, IOOptions, IOPromise, createIOPromise } from '@type-r/models'\r\n\r\nexport function localStorageIO( key : string ){\r\n return new LocalStorageEndpoint( key );\r\n}\r\n\r\nexport class LocalStorageEndpoint implements IOEndpoint {\r\n constructor( public key : string ){\r\n }\r\n\r\n resolve( value ){\r\n return createIOPromise( ( resolve, reject ) => {\r\n setTimeout( () =>{\r\n resolve( value )\r\n }, 0 );\r\n });\r\n }\r\n \r\n reject( value ){\r\n return createIOPromise( ( resolve, reject ) => {\r\n setTimeout( () => reject( value ), 0 );\r\n });\r\n }\r\n\r\n create( json, options : IOOptions ) {\r\n const { index } = this;\r\n index.push( json.id = String( ( index[ 0 ] as number )++ ) );\r\n this.index = index;\r\n this.set( json );\r\n return this.resolve({ id : json.id });\r\n }\r\n\r\n set( json ){\r\n localStorage.setItem( this.key + '#' + json.id, JSON.stringify( json ) );\r\n }\r\n\r\n get( id ){\r\n return JSON.parse( localStorage.getItem( this.key + '#' + id ) );\r\n }\r\n\r\n update( id, json, options : IOOptions ) {\r\n json.id = id;\r\n this.set( json );\r\n return this.resolve( {} );\r\n }\r\n\r\n read( id, options : IOOptions ){\r\n const existing = this.get( id );\r\n return existing ?\r\n this.resolve( existing ) : \r\n this.reject( \"Not found\" );\r\n }\r\n\r\n destroy( id, options : IOOptions ){\r\n const existing = this.get( id );\r\n if( existing ){\r\n localStorage.removeItem( this.key + '#' + id );\r\n this.index = this.index.filter( x => x !== id );\r\n return this.resolve( {} );\r\n }\r\n else{\r\n return this.reject( \"Not found\" );\r\n }\r\n }\r\n\r\n get index() : ( string | number )[]{\r\n return JSON.parse( localStorage.getItem( this.key ) ) || [ 0 ];\r\n }\r\n\r\n set index( x ){\r\n localStorage.setItem( this.key, JSON.stringify( x ) );\r\n }\r\n\r\n list( options? : IOOptions ) {\r\n const { index } = this; \r\n return this.resolve( this.index.slice( 1 ).map( id => this.get( id ) ) );\r\n }\r\n\r\n subscribe( events ) : any {}\r\n unsubscribe( events) : any {}\r\n}","import { IOEndpoint, IOOptions, IOPromise } from '@type-r/models'\r\n\r\nexport function attributesIO(){\r\n return new AttributesEndpoint();\r\n}\r\n\r\nexport class AttributesEndpoint implements IOEndpoint {\r\n create( json, options : IOOptions ) : IOPromise {\r\n throw new Error( 'Method is not supported.' ); \r\n }\r\n\r\n update( id, json, options : IOOptions ) : IOPromise {\r\n throw new Error( 'Method is not supported.' ); \r\n }\r\n\r\n read( id, options : IOOptions, record ) : IOPromise {\r\n const names = record.keys().filter( name => record[ name ] && record[ name ].fetch ),\r\n promises = names.map( name => record[ name ].fetch( options ) ),\r\n promise : IOPromise = Promise.all( promises ).then( () => {} );\r\n\r\n promise.abort = function(){\r\n promises.forEach( x => x.abort && x.abort() );\r\n }\r\n\r\n return promise;\r\n }\r\n\r\n destroy( id, options : IOOptions ) : IOPromise {\r\n throw new Error( 'Method is not supported.' ); \r\n }\r\n\r\n list( options? : IOOptions ) : IOPromise {\r\n throw new Error( 'Method is not supported.' );\r\n }\r\n\r\n subscribe( events ) : any {}\r\n unsubscribe( events) : any {}\r\n}\r\n\r\ndeclare var Promise;"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__assign","assign","t","s","i","n","arguments","length","prototype","call","apply","this","__rest","e","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","rejected","result","done","adopt","then","__generator","body","f","y","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","v","op","TypeError","pop","push","memoryIO","init","delay","MemoryEndpoint","createIOPromise","setTimeout","_this","a_id","id","Number","isNaN","index","Math","max","String","json","options","generateId","items","existing","filter","x","slice","map","events","init_1","_i","obj","create","url","fetchOptions","RestfulEndpoint","model","collectionUrl","simulateIO","request","objectUrl","collection","method","httpMethod","args","log","isProduction","UrlBuilder","from","modelId","params","toString","mergedOptions","defaultFetchOptions","headers","rest","resultOptions","Content-Type","JSON","stringify","_a","fetch","buildRequestOptions","response","ok","Error","statusText","cache","credentials","mode","redirect","mockData","_b","simulateDelay","object","rootUrl","Model","owner","getOwner","removeTrailingSlash","getEndpoint","substr","isNew","append","esc","encodeURIComponent","keys","k","join","charAt","notSupported","ReferenceError","__","ModelFetchEndpoint","list","decorators","target","key","desc","c","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","define","constructor","_super","parseOptions","parse","strict","ProxyEndpoint","Record","_endpoint","endpoint","subscribe","unsubscribe","coll","Collection","toJSON","doc","save","fillAttrs","res","_cas","updateAttrs","_type","createAttrs","destroy","record","split","source","getPrototypeOf","forEach","attrs","attrs_1","LocalStorageEndpoint","set","localStorage","setItem","getItem","get","removeItem","AttributesEndpoint","promises","name","promise","all","abort"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../../node_modules/tslib/tslib.es6.js","../src/memory.ts","../src/websocket.ts","../src/restful.ts","../src/fetchModel.ts","../src/proxy.ts","../src/localStorage.ts","../src/attributes.ts"],"sourcesContent":["/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","import { IOEndpoint, IOPromise, createIOPromise } from '@type-r/models'\n\ntype Index = ( number | string )[];\n\nexport function memoryIO( init = [], delay = 50 ){\n return new MemoryEndpoint( init, delay );\n}\n\nexport class MemoryEndpoint implements IOEndpoint {\n resolve( value ){\n return createIOPromise( ( resolve, reject ) => {\n setTimeout( () => resolve( value ), this.delay );\n });\n }\n \n reject( value ){\n return createIOPromise( ( resolve, reject ) => {\n setTimeout( () => reject( value ), this.delay );\n });\n }\n\n constructor( init : object[], public delay : number ){\n for( let obj of init ){\n this.create( obj, {} );\n }\n }\n\n index : Index = [ 0 ];\n items = {};\n\n generateId( a_id ){\n // Update index counter...\n const id = Number( a_id );\n if( !isNaN( id ) ){\n this.index[ 0 ] = Math.max( this.index[ 0 ] as number, id );\n }\n\n // Return id...\n return a_id || String( ( this.index[ 0 ] as number ) ++ );\n }\n\n create( json, options ) {\n const id = json.id = this.generateId( json.id );\n this.index.push( id );\n this.items[ id ] = json;\n return this.resolve({ id });\n }\n\n update( id, json, options ) {\n this.items[ id ] = json;\n return this.resolve( {} );\n }\n\n read( id, options ){\n const existing = this.items[ id ];\n return existing ?\n this.resolve( existing ) : \n this.reject( \"Not found\" );\n }\n\n destroy( id, options ){\n const existing = this.items[ id ];\n if( existing ){\n delete this.items[ id ];\n this.index = this.index.filter( x => x !== id );\n return this.resolve( {} );\n }\n else{\n return this.reject( \"Not found\" );\n }\n }\n\n list( options? : object ) {\n return this.resolve( this.index.slice( 1 ).map( id => this.items[ id ]) );\n }\n\n subscribe( events ) : any {}\n unsubscribe( events) : any {}\n}","import { IOEndpoint, IOOptions, IOPromise, createIOPromise } from '@type-r/models'\n\nexport function websocketIO( url : string, options : WebSocketEndpointOptions = {} ){\n return new WebSocketEndpoint( url, options );\n}\n\nexport type WebSocketMessageType =\n 'updated' | 'update' | 'created' | 'create' | 'upsert' |\n 'removed' | 'remove' | 'deleted' | 'delete' | 'destroyed' | 'destroy'\n\nexport interface WebSocketEndpointOptions {\n WebSocket? : WebSocketConstructor\n protocols? : string | string[]\n match? : ( message : any, collection? : any ) => boolean\n subscribeMessage? : object | ( ( collection? : any ) => any )\n unsubscribeMessage? : object | ( ( collection? : any ) => any )\n}\n\nexport interface WebSocketConstructor {\n new ( url : string, protocols? : string | string[] ) : WebSocketLike\n}\n\nexport interface WebSocketLike {\n onopen : ( ( event? : any ) => void ) | null\n onmessage : ( ( event : MessageEvent ) => void ) | null\n onerror : ( ( event? : any ) => void ) | null\n onclose : ( ( event? : any ) => void ) | null\n readyState? : number\n send( data : string ) : void\n close() : void\n}\n\ninterface Subscription {\n endpoint : WebSocketEndpoint\n events : any\n collection : any\n resolve : ( value? : any ) => void\n reject : ( error? : any ) => void\n opened : boolean\n}\n\nexport class WebSocketEndpoint implements IOEndpoint {\n private WebSocket : WebSocketConstructor\n private connection : SharedWebSocketConnection\n\n constructor( public url : string, public options : WebSocketEndpointOptions = {} ){\n this.WebSocket = options.WebSocket || getGlobalWebSocket();\n this.connection = SharedWebSocketConnection.get( url, this.WebSocket, options.protocols );\n }\n\n list( options : IOOptions, collection? ) : IOPromise {\n return notSupported( 'list' );\n }\n\n create( json : any, options : IOOptions, record? ) : IOPromise {\n return notSupported( 'create' );\n }\n\n update( id : string | number, json : any, options : IOOptions, record? ) : IOPromise {\n return notSupported( 'update' );\n }\n\n read( id : string | number, options : IOOptions, record? ) : IOPromise {\n return notSupported( 'read' );\n }\n\n destroy( id : string | number, options : IOOptions, record? ) : IOPromise {\n return notSupported( 'destroy' );\n }\n\n subscribe( events, collection? ) : IOPromise {\n return createIOPromise( ( resolve, reject, onAbort ) => {\n const subscription : Subscription = {\n endpoint : this,\n events,\n collection,\n resolve,\n reject,\n opened : false\n };\n\n this.connection.subscribe( subscription );\n\n onAbort( ( resolve, reject ) => {\n this.unsubscribe( events, collection );\n reject( new Error( 'I/O Aborted' ) );\n });\n });\n }\n\n unsubscribe( events, collection? ) : void {\n this.connection.unsubscribe( this, events, collection );\n }\n\n getMessage( message, collection ){\n return typeof message === 'function' ? message( collection ) : message;\n }\n\n sendMessage( socket : WebSocketLike, message ){\n if( message !== void 0 ) {\n socket.send( JSON.stringify( message ) );\n }\n }\n\n parseMessage( event : MessageEvent ){\n const { data } = event;\n return typeof data === 'string' ? JSON.parse( data ) : data;\n }\n\n acceptsMessage( message, collection? ){\n if( this.options.match && !this.options.match( message, collection ) ) return false;\n return true;\n }\n\n handleMessage( events, message, collection? ){\n if( !this.acceptsMessage( message, collection ) ) return;\n\n if( message.updated !== void 0 ) {\n events.updated && events.updated( message.updated );\n return;\n }\n\n if( message.removed !== void 0 ) {\n events.removed && events.removed( getRemovedId( message.removed ) );\n return;\n }\n\n const type = message.type || message.event || message.action,\n payload = message.payload !== void 0 ? message.payload : message.data;\n\n if( isUpdatedEvent( type ) ) {\n events.updated && events.updated( payload );\n }\n else if( isRemovedEvent( type ) ) {\n events.removed && events.removed( getRemovedId( payload ) );\n }\n }\n}\n\nclass SharedWebSocketConnection {\n private static connections : SharedWebSocketConnection[] = []\n\n static get( url : string, WebSocket : WebSocketConstructor, protocols? : string | string[] ){\n const existing = this.connections.filter( connection =>\n connection.url === url &&\n connection.WebSocket === WebSocket &&\n protocolsKey( connection.protocols ) === protocolsKey( protocols )\n )[ 0 ];\n\n if( existing ) return existing;\n\n const connection = new SharedWebSocketConnection( url, WebSocket, protocols );\n this.connections.push( connection );\n return connection;\n }\n\n private socket : WebSocketLike\n private subscriptions : Subscription[] = []\n private closing = false\n\n constructor(\n public url : string,\n public WebSocket : WebSocketConstructor,\n public protocols? : string | string[]\n ){}\n\n subscribe( subscription : Subscription ){\n this.subscriptions.push( subscription );\n this.connect();\n\n if( this.isOpen() ) {\n this.activate( subscription );\n }\n }\n\n unsubscribe( endpoint : WebSocketEndpoint, events, collection? ){\n const subscription = this.subscriptions.filter( x =>\n x.endpoint === endpoint && x.events === events && x.collection === collection\n )[ 0 ];\n\n if( subscription ) {\n if( subscription.opened && this.isOpen() ) {\n endpoint.sendMessage( this.socket, endpoint.getMessage( endpoint.options.unsubscribeMessage, collection ) );\n }\n else {\n subscription.reject( new Error( 'WebSocket connection closed before subscription was established.' ) );\n }\n\n this.remove( subscription );\n this.closeIfUnused();\n }\n }\n\n private connect(){\n if( this.socket ) return;\n\n this.closing = false;\n const socket = this.socket = new this.WebSocket( this.url, this.protocols );\n\n socket.onopen = () => {\n this.subscriptions.slice().forEach( subscription => this.activate( subscription ) );\n };\n\n socket.onmessage = event => {\n const parsed = new EndpointMessageCache( event );\n\n this.subscriptions.slice().forEach( subscription =>\n subscription.endpoint.handleMessage(\n subscription.events,\n parsed.get( subscription.endpoint ),\n subscription.collection\n )\n );\n };\n\n socket.onerror = event => {\n this.subscriptions.slice().forEach( subscription => {\n if( !subscription.opened ) {\n subscription.reject( getWebSocketError( event ) );\n this.remove( subscription );\n }\n });\n\n this.closeIfUnused();\n };\n\n socket.onclose = () => {\n const subscriptions = this.subscriptions.slice();\n\n subscriptions.forEach( subscription => {\n if( !subscription.opened ) {\n subscription.reject( new Error( 'WebSocket connection closed before subscription was established.' ) );\n }\n\n this.remove( subscription );\n });\n\n this.cleanupSocket();\n this.unregister();\n };\n }\n\n private activate( subscription : Subscription ){\n if( this.subscriptions.indexOf( subscription ) < 0 || subscription.opened ) return;\n\n subscription.opened = true;\n subscription.endpoint.sendMessage(\n this.socket,\n subscription.endpoint.getMessage( subscription.endpoint.options.subscribeMessage, subscription.collection )\n );\n subscription.resolve( subscription );\n }\n\n private remove( subscription : Subscription ){\n this.subscriptions = this.subscriptions.filter( x => x !== subscription );\n }\n\n private closeIfUnused(){\n if( this.socket && !this.subscriptions.length ) {\n this.closing = true;\n this.socket.close();\n this.cleanupSocket();\n this.unregister();\n }\n }\n\n private cleanupSocket(){\n if( this.socket ) {\n this.socket.onopen = null;\n this.socket.onmessage = null;\n this.socket.onerror = null;\n this.socket.onclose = null;\n this.socket = null;\n }\n }\n\n private isOpen(){\n return this.socket && ( this.socket.readyState === void 0 || this.socket.readyState === 1 );\n }\n\n private unregister(){\n const constructor = this.constructor as typeof SharedWebSocketConnection;\n constructor.connections = constructor.connections.filter( connection => connection !== this );\n }\n}\n\nclass EndpointMessageCache {\n private cache : { endpoint : WebSocketEndpoint, message : any }[] = []\n\n constructor( private event : MessageEvent ){}\n\n get( endpoint : WebSocketEndpoint ){\n const entry = this.cache.filter( x => x.endpoint === endpoint )[ 0 ];\n if( entry ) return entry.message;\n\n const message = endpoint.parseMessage( this.event );\n this.cache.push({ endpoint, message });\n return message;\n }\n}\n\nfunction isUpdatedEvent( type : WebSocketMessageType ){\n return [ 'updated', 'update', 'created', 'create', 'upsert' ].indexOf( type ) >= 0;\n}\n\nfunction isRemovedEvent( type : WebSocketMessageType ){\n return [ 'removed', 'remove', 'deleted', 'delete', 'destroyed', 'destroy' ].indexOf( type ) >= 0;\n}\n\nfunction getRemovedId( payload ){\n return payload && typeof payload === 'object' && payload.id !== void 0 ? payload.id : payload;\n}\n\nfunction notSupported( method : string ) : IOPromise {\n return createIOPromise( ( resolve, reject ) => {\n reject( new Error( `WebSocketEndpoint does not support ${method}().` ) );\n });\n}\n\nfunction getWebSocketError( event ){\n return event instanceof Error ? event : new Error( 'WebSocket connection failed.' );\n}\n\nfunction getGlobalWebSocket() : WebSocketConstructor {\n if( typeof WebSocket !== 'undefined' ) return WebSocket as any;\n\n throw new Error( 'WebSocket constructor is not available. Pass it in WebSocketEndpointOptions.WebSocket.' );\n}\n\nfunction protocolsKey( protocols : string | string[] ){\n return Array.isArray( protocols ) ? protocols.join( '\\n' ) : protocols || '';\n}\n","import { IOEndpoint, IOOptions, Model, Collection, log, isProduction, Transactional } from '@type-r/models'\nimport { memoryIO, MemoryEndpoint } from './memory'\nimport { WebSocketEndpoint, WebSocketEndpointOptions } from './websocket'\n\nexport type UrlTemplate = ( options : any, model? : any ) => string\n\nexport function create( url : string | UrlTemplate, fetchOptions? : Partial ){\n return new RestfulEndpoint( url, fetchOptions );\n}\n\nexport { create as restfulIO }\n\nexport function restfulWebsocketIO(\n url : string | UrlTemplate,\n websocketUrl : string,\n options : RestfulWebSocketEndpointOptions = {}\n){\n return new RestfulWebSocketEndpoint( url, websocketUrl, options );\n}\n\nexport type HttpMethod = 'GET' | 'POST' | 'UPDATE' | 'DELETE' | 'PUT'\n\nexport interface RestfulIOOptions extends IOOptions {\n params? : object,\n options? : RequestInit\n idempotencyKey? : string\n expectedVersion? : string | number\n}\n\nexport type RestfulFetchOptions = /* subset of RequestInit */{\n cache?: RequestCache;\n credentials?: RequestCredentials;\n mode?: RequestMode;\n redirect?: RequestRedirect;\n referrerPolicy?: ReferrerPolicy;\n mockData? : any\n simulateDelay? : number \n}\n\nexport type RestfulWebSocketEndpointOptions = Partial & WebSocketEndpointOptions\n\nexport class RestfulEndpoint implements IOEndpoint {\n constructor( public url : string | UrlTemplate, { mockData, simulateDelay = 1000, ...fetchOptions } : RestfulFetchOptions = {}) {\n this.fetchOptions = fetchOptions\n this.memoryIO = mockData && !isProduction ? memoryIO( mockData, simulateDelay ) : null;\n\n if( mockData && isProduction ){\n log( 'error', 'Type-R:RestfulIO', `Mock data is used in production for ${url}`);\n }\n }\n\n fetchOptions : RestfulFetchOptions\n memoryIO : MemoryEndpoint\n\n public static defaultFetchOptions : RestfulFetchOptions = {\n cache: \"no-cache\",\n credentials: \"same-origin\",\n mode: \"cors\",\n redirect: \"error\",\n }\n\n create( json, options : RestfulIOOptions, model ) {\n const url = this.collectionUrl( model, options );\n return this.memoryIO ?\n this.simulateIO( 'create', 'POST', url, arguments ) :\n this.request( 'POST', url, options, json );\n }\n\n update( id, json, options : RestfulIOOptions, model ) {\n const url = this.objectUrl( model, id, options )\n return this.memoryIO ?\n this.simulateIO( 'update', 'PUT', url, arguments ) :\n this.request( 'PUT', url, options, json );\n }\n\n read( id, options : IOOptions, model ){\n const url = this.objectUrl( model, id, options );\n return this.memoryIO ?\n this.simulateIO( 'read', 'GET', url, arguments ) :\n this.request( 'GET', url, options );\n }\n\n destroy( id, options : RestfulIOOptions, model ){\n const url = this.objectUrl( model, id, options );\n return this.memoryIO ?\n this.simulateIO( 'destroy', 'DELETE', url, arguments ) :\n this.request( 'DELETE', url, options );\n }\n\n list( options : RestfulIOOptions, collection ) {\n const url = this.collectionUrl( collection, options );\n return this.memoryIO ?\n this.simulateIO( 'list', 'GET', url, arguments ) :\n this.request( 'GET', url , options );\n }\n\n subscribe( events ) : any {}\n unsubscribe( events ) : any {}\n\n async simulateIO( method : string, httpMethod : string, url : string, args ){\n log( isProduction ? \"error\" : \"info\", 'Type-R:SimulatedIO', `${httpMethod} ${url}`);\n return this.memoryIO[ method ].apply( this.memoryIO, args );\n }\n\n protected objectUrl( model : Transactional, id : string, options : RestfulIOOptions = {} ){\n return UrlBuilder\n .from( this.url, model, options )\n .modelId( model )\n .params( options.params )\n .toString()\n }\n\n protected collectionUrl( collection : Transactional, options : RestfulIOOptions = {} ){\n return UrlBuilder\n .from( this.url, collection, options )\n .params( options.params )\n .toString()\n }\n\n protected buildRequestOptions( method : string, options? : RequestInit, body? ) : RequestInit {\n const mergedOptions : RequestInit = {\n ...RestfulEndpoint.defaultFetchOptions,\n ...this.fetchOptions,\n ...options\n };\n\n const {headers, ...rest} = mergedOptions,\n resultOptions : RequestInit = {\n method,\n headers: {\n 'Content-Type': 'application/json',\n ...headers\n },\n ...rest\n };\n\n if( body ) {\n resultOptions.body = JSON.stringify( body );\n }\n return resultOptions;\n }\n\n protected request( method : HttpMethod, url : string, ioOptions : RestfulIOOptions, body? ) : Promise {\n const { options, idempotencyKey, expectedVersion } = ioOptions,\n headers : HeadersInit = {\n ...( options && options.headers as object )\n };\n\n if( idempotencyKey !== void 0 ) {\n headers[ 'Idempotency-Key' ] = idempotencyKey;\n }\n\n if( expectedVersion !== void 0 ) {\n headers[ 'If-Match' ] = String( expectedVersion );\n }\n\n return fetch( url, this.buildRequestOptions( method, { ...options, headers }, body ) )\n .then( response => response.text()\n .then( text => {\n if( response.ok ) {\n return text ? JSON.parse( text ) : null\n }\n\n throw new Error( getErrorMessage( response, text ) );\n } )\n );\n }\n}\n\nexport class RestfulWebSocketEndpoint implements IOEndpoint {\n restful : RestfulEndpoint\n websocket : WebSocketEndpoint\n\n constructor(\n url : string | UrlTemplate,\n websocketUrl : string,\n public options : RestfulWebSocketEndpointOptions = {}\n ){\n this.restful = new RestfulEndpoint( url, options );\n this.websocket = new WebSocketEndpoint( websocketUrl, options );\n }\n\n create( json, options : RestfulIOOptions, model ) {\n return this.restful.create( json, options, model );\n }\n\n update( id, json, options : RestfulIOOptions, model ) {\n return this.restful.update( id, json, options, model );\n }\n\n read( id, options : IOOptions, model ){\n return this.restful.read( id, options, model );\n }\n\n destroy( id, options : RestfulIOOptions, model ){\n return this.restful.destroy( id, options, model );\n }\n\n list( options : RestfulIOOptions, collection ) {\n return this.restful.list( options, collection );\n }\n\n subscribe( events, collection? ) {\n return this.websocket.subscribe( events, collection );\n }\n\n unsubscribe( events, collection? ) {\n return this.websocket.unsubscribe( events, collection );\n }\n\n}\n\nfunction getErrorMessage( response : Response, text : string ) {\n const defaultMessage = response.statusText || `HTTP ${response.status}`;\n\n if( text ) {\n try {\n const data = JSON.parse( text );\n return data && ( data.message || data.error || data.detail ) || defaultMessage;\n }\n catch( e ) {\n return text;\n }\n }\n\n return defaultMessage;\n}\n\nexport class UrlBuilder {\n static from( url : string | UrlTemplate, object : Transactional, options : RestfulIOOptions = {} ){\n // Resolve URL template \n let rootUrl = typeof url === 'function' ?\n url( options, object instanceof Model ? object : null )\n : url;\n \n // Resolve relative URL\n if( rootUrl.indexOf( './' ) === 0 ){\n const owner = object.getOwner() as Model,\n ownerUrl = ( owner.getEndpoint() as any ).objectUrl( owner, options );\n \n rootUrl = removeTrailingSlash( ownerUrl ) + '/' + rootUrl.substr( 2 )\n }\n\n return new UrlBuilder( rootUrl );\n }\n\n constructor( private url : string ){}\n\n modelId( model : Transactional ){\n return model instanceof Model && !model.isNew()\n ? this.append( model.id )\n : this;\n }\n\n append( id : string ){\n return new UrlBuilder( removeTrailingSlash( this.url ) + '/' + id );\n }\n\n params( params : object ){\n var esc = encodeURIComponent;\n return params ?\n new UrlBuilder(\n this.url + '?' + Object.keys( params )\n .map( k => esc( k ) + '=' + esc( params[ k ] ) )\n .join( '&' )\n ):\n this;\n }\n\n toString(){\n return this.url;\n }\n}\n\nfunction removeTrailingSlash( url : string ) {\n const endsWithSlash = url.charAt( url.length - 1 ) === '/';\n return endsWithSlash ? url.substr( 0, url.length - 1 ) : url;\n}\n","import { define, isProduction, log, Model } from '@type-r/models';\nimport { HttpMethod, RestfulEndpoint, RestfulFetchOptions, RestfulIOOptions, UrlTemplate } from './restful';\n\n/**\n * Implement custom model.fetch() according to the given rules.\n * All other I/O methods are not supported, this is read-only model.\n * \n * @param method HTTP Method to use\n * @param url template function to generate the URL\n * @param options options coming from `model.fetch( options )`\n */\nexport function fetchModelIO( method : HttpMethod, url : string | UrlTemplate, options? : RestfulFetchOptions ){\n return new ModelFetchEndpoint( method, url, options );\n}\n\nfunction notSupported( method ){\n throw new ReferenceError( `Method ${method} is not supported. modelFetchIO supports only model.fetch().` );\n} \n\n@define class ModelFetchEndpoint extends RestfulEndpoint {\n constructor(\n public method : HttpMethod,\n public url : string | UrlTemplate,\n { mockData, ...options } : RestfulFetchOptions = {}\n ){\n super( '', mockData ? { mockData : [ mockData ], ...options } : options );\n }\n\n async list(){ notSupported( 'collection.fetch()') }\n async destroy(){ notSupported( 'model.destroy()') }\n async create(){ notSupported( 'model.save()') }\n async update(){ notSupported( 'model.save()') }\n\n async read( id, options : RestfulIOOptions, model : Model ){\n const url = this.collectionUrl( model, options );\n\n if( this.memoryIO ){\n log( isProduction ? \"error\" : \"info\", 'Type-R:SimulatedIO', `GET ${url}`);\n return ( await this.memoryIO.list( options ) )[ 0 ];\n }\n else{\n return this.request( this.method, url, options );\n }\n }\n}","import { IOEndpoint, Record } from '@type-r/models';\n\nconst parseOptions = { parse : true, strict : true };\n\nexport function proxyIO( record : typeof Record, options : ProxyIOOptions = {} ){\n return new ProxyEndpoint( record, options );\n}\n\nexport interface ProxyIOOptions {\n createAttrs? : string\n updateAttrs? : string\n}\n\nexport interface ProxyIOInternalOptions {\n createAttrs? : string[]\n updateAttrs? : string[]\n}\n\n\nexport class ProxyEndpoint implements IOEndpoint {\n Record : typeof Record\n get endpoint(){\n return ( this.Record.prototype as any )._endpoint;\n }\n\n options : ProxyIOInternalOptions = {}\n\n constructor( record : typeof Record, options : ProxyIOOptions = {} ){\n this.Record = record;\n\n if( options.createAttrs ){\n this.options.createAttrs = options.createAttrs.split( /\\s+/ );\n }\n\n if( options.updateAttrs ){\n this.options.updateAttrs = options.updateAttrs.split( /\\s+/ );\n }\n\n // Create proxy methods...\n const source = Object.getPrototypeOf( this.endpoint );\n\n Object.keys( source ).forEach( key => {\n if( !this[ key ] && typeof source[ key ] === 'function' ){\n this[ key ] = function(){\n return source[ key ].apply( this.endpoint, arguments );\n }\n }\n });\n }\n\n async subscribe( events, target ){\n return this.endpoint.subscribe( events, target );\n }\n\n unsubscribe( events, target ){\n this.endpoint.unsubscribe( events, target );\n }\n\n async list( options ){\n const coll = new this.Record.Collection();\n await coll.fetch( options );\n return coll.toJSON();\n }\n\n async update( id, json, options ){\n json.id = id;\n const doc : any = this.Record.from( json, parseOptions );\n await doc.save( options );\n const res = { _cas : doc._cas };\n\n fillAttrs( res, doc, this.options.updateAttrs );\n \n return res;\n }\n\n async create( json, options ){\n const doc : any = this.Record.from( json, parseOptions );\n await doc.save( options );\n const res = { id : doc.id, _cas : doc._cas, _type : doc._type };\n \n fillAttrs( res, doc, this.options.createAttrs );\n \n return res;\n }\n\n async read( id, options : object ){\n const doc = new this.Record({ id });\n await doc.fetch( options );\n return doc.toJSON();\n }\n\n async destroy( id : string, options : object ){\n return this.endpoint.destroy( id, options )\n }\n}\n\nfunction fillAttrs( res : object, doc : Record, attrs : string[] ){\n if( attrs ){\n const json = doc.toJSON();\n for( let key of attrs ){\n res[ key ] = json[ key ];\n }\n }\n}","import { IOEndpoint, IOOptions, IOPromise, createIOPromise } from '@type-r/models'\n\nexport function localStorageIO( key : string ){\n return new LocalStorageEndpoint( key );\n}\n\nexport class LocalStorageEndpoint implements IOEndpoint {\n constructor( public key : string ){\n }\n\n resolve( value ){\n return createIOPromise( ( resolve, reject ) => {\n setTimeout( () =>{\n resolve( value )\n }, 0 );\n });\n }\n \n reject( value ){\n return createIOPromise( ( resolve, reject ) => {\n setTimeout( () => reject( value ), 0 );\n });\n }\n\n create( json, options : IOOptions ) {\n const { index } = this;\n index.push( json.id = String( ( index[ 0 ] as number )++ ) );\n this.index = index;\n this.set( json );\n return this.resolve({ id : json.id });\n }\n\n set( json ){\n localStorage.setItem( this.key + '#' + json.id, JSON.stringify( json ) );\n }\n\n get( id ){\n return JSON.parse( localStorage.getItem( this.key + '#' + id ) );\n }\n\n update( id, json, options : IOOptions ) {\n json.id = id;\n this.set( json );\n return this.resolve( {} );\n }\n\n read( id, options : IOOptions ){\n const existing = this.get( id );\n return existing ?\n this.resolve( existing ) : \n this.reject( \"Not found\" );\n }\n\n destroy( id, options : IOOptions ){\n const existing = this.get( id );\n if( existing ){\n localStorage.removeItem( this.key + '#' + id );\n this.index = this.index.filter( x => x !== id );\n return this.resolve( {} );\n }\n else{\n return this.reject( \"Not found\" );\n }\n }\n\n get index() : ( string | number )[]{\n return JSON.parse( localStorage.getItem( this.key ) ) || [ 0 ];\n }\n\n set index( x ){\n localStorage.setItem( this.key, JSON.stringify( x ) );\n }\n\n list( options? : IOOptions ) {\n const { index } = this; \n return this.resolve( this.index.slice( 1 ).map( id => this.get( id ) ) );\n }\n\n subscribe( events ) : any {}\n unsubscribe( events) : any {}\n}","import { IOEndpoint, IOOptions, IOPromise } from '@type-r/models'\n\nexport function attributesIO(){\n return new AttributesEndpoint();\n}\n\nexport class AttributesEndpoint implements IOEndpoint {\n create( json, options : IOOptions ) : IOPromise {\n throw new Error( 'Method is not supported.' ); \n }\n\n update( id, json, options : IOOptions ) : IOPromise {\n throw new Error( 'Method is not supported.' ); \n }\n\n read( id, options : IOOptions, record ) : IOPromise {\n const names = record.keys().filter( name => record[ name ] && record[ name ].fetch ),\n promises = names.map( name => record[ name ].fetch( options ) ),\n promise : IOPromise = Promise.all( promises ).then( () => {} );\n\n promise.abort = function(){\n promises.forEach( x => x.abort && x.abort() );\n }\n\n return promise;\n }\n\n destroy( id, options : IOOptions ) : IOPromise {\n throw new Error( 'Method is not supported.' ); \n }\n\n list( options? : IOOptions ) : IOPromise {\n throw new Error( 'Method is not supported.' );\n }\n\n subscribe( events ) : any {}\n unsubscribe( events) : any {}\n}\n\ndeclare var Promise;"],"names":["extendStatics","d","b","Object","setPrototypeOf","__proto__","Array","p","hasOwnProperty","__assign","assign","t","s","i","n","arguments","length","prototype","call","apply","this","__rest","e","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__awaiter","thisArg","_arguments","P","generator","Promise","resolve","reject","fulfilled","value","step","next","rejected","result","done","adopt","then","__generator","body","f","y","g","_","label","sent","trys","ops","verb","throw","return","Symbol","iterator","v","op","TypeError","pop","push","memoryIO","init","delay","MemoryEndpoint","createIOPromise","setTimeout","_this","a_id","id","Number","isNaN","index","Math","max","String","json","options","generateId","items","existing","filter","x","slice","map","events","init_1","_i","obj","create","WebSocketEndpoint","collection","notSupported","record","onAbort","subscription","endpoint","opened","connection","subscribe","unsubscribe","Error","message","socket","send","JSON","stringify","event","updated","type","isUpdatedEvent","removed","payload","url","WebSocket","getGlobalWebSocket","SharedWebSocketConnection","get","protocols","connect","subscriptions","forEach","constructor","connections","protocolsKey","fetchOptions","RestfulEndpoint","model","collectionUrl","simulateIO","request","objectUrl","method","httpMethod","args","log","isProduction","UrlBuilder","from","modelId","params","toString","mergedOptions","defaultFetchOptions","headers","rest","resultOptions","Content-Type","ioOptions","idempotencyKey","expectedVersion","fetch","buildRequestOptions","response","text","ok","parse","defaultMessage","statusText","status","data","error","detail","getErrorMessage","cache","credentials","mode","redirect","_a","mockData","_b","simulateDelay","RestfulWebSocketEndpoint","restful","update","read","destroy","list","websocket","websocketUrl","object","rootUrl","Model","owner","getOwner","removeTrailingSlash","getEndpoint","substr","isNew","append","esc","encodeURIComponent","keys","k","join","charAt","ReferenceError","__","ModelFetchEndpoint","decorators","target","key","desc","c","r","getOwnPropertyDescriptor","Reflect","decorate","defineProperty","define","_super","parseOptions","strict","ProxyEndpoint","Record","_endpoint","coll","Collection","toJSON","doc","save","fillAttrs","res","_cas","updateAttrs","_type","createAttrs","split","source","getPrototypeOf","attrs","attrs_1","LocalStorageEndpoint","set","localStorage","setItem","getItem","removeItem","AttributesEndpoint","promises","name","promise","all","abort"],"mappings":"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"} \ No newline at end of file diff --git a/endpoints/lib/index.d.ts b/endpoints/lib/index.d.ts index 0b0d53f9..44dde5b2 100644 --- a/endpoints/lib/index.d.ts +++ b/endpoints/lib/index.d.ts @@ -4,3 +4,4 @@ export * from './memory'; export * from './proxy'; export * from './localStorage'; export * from './attributes'; +export * from './websocket'; diff --git a/endpoints/lib/index.js b/endpoints/lib/index.js index c6188525..ceec5922 100644 --- a/endpoints/lib/index.js +++ b/endpoints/lib/index.js @@ -4,4 +4,5 @@ export * from './memory'; export * from './proxy'; export * from './localStorage'; export * from './attributes'; +export * from './websocket'; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/endpoints/lib/index.js.map b/endpoints/lib/index.js.map index 5640ad51..e3f4ab06 100644 --- a/endpoints/lib/index.js.map +++ b/endpoints/lib/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,UAAU,CAAA;AACxB,cAAc,SAAS,CAAA;AACvB,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,aAAa,CAAA"} \ No newline at end of file diff --git a/endpoints/lib/restful.d.ts b/endpoints/lib/restful.d.ts index 2a1efc76..c72475d0 100644 --- a/endpoints/lib/restful.d.ts +++ b/endpoints/lib/restful.d.ts @@ -1,14 +1,18 @@ import { IOEndpoint, IOOptions, Transactional } from '@type-r/models'; import { MemoryEndpoint } from './memory'; -export declare type UrlTemplate = (options: any, model?: any) => string; +import { WebSocketEndpoint, WebSocketEndpointOptions } from './websocket'; +export type UrlTemplate = (options: any, model?: any) => string; export declare function create(url: string | UrlTemplate, fetchOptions?: Partial): RestfulEndpoint; export { create as restfulIO }; -export declare type HttpMethod = 'GET' | 'POST' | 'UPDATE' | 'DELETE' | 'PUT'; +export declare function restfulWebsocketIO(url: string | UrlTemplate, websocketUrl: string, options?: RestfulWebSocketEndpointOptions): RestfulWebSocketEndpoint; +export type HttpMethod = 'GET' | 'POST' | 'UPDATE' | 'DELETE' | 'PUT'; export interface RestfulIOOptions extends IOOptions { params?: object; options?: RequestInit; + idempotencyKey?: string; + expectedVersion?: string | number; } -export declare type RestfulFetchOptions = { +export type RestfulFetchOptions = { cache?: RequestCache; credentials?: RequestCredentials; mode?: RequestMode; @@ -17,6 +21,7 @@ export declare type RestfulFetchOptions = { mockData?: any; simulateDelay?: number; }; +export type RestfulWebSocketEndpointOptions = Partial & WebSocketEndpointOptions; export declare class RestfulEndpoint implements IOEndpoint { url: string | UrlTemplate; constructor(url: string | UrlTemplate, { mockData, simulateDelay, ...fetchOptions }?: RestfulFetchOptions); @@ -34,7 +39,20 @@ export declare class RestfulEndpoint implements IOEndpoint { protected objectUrl(model: Transactional, id: string, options?: RestfulIOOptions): string; protected collectionUrl(collection: Transactional, options?: RestfulIOOptions): string; protected buildRequestOptions(method: string, options?: RequestInit, body?: any): RequestInit; - protected request(method: HttpMethod, url: string, { options }: RestfulIOOptions, body?: any): Promise; + protected request(method: HttpMethod, url: string, ioOptions: RestfulIOOptions, body?: any): Promise; +} +export declare class RestfulWebSocketEndpoint implements IOEndpoint { + options: RestfulWebSocketEndpointOptions; + restful: RestfulEndpoint; + websocket: WebSocketEndpoint; + constructor(url: string | UrlTemplate, websocketUrl: string, options?: RestfulWebSocketEndpointOptions); + create(json: any, options: RestfulIOOptions, model: any): Promise; + update(id: any, json: any, options: RestfulIOOptions, model: any): Promise; + read(id: any, options: IOOptions, model: any): Promise; + destroy(id: any, options: RestfulIOOptions, model: any): Promise; + list(options: RestfulIOOptions, collection: any): Promise; + subscribe(events: any, collection?: any): import("@type-r/models").IOPromise; + unsubscribe(events: any, collection?: any): void; } export declare class UrlBuilder { private url; diff --git a/endpoints/lib/restful.js b/endpoints/lib/restful.js index ca62c8d8..f47861b5 100644 --- a/endpoints/lib/restful.js +++ b/endpoints/lib/restful.js @@ -1,10 +1,15 @@ import { __assign, __awaiter, __generator, __rest } from "tslib"; import { Model, log, isProduction } from '@type-r/models'; import { memoryIO } from './memory'; +import { WebSocketEndpoint } from './websocket'; export function create(url, fetchOptions) { return new RestfulEndpoint(url, fetchOptions); } export { create as restfulIO }; +export function restfulWebsocketIO(url, websocketUrl, options) { + if (options === void 0) { options = {}; } + return new RestfulWebSocketEndpoint(url, websocketUrl, options); +} var RestfulEndpoint = (function () { function RestfulEndpoint(url, _a) { if (_a === void 0) { _a = {}; } @@ -13,7 +18,7 @@ var RestfulEndpoint = (function () { this.fetchOptions = fetchOptions; this.memoryIO = mockData && !isProduction ? memoryIO(mockData, simulateDelay) : null; if (mockData && isProduction) { - log('error', 'Type-R:RestfulIO', "Mock data is used in production for " + url); + log('error', 'Type-R:RestfulIO', "Mock data is used in production for ".concat(url)); } } RestfulEndpoint.prototype.create = function (json, options, model) { @@ -51,7 +56,7 @@ var RestfulEndpoint = (function () { RestfulEndpoint.prototype.simulateIO = function (method, httpMethod, url, args) { return __awaiter(this, void 0, void 0, function () { return __generator(this, function (_a) { - log(isProduction ? "error" : "info", 'Type-R:SimulatedIO', httpMethod + " " + url); + log(isProduction ? "error" : "info", 'Type-R:SimulatedIO', "".concat(httpMethod, " ").concat(url)); return [2, this.memoryIO[method].apply(this.memoryIO, args)]; }); }); @@ -79,17 +84,22 @@ var RestfulEndpoint = (function () { } return resultOptions; }; - RestfulEndpoint.prototype.request = function (method, url, _a, body) { - var options = _a.options; - return fetch(url, this.buildRequestOptions(method, options, body)) - .then(function (response) { + RestfulEndpoint.prototype.request = function (method, url, ioOptions, body) { + var options = ioOptions.options, idempotencyKey = ioOptions.idempotencyKey, expectedVersion = ioOptions.expectedVersion, headers = __assign({}, (options && options.headers)); + if (idempotencyKey !== void 0) { + headers['Idempotency-Key'] = idempotencyKey; + } + if (expectedVersion !== void 0) { + headers['If-Match'] = String(expectedVersion); + } + return fetch(url, this.buildRequestOptions(method, __assign(__assign({}, options), { headers: headers }), body)) + .then(function (response) { return response.text() + .then(function (text) { if (response.ok) { - return response.json(); + return text ? JSON.parse(text) : null; } - else { - throw new Error(response.statusText); - } - }); + throw new Error(getErrorMessage(response, text)); + }); }); }; RestfulEndpoint.defaultFetchOptions = { cache: "no-cache", @@ -100,6 +110,50 @@ var RestfulEndpoint = (function () { return RestfulEndpoint; }()); export { RestfulEndpoint }; +var RestfulWebSocketEndpoint = (function () { + function RestfulWebSocketEndpoint(url, websocketUrl, options) { + if (options === void 0) { options = {}; } + this.options = options; + this.restful = new RestfulEndpoint(url, options); + this.websocket = new WebSocketEndpoint(websocketUrl, options); + } + RestfulWebSocketEndpoint.prototype.create = function (json, options, model) { + return this.restful.create(json, options, model); + }; + RestfulWebSocketEndpoint.prototype.update = function (id, json, options, model) { + return this.restful.update(id, json, options, model); + }; + RestfulWebSocketEndpoint.prototype.read = function (id, options, model) { + return this.restful.read(id, options, model); + }; + RestfulWebSocketEndpoint.prototype.destroy = function (id, options, model) { + return this.restful.destroy(id, options, model); + }; + RestfulWebSocketEndpoint.prototype.list = function (options, collection) { + return this.restful.list(options, collection); + }; + RestfulWebSocketEndpoint.prototype.subscribe = function (events, collection) { + return this.websocket.subscribe(events, collection); + }; + RestfulWebSocketEndpoint.prototype.unsubscribe = function (events, collection) { + return this.websocket.unsubscribe(events, collection); + }; + return RestfulWebSocketEndpoint; +}()); +export { RestfulWebSocketEndpoint }; +function getErrorMessage(response, text) { + var defaultMessage = response.statusText || "HTTP ".concat(response.status); + if (text) { + try { + var data = JSON.parse(text); + return data && (data.message || data.error || data.detail) || defaultMessage; + } + catch (e) { + return text; + } + } + return defaultMessage; +} var UrlBuilder = (function () { function UrlBuilder(url) { this.url = url; diff --git a/endpoints/lib/restful.js.map b/endpoints/lib/restful.js.map index 82d1c38d..ca634f94 100644 --- a/endpoints/lib/restful.js.map +++ b/endpoints/lib/restful.js.map @@ -1 +1 @@ -{"version":3,"file":"restful.js","sourceRoot":"","sources":["../src/restful.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"restful.js","sourceRoot":"","sources":["../src/restful.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/endpoints/lib/websocket.d.ts b/endpoints/lib/websocket.d.ts new file mode 100644 index 00000000..091a8da2 --- /dev/null +++ b/endpoints/lib/websocket.d.ts @@ -0,0 +1,41 @@ +import { IOEndpoint, IOOptions, IOPromise } from '@type-r/models'; +export declare function websocketIO(url: string, options?: WebSocketEndpointOptions): WebSocketEndpoint; +export type WebSocketMessageType = 'updated' | 'update' | 'created' | 'create' | 'upsert' | 'removed' | 'remove' | 'deleted' | 'delete' | 'destroyed' | 'destroy'; +export interface WebSocketEndpointOptions { + WebSocket?: WebSocketConstructor; + protocols?: string | string[]; + match?: (message: any, collection?: any) => boolean; + subscribeMessage?: object | ((collection?: any) => any); + unsubscribeMessage?: object | ((collection?: any) => any); +} +export interface WebSocketConstructor { + new (url: string, protocols?: string | string[]): WebSocketLike; +} +export interface WebSocketLike { + onopen: ((event?: any) => void) | null; + onmessage: ((event: MessageEvent) => void) | null; + onerror: ((event?: any) => void) | null; + onclose: ((event?: any) => void) | null; + readyState?: number; + send(data: string): void; + close(): void; +} +export declare class WebSocketEndpoint implements IOEndpoint { + url: string; + options: WebSocketEndpointOptions; + private WebSocket; + private connection; + constructor(url: string, options?: WebSocketEndpointOptions); + list(options: IOOptions, collection?: any): IOPromise; + create(json: any, options: IOOptions, record?: any): IOPromise; + update(id: string | number, json: any, options: IOOptions, record?: any): IOPromise; + read(id: string | number, options: IOOptions, record?: any): IOPromise; + destroy(id: string | number, options: IOOptions, record?: any): IOPromise; + subscribe(events: any, collection?: any): IOPromise; + unsubscribe(events: any, collection?: any): void; + getMessage(message: any, collection: any): any; + sendMessage(socket: WebSocketLike, message: any): void; + parseMessage(event: MessageEvent): any; + acceptsMessage(message: any, collection?: any): boolean; + handleMessage(events: any, message: any, collection?: any): void; +} diff --git a/endpoints/lib/websocket.js b/endpoints/lib/websocket.js new file mode 100644 index 00000000..273925bc --- /dev/null +++ b/endpoints/lib/websocket.js @@ -0,0 +1,245 @@ +import { createIOPromise } from '@type-r/models'; +export function websocketIO(url, options) { + if (options === void 0) { options = {}; } + return new WebSocketEndpoint(url, options); +} +var WebSocketEndpoint = (function () { + function WebSocketEndpoint(url, options) { + if (options === void 0) { options = {}; } + this.url = url; + this.options = options; + this.WebSocket = options.WebSocket || getGlobalWebSocket(); + this.connection = SharedWebSocketConnection.get(url, this.WebSocket, options.protocols); + } + WebSocketEndpoint.prototype.list = function (options, collection) { + return notSupported('list'); + }; + WebSocketEndpoint.prototype.create = function (json, options, record) { + return notSupported('create'); + }; + WebSocketEndpoint.prototype.update = function (id, json, options, record) { + return notSupported('update'); + }; + WebSocketEndpoint.prototype.read = function (id, options, record) { + return notSupported('read'); + }; + WebSocketEndpoint.prototype.destroy = function (id, options, record) { + return notSupported('destroy'); + }; + WebSocketEndpoint.prototype.subscribe = function (events, collection) { + var _this = this; + return createIOPromise(function (resolve, reject, onAbort) { + var subscription = { + endpoint: _this, + events: events, + collection: collection, + resolve: resolve, + reject: reject, + opened: false + }; + _this.connection.subscribe(subscription); + onAbort(function (resolve, reject) { + _this.unsubscribe(events, collection); + reject(new Error('I/O Aborted')); + }); + }); + }; + WebSocketEndpoint.prototype.unsubscribe = function (events, collection) { + this.connection.unsubscribe(this, events, collection); + }; + WebSocketEndpoint.prototype.getMessage = function (message, collection) { + return typeof message === 'function' ? message(collection) : message; + }; + WebSocketEndpoint.prototype.sendMessage = function (socket, message) { + if (message !== void 0) { + socket.send(JSON.stringify(message)); + } + }; + WebSocketEndpoint.prototype.parseMessage = function (event) { + var data = event.data; + return typeof data === 'string' ? JSON.parse(data) : data; + }; + WebSocketEndpoint.prototype.acceptsMessage = function (message, collection) { + if (this.options.match && !this.options.match(message, collection)) + return false; + return true; + }; + WebSocketEndpoint.prototype.handleMessage = function (events, message, collection) { + if (!this.acceptsMessage(message, collection)) + return; + if (message.updated !== void 0) { + events.updated && events.updated(message.updated); + return; + } + if (message.removed !== void 0) { + events.removed && events.removed(getRemovedId(message.removed)); + return; + } + var type = message.type || message.event || message.action, payload = message.payload !== void 0 ? message.payload : message.data; + if (isUpdatedEvent(type)) { + events.updated && events.updated(payload); + } + else if (isRemovedEvent(type)) { + events.removed && events.removed(getRemovedId(payload)); + } + }; + return WebSocketEndpoint; +}()); +export { WebSocketEndpoint }; +var SharedWebSocketConnection = (function () { + function SharedWebSocketConnection(url, WebSocket, protocols) { + this.url = url; + this.WebSocket = WebSocket; + this.protocols = protocols; + this.subscriptions = []; + this.closing = false; + } + SharedWebSocketConnection.get = function (url, WebSocket, protocols) { + var existing = this.connections.filter(function (connection) { + return connection.url === url && + connection.WebSocket === WebSocket && + protocolsKey(connection.protocols) === protocolsKey(protocols); + })[0]; + if (existing) + return existing; + var connection = new SharedWebSocketConnection(url, WebSocket, protocols); + this.connections.push(connection); + return connection; + }; + SharedWebSocketConnection.prototype.subscribe = function (subscription) { + this.subscriptions.push(subscription); + this.connect(); + if (this.isOpen()) { + this.activate(subscription); + } + }; + SharedWebSocketConnection.prototype.unsubscribe = function (endpoint, events, collection) { + var subscription = this.subscriptions.filter(function (x) { + return x.endpoint === endpoint && x.events === events && x.collection === collection; + })[0]; + if (subscription) { + if (subscription.opened && this.isOpen()) { + endpoint.sendMessage(this.socket, endpoint.getMessage(endpoint.options.unsubscribeMessage, collection)); + } + else { + subscription.reject(new Error('WebSocket connection closed before subscription was established.')); + } + this.remove(subscription); + this.closeIfUnused(); + } + }; + SharedWebSocketConnection.prototype.connect = function () { + var _this = this; + if (this.socket) + return; + this.closing = false; + var socket = this.socket = new this.WebSocket(this.url, this.protocols); + socket.onopen = function () { + _this.subscriptions.slice().forEach(function (subscription) { return _this.activate(subscription); }); + }; + socket.onmessage = function (event) { + var parsed = new EndpointMessageCache(event); + _this.subscriptions.slice().forEach(function (subscription) { + return subscription.endpoint.handleMessage(subscription.events, parsed.get(subscription.endpoint), subscription.collection); + }); + }; + socket.onerror = function (event) { + _this.subscriptions.slice().forEach(function (subscription) { + if (!subscription.opened) { + subscription.reject(getWebSocketError(event)); + _this.remove(subscription); + } + }); + _this.closeIfUnused(); + }; + socket.onclose = function () { + var subscriptions = _this.subscriptions.slice(); + subscriptions.forEach(function (subscription) { + if (!subscription.opened) { + subscription.reject(new Error('WebSocket connection closed before subscription was established.')); + } + _this.remove(subscription); + }); + _this.cleanupSocket(); + _this.unregister(); + }; + }; + SharedWebSocketConnection.prototype.activate = function (subscription) { + if (this.subscriptions.indexOf(subscription) < 0 || subscription.opened) + return; + subscription.opened = true; + subscription.endpoint.sendMessage(this.socket, subscription.endpoint.getMessage(subscription.endpoint.options.subscribeMessage, subscription.collection)); + subscription.resolve(subscription); + }; + SharedWebSocketConnection.prototype.remove = function (subscription) { + this.subscriptions = this.subscriptions.filter(function (x) { return x !== subscription; }); + }; + SharedWebSocketConnection.prototype.closeIfUnused = function () { + if (this.socket && !this.subscriptions.length) { + this.closing = true; + this.socket.close(); + this.cleanupSocket(); + this.unregister(); + } + }; + SharedWebSocketConnection.prototype.cleanupSocket = function () { + if (this.socket) { + this.socket.onopen = null; + this.socket.onmessage = null; + this.socket.onerror = null; + this.socket.onclose = null; + this.socket = null; + } + }; + SharedWebSocketConnection.prototype.isOpen = function () { + return this.socket && (this.socket.readyState === void 0 || this.socket.readyState === 1); + }; + SharedWebSocketConnection.prototype.unregister = function () { + var _this = this; + var constructor = this.constructor; + constructor.connections = constructor.connections.filter(function (connection) { return connection !== _this; }); + }; + SharedWebSocketConnection.connections = []; + return SharedWebSocketConnection; +}()); +var EndpointMessageCache = (function () { + function EndpointMessageCache(event) { + this.event = event; + this.cache = []; + } + EndpointMessageCache.prototype.get = function (endpoint) { + var entry = this.cache.filter(function (x) { return x.endpoint === endpoint; })[0]; + if (entry) + return entry.message; + var message = endpoint.parseMessage(this.event); + this.cache.push({ endpoint: endpoint, message: message }); + return message; + }; + return EndpointMessageCache; +}()); +function isUpdatedEvent(type) { + return ['updated', 'update', 'created', 'create', 'upsert'].indexOf(type) >= 0; +} +function isRemovedEvent(type) { + return ['removed', 'remove', 'deleted', 'delete', 'destroyed', 'destroy'].indexOf(type) >= 0; +} +function getRemovedId(payload) { + return payload && typeof payload === 'object' && payload.id !== void 0 ? payload.id : payload; +} +function notSupported(method) { + return createIOPromise(function (resolve, reject) { + reject(new Error("WebSocketEndpoint does not support ".concat(method, "()."))); + }); +} +function getWebSocketError(event) { + return event instanceof Error ? event : new Error('WebSocket connection failed.'); +} +function getGlobalWebSocket() { + if (typeof WebSocket !== 'undefined') + return WebSocket; + throw new Error('WebSocket constructor is not available. Pass it in WebSocketEndpointOptions.WebSocket.'); +} +function protocolsKey(protocols) { + return Array.isArray(protocols) ? protocols.join('\n') : protocols || ''; +} +//# sourceMappingURL=websocket.js.map \ No newline at end of file diff --git a/endpoints/lib/websocket.js.map b/endpoints/lib/websocket.js.map new file mode 100644 index 00000000..ffef1c03 --- /dev/null +++ b/endpoints/lib/websocket.js.map @@ -0,0 +1 @@ +{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/endpoints/src/index.ts b/endpoints/src/index.ts index 28718b17..c8da8ab8 100644 --- a/endpoints/src/index.ts +++ b/endpoints/src/index.ts @@ -3,4 +3,5 @@ export * from './fetchModel' export * from './memory' export * from './proxy' export * from './localStorage' -export * from './attributes' \ No newline at end of file +export * from './attributes' +export * from './websocket' diff --git a/endpoints/src/restful.ts b/endpoints/src/restful.ts index 6dd46ae2..a771a22d 100644 --- a/endpoints/src/restful.ts +++ b/endpoints/src/restful.ts @@ -1,5 +1,6 @@ import { IOEndpoint, IOOptions, Model, Collection, log, isProduction, Transactional } from '@type-r/models' import { memoryIO, MemoryEndpoint } from './memory' +import { WebSocketEndpoint, WebSocketEndpointOptions } from './websocket' export type UrlTemplate = ( options : any, model? : any ) => string @@ -9,11 +10,21 @@ export function create( url : string | UrlTemplate, fetchOptions? : Partial & WebSocketEndpointOptions + export class RestfulEndpoint implements IOEndpoint { constructor( public url : string | UrlTemplate, { mockData, simulateDelay = 1000, ...fetchOptions } : RestfulFetchOptions = {}) { this.fetchOptions = fetchOptions @@ -127,18 +140,92 @@ export class RestfulEndpoint implements IOEndpoint { return resultOptions; } - protected request( method : HttpMethod, url : string, {options} : RestfulIOOptions, body? ) : Promise { - return fetch( url, this.buildRequestOptions( method, options, body ) ) - .then( response => { - if( response.ok ) { - return response.json() - } else { - throw new Error( response.statusText ) - } - } ); + protected request( method : HttpMethod, url : string, ioOptions : RestfulIOOptions, body? ) : Promise { + const { options, idempotencyKey, expectedVersion } = ioOptions, + headers : HeadersInit = { + ...( options && options.headers as object ) + }; + + if( idempotencyKey !== void 0 ) { + headers[ 'Idempotency-Key' ] = idempotencyKey; + } + + if( expectedVersion !== void 0 ) { + headers[ 'If-Match' ] = String( expectedVersion ); + } + + return fetch( url, this.buildRequestOptions( method, { ...options, headers }, body ) ) + .then( response => response.text() + .then( text => { + if( response.ok ) { + return text ? JSON.parse( text ) : null + } + + throw new Error( getErrorMessage( response, text ) ); + } ) + ); } } +export class RestfulWebSocketEndpoint implements IOEndpoint { + restful : RestfulEndpoint + websocket : WebSocketEndpoint + + constructor( + url : string | UrlTemplate, + websocketUrl : string, + public options : RestfulWebSocketEndpointOptions = {} + ){ + this.restful = new RestfulEndpoint( url, options ); + this.websocket = new WebSocketEndpoint( websocketUrl, options ); + } + + create( json, options : RestfulIOOptions, model ) { + return this.restful.create( json, options, model ); + } + + update( id, json, options : RestfulIOOptions, model ) { + return this.restful.update( id, json, options, model ); + } + + read( id, options : IOOptions, model ){ + return this.restful.read( id, options, model ); + } + + destroy( id, options : RestfulIOOptions, model ){ + return this.restful.destroy( id, options, model ); + } + + list( options : RestfulIOOptions, collection ) { + return this.restful.list( options, collection ); + } + + subscribe( events, collection? ) { + return this.websocket.subscribe( events, collection ); + } + + unsubscribe( events, collection? ) { + return this.websocket.unsubscribe( events, collection ); + } + +} + +function getErrorMessage( response : Response, text : string ) { + const defaultMessage = response.statusText || `HTTP ${response.status}`; + + if( text ) { + try { + const data = JSON.parse( text ); + return data && ( data.message || data.error || data.detail ) || defaultMessage; + } + catch( e ) { + return text; + } + } + + return defaultMessage; +} + export class UrlBuilder { static from( url : string | UrlTemplate, object : Transactional, options : RestfulIOOptions = {} ){ // Resolve URL template @@ -188,4 +275,4 @@ export class UrlBuilder { function removeTrailingSlash( url : string ) { const endsWithSlash = url.charAt( url.length - 1 ) === '/'; return endsWithSlash ? url.substr( 0, url.length - 1 ) : url; -} \ No newline at end of file +} diff --git a/endpoints/src/websocket.ts b/endpoints/src/websocket.ts new file mode 100644 index 00000000..41b5965e --- /dev/null +++ b/endpoints/src/websocket.ts @@ -0,0 +1,332 @@ +import { IOEndpoint, IOOptions, IOPromise, createIOPromise } from '@type-r/models' + +export function websocketIO( url : string, options : WebSocketEndpointOptions = {} ){ + return new WebSocketEndpoint( url, options ); +} + +export type WebSocketMessageType = + 'updated' | 'update' | 'created' | 'create' | 'upsert' | + 'removed' | 'remove' | 'deleted' | 'delete' | 'destroyed' | 'destroy' + +export interface WebSocketEndpointOptions { + WebSocket? : WebSocketConstructor + protocols? : string | string[] + match? : ( message : any, collection? : any ) => boolean + subscribeMessage? : object | ( ( collection? : any ) => any ) + unsubscribeMessage? : object | ( ( collection? : any ) => any ) +} + +export interface WebSocketConstructor { + new ( url : string, protocols? : string | string[] ) : WebSocketLike +} + +export interface WebSocketLike { + onopen : ( ( event? : any ) => void ) | null + onmessage : ( ( event : MessageEvent ) => void ) | null + onerror : ( ( event? : any ) => void ) | null + onclose : ( ( event? : any ) => void ) | null + readyState? : number + send( data : string ) : void + close() : void +} + +interface Subscription { + endpoint : WebSocketEndpoint + events : any + collection : any + resolve : ( value? : any ) => void + reject : ( error? : any ) => void + opened : boolean +} + +export class WebSocketEndpoint implements IOEndpoint { + private WebSocket : WebSocketConstructor + private connection : SharedWebSocketConnection + + constructor( public url : string, public options : WebSocketEndpointOptions = {} ){ + this.WebSocket = options.WebSocket || getGlobalWebSocket(); + this.connection = SharedWebSocketConnection.get( url, this.WebSocket, options.protocols ); + } + + list( options : IOOptions, collection? ) : IOPromise { + return notSupported( 'list' ); + } + + create( json : any, options : IOOptions, record? ) : IOPromise { + return notSupported( 'create' ); + } + + update( id : string | number, json : any, options : IOOptions, record? ) : IOPromise { + return notSupported( 'update' ); + } + + read( id : string | number, options : IOOptions, record? ) : IOPromise { + return notSupported( 'read' ); + } + + destroy( id : string | number, options : IOOptions, record? ) : IOPromise { + return notSupported( 'destroy' ); + } + + subscribe( events, collection? ) : IOPromise { + return createIOPromise( ( resolve, reject, onAbort ) => { + const subscription : Subscription = { + endpoint : this, + events, + collection, + resolve, + reject, + opened : false + }; + + this.connection.subscribe( subscription ); + + onAbort( ( resolve, reject ) => { + this.unsubscribe( events, collection ); + reject( new Error( 'I/O Aborted' ) ); + }); + }); + } + + unsubscribe( events, collection? ) : void { + this.connection.unsubscribe( this, events, collection ); + } + + getMessage( message, collection ){ + return typeof message === 'function' ? message( collection ) : message; + } + + sendMessage( socket : WebSocketLike, message ){ + if( message !== void 0 ) { + socket.send( JSON.stringify( message ) ); + } + } + + parseMessage( event : MessageEvent ){ + const { data } = event; + return typeof data === 'string' ? JSON.parse( data ) : data; + } + + acceptsMessage( message, collection? ){ + if( this.options.match && !this.options.match( message, collection ) ) return false; + return true; + } + + handleMessage( events, message, collection? ){ + if( !this.acceptsMessage( message, collection ) ) return; + + if( message.updated !== void 0 ) { + events.updated && events.updated( message.updated ); + return; + } + + if( message.removed !== void 0 ) { + events.removed && events.removed( getRemovedId( message.removed ) ); + return; + } + + const type = message.type || message.event || message.action, + payload = message.payload !== void 0 ? message.payload : message.data; + + if( isUpdatedEvent( type ) ) { + events.updated && events.updated( payload ); + } + else if( isRemovedEvent( type ) ) { + events.removed && events.removed( getRemovedId( payload ) ); + } + } +} + +class SharedWebSocketConnection { + private static connections : SharedWebSocketConnection[] = [] + + static get( url : string, WebSocket : WebSocketConstructor, protocols? : string | string[] ){ + const existing = this.connections.filter( connection => + connection.url === url && + connection.WebSocket === WebSocket && + protocolsKey( connection.protocols ) === protocolsKey( protocols ) + )[ 0 ]; + + if( existing ) return existing; + + const connection = new SharedWebSocketConnection( url, WebSocket, protocols ); + this.connections.push( connection ); + return connection; + } + + private socket : WebSocketLike + private subscriptions : Subscription[] = [] + private closing = false + + constructor( + public url : string, + public WebSocket : WebSocketConstructor, + public protocols? : string | string[] + ){} + + subscribe( subscription : Subscription ){ + this.subscriptions.push( subscription ); + this.connect(); + + if( this.isOpen() ) { + this.activate( subscription ); + } + } + + unsubscribe( endpoint : WebSocketEndpoint, events, collection? ){ + const subscription = this.subscriptions.filter( x => + x.endpoint === endpoint && x.events === events && x.collection === collection + )[ 0 ]; + + if( subscription ) { + if( subscription.opened && this.isOpen() ) { + endpoint.sendMessage( this.socket, endpoint.getMessage( endpoint.options.unsubscribeMessage, collection ) ); + } + else { + subscription.reject( new Error( 'WebSocket connection closed before subscription was established.' ) ); + } + + this.remove( subscription ); + this.closeIfUnused(); + } + } + + private connect(){ + if( this.socket ) return; + + this.closing = false; + const socket = this.socket = new this.WebSocket( this.url, this.protocols ); + + socket.onopen = () => { + this.subscriptions.slice().forEach( subscription => this.activate( subscription ) ); + }; + + socket.onmessage = event => { + const parsed = new EndpointMessageCache( event ); + + this.subscriptions.slice().forEach( subscription => + subscription.endpoint.handleMessage( + subscription.events, + parsed.get( subscription.endpoint ), + subscription.collection + ) + ); + }; + + socket.onerror = event => { + this.subscriptions.slice().forEach( subscription => { + if( !subscription.opened ) { + subscription.reject( getWebSocketError( event ) ); + this.remove( subscription ); + } + }); + + this.closeIfUnused(); + }; + + socket.onclose = () => { + const subscriptions = this.subscriptions.slice(); + + subscriptions.forEach( subscription => { + if( !subscription.opened ) { + subscription.reject( new Error( 'WebSocket connection closed before subscription was established.' ) ); + } + + this.remove( subscription ); + }); + + this.cleanupSocket(); + this.unregister(); + }; + } + + private activate( subscription : Subscription ){ + if( this.subscriptions.indexOf( subscription ) < 0 || subscription.opened ) return; + + subscription.opened = true; + subscription.endpoint.sendMessage( + this.socket, + subscription.endpoint.getMessage( subscription.endpoint.options.subscribeMessage, subscription.collection ) + ); + subscription.resolve( subscription ); + } + + private remove( subscription : Subscription ){ + this.subscriptions = this.subscriptions.filter( x => x !== subscription ); + } + + private closeIfUnused(){ + if( this.socket && !this.subscriptions.length ) { + this.closing = true; + this.socket.close(); + this.cleanupSocket(); + this.unregister(); + } + } + + private cleanupSocket(){ + if( this.socket ) { + this.socket.onopen = null; + this.socket.onmessage = null; + this.socket.onerror = null; + this.socket.onclose = null; + this.socket = null; + } + } + + private isOpen(){ + return this.socket && ( this.socket.readyState === void 0 || this.socket.readyState === 1 ); + } + + private unregister(){ + const constructor = this.constructor as typeof SharedWebSocketConnection; + constructor.connections = constructor.connections.filter( connection => connection !== this ); + } +} + +class EndpointMessageCache { + private cache : { endpoint : WebSocketEndpoint, message : any }[] = [] + + constructor( private event : MessageEvent ){} + + get( endpoint : WebSocketEndpoint ){ + const entry = this.cache.filter( x => x.endpoint === endpoint )[ 0 ]; + if( entry ) return entry.message; + + const message = endpoint.parseMessage( this.event ); + this.cache.push({ endpoint, message }); + return message; + } +} + +function isUpdatedEvent( type : WebSocketMessageType ){ + return [ 'updated', 'update', 'created', 'create', 'upsert' ].indexOf( type ) >= 0; +} + +function isRemovedEvent( type : WebSocketMessageType ){ + return [ 'removed', 'remove', 'deleted', 'delete', 'destroyed', 'destroy' ].indexOf( type ) >= 0; +} + +function getRemovedId( payload ){ + return payload && typeof payload === 'object' && payload.id !== void 0 ? payload.id : payload; +} + +function notSupported( method : string ) : IOPromise { + return createIOPromise( ( resolve, reject ) => { + reject( new Error( `WebSocketEndpoint does not support ${method}().` ) ); + }); +} + +function getWebSocketError( event ){ + return event instanceof Error ? event : new Error( 'WebSocket connection failed.' ); +} + +function getGlobalWebSocket() : WebSocketConstructor { + if( typeof WebSocket !== 'undefined' ) return WebSocket as any; + + throw new Error( 'WebSocket constructor is not available. Pass it in WebSocketEndpointOptions.WebSocket.' ); +} + +function protocolsKey( protocols : string | string[] ){ + return Array.isArray( protocols ) ? protocols.join( '\n' ) : protocols || ''; +} diff --git a/models/dist/index.js b/models/dist/index.js index 3d26b907..62049842 100644 --- a/models/dist/index.js +++ b/models/dist/index.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(exports):"function"==typeof define&&define.amd?define(["exports"],e):e((t=t||self).Nested={})}(this,function(s){"use strict";function a(t,e){for(var n in e)e.hasOwnProperty(n)&&!t.hasOwnProperty(n)&&(t[n]=e[n]);if(2( dest : T, ...sources : Object[] ) : T\r\nexport function defaults< T >( dest : T, source : Object ) : T {\r\n for( var name in source ) {\r\n if( source.hasOwnProperty( name ) && !dest.hasOwnProperty( name ) ) {\r\n dest[ name ] = source[ name ];\r\n }\r\n }\r\n\r\n if( arguments.length > 2 ){\r\n for( let i = 2; i < arguments.length; i++ ){\r\n const other = arguments[ i ];\r\n other && defaults( dest, other );\r\n }\r\n }\r\n\r\n return dest;\r\n}\r\n\r\n/** Check if value is raw JSON */\r\nexport function isValidJSON( value : any ) : boolean {\r\n if( value === null ){\r\n return true;\r\n }\r\n\r\n switch( typeof value ){\r\n case 'number' :\r\n case 'string' :\r\n case 'boolean' :\r\n return true;\r\n\r\n case 'object':\r\n var proto = Object.getPrototypeOf( value );\r\n\r\n if( proto === Object.prototype || proto === Array.prototype ){\r\n return every( value, isValidJSON );\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/** Get the base class constructor function.\r\n * @param Class Subclass constructor function.\r\n * @returns Base class constructor function.\r\n */\r\nexport function getBaseClass( Class : Function ) {\r\n return Object.getPrototypeOf( Class.prototype ).constructor\r\n}\r\n\r\nexport function assignToClassProto( Class, definition : T, ...names : K[] ) : void {\r\n for( let name of names ){\r\n const value = definition[ name ];\r\n value === void 0 || ( Class.prototype[ name ] = value );\r\n }\r\n}\r\n\r\n/** Checks whenever given object is an empty hash `{}` */\r\nexport function isEmpty( obj : {} ) : boolean {\r\n if( obj ){\r\n for( let key in obj ){\r\n if( obj.hasOwnProperty( key ) ){\r\n return false;\r\n }\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport type Iteratee = ( value : any, key? : string | number ) => any;\r\n\r\nfunction someArray( arr : any[], fun : Iteratee ) : any {\r\n let result;\r\n\r\n for( let i = 0; i < arr.length; i++ ){\r\n if( result = fun( arr[ i ], i ) ){\r\n return result;\r\n }\r\n }\r\n}\r\n\r\nfunction someObject( obj : {}, fun : Iteratee ) : any {\r\n let result;\r\n\r\n for( let key in obj ){\r\n if( obj.hasOwnProperty( key ) ){\r\n if( result = fun( obj[ key ], key ) ){\r\n return result;\r\n }\r\n }\r\n }\r\n}\r\n\r\n/** Similar to underscore `_.some` */\r\nexport function some( obj, fun : Iteratee ) : any {\r\n if( Object.getPrototypeOf( obj ) === ArrayProto ){\r\n return someArray( obj, fun );\r\n }\r\n else{\r\n return someObject( obj, fun );\r\n }\r\n}\r\n\r\n/** Similar to underscore `_.every` */\r\nexport function every( obj : { }, predicate : Iteratee ) : boolean {\r\n return !some( obj, x => !predicate( x ) );\r\n}\r\n\r\n/** Similar to `getOwnPropertyDescriptor`, but traverse the whole prototype chain. */\r\nexport function getPropertyDescriptor( obj : {}, prop : string ) : PropertyDescriptor {\r\n let desc : PropertyDescriptor;\r\n\r\n for( let proto = obj; !desc && proto; proto = Object.getPrototypeOf( proto ) ) {\r\n desc = Object.getOwnPropertyDescriptor( proto, prop );\r\n }\r\n\r\n return desc;\r\n}\r\n\r\n/** Similar to underscore `_.omit` */\r\nexport function omit( source : {}, ...rest : string[] ) : {}\r\nexport function omit( source ) : {} {\r\n const dest = {}, discard = {};\r\n\r\n for( let i = 1; i < arguments.length; i ++ ){\r\n discard[ arguments[ i ] ] = true;\r\n }\r\n\r\n for( var name in source ) {\r\n if( !discard.hasOwnProperty( name ) && source.hasOwnProperty( name ) ) {\r\n dest[ name ] = source[ name ];\r\n }\r\n }\r\n\r\n return dest;\r\n}\r\n\r\n/** map `source` object properties with a given function, and assign the result to the `dest` object.\r\n * When `fun` returns `undefined`, skip this value. \r\n */\r\nexport function transform< A, B >( dest : { [ key : string ] : A }, source : { [ key : string ] : B }, fun : ( value : B, key : string ) => A | void ) : { [ key : string ] : A } {\r\n for( var name in source ) {\r\n if( source.hasOwnProperty( name ) ) {\r\n var value = fun( source[ name ], name );\r\n value === void 0 || ( dest[ name ] = < A >value );\r\n }\r\n }\r\n\r\n return dest;\r\n}\r\n\r\nexport function fastAssign< A >( dest : A, source : {} ) : A {\r\n for( var name in source ) {\r\n dest[ name ] = source[ name ];\r\n }\r\n\r\n return dest;\r\n}\r\n\r\nexport function fastDefaults< A >( dest : A, source : {} ) : A {\r\n for( var name in source ) {\r\n if( dest[ name ] === void 0 ){\r\n dest[ name ] = source[ name ];\r\n }\r\n }\r\n\r\n return dest;\r\n}\r\n\r\n/** Similar to underscore `_.extend` and `Object.assign` */\r\nexport function assign< T >( dest : T, ...sources : Object[] ) : T\r\nexport function assign< T >( dest : T, source : Object ) : T {\r\n for( var name in source ) {\r\n if( source.hasOwnProperty( name ) ) {\r\n dest[ name ] = source[ name ];\r\n }\r\n }\r\n\r\n if( arguments.length > 2 ){\r\n for( let i = 2; i < arguments.length; i++ ){\r\n const other = arguments[ i ];\r\n other && assign( dest, other );\r\n }\r\n }\r\n\r\n return dest;\r\n}\r\n\r\n/** Similar to underscore `_.keys` */\r\nexport function keys( o : any ) : string[]{\r\n return o ? Object.keys( o ) : [];\r\n}\r\n\r\n/** Similar to underscore `_.once` */\r\nexport function once( func : Function ) : Function {\r\n var memo, first = true;\r\n return function() {\r\n if ( first ) {\r\n first = false;\r\n memo = func.apply(this, arguments);\r\n func = null;\r\n }\r\n return memo;\r\n };\r\n}\r\n\r\nconst ArrayProto = Array.prototype,\r\n DateProto = Date.prototype,\r\n ObjectProto = Object.prototype;\r\n\r\n/**\r\n * Determine whenever two values are not equal, deeply traversing \r\n * arrays and plain JS objects (hashes). Dates are compared by enclosed timestamps, all other\r\n * values are compared with strict comparison.\r\n */\r\nexport function notEqual( a : any, b : any) : boolean {\r\n if( a === b ) return false;\r\n\r\n if( a && b && typeof a == 'object' && typeof b == 'object' ) {\r\n const protoA = Object.getPrototypeOf( a );\r\n\r\n if( protoA !== Object.getPrototypeOf( b ) ) return true;\r\n\r\n switch( protoA ){\r\n case DateProto : return +a !== +b;\r\n case ArrayProto : return arraysNotEqual( a, b );\r\n case ObjectProto :\r\n case null:\r\n return objectsNotEqual( a, b );\r\n }\r\n }\r\n\r\n return true;\r\n}\r\n\r\nfunction objectsNotEqual( a, b ) {\r\n const keysA = Object.keys( a );\r\n\r\n if( keysA.length !== Object.keys( b ).length ) return true;\r\n\r\n for( let i = 0; i < keysA.length; i++ ) {\r\n const key = keysA[ i ];\r\n\r\n if( !b.hasOwnProperty( key ) || notEqual( a[ key ], b[ key ] ) ) {\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n}\r\n\r\nfunction arraysNotEqual( a, b ) {\r\n if( a.length !== b.length ) return true;\r\n\r\n for( let i = 0; i < a.length; i++ ) {\r\n if( notEqual( a[ i ], b[ i ] ) ) return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**\r\n * Create an object without Object prototype members except hasOwnProperty.\r\n * @param obj - optional parameter to populate the hash map from.\r\n */\r\nconst HashProto = Object.create( null );\r\nHashProto.hasOwnProperty = ObjectProto.hasOwnProperty;\r\n\r\nexport function hashMap( obj? ){\r\n const hash = Object.create( HashProto );\r\n return obj ? assign( hash, obj ) : hash;\r\n}\r\n\r\nexport function compare( a : any, b : any ) : -1 | 0 | 1 {\r\n // Handle strictly equal values.\r\n if( a == b ) return 0;\r\n\r\n // Handle nulls.\r\n if( a == null ) return -1;\r\n if( b == null ) return 1;\r\n\r\n // No nulls. Convert values to primitives.\r\n const av = a.valueOf(),\r\n bv = b.valueOf();\r\n\r\n return av < bv ? -1 :\r\n av > bv ? 1 :\r\n 0;\r\n}","import { once as _once } from './tools'\r\n\r\n/*******************\r\n * Prebuilt events map, used for optimized bulk event subscriptions.\r\n *\r\n * const events = new EventMap({\r\n * 'change' : true, // Resend this event from self as it is.\r\n * 'change:attr' : 'localTargetFunction',\r\n * 'executedInTargetContext' : function(){ ... }\r\n * 'executedInNativeContext' : '^props.handler'\r\n * })\r\n */\r\nexport interface EventsDefinition {\r\n [ events : string ] : Function | string | boolean\r\n}\r\n\r\nexport class EventMap {\r\n handlers : EventDescriptor[] = [];\r\n\r\n constructor( map? : EventsDefinition | EventMap ){\r\n if( map ){\r\n if( map instanceof EventMap ){\r\n this.handlers = map.handlers.slice();\r\n }\r\n else{\r\n map && this.addEventsMap( map );\r\n }\r\n }\r\n }\r\n\r\n merge( map : EventMap ){\r\n this.handlers = this.handlers.concat( map.handlers );\r\n }\r\n\r\n addEventsMap( map : EventsDefinition ){\r\n for( let names in map ){\r\n this.addEvent( names, map[ names ] )\r\n }\r\n }\r\n\r\n bubbleEvents( names : string ){\r\n for( let name of names.split( eventSplitter ) ){\r\n this.addEvent( name, getBubblingHandler( name ) );\r\n }\r\n }\r\n\r\n addEvent( names : string, callback : Function | string | boolean ){\r\n const { handlers } = this;\r\n\r\n for( let name of names.split( eventSplitter ) ){\r\n handlers.push( new EventDescriptor( name, callback ) );\r\n }\r\n }\r\n\r\n subscribe( target : {}, source : EventSource ){\r\n for( let event of this.handlers ){\r\n on( source, event.name, event.callback, target );\r\n }\r\n }\r\n\r\n unsubscribe( target : {}, source : EventSource ){\r\n for( let event of this.handlers ){\r\n off( source, event.name, event.callback, target );\r\n }\r\n }\r\n}\r\n\r\nexport class EventDescriptor {\r\n callback : Function\r\n\r\n constructor(\r\n public name : string,\r\n callback : Function | string | boolean\r\n ){\r\n if( callback === true ){\r\n this.callback = getBubblingHandler( name );\r\n }\r\n else if( typeof callback === 'string' ){\r\n this.callback =\r\n function localCallback(){\r\n const handler = this[ callback ];\r\n handler && handler.apply( this, arguments );\r\n };\r\n }\r\n else{\r\n this.callback = callback;\r\n }\r\n }\r\n}\r\n\r\nconst _bubblingHandlers = {};\r\n\r\nfunction getBubblingHandler( event : string ){\r\n return _bubblingHandlers[ event ] || (\r\n _bubblingHandlers[ event ] = function( a?, b?, c?, d?, e? ){\r\n if( d !== void 0 || e !== void 0 ) trigger5( this, event, a, b, c, d, e );\r\n if( c !== void 0 ) trigger3( this, event, a, b, c );\r\n else trigger2( this, event, a, b );\r\n }\r\n );\r\n}\r\n\r\nexport interface HandlersByEvent {\r\n [ name : string ] : EventHandler\r\n}\r\n\r\nexport class EventHandler {\r\n constructor( public callback : Callback, public context : any, public next = null ){}\r\n}\r\n\r\nfunction listOff( _events : HandlersByEvent, name : string, callback : Callback, context : any ){\r\n const head = _events[ name ];\r\n\r\n let filteredHead, prev;\r\n\r\n for( let ev = head; ev; ev = ev.next ){\r\n // Element must be kept\r\n if( ( callback && callback !== ev.callback && callback !== ev.callback._callback ) ||\r\n ( context && context !== ev.context ) ){\r\n \r\n prev = ev;\r\n filteredHead || ( filteredHead = ev );\r\n }\r\n // Element must be skipped\r\n else{\r\n if( prev ) prev.next = ev.next;\r\n }\r\n }\r\n\r\n if( head !== filteredHead ) _events[ name ] = filteredHead;\r\n}\r\n\r\nfunction listSend2( head : EventHandler, a, b ){\r\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b );\r\n}\r\n\r\nfunction listSend3( head : EventHandler, a, b, c ){\r\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c );\r\n}\r\n\r\nfunction listSend4( head : EventHandler, a, b, c, d ){\r\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c, d );\r\n}\r\n\r\nfunction listSend5( head : EventHandler, a, b, c, d, e ){\r\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c, d, e );\r\n}\r\n\r\nfunction listSend6( head : EventHandler, a, b, c, d, e, f ){\r\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c, d, e, f );\r\n}\r\n\r\nexport interface Callback extends Function {\r\n _callback? : Function\r\n}\r\n\r\nexport function on( source : EventSource, name : string, callback : Callback, context? : any ) : void {\r\n if( callback ){\r\n const _events = source._events || ( source._events = Object.create( null ) );\r\n _events[ name ] = new EventHandler( callback, context, _events[ name ] );\r\n }\r\n}\r\n\r\nexport function once( source : EventSource, name : string, callback : Callback, context? : any ) : void {\r\n if( callback ){\r\n const once : Callback = _once( function(){\r\n off( source, name, once );\r\n callback.apply(this, arguments);\r\n });\r\n\r\n once._callback = callback;\r\n on( source, name, once, context );\r\n }\r\n}\r\n\r\nexport function off( source : EventSource, name? : string, callback? : Callback, context? : any ) : void {\r\n const { _events } = source;\r\n if( _events ){\r\n if( callback || context ) {\r\n if( name ){\r\n listOff( _events, name, callback, context );\r\n }\r\n else{\r\n for( let name in _events ){\r\n listOff( _events, name, callback, context );\r\n }\r\n }\r\n }\r\n else if( name ){\r\n _events[ name ] = void 0;\r\n }\r\n else{\r\n source._events = void 0;\r\n }\r\n }\r\n}\r\n\r\nexport interface EventSource {\r\n /** @internal */\r\n _events : HandlersByEvent\r\n}\r\n\r\nconst eventSplitter = /\\s+/;\r\n\r\nexport function strings( api : ApiEntry, source : EventSource, events : string, callback : Callback, context ){\r\n if( eventSplitter.test( events ) ){\r\n const names = events.split( eventSplitter );\r\n for( let name of names ) api( source, name, callback, context );\r\n }\r\n else api( source, events, callback, context );\r\n}\r\n\r\nexport type ApiEntry = ( source : EventSource, event : string, callback : Callback, context? : any ) => void\r\n\r\n/*********************************\r\n * Event-triggering API\r\n */\r\n\r\n export function trigger2( self : EventSource, name : string, a, b ) : void {\r\n const { _events } = self;\r\n if( _events ){\r\n const queue = _events[ name ],\r\n { all } = _events;\r\n\r\n listSend2( queue, a, b );\r\n listSend3( all, name, a, b );\r\n }\r\n};\r\n\r\nexport function trigger3( self : EventSource, name : string, a, b, c ) : void{\r\n const { _events } = self;\r\n if( _events ){\r\n const queue = _events[ name ],\r\n { all } = _events;\r\n\r\n listSend3( queue, a, b, c );\r\n listSend4( all, name, a, b, c );\r\n }\r\n};\r\n\r\nexport function trigger5( self : EventSource, name : string, a, b, c, d, e ) : void{\r\n const { _events } = self;\r\n if( _events ){\r\n const queue = _events[ name ],\r\n { all } = _events;\r\n\r\n listSend5( queue, a, b, c, d, e );\r\n listSend6( all, name, a, b, c, d, e );\r\n }\r\n};","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","/*****************************************************************\r\n * Mixins engine and @define metaprogramming class extensions\r\n *\r\n * Vlad Balin & Volicon, (c) 2016-2017\r\n */\r\nimport { __extends } from 'tslib';\r\nimport { assign, defaults, getBaseClass, hashMap, transform } from './tools';\r\n\r\nexport interface Subclass< T > extends MixableConstructor {\r\n new ( ...args ) : T\r\n prototype : T\r\n}\r\n\r\nexport interface MixableConstructor extends Function{\r\n __super__? : object;\r\n mixins? : MixinsState;\r\n onExtend? : ( BaseClass : Function ) => void;\r\n onDefine? : ( definition : object, BaseClass : Function ) => void;\r\n define? : ( definition? : object, statics? : object ) => MixableConstructor;\r\n extend? : ( definition? : T, statics? : object ) => Subclass;\r\n}\r\n\r\nexport interface MixableDefinition {\r\n mixins? : Mixin[]\r\n}\r\n\r\n/**\r\n * Base class, holding metaprogramming class extensions.\r\n * Supports mixins and Class.define metaprogramming method.\r\n */\r\nexport class Mixable {\r\n static onExtend : ( BaseClass : Function ) => void;\r\n static onDefine : ( definition : object, BaseClass : Function ) => object; \r\n static __super__ : object\r\n static mixins : MixinsState;\r\n\r\n /** \r\n * Must be called after inheritance and before 'define'.\r\n */\r\n static define( protoProps : MixableDefinition = {}, staticProps? : object ) : MixableConstructor {\r\n const BaseClass : MixableConstructor = getBaseClass( this );\r\n\r\n // Assign statics.\r\n staticProps && assign( this, staticProps );\r\n\r\n // Extract and apply mixins from the definition.\r\n const { mixins, ...defineMixin } = protoProps;\r\n mixins && this.mixins.merge( mixins );\r\n\r\n // Unshift definition to the the prototype.\r\n this.mixins.mergeObject( this.prototype, defineMixin, true );\r\n\r\n // Unshift definition from statics to the prototype.\r\n this.mixins.mergeObject( this.prototype, this.mixins.getStaticDefinitions( BaseClass ), true );\r\n\r\n // Call onDefine hook, if it's present.\r\n this.onDefine && this.onDefine( this.mixins.definitions, BaseClass );\r\n \r\n // Apply merge rules to inherited members. No mixins can be added after this point.\r\n this.mixins.mergeInheritedMembers( BaseClass );\r\n\r\n return this;\r\n }\r\n\r\n /** Backbone-compatible extend method to be used in ES5 and for backward compatibility */\r\n static extend< T extends object>(spec? : T, statics? : {} ) : Subclass< T > {\r\n let TheSubclass : Subclass< T >;\r\n\r\n // 1. Create the subclass (ES5 compatibility shim).\r\n // If constructor function is given...\r\n if( spec && spec.hasOwnProperty( 'constructor' ) ){\r\n // ...we need to manually call internal TypeScript __extend function. Hack! Hack!\r\n TheSubclass = spec.constructor as any;\r\n __extends( TheSubclass, this );\r\n }\r\n // Otherwise, create the subclall in usual way.\r\n else{\r\n TheSubclass = class Subclass extends this {} as any;\r\n }\r\n\r\n predefine( TheSubclass );\r\n spec && TheSubclass.define( spec, statics );\r\n\r\n return TheSubclass;\r\n }\r\n}\r\n\r\n/** @decorator `@predefine` for forward definitions. Can be used with [[Mixable]] classes only.\r\n * Forwards the call to the [[Mixable.predefine]];\r\n */\r\nexport function predefine( Constructor : MixableConstructor ) : void {\r\n const BaseClass : MixableConstructor = getBaseClass( Constructor );\r\n\r\n // Legacy systems support\r\n Constructor.__super__ = BaseClass.prototype;\r\n \r\n // Initialize mixins structures...\r\n Constructor.define || MixinsState.get( Mixable ).populate( Constructor );\r\n\r\n // Make sure Ctor.mixins are ready before the callback...\r\n MixinsState.get( Constructor );\r\n\r\n // Call extend hook.\r\n Constructor.onExtend && Constructor.onExtend( BaseClass );\r\n}\r\n\r\n/** @decorator `@define` for metaprogramming magic. Can be used with [[Mixable]] classes only.\r\n * Forwards the call to [[Mixable.define]].\r\n */\r\nexport function define( ClassOrDefinition : Function ) : void;\r\nexport function define( ClassOrDefinition : object ) : ClassDecorator;\r\nexport function define( ClassOrDefinition : object | MixableConstructor ){\r\n // @define class\r\n if( typeof ClassOrDefinition === 'function' ){\r\n predefine( ClassOrDefinition );\r\n ( ClassOrDefinition as MixableConstructor ).define();\r\n }\r\n // @define({ prop : val, ... }) class\r\n else{\r\n return function( Ctor : MixableConstructor ){\r\n predefine( Ctor );\r\n Ctor.define( ClassOrDefinition );\r\n } as any;\r\n }\r\n}\r\n\r\nexport function definitions( rules : MixinMergeRules ) : ClassDecorator {\r\n return ( Class : Function ) => {\r\n const mixins = MixinsState.get( Class );\r\n mixins.definitionRules = defaults( hashMap(), rules, mixins.definitionRules );\r\n }\r\n}\r\n\r\n// Create simple property list decorator\r\nexport function propertyListDecorator( listName: string ) : PropertyDecorator {\r\n return function propList(proto, name : string) {\r\n const list = proto.hasOwnProperty( listName ) ?\r\n proto[ listName ] : (proto[ listName ] = (proto[ listName ] || []).slice()); \r\n\r\n list.push(name);\r\n }\r\n}\r\n\r\nexport function definitionDecorator( definitionKey, value ){\r\n return ( proto : object, name : string ) => {\r\n MixinsState\r\n .get( proto.constructor )\r\n .mergeObject( proto, {\r\n [ definitionKey ] : {\r\n [ name ] : value\r\n }\r\n });\r\n }\r\n}\r\n\r\nexport class MixinsState {\r\n mergeRules : MixinMergeRules;\r\n definitionRules : MixinMergeRules;\r\n definitions : object = {};\r\n appliedMixins : Mixin[];\r\n\r\n // Return mixins state for the class. Initialize if it's not exist.\r\n static get( Class ) : MixinsState {\r\n const { mixins } = Class;\r\n \r\n return mixins && Class === mixins.Class ? mixins :\r\n Class.mixins = new MixinsState( Class );\r\n }\r\n\r\n constructor( public Class : MixableConstructor ){\r\n const { mixins } = getBaseClass( Class );\r\n\r\n this.mergeRules = ( mixins && mixins.mergeRules ) || hashMap();\r\n this.definitionRules = ( mixins && mixins.definitionRules ) || hashMap();\r\n this.appliedMixins = ( mixins && mixins.appliedMixins ) || [];\r\n }\r\n\r\n getStaticDefinitions( BaseClass : Function ){\r\n const definitions = hashMap(),\r\n { Class } = this;\r\n\r\n return transform( definitions, this.definitionRules, ( rule, name ) =>{\r\n if( BaseClass[ name ] !== Class[ name ]){\r\n return Class[ name ];\r\n }\r\n });\r\n }\r\n\r\n merge( mixins : Mixin[] ){\r\n const proto = this.Class.prototype,\r\n { mergeRules } = this;\r\n\r\n // Copy applied mixins array as it's going to be updated.\r\n const appliedMixins = this.appliedMixins = this.appliedMixins.slice();\r\n\r\n // Apply mixins in sequence...\r\n for( let mixin of mixins ) {\r\n // Mixins array should be flattened.\r\n if( Array.isArray( mixin ) ) {\r\n this.merge( mixin );\r\n }\r\n // Don't apply mixins twice.\r\n else if( appliedMixins.indexOf( mixin ) < 0 ){\r\n appliedMixins.push( mixin );\r\n\r\n // For constructors, merge _both_ static and prototype members.\r\n if( typeof mixin === 'function' ){\r\n // Merge static members\r\n this.mergeObject( this.Class, mixin );\r\n\r\n // merge definitionRules and mergeRules\r\n const sourceMixins = ( mixin as any ).mixins;\r\n if( sourceMixins ){\r\n this.mergeRules = defaults( hashMap(), this.mergeRules, sourceMixins.mergeRules );\r\n this.definitionRules = defaults( hashMap(), this.definitionRules, sourceMixins.definitionRules );\r\n this.appliedMixins = this.appliedMixins.concat( sourceMixins.appliedMixins );\r\n }\r\n\r\n // Prototypes are merged according with rules.\r\n this.mergeObject( proto, mixin.prototype );\r\n }\r\n // Handle plain object mixins.\r\n else {\r\n this.mergeObject( proto, mixin );\r\n }\r\n }\r\n }\r\n }\r\n\r\n populate( ...ctors : Function[] ){\r\n for( let Ctor of ctors ) {\r\n MixinsState.get( Ctor ).merge([ this.Class ]);\r\n }\r\n }\r\n\r\n mergeObject( dest : object, source : object, unshift? : boolean ) {\r\n forEachOwnProp( source, name => {\r\n const sourceProp = Object.getOwnPropertyDescriptor( source, name );\r\n let rule : MixinMergeRule;\r\n\r\n if( rule = this.definitionRules[ name ] ){\r\n assignProperty( this.definitions, name, sourceProp, rule, unshift );\r\n }\r\n\r\n if( !rule || rule === mixinRules.protoValue ){\r\n assignProperty( dest, name, sourceProp, this.mergeRules[ name ], unshift );\r\n }\r\n });\r\n }\r\n\r\n mergeInheritedMembers( BaseClass : Function ){\r\n const { mergeRules, Class } = this;\r\n\r\n if( mergeRules ){\r\n const proto = Class.prototype,\r\n baseProto = BaseClass.prototype;\r\n\r\n for( let name in mergeRules ) {\r\n const rule = mergeRules[ name ];\r\n\r\n if( proto.hasOwnProperty( name ) && name in baseProto ){\r\n proto[ name ] = resolveRule( proto[ name ], baseProto[ name ], rule );\r\n }\r\n }\r\n }\r\n }\r\n}\r\n\r\nconst dontMix = {\r\n function : hashMap({\r\n length : true,\r\n prototype : true,\r\n caller : true,\r\n arguments : true,\r\n name : true,\r\n __super__ : true\r\n }),\r\n \r\n object : hashMap({\r\n constructor : true\r\n }) \r\n}\r\n\r\nfunction forEachOwnProp( object : object, fun : ( name : string ) => void ){\r\n const ignore = dontMix[ typeof object ];\r\n\r\n for( let name of Object.getOwnPropertyNames( object ) ) {\r\n ignore[ name ] || fun( name );\r\n }\r\n}\r\n\r\nexport interface MixinMergeRules {\r\n [ name : string ] : MixinMergeRule\r\n}\r\n\r\nexport type MixinMergeRule = ( a : any, b : any ) => any\r\nexport type Mixin = { [ key : string ] : any } | Function\r\n\r\n// @mixins( A, B, ... ) decorator.\r\nexport interface MixinRulesDecorator {\r\n ( rules : MixinMergeRules ) : ClassDecorator\r\n value( a : object, b : object) : object;\r\n protoValue( a : object, b : object) : object;\r\n merge( a : object, b : object ) : object;\r\n pipe( a: Function, b : Function ) : Function;\r\n defaults( a: Function, b : Function ) : Function;\r\n classFirst( a: Function, b : Function ) : Function;\r\n classLast( a: Function, b : Function ) : Function;\r\n every( a: Function, b : Function ) : Function;\r\n some( a: Function, b : Function ) : Function;\r\n}\r\n\r\nexport const mixins = ( ...list : Mixin[] ) => (\r\n ( Class : Function ) => MixinsState.get( Class ).merge( list )\r\n);\r\n\r\n// @mixinRules({ name : rule, ... }) decorator.\r\nexport const mixinRules = ( ( rules : MixinMergeRules ) => (\r\n ( Class : Function ) => {\r\n const mixins = MixinsState.get( Class );\r\n mixins.mergeRules = defaults( rules, mixins.mergeRules );\r\n }\r\n) ) as MixinRulesDecorator;\r\n\r\n// Pre-defined mixin merge rules\r\n\r\nmixinRules.value = ( a, b ) => a;\r\n\r\nmixinRules.protoValue = ( a, b ) => a;\r\n\r\n// Recursively merge members\r\nmixinRules.merge = ( a, b ) => defaults( {}, a, b );\r\n\r\n // Execute methods in pipe, with the class method executed last.\r\nmixinRules.pipe = ( a, b ) => (\r\n function( x : any ) : any {\r\n return a.call( this, b.call( this, x ) );\r\n }\r\n);\r\n\r\n // Assume methods return an object, and merge results with defaults (class method executed first)\r\nmixinRules.defaults = ( a : Function, b : Function ) => (\r\n function() : object {\r\n return defaults( a.apply( this, arguments ), b.apply( this, arguments ) );\r\n }\r\n);\r\n\r\n// Execute methods in sequence staring with the class method.\r\nmixinRules.classFirst = ( a : Function, b : Function ) => (\r\n function() : void {\r\n a.apply( this, arguments );\r\n b.apply( this, arguments );\r\n }\r\n);\r\n\r\n // Execute methods in sequence ending with the class method.\r\nmixinRules.classLast = ( a : Function, b : Function ) => (\r\n function() : void {\r\n b.apply( this, arguments );\r\n a.apply( this, arguments );\r\n }\r\n)\r\n\r\n // Execute methods in sequence returning the first falsy result.\r\nmixinRules.every = ( a : Function, b : Function ) =>(\r\n function() : any {\r\n return a.apply( this, arguments ) && b.apply( this, arguments );\r\n }\r\n);\r\n // Execute methods in sequence returning the first truthy result.\r\nmixinRules.some = ( a : Function, b : Function ) =>(\r\n function() : any {\r\n return a.apply( this, arguments ) || b.apply( this, arguments );\r\n }\r\n);\r\n\r\n/**\r\n * Helpers\r\n */\r\n\r\nfunction assignProperty( dest : object, name : string, sourceProp : PropertyDescriptor, rule : MixinMergeRule, unshift? : boolean ){\r\n// Destination prop is defined, thus the merge rules must be applied.\r\n if( dest.hasOwnProperty( name ) ){\r\n const destProp = Object.getOwnPropertyDescriptor( dest, name );\r\n\r\n if( destProp.configurable && 'value' in destProp ){\r\n dest[ name ] = unshift ?\r\n resolveRule( sourceProp.value, destProp.value, rule ) :\r\n resolveRule( destProp.value, sourceProp.value, rule ) ;\r\n }\r\n }\r\n // If destination is empty, just copy the prop over.\r\n else{\r\n Object.defineProperty( dest, name, sourceProp );\r\n }\r\n}\r\n\r\nfunction resolveRule( dest, source, rule : MixinMergeRule ){\r\n // When destination is empty, take the source.\r\n if( dest === void 0 ) return source;\r\n\r\n // In these cases we take non-empty destination:\r\n if( !rule || source === void 0 ) return dest;\r\n\r\n // In other cases we must merge values.\r\n return rule( dest, source );\r\n}","import * as _eventsApi from './eventsource';\r\nimport { EventMap, EventsDefinition, EventSource, HandlersByEvent } from './eventsource';\r\nimport { define, definitions, Mixable, MixableConstructor, mixinRules, MixinsState } from './mixins';\r\nimport { omit, transform } from './tools';\r\n\r\nconst { strings, on, off, once, trigger5, trigger2, trigger3 } = _eventsApi;\r\n\r\nlet _idCount = 0;\r\n\r\nfunction uniqueId() : string {\r\n return 'l' + _idCount++;\r\n}\r\n\r\nexport { EventMap, EventsDefinition };\r\n\r\nexport interface MessengerDefinition {\r\n _localEvents? : EventMap\r\n localEvents? : EventsDefinition\r\n properties? : PropertyMap\r\n [ name : string ] : any\r\n}\r\n\r\nexport interface PropertyMap {\r\n [ name : string ] : Property\r\n}\r\n\r\nexport type Property = PropertyDescriptor | ( () => any )\r\n\r\nexport interface MessengersByCid {\r\n [ cid : string ] : Messenger\r\n}\r\n\r\nexport type EventCallbacks = { [ events : string ] : EventCallback }\r\nexport type EventCallback = ( this : Context, ...args : any[] ) => void\r\n\r\n/*************************\r\n * Messenger is mixable class with capabilities of sending and receiving synchronous events.\r\n * This class itself can serve as both mixin and base class.\r\n */\r\n\r\n@define\r\n@definitions({\r\n properties : mixinRules.merge,\r\n localEvents : mixinRules.merge\r\n})\r\nexport class Messenger implements Mixable, EventSource {\r\n // Define extendable mixin static properties.\r\n /** @internal */\r\n static __super__ : object;\r\n static mixins : MixinsState;\r\n static onExtend : ( BaseClass : Function ) => void;\r\n static define : ( definition? : MessengerDefinition, statics? : object ) => MixableConstructor;\r\n static extend : ( definition? : MessengerDefinition, statics? : object ) => MixableConstructor;\r\n static onDefine({ localEvents, _localEvents, properties } : MessengerDefinition, BaseClass? : typeof Mixable ){\r\n // Handle localEvents definition\r\n if( localEvents || _localEvents ){\r\n const eventsMap = new EventMap( this.prototype._localEvents );\r\n\r\n localEvents && eventsMap.addEventsMap( localEvents );\r\n _localEvents && eventsMap.merge( _localEvents );\r\n \r\n this.prototype._localEvents = eventsMap;\r\n }\r\n\r\n // Handle properties definitions...\r\n if( properties ){\r\n Object.defineProperties( this.prototype, transform( {}, properties, toPropertyDescriptor ) );\r\n }\r\n }\r\n\r\n /** @internal */ \r\n _events : HandlersByEvent = void 0;\r\n\r\n /** @internal */ \r\n _listeningTo : MessengersByCid = void 0\r\n\r\n /** Unique client-only id. */\r\n cid : string\r\n\r\n /** Prototype-only property to manage automatic local events subscription */ \r\n protected _localEvents : EventMap\r\n\r\n constructor(){\r\n this.cid = uniqueId();\r\n this.initialize.apply( this, arguments );\r\n\r\n // TODO: local events subscribe?\r\n }\r\n\r\n /** Method is called at the end of the constructor */\r\n initialize() : void {}\r\n \r\n on( events : string | EventCallbacks, callback?, context? ) : this {\r\n if( typeof events === 'string' ) strings( on, this, events, callback, context );\r\n else for( let name in events ) strings( on, this, name, events[ name ], context || callback );\r\n\r\n return this;\r\n }\r\n\r\n once( events : string | EventCallbacks, callback?, context? ) : this {\r\n if( typeof events === 'string' ) strings( once, this, events, callback, context );\r\n else for( let name in events ) strings( once, this, name, events[ name ], context || callback );\r\n\r\n return this;\r\n }\r\n\r\n off( events? : string | EventCallbacks, callback?, context? ) : this {\r\n if( !events ) off( this, void 0, callback, context );\r\n else if( typeof events === 'string' ) strings( off, this, events, callback, context );\r\n else for( let name in events ) strings( off, this, name, events[ name ], context || callback );\r\n\r\n return this;\r\n }\r\n\r\n // Trigger one or many events, firing all bound callbacks. Callbacks are\r\n // passed the same arguments as `trigger` is, apart from the event name\r\n // (unless you're listening on `\"all\"`, which will cause your callback to\r\n // receive the true name of the event as the first argument).\r\n trigger(name : string, a?, b?, c?, d?, e? ) : this {\r\n if( d !== void 0 || e !== void 0 ) trigger5( this, name, a, b, c, d, e );\r\n else if( c !== void 0 ) trigger3( this, name, a, b, c );\r\n else trigger2( this, name, a, b );\r\n return this;\r\n }\r\n\r\n listenTo( source : Messenger, a : string | EventCallbacks, b? : Function ) : this {\r\n if( source ){\r\n addReference( this, source );\r\n source.on( a, !b && typeof a === 'object' ? this : b, this );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n listenToOnce( source : Messenger, a : string | EventCallbacks, b? : Function ) : this {\r\n if( source ){\r\n addReference( this, source );\r\n source.once( a, !b && typeof a === 'object' ? this : b, this );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n stopListening( a_source? : Messenger, a? : string | EventCallbacks, b? : Function ) : this {\r\n const { _listeningTo } = this;\r\n if( _listeningTo ){\r\n const removeAll = !( a || b ),\r\n second = !b && typeof a === 'object' ? this : b;\r\n\r\n if( a_source ){\r\n const source = _listeningTo[ a_source.cid ];\r\n if( source ){\r\n if( removeAll ) delete _listeningTo[ a_source.cid ];\r\n source.off( a, second, this );\r\n }\r\n }\r\n else if( a_source == null ){\r\n for( let cid in _listeningTo ) _listeningTo[ cid ].off( a, second, this );\r\n\r\n if( removeAll ) ( this._listeningTo = void 0 );\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Destructor. Stops messenger from listening to all objects,\r\n * and stop others from listening to the messenger. \r\n */\r\n _disposed : boolean\r\n\r\n dispose() : void {\r\n if( this._disposed ) return;\r\n\r\n this.stopListening();\r\n this.off();\r\n\r\n this._disposed = true;\r\n }\r\n}\r\n\r\n/**\r\n * Backbone 1.2 API conformant Events mixin.\r\n */\r\nexport const Events : Messenger = omit( Messenger.prototype, 'constructor', 'initialize' );\r\n\r\n/**\r\n * Messenger Private Helpers \r\n */\r\n\r\nfunction toPropertyDescriptor( x : Property ) : PropertyDescriptor {\r\n if( x ){\r\n return typeof x === 'function' ? { get : < () => any >x, configurable : true } : x;\r\n }\r\n}\r\n\r\nfunction addReference( listener : Messenger, source : Messenger ){\r\n const listeningTo = listener._listeningTo || (listener._listeningTo = Object.create( null ) ),\r\n cid = source.cid || ( source.cid = uniqueId() );\r\n\r\n listeningTo[ cid ] = source;\r\n}","import { Messenger } from './events'\r\nimport { define } from './mixins';\r\n\r\nexport type LogLevel = 'error' | 'warn' | 'debug' | 'info' | 'log';\r\nexport type LoggerEventHandler = ( topic : string, msg : string, props : object ) => void;\r\n\r\nexport const isProduction = typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'production',\r\n logEvents : LogLevel[] = isProduction ?\r\n [ 'error', 'info' ] :\r\n [ 'error', 'warn', 'debug', 'info', 'log' ];\r\n\r\n@define\r\nexport class Logger extends Messenger {\r\n counter : { [ level in LogLevel ]? : number } = {}\r\n\r\n // Log events of the given log level to the console, optionally filtered by topic\r\n logToConsole( level : LogLevel, filter? : RegExp ) : this {\r\n return this.on( level, ( topic, msg, props ) => {\r\n if( !filter || filter.test( topic ) ){\r\n const args = [ `[${topic}] ${msg}` ];\r\n \r\n for( let name in props ){\r\n args.push( `\\n\\t${name}:`, toString( props[ name ] ) );\r\n }\r\n \r\n console[ level ].apply( console, args );\r\n }\r\n });\r\n }\r\n\r\n // Fire exception on the events of the given log level, optionally filtered by topic\r\n throwOn( level : LogLevel, filter? : RegExp ) : this {\r\n return this.on( level, ( topic, msg, props ) => {\r\n if( !filter || filter.test( topic ) ){\r\n throw new Error( `[${topic}] ${msg}` );\r\n }\r\n });\r\n }\r\n\r\n // Count log events of the given level, optionally filtered by topic\r\n count( level : LogLevel, filter? : RegExp ) : this {\r\n return this.on( level, ( topic, msg, props ) => {\r\n if( !filter || filter.test( topic ) ){\r\n this.counter[ level ] = ( this.counter[ level ] || 0 ) + 1;\r\n }\r\n });\r\n }\r\n\r\n trigger : ( level : LogLevel, topic : string, message : string, props? : object ) => this;\r\n \r\n off : ( event? : LogLevel ) => this;\r\n\r\n\r\n on( handlers : { [ name in LogLevel ] : LoggerEventHandler } ) : this;\r\n on( handlers : LogLevel, handler : LoggerEventHandler ) : this;\r\n on( handlers : 'all', handler : ( level : LogLevel, topic : string, msg : string, props : object ) => void ) : this;\r\n on( a : any, b? : any ){\r\n return super.on( a, b );\r\n }\r\n}\r\n\r\n/**\r\n * Convert objects to the plain text friendly format.\r\n * primitives as in JSON.\r\n */\r\nlet toString = typeof window === 'undefined' ? \r\n something => {\r\n if( something && typeof something === 'object' ){\r\n // Support custom object wrappers...\r\n const value = something.__inner_state__ || something,\r\n isArray = Array.isArray( value );\r\n\r\n const body = isArray ? `[ length = ${ value.length } ]` : `{ ${ Object.keys( value ).join( ', ' )} }`;\r\n\r\n return something.constructor.name + ' ' + body;\r\n }\r\n\r\n return JSON.stringify( something );\r\n }\r\n : x => x;\r\n\r\nexport const logger = new Logger();\r\n\r\nif( typeof console !== 'undefined' ) {\r\n for( let event of logEvents ){\r\n logger.logToConsole( event );\r\n }\r\n}\r\n\r\nexport const throwingLogger = new Logger();\r\nthrowingLogger.throwOn( 'error' ).throwOn( 'warn' );\r\n\r\nexport const log : typeof logger.trigger = logger.trigger.bind( logger );","export interface IONode {\r\n /** @internal */\r\n _endpoint : IOEndpoint\r\n\r\n /** @internal */\r\n _ioPromise : IOPromise< this >\r\n}\r\n\r\nexport interface IOPromise extends Promise {\r\n abort? : () => void\r\n}\r\n\r\nexport interface IOEndpoint {\r\n list( options : IOOptions, collection? ) : IOPromise\r\n create( json : any, options : IOOptions, record? ) : IOPromise\r\n update( id : string | number, json :any, options : IOOptions, record? ) : IOPromise\r\n read( id : string | number, options : IOOptions, record? ) : IOPromise\r\n destroy( id : string | number, options : IOOptions, record? ) : IOPromise\r\n subscribe( events : IOEvents, collection? ) : IOPromise\r\n unsubscribe( events : IOEvents, collection? ) : void\r\n}\r\n\r\nexport interface IOOptions {\r\n ioMethod? : 'save' | 'fetch'\r\n}\r\n\r\nexport interface IOEvents {\r\n updated? : ( json : any ) => void\r\n removed? : ( json : any ) => void\r\n}\r\n\r\nexport function getOwnerEndpoint( self ) : IOEndpoint {\r\n // Check if we are the member of the collection...\r\n const { collection } = self;\r\n if( collection ){\r\n return getOwnerEndpoint( collection );\r\n }\r\n\r\n // Now, if we're the member of the model...\r\n if( self._owner ){\r\n const { _endpoints } = self._owner;\r\n return _endpoints && _endpoints[ self._ownerKey ];\r\n }\r\n}\r\n\r\n/**\r\n * Create abortable promise.\r\n * Adds `promise.abort()` function which rejects the promise by default\r\n * initialize() function takes third optional argument `abort : ( resolve, reject ) => void`,\r\n * which can be used to add custom abort handling.\r\n */\r\ndeclare var Promise: PromiseConstructorLike;\r\n\r\nexport function createIOPromise( initialize : InitIOPromise ) : IOPromise{\r\n let resolve, reject, onAbort;\r\n\r\n function abort( fn ){\r\n onAbort = fn;\r\n }\r\n\r\n const promise : IOPromise = new Promise( ( a_resolve, a_reject ) =>{\r\n reject = a_reject;\r\n resolve = a_resolve;\r\n initialize( resolve, reject, abort );\r\n }) as IOPromise;\r\n\r\n promise.abort = () => {\r\n onAbort ? onAbort( resolve, reject ) : reject( new Error( \"I/O Aborted\" ) );\r\n }\r\n\r\n return promise;\r\n}\r\n\r\nexport type InitIOPromise = ( resolve : ( x? : any ) => void, reject : ( x? : any ) => void, abort? : ( fn : Function ) => void ) => void;\r\n\r\nexport function startIO( self : IONode, promise : IOPromise, options : IOOptions, thenDo : ( json : any ) => any ) : IOPromise {\r\n // Stop pending I/O first...\r\n abortIO( self );\r\n\r\n self._ioPromise = promise\r\n .then( resp => {\r\n self._ioPromise = null;\r\n \r\n const result = thenDo ? thenDo( resp ) : resp;\r\n \r\n triggerAndBubble( self, 'sync', self, resp, options );\r\n \r\n return result;\r\n } ) \r\n .catch( err => {\r\n self._ioPromise = null;\r\n \r\n // Overlaps with a new `error` event.\r\n triggerAndBubble( self, 'error', self, err, options );\r\n \r\n throw err;\r\n } ) as IOPromise;\r\n\r\n self._ioPromise.abort = promise.abort;\r\n\r\n return self._ioPromise;\r\n}\r\n\r\nexport function abortIO( self : IONode ){\r\n if( self._ioPromise && self._ioPromise.abort ){\r\n self._ioPromise.abort();\r\n self._ioPromise = null;\r\n }\r\n}\r\n\r\nexport function triggerAndBubble( eventSource, ...args ){\r\n eventSource.trigger.apply( eventSource, args );\r\n const { collection } = eventSource;\r\n collection && collection.trigger.apply( collection, args ); \r\n}","/**\r\n * Traversable objects and symbolic references\r\n */\r\nexport interface Traversable {\r\n getStore() : Traversable\r\n getOwner() : Traversable\r\n get( key : string ) : any \r\n}\r\n\r\nconst referenceMask = /\\^|(store\\.[^.]+)|([^.]+)/g;\r\n\r\n// Compile reference to function\r\nexport type ResolveReference = ( root : Traversable ) => any; \r\n\r\nexport class CompiledReference {\r\n resolve : ResolveReference\r\n tail : string\r\n local : boolean\r\n\r\n constructor( reference : string, splitTail : boolean = false ){\r\n const path = reference\r\n .match( referenceMask )\r\n .map( key => {\r\n if( key === '^' || key === 'owner' ) return 'getOwner()';\r\n\r\n if( key[ 0 ] === '~' ) return `getStore().get(\"${ key.substr( 1 ) }\")`;\r\n\r\n if( key.indexOf( 'store.' ) === 0 ) return `getStore().get(\"${ key.substr( 6 ) }\")`;\r\n \r\n return key;\r\n } );\r\n \r\n this.tail = splitTail && path.pop();\r\n this.local = !path.length;\r\n \r\n this.resolve = new Function( 'self', `\r\n var v = self.${ path.shift() };\r\n \r\n ${ path.map( x => `\r\n v = v && v.${ x };\r\n `).join('')}\r\n\r\n return v;\r\n ` );\r\n }\r\n}\r\n\r\nexport function resolveReference( root : Traversable, reference : string, action : ( object, key : string ) => any ) : any {\r\n const path = reference.match( referenceMask ),\r\n skip = path.length - 1;\r\n \r\n let self = root;\r\n\r\n for( var i = 0; i < skip; i++ ){\r\n const key = path[ i ];\r\n switch( key ){\r\n case '~' : self = self.getStore(); break;\r\n case '^' : self = self.getOwner(); break;\r\n default : self = self.get( key );\r\n }\r\n\r\n // Do nothing if object on the path doesn't exist.\r\n if( !self ) return;\r\n }\r\n\r\n return action( self, path[ skip ] );\r\n}","export interface ChildrenErrors {\r\n [ key : string ] : ValidationError | any\r\n} \r\n\r\nexport interface Validatable {\r\n /** @internal */\r\n _validateNested( errors : ChildrenErrors ) : number;\r\n \r\n validate( self : any ) : any\r\n get( key : string ) : any\r\n}\r\n\r\n// Validation error object.\r\nexport class ValidationError {\r\n // Invalid nested object keys \r\n nested : ChildrenErrors \r\n length : number\r\n\r\n // Local error\r\n error : any\r\n\r\n constructor( obj : Validatable ){\r\n this.length = obj._validateNested( this.nested = {} );\r\n\r\n if( this.error = obj.validate( obj ) ){\r\n this.length++;\r\n }\r\n }\r\n\r\n each( iteratee : ( value : any, key : string ) => void ) : void {\r\n const { error, nested } = this;\r\n\r\n if( error ) iteratee( error, null );\r\n\r\n for( const key in nested ){\r\n iteratee( nested[ key ], key );\r\n }\r\n }\r\n\r\n eachError( iteratee : ( error : any, key : string, object : Validatable ) => void, object : Validatable ) : void {\r\n this.each( ( value : any, key : string ) => {\r\n if( value instanceof ValidationError ){\r\n (value).eachError( iteratee, object.get( key ) );\r\n }\r\n else{\r\n iteratee( value, key, object );\r\n }\r\n });\r\n }\r\n}","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","/**\r\n * Select appropriate helpers function for particular value type.\r\n */\r\nexport interface IterableLink {\r\n value : any\r\n at( key : number | string ) : any\r\n}\r\n\r\nexport type Iterator = ( link : any, key : string | number ) => any;\r\n\r\nexport interface Helper {\r\n map( link : IterableLink, iterator : Iterator ) : any[]\r\n clone( obj : any ) : any,\r\n remove( obj : any, key : string | number ) : any\r\n}\r\n\r\nconst ArrayProto = Array.prototype,\r\n ObjectProto = Object.prototype;\r\n\r\nexport function helpers( value ) : Helper {\r\n if( value && typeof value === 'object' ){\r\n switch( Object.getPrototypeOf( value ) ){\r\n case ArrayProto : return arrayHelpers;\r\n case ObjectProto : return objectHelpers;\r\n }\r\n }\r\n\r\n return dummyHelpers;\r\n}\r\n\r\n// Do nothing for types other than Array and plain Object.\r\nconst dummyHelpers : Helper = {\r\n clone( value ){ return value; },\r\n map( link : IterableLink, fun ){ return []; },\r\n remove( value ){ return value; }\r\n};\r\n\r\n// `map` and `clone` for plain JS objects\r\nexport const objectHelpers : Helper = {\r\n // Map through the link to object\r\n map( link : IterableLink, iterator : Iterator ) : any[] {\r\n let mapped = [],\r\n { value } = link\r\n\r\n for( let key in value ){\r\n if( value.hasOwnProperty( key ) ){\r\n const element = iterator( link.at( key ), key );\r\n element === void 0 || ( mapped.push( element ) ); \r\n }\r\n }\r\n\r\n return mapped;\r\n },\r\n\r\n remove( object : {}, key : string ) : {} {\r\n delete object[ key ];\r\n return object;\r\n },\r\n\r\n // Shallow clone plain JS object\r\n clone( object : {} ) : {} {\r\n return { ...object };\r\n }\r\n};\r\n\r\n// `map` and `clone` helpers for arrays.\r\nexport const arrayHelpers : Helper = {\r\n // Shallow clone array\r\n clone( array : any[] ) : any[] {\r\n return array.slice();\r\n },\r\n\r\n remove( array : any[], i : number ) : any[] {\r\n array.splice( i, 1 );\r\n return array;\r\n },\r\n\r\n // Map through the link to array\r\n map( link : IterableLink, iterator : Iterator ) : any[] {\r\n const length = link.value.length,\r\n mapped = Array( length );\r\n\r\n for( var i = 0, j = 0; i < length; i++ ){\r\n const y = iterator( link.at( i ), i );\r\n y === void 0 || ( mapped[ j++ ] = y );\r\n }\r\n\r\n mapped.length === j || ( mapped.length = j );\r\n\r\n return mapped;\r\n }\r\n};","/**\r\n * Advanced React links for purely functional two-way data binding\r\n *\r\n * MIT License, (c) 2016 Vlad Balin, Volicon.\r\n */\r\nimport { arrayHelpers, helpers } from './helpers';\r\n\r\nexport * from './helpers'\r\n\r\n/** \r\n * `Linked` class is an abstract linked value - the value, the function to update this value, and its validation error.\r\n * The enclosed value is considered as immutable.\r\n */ \r\nexport abstract class Linked{\r\n /** Validation error. Usually is a string with error text, but can hold any type. */ \r\n error : any = void 0\r\n \r\n /** Set linked value */ \r\n abstract set( x : T ) : void\r\n\r\n constructor( public value : T ){}\r\n\r\n /** EXPERIMENTAL: Support useRef interface. */ \r\n get current(){ return this.value; }\r\n set current( x : T ){ this.set( x ); }\r\n\r\n // Private accessor for whenChanged. Uniform with Type-R models and collections API.\r\n protected get _changeToken(){\r\n return this.value;\r\n }\r\n\r\n /** Produce the new link executing the given function before the link value will be updated. */\r\n onChange( handler : ( x : T ) => void ) : Linked {\r\n return new ClonedValueLink( this, ( x : T ) => {\r\n handler( x );\r\n this.set( x );\r\n });\r\n }\r\n\r\n /** Produce the new link which transform the value before `set` with a given function. */\r\n pipe( handler : Linked.Transform ) : Linked< T > {\r\n return new ClonedValueLink( this, x =>{\r\n const next = handler( x, this.value );\r\n next === void 0 || this.set( next );\r\n } );\r\n }\r\n\r\n /** \r\n * Create React component props for the component.\r\n * \r\n * \r\n */ \r\n get props() :\r\n T extends boolean ? { checked : boolean, onChange : ( e : any ) => void } :\r\n { value : T, onChange : ( e : any ) => void }\r\n {\r\n return typeof this.value === 'boolean' ? {\r\n checked : this.value,\r\n onChange : e => this.set( Boolean( e.target.checked ) as any )\r\n }:{\r\n value : this.value,\r\n onChange : e => this.set( e.target.value )\r\n } as any;\r\n }\r\n\r\n /** Update the linked value using given transform function. */ \r\n update( transform : Linked.Transform, e? : Object ) : void {\r\n const next = transform( this.clone(), e );\r\n next === void 0 || this.set( next );\r\n }\r\n\r\n // Create UI event handler function which will update the link with a given transform function.\r\n action( transform : Linked.Transform< T > ) : Linked.EventHandler {\r\n return e => this.update( transform, e );\r\n }\r\n\r\n equals( truthyValue : T ) : Linked {\r\n return new EqualsValueLink( this, truthyValue );\r\n }\r\n\r\n get true( this : Linked ){\r\n return () => this.set( true );\r\n }\r\n\r\n get false( this : Linked ){\r\n return () => this.set( false );\r\n }\r\n\r\n get null(){\r\n return () => this.set( null );\r\n }\r\n\r\n get isTruthy(){\r\n return this.value ? true : undefined;\r\n }\r\n\r\n enabled( defaultValue? : T ) : Linked {\r\n return new EnabledValueLink( this, defaultValue || \"\" );\r\n }\r\n\r\n // Array-only links methods\r\n contains( this : Linked, element : E ) : Linked{\r\n return new ContainsRef( this, element );\r\n }\r\n\r\n push( this : Linked, ...args : E[] ) : void;\r\n push(){\r\n const array = arrayHelpers.clone( this.value );\r\n Array.prototype.push.apply( array, arguments );\r\n this.set( array );\r\n }\r\n\r\n unshift( this : Linked, ...args : E[] ) : void;\r\n unshift() : void {\r\n const array = arrayHelpers.clone( this.value );\r\n Array.prototype.unshift.apply( array, arguments );\r\n this.set( array );\r\n }\r\n\r\n \r\n splice( this : Linked, start : number, deleteCount? : number ) : void;\r\n splice() : void {\r\n const array = arrayHelpers.clone( this.value );\r\n Array.prototype.splice.apply( array, arguments );\r\n this.set( array );\r\n }\r\n\r\n // Array and objects universal collection methods\r\n map( this : Linked, iterator : ( link : PropValueLink, idx : number ) => Z ) : Z[];\r\n map( this : Linked<{[ key : string ] : E }>, iterator : ( link : PropValueLink, idx : string ) => Z ) : Z[];\r\n map( iterator ) {\r\n return helpers( this.value ).map( this, iterator );\r\n }\r\n\r\n removeAt( this : Linked, key : number ) : void;\r\n removeAt( this : Linked<{ [ key : string ] : E }>, key : string ) : void;\r\n removeAt( key ){\r\n const { value } = this,\r\n _ = helpers( value );\r\n\r\n this.set( _.remove( _.clone( value ), key ) );\r\n }\r\n\r\n at( this : Linked, key : number ) : PropValueLink;\r\n at( key : K ) : PropValueLink;\r\n at( key ){\r\n return new PropValueLink( this, key );\r\n }\r\n\r\n clone() : T {\r\n let { value } = this;\r\n return helpers( value ).clone( value );\r\n }\r\n\r\n /**\r\n * Convert link to object to the object of links. Optionally filter by \r\n */\r\n pick< K extends keyof T >( ...keys : K[]) : {[ P in K ]: Linked}\r\n pick() {\r\n let links = {}, keys = arguments.length ? arguments : Object.keys( this.value );\r\n\r\n for( let i = 0; i < keys.length; i++ ){\r\n const key : string = keys[ i ];\r\n links[ key ] = new PropValueLink( this, key );\r\n }\r\n\r\n return links;\r\n }\r\n\r\n /**\r\n * Convert link to object to the object of links.\r\n * Memorises the result, subsequent calls are cheap.\r\n */\r\n get $() : T extends object ? Linked.Hash : never {\r\n if( !this._value$ ){\r\n let links : Linked.Hash = this._value$ = {},\r\n { value } = this;\r\n\r\n for( let key in value ){\r\n if( value.hasOwnProperty( key ) ){\r\n links[ key ] = new PropValueLink( this, key );\r\n }\r\n }\r\n }\r\n\r\n return this._value$ as any;\r\n }\r\n\r\n private _value$ : object\r\n\r\n /**\r\n * Validate link with validness predicate and optional custom error object. Can be chained.\r\n */\r\n check( whenValid : Linked.Validator, error? : any ) : this {\r\n if( !this.error && !whenValid( this.value ) ){\r\n this.error = error || whenValid.error || defaultError;\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n\r\nexport namespace Linked {\r\n export interface Validator< T >{\r\n ( value : T ) : boolean\r\n error? : any\r\n } \r\n\r\n export type Transform< T > = ( value : T, event? : {} ) => T\r\n export type EventHandler = ( event : {} ) => void\r\n\r\n export type Hash = {\r\n [K in keyof T] : Linked\r\n }\r\n\r\n /** Create linked value out of its value and the set function */ \r\n export function value( value : T, set : ( x : T ) => void ) : Linked{\r\n return new CustomValueLink( value, set );\r\n }\r\n\r\n export function mutable( state : T ) : Linked{\r\n return new CustomValueLink( state, x => {\r\n for( let key in x ){\r\n if( x.hasOwnProperty( key ) ){\r\n state[ key ] = x[ key ];\r\n }\r\n }\r\n } );\r\n }\r\n\r\n /**\r\n * Unwrap object with links, returning an object of a similar shape filled with link values.\r\n */\r\n export function getValues( links : Linked.Hash ) : T {\r\n return unwrap( links, 'value' ) as any;\r\n }\r\n\r\n /**\r\n * Unwrap object with links, returning an object of a similar shape filled with link errors.\r\n */\r\n export function getErrors( links : Linked.Hash ) : { [ name in keyof T ] : any } {\r\n return unwrap( links, 'error' ) as any;\r\n }\r\n\r\n /**\r\n * Return true if an object with links contains any errors.\r\n */\r\n export function hasErrors( links : Linked.Hash ) : boolean {\r\n for( let key in links ){\r\n if( links.hasOwnProperty( key ) && links[ key ].error ){\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Assing links with values from the source object.\r\n */\r\n export function setValues( links : Linked.Hash, source : T ) : void {\r\n if( source ){\r\n for( let key in links ){\r\n const sourceKey = trim( key );\r\n if( source.hasOwnProperty( sourceKey ) ){\r\n const sourceVal = source[ sourceKey ];\r\n sourceVal === void 0 || links[ key ].set( sourceVal );\r\n }\r\n } \r\n }\r\n }\r\n\r\n}\r\n\r\nclass CustomValueLink< T > extends Linked< T > {\r\n set( x ){}\r\n\r\n constructor( value : T, set : ( x : T ) => void ){\r\n super( value );\r\n this.set = set;\r\n }\r\n}\r\n\r\nclass ClonedValueLink< T > extends Linked< T > {\r\n set( x ){}\r\n\r\n constructor( parent : Linked< T >, set : ( x : T ) => void ){\r\n super( parent.value );\r\n this.set = set;\r\n\r\n const { error } = parent;\r\n if( error ) this.error = error;\r\n }\r\n}\r\n\r\nclass EqualsValueLink extends Linked< boolean > {\r\n constructor( public parent : Linked< any >, public truthyValue ){\r\n super( parent.value === truthyValue );\r\n }\r\n\r\n set( x : boolean ) : void {\r\n this.parent.set( x ? this.truthyValue : null );\r\n }\r\n}\r\n\r\nclass EnabledValueLink extends Linked< boolean > {\r\n constructor( public parent : Linked< any >, public defaultValue ){\r\n super( parent.value != null );\r\n }\r\n\r\n set( x : boolean ){\r\n this.parent.set( x ? this.defaultValue : null );\r\n }\r\n}\r\n\r\nclass ContainsRef extends Linked< boolean > {\r\n constructor( public parent : Linked< any >, public element : any ){\r\n super( parent.value.indexOf( element ) >= 0 );\r\n }\r\n\r\n set( x : boolean ){\r\n var next = Boolean( x );\r\n\r\n if( this.value !== next ){\r\n var arr : any[] = this.parent.value,\r\n nextValue = x ? arr.concat( this.element ) : arr.filter( el => el !== this.element );\r\n\r\n this.parent.set( nextValue );\r\n }\r\n }\r\n}\r\n\r\nconst defaultError = 'Invalid value';\r\n\r\n/**\r\n * Link to array or object element enclosed in parent link.\r\n * Performs purely functional update of the parent, shallow copying its value on `set`.\r\n */\r\nexport class PropValueLink< E, K > extends Linked< E > {\r\n constructor( private parent : Linked< any >, public key : K ){\r\n super( parent.value[ key ] );\r\n }\r\n\r\n remove(){\r\n this.parent.removeAt( this.key );\r\n }\r\n\r\n update( transform : Linked.Transform, e? : Object ) : void {\r\n const { key } = this;\r\n\r\n this.parent.update( obj => {\r\n const prev = obj[ key ],\r\n next = transform( helpers( prev ).clone( prev ), e );\r\n\r\n if( next !== void 0 ){\r\n obj[ key ] = next;\r\n return obj;\r\n }\r\n } );\r\n }\r\n\r\n // Set new element value to parent array or object, performing purely functional update.\r\n set( next : E ) : void {\r\n /*\r\n this.update( prev => {\r\n if( prev !== next ) return next\r\n })*/\r\n\r\n // A bit more efficient implementation.\r\n const { key } = this;\r\n\r\n this.parent.update( obj => {\r\n if( obj[ key ] !== next ){\r\n obj[ key ] = next;\r\n return obj;\r\n }\r\n });\r\n\r\n \r\n };\r\n}\r\n\r\nfunction unwrap( links : Linked.Hash, field : string) : object {\r\n const values = {};\r\n\r\n for( let key in links ){\r\n if( links.hasOwnProperty( key ) ){\r\n const value = links[ key ][ field ];\r\n if( value !== void 0 ){\r\n values[ trim( key ) ] = value;\r\n }\r\n }\r\n }\r\n\r\n return values;\r\n}\r\n\r\nfunction trim( key : string ){\r\n return key[ 0 ] === '$' ? key.slice( 1 ) : key;\r\n}","import { abortIO, IOEndpoint, IONode, IOPromise } from './io-tools';\r\nimport { EventCallbacks, define, definitions, eventsApi, Logger, LogLevel, Messenger, MessengerDefinition, MessengersByCid, mixinRules, mixins, MixinsState, throwingLogger } from '@type-r/mixture';\r\nimport { resolveReference, Traversable } from './traversable';\r\nimport { ChildrenErrors, Validatable, ValidationError } from './validation';\r\nimport { Linked } from '@linked/value/lib';\r\n\r\nconst { trigger3, on, off } = eventsApi;\r\n/***\r\n * Abstract class implementing ownership tree, tho-phase transactions, and validation. \r\n * 1. createTransaction() - apply changes to an object tree, and if there are some events to send, transaction object is created.\r\n * 2. transaction.commit() - send and process all change events, and close transaction.\r\n */\r\n\r\n/** @private */\r\nexport interface TransactionalDefinition extends MessengerDefinition {\r\n endpoint? : IOEndpoint\r\n}\r\n\r\nexport enum ItemsBehavior {\r\n share = 0b0001,\r\n listen = 0b0010,\r\n persistent = 0b0100\r\n}\r\n\r\n// Transactional object interface\r\n\r\n/**\r\n * Used to access the version token of the object,\r\n * which changes every time something inside of the object is changed.\r\n * \r\n * useEffect( () => data.fetch(), [ state[versionToken] ])\r\n */\r\nexport const versionToken = '_changeToken';\r\nexport const defaultStore = '_defaultStore';\r\n\r\nexport interface Transactional extends Messenger {}\r\n\r\n@define\r\n@definitions({\r\n endpoint : mixinRules.value\r\n})\r\n@mixins( Messenger )\r\nexport abstract class Transactional implements Messenger, IONode, Validatable, Traversable {\r\n // Mixins are hard in TypeScript. We need to copy type signatures over...\r\n // Here goes 'Mixable' mixin.\r\n static endpoint : IOEndpoint;\r\n \r\n /** @internal */\r\n static __super__ : object;\r\n \r\n static mixins : MixinsState;\r\n static define : ( definition? : TransactionalDefinition, statics? : object ) => typeof Transactional;\r\n static extend : ( definition? : T, statics? : object ) => any;\r\n\r\n static onDefine( definitions : TransactionalDefinition, BaseClass : typeof Transactional ){\r\n if( definitions.endpoint ) this.prototype._endpoint = definitions.endpoint;\r\n Messenger.onDefine.call( this, definitions, BaseClass );\r\n };\r\n\r\n static onExtend( BaseClass : typeof Transactional ) : void {\r\n // Make sure we don't inherit class factories.\r\n if( BaseClass.create === this.create ) {\r\n this.create = Transactional.create;\r\n }\r\n }\r\n\r\n // Define extendable mixin static properties.\r\n static create any>( this : M, a? : any, b? : any ) : InstanceType {\r\n return new (this as any)( a, b );\r\n }\r\n\r\n // State accessor.\r\n /** @internal */\r\n readonly __inner_state__ : any;\r\n\r\n // Shared modifier (used by collections of shared models)\r\n /** @internal */\r\n _shared? : number; \r\n \r\n dispose() : void {\r\n if( this._disposed ) return;\r\n \r\n abortIO( this );\r\n this._owner = void 0;\r\n this._ownerKey = void 0;\r\n this.off();\r\n this.stopListening();\r\n this._disposed = true;\r\n }\r\n \r\n cidPrefix : string\r\n\r\n // Unique version token replaced on change\r\n /** @internal */\r\n _changeToken : {} = {}\r\n\r\n // true while inside of the transaction\r\n /** @internal */\r\n _transaction : boolean = false;\r\n\r\n // Holds current transaction's options, when in the middle of transaction and there're changes but is an unsent change event\r\n /** @internal */\r\n _isDirty : TransactionOptions = null;\r\n\r\n // Backreference set by owner (Model, Collection, or other object)\r\n /** @internal */\r\n _owner : Owner = void 0;\r\n\r\n // Key supplied by owner. Used by record to identify attribute key.\r\n // Only collections doesn't set the key, which is used to distinguish collections.\r\n /** @internal */ \r\n _ownerKey : string = void 0;\r\n\r\n // Name of the change event\r\n /** @internal */\r\n _changeEventName : string\r\n\r\n /**\r\n * Subsribe for the changes.\r\n */\r\n onChanges( handler : Function, target? : Messenger ){\r\n on( this, this._changeEventName, handler, target );\r\n }\r\n\r\n /**\r\n * Unsubscribe from changes.\r\n */\r\n offChanges( handler? : Function, target? : Messenger ){\r\n off( this, this._changeEventName, handler, target );\r\n }\r\n\r\n /**\r\n * Listen to changes event. \r\n */\r\n listenToChanges( target : Transactional, handler ){\r\n this.listenTo( target, target._changeEventName, handler );\r\n }\r\n\r\n constructor( cid : string | number ){\r\n this.cid = this.cidPrefix + cid;\r\n }\r\n\r\n // Deeply clone ownership subtree\r\n abstract clone( options? : CloneOptions ) : this\r\n \r\n // Execute given function in the scope of ad-hoc transaction.\r\n transaction( fun : ( self : this ) => void, options : TransactionOptions = {} ) : void{\r\n const isRoot = transactionApi.begin( this );\r\n const update = fun.call( this, this );\r\n update && this.set( update );\r\n isRoot && transactionApi.commit( this );\r\n }\r\n\r\n // Assign transactional object \"by value\", copying aggregated items.\r\n assignFrom( a_source : Transactional | Object | Linked ) : this {\r\n // Unpack linked value.\r\n const source = a_source instanceof Linked ? a_source.value : a_source;\r\n\r\n // Need to delay change events until change token will by synced.\r\n this.transaction( () =>{\r\n this.set( ( source as any).__inner_state__ || source, { merge : true } );\r\n\r\n // Synchronize change tokens\r\n const { _changeToken } = source as any;\r\n \r\n if( _changeToken ){\r\n this._changeToken = _changeToken;\r\n } \r\n });\r\n\r\n return this;\r\n }\r\n\r\n // Create object from JSON. Throw if validation fail.\r\n static from Transactional >( this : T, json : any, { strict, ...options } : { strict? : boolean } & TransactionOptions = {} ) : InstanceType{\r\n const obj : Transactional = ( this as any ).create( json, { ...options, logger : strict ? throwingLogger : void 0 } );\r\n\r\n if( strict && obj.validationError ){\r\n obj.eachValidationError( ( error, key, obj ) => {\r\n throw new Error( `${ obj.getClassName() }.${ key }: ${ error }` );\r\n });\r\n }\r\n\r\n return obj as any;\r\n }\r\n\r\n // Apply bulk object update without any notifications, and return open transaction.\r\n // Used internally to implement two-phase commit.\r\n // Returns null if there are no any changes.\r\n /** @internal */\r\n abstract _createTransaction( values : any, options? : TransactionOptions ) : Transaction | void\r\n\r\n // Apply bulk in-place object update in scope of ad-hoc transaction \r\n abstract set( values : any, options? : TransactionOptions ) : this;\r\n\r\n \r\n // Parse function applied when 'parse' option is set for transaction.\r\n parse( data : any, options? : TransactionOptions ) : any { return data }\r\n\r\n // Convert object to the serializable JSON structure\r\n abstract toJSON( options? : object ) : {}\r\n\r\n /*******************\r\n * Traversals and member access\r\n */\r\n \r\n // Get object member by its key.\r\n abstract get( key : string ) : any\r\n\r\n // Get object member by symbolic reference.\r\n deepGet( reference : string ) : any {\r\n return resolveReference( this, reference, ( object, key ) => object.get ? object.get( key ) : object[ key ] );\r\n }\r\n\r\n //_isCollection : boolean\r\n\r\n // Return owner skipping collections.\r\n getOwner() : Owner {\r\n return this._owner;\r\n }\r\n\r\n // Store used when owner chain store lookup failed. Static value in the prototype. \r\n /** @internal */\r\n _defaultStore : Transactional\r\n\r\n // Locate the closest store. Store object stops traversal by overriding this method. \r\n getStore() : Transactional {\r\n const { _owner } = this;\r\n return _owner ? _owner.getStore() : this._defaultStore;\r\n }\r\n\r\n\r\n /***************************************************\r\n * Iteration API\r\n */\r\n\r\n // Loop through the members. Must be efficiently implemented in container class.\r\n\r\n /** @internal */\r\n _endpoint : IOEndpoint\r\n \r\n /** @internal */\r\n _ioPromise : IOPromise\r\n\r\n hasPendingIO() : IOPromise { return this._ioPromise; }\r\n\r\n //fetch( options? : object ) : IOPromise { throw new Error( \"Not implemented\" ); }\r\n\r\n getEndpoint() : IOEndpoint {\r\n return getOwnerEndpoint( this ) || this._endpoint;\r\n }\r\n \r\n /*********************************\r\n * Validation API\r\n */\r\n\r\n // Lazily evaluated validation error\r\n /** @internal */\r\n _validationError : ValidationError = void 0\r\n\r\n // Validate ownership tree and return valudation error \r\n get validationError() : ValidationError {\r\n const error = this._validationError || ( this._validationError = new ValidationError( this ) );\r\n return error.length ? error : null; \r\n }\r\n\r\n // Validate nested members. Returns errors count.\r\n /** @internal */\r\n abstract _validateNested( errors : ChildrenErrors ) : number\r\n\r\n // Object-level validator. Returns validation error.\r\n validate( obj? : Transactional ) : any {}\r\n\r\n // Return validation error (or undefined) for nested object with the given key. \r\n getValidationError( key? : string ) : any {\r\n var error = this.validationError;\r\n return ( key ? error && error.nested[ key ] : error ) || null;\r\n }\r\n\r\n // Get validation error for the given symbolic reference.\r\n deepValidationError( reference : string ) : any {\r\n return resolveReference( this, reference, ( object, key ) => object.getValidationError( key ) );\r\n }\r\n\r\n // Iterate through all validation errors across the ownership tree.\r\n eachValidationError( iteratee : ( error : any, key : string, object : Transactional ) => void ) : void {\r\n const { validationError } = this;\r\n validationError && validationError.eachError( iteratee, this );\r\n }\r\n\r\n // Check whenever member with a given key is valid. \r\n isValid( key? : string ) : boolean {\r\n return !this.getValidationError( key );\r\n }\r\n\r\n valueOf() : Object { return this.cid; }\r\n toString(){ return this.cid; }\r\n\r\n // Get class name for an object instance. Works fine with ES6 classes definitions (not in IE).\r\n getClassName() : string {\r\n const { name } = this.constructor;\r\n if( name !== 'Subclass' ) return name;\r\n }\r\n\r\n // Logging interface for run time errors and warnings.\r\n /** @internal */\r\n abstract _log( level : LogLevel, topic : string, text : string, value : any, logger? : Logger ) : void\r\n}\r\n\r\nexport interface CloneOptions {\r\n // 'Pin store' shall assign this._defaultStore = this.getStore();\r\n pinStore? : boolean\r\n}\r\n\r\n// Owner must accept children update events. It's an only way children communicates with an owner.\r\n/** @private */\r\nexport interface Owner extends Traversable, Messenger {\r\n /** @internal */\r\n _onChildrenChange( child : Transactional, options : TransactionOptions ) : void;\r\n \r\n getOwner() : Owner\r\n getStore() : Transactional\r\n}\r\n\r\n// Transaction object used for two-phase commit protocol.\r\n// Must be implemented by subclasses.\r\n// Transaction must be created if there are actual changes and when markIsDirty returns true.\r\n/** @private */ \r\nexport interface Transaction {\r\n // Object transaction is being made on.\r\n object : Transactional\r\n\r\n // Send out change events, process update triggers, and close transaction.\r\n // Nested transactions must be marked with isNested flag (it suppress owner notification).\r\n commit( initiator? : Transactional )\r\n}\r\n\r\n// Options for distributed transaction \r\nexport interface TransactionOptions {\r\n // Invoke parsing \r\n parse? : boolean\r\n\r\n // Optional logger\r\n logger? : Logger\r\n\r\n // Suppress change notifications and update triggers\r\n silent? : boolean\r\n\r\n // Update existing transactional members in place, or skip the update (ignored by models)\r\n merge? : boolean // =true\r\n\r\n // Should collections remove elements in set (ignored by models) \r\n remove? : boolean // =true\r\n\r\n // Always replace enclosed objects with new instances\r\n reset? : boolean // = false\r\n\r\n // Do not dispose aggregated members\r\n unset? : boolean\r\n\r\n validate? : boolean\r\n\r\n // IO method name if the transaction is initiated as a result of IO operation\r\n ioMethod? : 'save' | 'fetch'\r\n\r\n // The hint for IOEndpoint\r\n // If `true`, `record.save()` will behave as \"upsert\" operation for the records having id.\r\n upsert? : boolean\r\n}\r\n\r\n/**\r\n * Low-level transactions API. Must be used like this:\r\n * const isRoot = begin( record );\r\n * ...\r\n * isRoot && commit( record, options );\r\n * \r\n * When committing nested transaction, the flag must be set to true. \r\n * commit( object, options, isNested ) \r\n */\r\n\r\nexport const transactionApi = {\r\n // Start transaction. Return true if it's the root one.\r\n /** @private */\r\n begin( object : Transactional ) : boolean {\r\n return object._transaction ? false : ( object._transaction = true ); \r\n },\r\n\r\n // Mark object having changes inside of the current transaction.\r\n // Returns true whenever there notifications are required.\r\n /** @private */\r\n markAsDirty( object : Transactional, options : TransactionOptions ) : boolean {\r\n // If silent option is in effect, don't set isDirty flag.\r\n const dirty = !options.silent;\r\n if( dirty ) object._isDirty = options;\r\n \r\n // Reset version token.\r\n object._changeToken = {};\r\n\r\n // Object is changed, so validation must happen again. Clear the cache.\r\n object._validationError = void 0;\r\n\r\n return dirty;\r\n },\r\n\r\n // Commit transaction. Send out change event and notify owner. Returns true if there were changes.\r\n // Must be executed for the root transaction only.\r\n /** @private */\r\n commit( object : Transactional, initiator? : Transactional ){\r\n let originalOptions = object._isDirty;\r\n\r\n if( originalOptions ){\r\n // Send the sequence of change events, handling chained handlers.\r\n while( object._isDirty ){\r\n const options = object._isDirty;\r\n object._isDirty = null; \r\n trigger3( object, object._changeEventName, object, options, initiator );\r\n }\r\n \r\n // Mark transaction as closed.\r\n object._transaction = false;\r\n\r\n // Notify owner on changes out of transaction scope. \r\n const { _owner } = object; \r\n if( _owner && _owner !== initiator ){ // If it's the nested transaction, owner is already aware there are some changes.\r\n _owner._onChildrenChange( object, originalOptions );\r\n }\r\n }\r\n else{\r\n // No changes. Silently close transaction.\r\n object._isDirty = null;\r\n object._transaction = false;\r\n }\r\n },\r\n\r\n /************************************\r\n * Ownership management\r\n */\r\n\r\n // Add reference to the record.\r\n /** @private */\r\n aquire( owner : Owner, child : Transactional, key? : string ) : void {\r\n if( child._owner ) throw new ReferenceError( 'Trying to aquire ownership for an object already having an owner' );\r\n\r\n child._owner = owner;\r\n child._ownerKey = key;\r\n },\r\n\r\n // Remove reference to the record.\r\n /** @private */\r\n free( owner : Owner, child : Transactional ) : void {\r\n if( owner === child._owner ){\r\n child._owner = void 0;\r\n child._ownerKey = void 0;\r\n }\r\n }\r\n}\r\n\r\nfunction getOwnerEndpoint( self : Transactional ) : IOEndpoint {\r\n // Check if we are the member of the collection...\r\n const { collection } = self as any;\r\n if( collection ){\r\n return getOwnerEndpoint( collection );\r\n }\r\n\r\n // Now, if we're the member of the model...\r\n if( self._owner ){\r\n const { _endpoints } = self._owner as any;\r\n return _endpoints && _endpoints[ self._ownerKey ];\r\n }\r\n}\r\n","import { eventsApi } from '@type-r/mixture';\r\nimport { Owner, Transaction, Transactional, transactionApi, TransactionOptions } from \"../transactions\";\r\nconst { begin : _begin, markAsDirty : _markAsDirty, commit } = transactionApi;\r\n\r\nconst { trigger3 } = eventsApi;\r\n\r\nexport interface ConstructorsMixin {\r\n Attributes : AttributesConstructor\r\n AttributesCopy : AttributesCopyConstructor\r\n}\r\n\r\nexport interface ConstructorOptions extends TransactionOptions{\r\n clone? : boolean\r\n}\r\n\r\nexport type AttributesConstructor = new ( record : AttributesContainer, values : object, options : TransactionOptions ) => AttributesValues;\r\nexport type AttributesCopyConstructor = new ( values : object ) => AttributesValues;\r\n\r\nexport interface AttributesContainer extends Transactional, Owner, ConstructorsMixin {\r\n // Attribute descriptors.\r\n /** @internal */\r\n _attributes : AttributesDescriptors\r\n\r\n // Attribute values.\r\n attributes : AttributesValues\r\n\r\n // Previous attribute values.\r\n /** @internal */\r\n _previousAttributes : AttributesValues\r\n\r\n // Changed attributes cache. \r\n /** @internal */\r\n _changedAttributes : AttributesValues\r\n}\r\n\r\nexport interface AttributesValues {\r\n [ name : string ] : any\r\n}\r\n\r\nexport interface AttributesDescriptors {\r\n [ name : string ] : AttributeUpdatePipeline\r\n}\r\n\r\nexport interface AttributeUpdatePipeline{\r\n doUpdate( value, record : AttributesContainer, options : TransactionOptions, nested? : Transaction[] ) : boolean\r\n}\r\n\r\n // Optimized single attribute transactional update. To be called from attributes setters\r\n // options.silent === false, parse === false. \r\nexport function setAttribute( record : AttributesContainer, name : string, value : any ) : void {\r\n // Open the transaction.\r\n const isRoot = begin( record ),\r\n options = {};\r\n\r\n // Update attribute. \r\n if( record._attributes[ name ].doUpdate( value, record, options ) ){\r\n // Notify listeners on changes.\r\n markAsDirty( record, options );\r\n trigger3( record, 'change:' + name, record, record.attributes[ name ], options );\r\n }\r\n\r\n // Close the transaction.\r\n isRoot && commit( record );\r\n}\r\n\r\nfunction begin( record : AttributesContainer ){\r\n if( _begin( record ) ){\r\n record._previousAttributes = new record.AttributesCopy( record.attributes );\r\n record._changedAttributes = null;\r\n return true;\r\n }\r\n \r\n return false;\r\n}\r\n\r\nfunction markAsDirty( record : AttributesContainer, options : TransactionOptions ){\r\n // Need to recalculate changed attributes, when we have nested set in change:attr handler\r\n if( record._changedAttributes ){\r\n record._changedAttributes = null;\r\n }\r\n\r\n return _markAsDirty( record, options );\r\n}\r\n\r\n/**\r\n * TODO: There's an opportunity to create an optimized pipeline for primitive types and Date, which makes the majority\r\n * of attributes. It might create the major speedup.\r\n * \r\n * Create the dedicated pipeline for owned and shared attributes as well.\r\n * \r\n * Three elements of the pipeline:\r\n * - from constructor\r\n * - from assignment\r\n * - from `set`\r\n */\r\n\r\nexport const UpdateModelMixin = {\r\n// Need to override it here, since begin/end transaction brackets are overriden. \r\n transaction( this : AttributesContainer, fun : ( self : AttributesContainer ) => void, options : TransactionOptions = {} ) : void{\r\n const isRoot = begin( this );\r\n fun.call( this, this );\r\n isRoot && commit( this );\r\n },\r\n \r\n // Handle nested changes. TODO: propagateChanges == false, same in transaction.\r\n _onChildrenChange( child : Transactional, options : TransactionOptions ) : void {\r\n const { _ownerKey } = child,\r\n attribute = this._attributes[ _ownerKey ];\r\n\r\n if( !attribute /* TODO: Must be an opposite, likely the bug */ || attribute.propagateChanges ) this.forceAttributeChange( _ownerKey, options );\r\n },\r\n\r\n // Simulate attribute change \r\n forceAttributeChange( key : string, options : TransactionOptions = {} ){\r\n // Touch an attribute in bounds of transaction\r\n const isRoot = begin( this );\r\n\r\n if( markAsDirty( this, options ) ){\r\n trigger3( this, 'change:' + key, this, this.attributes[ key ], options );\r\n }\r\n \r\n isRoot && commit( this );\r\n },\r\n\r\n _createTransaction( this : AttributesContainer, a_values : {}, options : TransactionOptions = {} ) : Transaction {\r\n const isRoot = begin( this ),\r\n changes : string[] = [],\r\n nested : ModelTransaction[]= [],\r\n { _attributes } = this,\r\n values = options.parse ? this.parse( a_values, options ) : a_values;\r\n\r\n let unknown;\r\n\r\n if( shouldBeAnObject( this, values, options ) ){\r\n for( let name in values ){\r\n const spec = _attributes[ name ];\r\n\r\n if( spec ){\r\n if( spec.doUpdate( values[ name ], this, options, nested ) ){\r\n changes.push( name );\r\n }\r\n }\r\n else{\r\n unknown || ( unknown = [] );\r\n unknown.push( `'${ name }'` );\r\n }\r\n }\r\n\r\n if( unknown ){\r\n unknownAttrsWarning( this, unknown, { values }, options );\r\n }\r\n }\r\n \r\n if( changes.length && markAsDirty( this, options ) ){\r\n return new ModelTransaction( this, isRoot, nested, changes );\r\n }\r\n \r\n // No changes, but there might be silent attributes with open transactions.\r\n for( let pendingTransaction of nested ){\r\n pendingTransaction.commit( this );\r\n }\r\n\r\n isRoot && commit( this );\r\n }\r\n};\r\n\r\nexport function unknownAttrsWarning( record : AttributesContainer, unknown : string[], props, options ){\r\n record._log( 'warn', 'Type-R:UnknownAttrs', `undefined attributes ${ unknown.join(', ')} are ignored.`, props, options.logger );\r\n}\r\n\r\n// One of the main performance tricks of Type-R.\r\n// Create loop unrolled constructors for internal attribute hash,\r\n// so the hidden class JIT optimization will be engaged and they will become static structs.\r\n// It dramatically improves record performance.\r\nexport function constructorsMixin( attrDefs : AttributesDescriptors ) : ConstructorsMixin {\r\n const attrs = Object.keys( attrDefs );\r\n\r\n const AttributesCopy : AttributesCopyConstructor = new Function( 'values', `\r\n ${ attrs.map( attr =>`\r\n this.${ attr } = values.${ attr };\r\n `).join( '' ) }\r\n `) as any;\r\n\r\n AttributesCopy.prototype = Object.prototype;\r\n\r\n const Attributes : AttributesConstructor = new Function( 'record', 'values', 'options', `\r\n var _attrs = record._attributes;\r\n\r\n ${ attrs.map( attr =>`\r\n this.${ attr } = _attrs.${ attr }.doInit( values.${ attr }, record, options );\r\n `).join( '' ) }\r\n `) as any;\r\n\r\n Attributes.prototype = Object.prototype;\r\n\r\n return { Attributes, AttributesCopy };\r\n}\r\n\r\nexport function shouldBeAnObject( record : AttributesContainer, values : object, options ){\r\n if( values && values.constructor === Object ) return true;\r\n\r\n record._log( 'error', 'Type-R:InvalidObject', 'update with non-object is ignored!', { values }, options.logger );\r\n return false;\r\n}\r\n\r\n// Transaction class. Implements two-phase transactions on object's tree. \r\n// Transaction must be created if there are actual changes and when markIsDirty returns true. \r\nexport class ModelTransaction implements Transaction {\r\n // open transaction\r\n constructor( public object : AttributesContainer,\r\n public isRoot : boolean,\r\n public nested : Transaction[],\r\n public changes : string[] ){}\r\n\r\n // commit transaction\r\n commit( initiator? : AttributesContainer ) : void {\r\n const { nested, object, changes } = this;\r\n\r\n // Commit all pending nested transactions...\r\n for( let transaction of nested ){ \r\n transaction.commit( object );\r\n }\r\n\r\n // Notify listeners on attribute changes...\r\n // Transaction is never created when silent option is set, so just send events out.\r\n const { attributes, _isDirty } = object;\r\n for( let key of changes ){\r\n trigger3( object, 'change:' + key, object, attributes[ key ], _isDirty );\r\n }\r\n\r\n this.isRoot && commit( object, initiator );\r\n }\r\n}","import { IOEndpoint } from '../../io-tools';\r\nimport { LogLevel, tools, Logger } from '@type-r/mixture';\r\nimport { TransactionOptions, Transactional } from '../../transactions';\r\nimport { AttributesContainer, AttributeUpdatePipeline, ModelTransaction, setAttribute } from '../updates';\r\n\r\nconst { notEqual, assign} = tools;\r\n\r\nexport type Transform = ( this : AnyType, next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) => any;\r\nexport type ChangeHandler = ( this : AnyType, next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) => void;\r\n\r\nexport interface AttributeOptions {\r\n _metatype? : typeof AnyType\r\n validate? : ( record : AttributesContainer, value : any, key : string ) => any\r\n isRequired? : boolean\r\n changeEvents? : boolean\r\n\r\n endpoint? : IOEndpoint\r\n\r\n type? : Function\r\n value? : any\r\n hasCustomDefault? : boolean\r\n\r\n parse? : Parse\r\n toJSON? : AttributeToJSON\r\n \r\n getHooks? : GetHook[]\r\n transforms? : Transform[]\r\n changeHandlers? : ChangeHandler[]\r\n\r\n _onChange? : ChangeAttrHandler\r\n}\r\n\r\nexport type Parse = ( value : any, key? : string ) => any;\r\nexport type GetHook = ( value : any, key? : string ) => any;\r\nexport type AttributeToJSON = ( value : any, key? : string ) => any\r\nexport type AttributeParse = ( value : any, key? : string ) => any\r\nexport type ChangeAttrHandler = ( ( value : any, attr? : string ) => void ) | string;\r\n\r\n// TODO: interface differs from options, do something obout it\r\nconst emptyOptions : TransactionOptions = {};\r\n\r\n/**\r\n * Typeless attribute. Is the base class for all other attributes.\r\n */\r\nexport class AnyType implements AttributeUpdatePipeline {\r\n // Factory method to create attribute from options \r\n static create : ( options : AttributeOptions, name : string ) => AnyType;\r\n \r\n /**\r\n * Update pipeline functions\r\n * =========================\r\n *\r\n * Stage 0. canBeUpdated( value )\r\n * - presence of this function implies attribute's ability to update in place.\r\n */\r\n canBeUpdated( prev, next, options : TransactionOptions ) : any {}\r\n\r\n /**\r\n * Stage 1. Transform stage\r\n */\r\n transform( next : any, prev : any, model : AttributesContainer, options : TransactionOptions ) : any { return next; }\r\n\r\n // convert attribute type to `this.type`.\r\n convert( next : any, prev : any, model : AttributesContainer, options : TransactionOptions ) : any { return next; }\r\n\r\n /**\r\n * Stage 2. Check if attr value is changed\r\n */\r\n isChanged( a : any, b : any ) : boolean {\r\n return notEqual( a, b );\r\n }\r\n\r\n /**\r\n * Stage 3. Handle attribute change\r\n */\r\n handleChange( next : any, prev : any, model : AttributesContainer, options : TransactionOptions ) {}\r\n\r\n /**\r\n * End update pipeline definitions.\r\n */\r\n\r\n // create empty object passing backbone options to constructor...\r\n create() { return void 0; }\r\n\r\n // generic clone function for typeless attributes\r\n // Must be overriden in sublass\r\n clone( value : any, record : AttributesContainer ) {\r\n return value;\r\n }\r\n\r\n dispose( record : AttributesContainer, value : any ) : void {\r\n this.handleChange( void 0, value, record, emptyOptions );\r\n }\r\n\r\n validate( record : AttributesContainer, value : any, key : string ) : any {}\r\n\r\n toJSON( value, key, options? : object ) {\r\n return value && value.toJSON ? value.toJSON( options ) : value;\r\n }\r\n\r\n isMutableType(){\r\n return this.type && this.type.prototype instanceof Transactional;\r\n }\r\n\r\n createPropertyDescriptor() : PropertyDescriptor | void {\r\n const { name, getHook } = this;\r\n\r\n if( name !== 'id' ){\r\n return {\r\n // call to optimized set function for single argument.\r\n set( value ){\r\n setAttribute( this, name, value );\r\n },\r\n\r\n // attach get hook to the getter function, if it present\r\n get : (\r\n getHook ?\r\n function() {\r\n return getHook.call( this, this.attributes[ name ], name );\r\n } :\r\n function() { return this.attributes[ name ]; }\r\n ),\r\n\r\n configurable : true\r\n }\r\n }\r\n }\r\n\r\n value : any\r\n\r\n // Used as global default value for the given metatype\r\n static defaultValue : any;\r\n\r\n type : Function\r\n\r\n initialize( name : string, options : TransactionOptions ){}\r\n\r\n options : AttributeOptions\r\n\r\n doInit( value, record : AttributesContainer, options : TransactionOptions ){\r\n const v = value === void 0 ? this.defaultValue() : value,\r\n x = this.transform( v, void 0, record, options );\r\n \r\n this.handleChange( x, void 0, record, options );\r\n return x;\r\n }\r\n\r\n doUpdate( value, record : AttributesContainer, options : TransactionOptions, nested? : ModelTransaction[] ){\r\n const { name } = this,\r\n { attributes } = record,\r\n prev = attributes[ name ];\r\n\r\n const next = this.transform( value, prev, record, options );\r\n attributes[ name ] = next;\r\n\r\n if( this.isChanged( next, prev ) ) {\r\n // Do the rest of the job after assignment\r\n this.handleChange( next, prev, record, options );\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n propagateChanges : boolean\r\n\r\n protected _log( level : LogLevel, code : string, text : string, value, record : AttributesContainer, logger : Logger ){\r\n record._log( level, code, `${record.getClassName()}.${ this.name } ${ text }`, {\r\n 'New value' : value,\r\n 'Prev. value' : record.attributes[ this.name ]\r\n }, logger );\r\n }\r\n\r\n defaultValue(){\r\n return this.value;\r\n }\r\n\r\n constructor( public name : string, a_options : AttributeOptions ) { \r\n // Save original options...\r\n this.options = a_options;\r\n\r\n // Clone options.\r\n const options : AttributeOptions = { getHooks : [], transforms : [], changeHandlers : [], ...a_options };\r\n options.getHooks = options.getHooks.slice();\r\n options.transforms = options.transforms.slice();\r\n options.changeHandlers = options.changeHandlers.slice();\r\n\r\n const {\r\n value, type, parse, toJSON, changeEvents,\r\n validate, getHooks, transforms, changeHandlers\r\n } = options;\r\n\r\n // Initialize default value...\r\n this.value = value;\r\n this.type = type;\r\n\r\n // TODO: An opportunity to optimize for attribute subtype.\r\n if( !options.hasCustomDefault && type ){\r\n this.defaultValue = this.create;\r\n }\r\n else if( tools.isValidJSON( value ) ){ \r\n // JSON literals must be deep copied.\r\n this.defaultValue = new Function( `return ${ JSON.stringify( value ) };` ) as any;\r\n }\r\n else{\r\n this.defaultValue = this.defaultValue;\r\n }\r\n\r\n // Changes must be bubbled when they are not disabled for an attribute and transactional object.\r\n this.propagateChanges = changeEvents !== false;\r\n\r\n this.toJSON = toJSON === void 0 ? this.toJSON : toJSON;\r\n\r\n this.validate = validate || this.validate;\r\n \r\n if( options.isRequired ){\r\n this.validate = wrapIsRequired( this.validate );\r\n }\r\n\r\n /**\r\n * Assemble pipelines...\r\n */\r\n\r\n // `convert` is default transform, which is always present...\r\n transforms.unshift( this.convert );\r\n\r\n // Get hook from the attribute will be used first...\r\n if( this.get ) getHooks.unshift( this.get );\r\n\r\n // let subclasses configure the pipeline...\r\n this.initialize.call( this, options );\r\n\r\n // let attribute spec configure the pipeline...\r\n if( getHooks.length ){\r\n const getHook = this.getHook = getHooks.reduce( chainGetHooks );\r\n\r\n const { validate } = this;\r\n this.validate = function( record : AttributesContainer, value : any, key : string ){\r\n return validate.call( this, record, getHook.call( record, value, key ), key );\r\n }\r\n }\r\n \r\n this.transform = transforms.length ? transforms.reduce( chainTransforms ) : this.transform;\r\n \r\n this.handleChange = changeHandlers.length ? changeHandlers.reduce( chainChangeHandlers ) : this.handleChange;\r\n\r\n // Attribute-level parse transform are attached as update hooks modifiers...\r\n const { doInit, doUpdate } = this;\r\n this.doInit = parse ? function( value, record : AttributesContainer, options : TransactionOptions ){\r\n return doInit.call( this, options.parse && value !== void 0 ? parse.call( record, value, this.name ) : value, record, options );\r\n } : doInit;\r\n\r\n this.doUpdate = parse ? function( value, record : AttributesContainer, options : TransactionOptions, nested? : ModelTransaction[] ){\r\n return doUpdate.call( this, options.parse && value !== void 0 ? parse.call( record, value, this.name ) : value, record, options, nested );\r\n } : doUpdate;\r\n }\r\n\r\n getHook : ( value, key : string ) => any = null\r\n get : ( value, key : string ) => any\r\n}\r\n\r\n\r\nfunction chainGetHooks( prevHook : GetHook, nextHook : GetHook ) : GetHook {\r\n return function( value, name ) {\r\n return nextHook.call( this, prevHook.call( this, value, name ), name );\r\n }\r\n}\r\n\r\nfunction chainTransforms( prevTransform : Transform, nextTransform : Transform ) : Transform {\r\n return function( next, prev, record, options ) {\r\n return nextTransform.call( this, prevTransform.call( this, next, prev, record, options ), prev, record, options );\r\n }\r\n}\r\n\r\nfunction chainChangeHandlers( prevHandler : ChangeHandler, nextHandler : ChangeHandler ) : ChangeHandler {\r\n return function( next, prev, record, options ) {\r\n prevHandler.call( this, next, prev, record, options );\r\n nextHandler.call( this, next, prev, record, options );\r\n }\r\n}\r\n\r\nfunction wrapIsRequired( validate ){\r\n return function( record : AttributesContainer, value : any, key : string ){\r\n return value ? validate.call( this, record, value, key ) : 'Required';\r\n }\r\n}","/**\r\n * Built-in JSON types attributes: Object, Array, Number, String, Boolean, and immutable class.\r\n * \r\n * Adds type assertions, default validation, and optimized update pipeline.\r\n */\r\n\r\nimport { TransactionOptions } from '../../transactions';\r\nimport { AnyType } from './any';\r\nimport { AttributesContainer } from '../updates';\r\n\r\n/**\r\n * Custom class must be immutable class which implements toJSON() method\r\n * with a constructor taking json.\r\n */\r\nexport class ImmutableClassType extends AnyType {\r\n type : new ( value? : any ) => {}\r\n\r\n create(){\r\n return new this.type();\r\n }\r\n\r\n convert( next : any ) : any {\r\n return next == null || next instanceof this.type ? next : new this.type( next );\r\n }\r\n\r\n toJSON( value, key? : string, options? : object ){\r\n return value && value.toJSON ? value.toJSON( options ) : value;\r\n }\r\n\r\n clone( value ) {\r\n return new this.type( this.toJSON( value ) );\r\n }\r\n\r\n isChanged( a, b ){\r\n return a !== b;\r\n }\r\n}\r\n\r\n/**\r\n * Optimized attribute of primitive type.\r\n * \r\n * Primitives has specialized simplified pipeline.\r\n */\r\nexport class PrimitiveType extends AnyType {\r\n type : NumberConstructor | StringConstructor | BooleanConstructor\r\n\r\n dispose(){}\r\n create() { return this.type(); }\r\n\r\n toJSON( value ) { return value; }\r\n\r\n convert( next ) { return next == null ? next : this.type( next ); }\r\n\r\n isChanged( a, b ) { return a !== b; }\r\n\r\n clone( value ) { return value; }\r\n\r\n doInit( value, record : AttributesContainer, options : TransactionOptions ){\r\n return this.transform( value === void 0 ? this.value : value, void 0, record, options );\r\n }\r\n\r\n doUpdate( value, record, options, nested ){\r\n const { name } = this,\r\n { attributes } = record,\r\n prev = attributes[ name ];\r\n \r\n return prev !== ( attributes[ name ] = this.transform( value, prev, record, options ) );\r\n }\r\n\r\n initialize(){\r\n if( !this.options.hasCustomDefault ){\r\n this.value = this.type();\r\n }\r\n }\r\n}\r\n\r\n// Number type with special validation algothim.\r\n/** @private */ \r\nexport class NumericType extends PrimitiveType {\r\n type : NumberConstructor\r\n\r\n create(){\r\n return 0;\r\n }\r\n\r\n convert( next, prev?, record?, options? ) {\r\n const num = next == null ? next : this.type( next );\r\n\r\n if( num !== num ){\r\n this._log( 'error', 'Type-R:InvalidNumber', 'Number attribute is assigned with an invalid number', next, record, options.logger );\r\n }\r\n \r\n return num;\r\n }\r\n\r\n validate( model, value, name ) {\r\n // Whatever is not symmetrically serializable to JSON, is not valid by default.\r\n if( value != null && !isFinite( value ) ) {\r\n return name + ' is not valid number';\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * Compatibility wrapper for Array type.\r\n * @private\r\n */ \r\nexport class ArrayType extends AnyType {\r\n toJSON( value ) { return value; }\r\n dispose(){}\r\n create(){ return []; }\r\n\r\n convert( next, prev, record, options ) {\r\n // Fix incompatible constructor behaviour of Array...\r\n if( next == null || Array.isArray( next ) ) return next;\r\n\r\n this._log( 'error', 'Type-R:InvalidArray', 'Array attribute assigned with non-array value', next, record, options.logger );\r\n\r\n return [];\r\n }\r\n\r\n clone( value ){\r\n return value && value.slice();\r\n }\r\n}\r\n\r\nexport class ObjectType extends AnyType {\r\n create(){ return {}; }\r\n\r\n convert( next, prev, record, options ) {\r\n if( next == null || typeof next === 'object' ) return next;\r\n \r\n this._log( 'error', 'Type-R:InvalidObject', 'Object attribute is assigned with non-object value', next, record, options.logger );\r\n return {};\r\n }\r\n}\r\n\r\nexport function doNothing(){}\r\n\r\nexport class FunctionType extends AnyType {\r\n // Functions are not serialized.\r\n toJSON( value ) { return void 0; }\r\n create(){ return doNothing; }\r\n dispose(){}\r\n\r\n convert( next, prev, record, options ) {\r\n // Fix incompatible constructor behaviour of Function...\r\n if( next == null || typeof next === 'function' ) return next;\r\n\r\n this._log( 'error', 'Type-R:InvalidFunction', 'Function attribute assigned with non-function value', next, record, options.logger );\r\n\r\n return doNothing;\r\n }\r\n\r\n // Functions are not cloned.\r\n clone( value ){ return value; }\r\n}\r\n","/**\r\n * Date attribute type.\r\n * \r\n * Implements validation, cross-browser compatibility fixes, variety of Date serialization formats,\r\n * and optimized update pipeline.\r\n */\r\nimport { TransactionOptions } from '../../transactions';\r\nimport { AnyType } from './any';\r\nimport { AttributesContainer } from '../updates';\r\n\r\n// Date Attribute\r\n/** @private */\r\nexport class DateType extends AnyType {\r\n create(){\r\n return new Date();\r\n }\r\n \r\n convert( next : any, a, record, options ){\r\n if( next == null || next instanceof Date ) return next;\r\n\r\n const date = new Date( next ),\r\n timestamp = date.getTime();\r\n\r\n if( timestamp !== timestamp ){\r\n this._log( 'error', 'Type-R:InvalidDate', 'Date attribute assigned with invalid date', next, record, options.logger );\r\n }\r\n\r\n return date;\r\n }\r\n\r\n validate( model, value, name ) {\r\n if( value != null ){\r\n const timestamp = value.getTime(); \r\n if( timestamp !== timestamp ) return name + ' is Invalid Date';\r\n }\r\n }\r\n\r\n toJSON( value ) { return value && value.toISOString(); }\r\n\r\n isChanged( a, b ) { return ( a && a.getTime() ) !== ( b && b.getTime() ); }\r\n\r\n doInit( value, record : AttributesContainer, options : TransactionOptions ){\r\n // Date don't have handleChanges step.\r\n return this.transform( value === void 0 ? this.defaultValue() : value, void 0, record, options );\r\n }\r\n\r\n doUpdate( value, record, options, nested ){\r\n const { name } = this,\r\n { attributes } = record,\r\n prev = attributes[ name ];\r\n \r\n // Date don't have handleChanges step.\r\n return this.isChanged( prev , attributes[ name ] = this.transform( value, prev, record, options ) );\r\n }\r\n\r\n clone( value ) { return value && new Date( value.getTime() ); }\r\n dispose(){}\r\n}\r\n\r\n// If ISO date is not supported by date constructor (such as in Safari), polyfill it.\r\nfunction supportsDate( date ){\r\n return !isNaN( ( new Date( date ) ).getTime() );\r\n}\r\n\r\nif( !supportsDate('2011-11-29T15:52:30.5') ||\r\n !supportsDate('2011-11-29T15:52:30.52') ||\r\n !supportsDate('2011-11-29T15:52:18.867') ||\r\n !supportsDate('2011-11-29T15:52:18.867Z') ||\r\n !supportsDate('2011-11-29T15:52:18.867-03:30') ){\r\n\r\n DateType.prototype.convert = function( value ){\r\n return value == null || value instanceof Date ? value : new Date( safeParseDate( value ) );\r\n }\r\n}\r\n\r\nconst numericKeys = [ 1, 4, 5, 6, 7, 10, 11 ],\r\n isoDatePattern = /^(\\d{4}|[+\\-]\\d{6})(?:-(\\d{2})(?:-(\\d{2}))?)?(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?(?:(Z)|([+\\-])(\\d{2})(?::(\\d{2}))?)?)?$/;\r\n\r\nfunction safeParseDate( date : string ) : number {\r\n var timestamp, struct : any[], minutesOffset = 0;\r\n\r\n if( ( struct = isoDatePattern.exec( date )) ) {\r\n // avoid NaN timestamps caused by undefined values being passed to Date.UTC\r\n for( var i = 0, k; ( k = numericKeys[ i ] ); ++i ) {\r\n struct[ k ] = +struct[ k ] || 0;\r\n }\r\n\r\n // allow undefined days and months\r\n struct[ 2 ] = (+struct[ 2 ] || 1) - 1;\r\n struct[ 3 ] = +struct[ 3 ] || 1;\r\n\r\n if( struct[ 8 ] !== 'Z' && struct[ 9 ] !== undefined ) {\r\n minutesOffset = struct[ 10 ] * 60 + struct[ 11 ];\r\n\r\n if( struct[ 9 ] === '+' ) {\r\n minutesOffset = 0 - minutesOffset;\r\n }\r\n }\r\n\r\n timestamp =\r\n Date.UTC( struct[ 1 ], struct[ 2 ], struct[ 3 ], struct[ 4 ], struct[ 5 ] + minutesOffset, struct[ 6 ],\r\n struct[ 7 ] );\r\n }\r\n else {\r\n timestamp = Date.parse( date );\r\n }\r\n\r\n return timestamp;\r\n}","import { ItemsBehavior, Transactional, transactionApi, TransactionOptions } from '../../transactions';\r\nimport { ValidationError } from '../../validation';\r\nimport { AnyType } from './any';\r\nimport { AttributesContainer, ConstructorOptions } from '../updates';\r\n\r\nconst { free, aquire } = transactionApi;\r\n\r\nexport class AggregatedType extends AnyType {\r\n type : typeof Transactional\r\n\r\n clone( value : Transactional ) : Transactional {\r\n return value ? value.clone() : value;\r\n }\r\n\r\n toJSON( x, key : string, options : object ){ return x && x.toJSON( options ); }\r\n\r\n doInit( value, record : AttributesContainer, options : ConstructorOptions ){\r\n const v = options.clone ? this.clone( value ) : (\r\n value === void 0 ? this.defaultValue() : value\r\n );\r\n\r\n const x = this.transform( v, void 0, record, options );\r\n this.handleChange( x, void 0, record, options );\r\n return x;\r\n }\r\n\r\n doUpdate( value, record, options, nested : any[] ){ // Last to things can be wrapped to an object, either transaction or ad-hoc\r\n const key = this.name, { attributes } = record; \r\n const prev = attributes[ key ];\r\n let update;\r\n\r\n // This can be moved to transactional attribute. And chained with the rest.\r\n if( update = this.canBeUpdated( prev, value, options ) ) { // todo - skip empty updates.\r\n const nestedTransaction = prev._createTransaction( update, options );\r\n // TODO: sync update tokens\r\n if( nestedTransaction ){\r\n if( nested ){\r\n nested.push( nestedTransaction );\r\n }\r\n else{\r\n nestedTransaction.commit( record );\r\n }\r\n\r\n if( this.propagateChanges ) return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n const next = this.transform( value, prev, record, options );\r\n attributes[ key ] = next;\r\n\r\n if( this.isChanged( next, prev ) ) { // Primitives and nested comparison can be inlined.\r\n // Do the rest of the job after assignment\r\n this.handleChange( next, prev, record, options );\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n canBeUpdated( prev : Transactional, next : any, options : TransactionOptions ) : any {\r\n // If an object already exists, and new value is of incompatible type, let object handle the update.\r\n if( prev && next != null ){\r\n if( next instanceof this.type ){\r\n // In case if merge option explicitly specified, force merge.\r\n if( options.merge ) return next.__inner_state__;\r\n }\r\n else{\r\n return next;\r\n }\r\n }\r\n }\r\n\r\n convert( next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) : Transactional {\r\n // Invoke class factory to handle abstract classes\r\n if( next == null ) return next;\r\n \r\n if( next instanceof this.type ){\r\n if( next._shared && !( next._shared & ItemsBehavior.persistent ) ) { // TODO: think more about shared types assignment compatibility. \r\n this._log( 'error', 'Type-R:InvalidCollection', 'aggregated collection attribute is assigned with shared collection type', next, record, options.logger );\r\n }\r\n\r\n // With explicit 'merge' option we need to clone an object if its previous value was 'null'.\r\n // This is an only case we could be here when merge === true.\r\n if( options.merge ) return next.clone();\r\n\r\n if( next._owner ){\r\n this._log( 'warn', 'Type-R:InvalidOwner', 'object alreay has an owner and was cloned. Use explicit object.clone() to dismiss this warning.', next, record, options.logger );\r\n return next.clone();\r\n }\r\n\r\n return next;\r\n }\r\n\r\n return ( this.type as any).create( next, options );\r\n }\r\n\r\n dispose ( record : AttributesContainer, value : Transactional ){\r\n if( value ){\r\n this.handleChange( void 0, value, record, {} );\r\n }\r\n }\r\n\r\n validate( record : AttributesContainer, value : Transactional ) : ValidationError {\r\n var error = value && value.validationError;\r\n if( error ) return error;\r\n }\r\n\r\n create() : Transactional {\r\n return (this.type).create(); // this the subclass of Transactional here.\r\n }\r\n\r\n initialize( options ){\r\n options.changeHandlers.unshift( this._handleChange );\r\n }\r\n\r\n _handleChange( next : Transactional, prev : Transactional, record : AttributesContainer, options : TransactionOptions ){\r\n if( prev ){\r\n free( record, prev );\r\n options.unset || prev.dispose();\r\n } \r\n \r\n if( next ) aquire( record, next, this.name );\r\n }\r\n}","import { eventsApi } from '@type-r/mixture';\r\nimport { ItemsBehavior, Transactional, transactionApi, TransactionOptions } from '../../transactions';\r\nimport { AnyType } from './any';\r\nimport { AttributesContainer, ConstructorOptions } from '../updates';\r\nimport { ChainableAttributeSpec } from '../attrDef';\r\n\r\nconst { on, off } = eventsApi,\r\n { free, aquire } = transactionApi;\r\n\r\n/************************\r\n * Shared attribute definition.\r\n * - Not serialized.\r\n * - Listening to the changes.\r\n * - Doesn't take ownership when assigned with object of proper type.\r\n * - Takes ownership on objects which are converted.\r\n */\r\n\r\nconst shareAndListen = ItemsBehavior.listen | ItemsBehavior.share;\r\n\r\n/** @private */\r\nexport class SharedType extends AnyType {\r\n type : typeof Transactional\r\n\r\n doInit( value, record : AttributesContainer, options : ConstructorOptions ){\r\n const v = options.clone ? this.clone( value, record ) : (\r\n value === void 0 ? this.defaultValue() : value\r\n );\r\n\r\n const x = this.transform( v, void 0, record, options );\r\n this.handleChange( x, void 0, record, options );\r\n return x;\r\n }\r\n\r\n doUpdate( value, record, options, nested : any[] ){ // Last to things can be wrapped to an object, either transaction or ad-hoc\r\n const key = this.name, { attributes } = record; \r\n const prev = attributes[ key ];\r\n let update;\r\n\r\n // This can be moved to transactional attribute. And chained with the rest.\r\n if( update = this.canBeUpdated( prev, value, options ) ) { // todo - skip empty updates.\r\n const nestedTransaction = prev._createTransaction( update, options );\r\n if( nestedTransaction ){\r\n if( nested ){\r\n nested.push( nestedTransaction );\r\n }\r\n else{\r\n nestedTransaction.commit( record );\r\n }\r\n\r\n if( this.propagateChanges ) return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n const next = this.transform( value, prev, record, options );\r\n attributes[ key ] = next;\r\n\r\n if( this.isChanged( next, prev ) ) { // Primitives and nested comparison can be inlined.\r\n // Do the rest of the job after assignment\r\n this.handleChange( next, prev, record, options );\r\n\r\n return true;\r\n }\r\n\r\n return false;\r\n }\r\n\r\n clone( value : Transactional, record : AttributesContainer ) : Transactional {\r\n // References are not cloned.\r\n if( !value || value._owner !== record ) return value;\r\n\r\n // Implicitly created objects are cloned.\r\n const clone = value.clone();\r\n aquire( record, clone, this.name );\r\n return clone;\r\n }\r\n\r\n // Do not serialize by default.\r\n toJSON(){}\r\n\r\n canBeUpdated( prev : Transactional, next : any, options : TransactionOptions ) : any {\r\n // If an object already exists, and new value is of incompatible type, let object handle the update.\r\n if( prev && next != null && !( next instanceof this.type ) ){\r\n return next;\r\n }\r\n }\r\n\r\n convert( next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) : Transactional {\r\n if( next == null || next instanceof this.type ) return next;\r\n\r\n // Convert type using implicitly created transactional object.\r\n const implicitObject = new ( this.type as any )( next, options, shareAndListen );\r\n\r\n // To prevent a leak, we need to take an ownership on it.\r\n aquire( record, implicitObject, this.name );\r\n\r\n return implicitObject;\r\n }\r\n\r\n // Refs are always valid.\r\n validate( model, value, name ){}\r\n\r\n // They are always created as null.\r\n create() : Transactional {\r\n return null;\r\n }\r\n\r\n // Listening to the change events\r\n _handleChange( next : Transactional, prev : Transactional, record : AttributesContainer, options ){\r\n if( prev ){\r\n // If there was an implicitly created object, remove an ownership.\r\n if( prev._owner === record ){\r\n free( record, prev );\r\n options.unset || prev.dispose();\r\n }\r\n else{\r\n off( prev, prev._changeEventName, this._onChange, record );\r\n }\r\n } \r\n \r\n if( next ){\r\n // No need to take an ownership for an implicit object - already done in convert or clone.\r\n if( next._owner !== record ){\r\n on( next, next._changeEventName, this._onChange, record );\r\n }\r\n } \r\n }\r\n\r\n dispose( record : AttributesContainer, value : Transactional ){\r\n if( value ){\r\n this.handleChange( void 0, value, record, {} );\r\n }\r\n }\r\n\r\n _onChange : ( child : Transactional, options : TransactionOptions, initiator : Transactional ) => void \r\n\r\n initialize( options ){\r\n // Create change event handler which knows current attribute name. \r\n const attribute = this;\r\n this._onChange = this.propagateChanges ? function( child, options, initiator ){\r\n this === initiator || this.forceAttributeChange( attribute.name, options );\r\n } : ignore;\r\n\r\n options.changeHandlers.unshift( this._handleChange );\r\n }\r\n}\r\n\r\nfunction ignore(){}","import { PrimitiveType, NumericType, ObjectType, ImmutableClassType, FunctionType, ArrayType } from './basic';\r\nimport { DateType } from './date';\r\nimport { AnyType, AttributeOptions } from './any';\r\n\r\nexport * from './any';\r\nexport * from './basic';\r\nexport * from './date';\r\nexport * from './owned';\r\nexport * from './shared';\r\n\r\n/**\r\n * Every record attribute type has the corresponding metatype controlling its behavior.\r\n * For built-in types, Type-R uses the predefined list to resolve metatype in order to avoid global objects modifications.\r\n * For user-defined types, static `_metatype` constructor member is used.\r\n */\r\n\r\nconst builtins : Function[] = [ String, Number, Boolean, Date, Object, Array, Function ],\r\n metatypes = [ PrimitiveType, NumericType, PrimitiveType, DateType, ObjectType, ArrayType, FunctionType ];\r\n\r\nexport function getMetatype( Ctor : Function ){\r\n return ( Ctor as any )._metatype || resolveBuiltins( Ctor );\r\n}\r\n\r\nAnyType.create = ( options : AttributeOptions, name : string ) => {\r\n const type = options.type,\r\n AttributeCtor = options._metatype || ( type ? getMetatype( type ): AnyType );\r\n\r\n return new AttributeCtor( name, options );\r\n}\r\n\r\nfunction resolveBuiltins( Ctor : Function ){\r\n const idx = builtins.indexOf( Ctor );\r\n return idx < 0 ? ImmutableClassType : metatypes[ idx ];\r\n}","/**\r\n * Type spec engine. Declare attributes using chainable syntax,\r\n * and returns object with spec.\r\n */\r\nimport { Linked } from '@linked/value';\r\nimport { definitionDecorator, EventMap, EventsDefinition, tools } from '@type-r/mixture';\r\nimport { Collection } from '../collection';\r\nimport { IOEndpoint } from '../io-tools';\r\nimport { Transactional } from '../transactions';\r\nimport { AttributeOptions, AttributeToJSON, getMetatype, Parse, SharedType } from './metatypes';\r\nimport { Model } from './model';\r\nimport { ModelAttributes } from './define'\r\nimport { AttributesContainer } from './updates';\r\n\r\nconst { assign } = tools;\r\n\r\nexport interface AttributeCheck {\r\n ( value : any, key : string ) : boolean\r\n error? : any\r\n}\r\n\r\n\r\n// Infer the proper TS type from a Type-R attribute spec.\r\nexport type Infer =\r\n A extends Function ? TrueReturnType :\r\n A extends ChainableAttributeSpec ? TrueReturnType :\r\n A extends Array ? (\r\n T extends new (...args : any[]) => infer M ? (\r\n M extends Model ? Collection : never\r\n ) :\r\n T extends object ? Collection> :\r\n T[]\r\n ) :\r\n A extends object ? Model & ModelAttributes :\r\n A | null;\r\n\r\n// Extract the proper TS return type for a function or constructor.\r\ntype TrueReturnType =\r\n F extends DateConstructor ? Date | null :\r\n F extends typeof Linked ? Linked :\r\n F extends ( ...args : any[] ) => infer R ? R | null :\r\n F extends new ( ...args : any[] ) => infer R ? R | null:\r\n void;\r\n\r\nexport class ChainableAttributeSpec{\r\n options : AttributeOptions & { type? : F };\r\n\r\n constructor( options : AttributeOptions ) {\r\n // Shallow copy options, fill it with defaults.\r\n this.options = { getHooks : [], transforms : [], changeHandlers : []};\r\n if( options ) assign( this.options, options );\r\n }\r\n\r\n check( check : AttributeCheck, error? : any ) : this {\r\n function validate( model, value, name ){\r\n if( !check.call( model, value, name ) ){\r\n const msg = error || check.error || name + ' is not valid';\r\n return typeof msg === 'function' ? msg.call( model, name ) : msg;\r\n }\r\n }\r\n\r\n const prev = this.options.validate;\r\n\r\n return this.metadata({\r\n validate : prev ? (\r\n function( model, value, name ){\r\n return prev( model, value, name ) || validate( model, value, name );\r\n }\r\n ) : validate\r\n });\r\n }\r\n\r\n get as() : PropertyDecorator {\r\n return definitionDecorator( 'attributes', this );\r\n }\r\n\r\n get isRequired() : this {\r\n return this.required;\r\n }\r\n\r\n get required() : this {\r\n return this.metadata({ isRequired : true }); \r\n }\r\n\r\n endpoint( endpoint : IOEndpoint ) : this {\r\n return this.metadata({ endpoint });\r\n }\r\n\r\n watcher( ref : string | ( ( value : any, key : string ) => void ) ) : this {\r\n return this.metadata({ _onChange : ref });\r\n }\r\n\r\n // Attribute-specific parse transform\r\n parse( fun : Parse ) : this {\r\n return this.metadata({ parse : fun });\r\n }\r\n\r\n toJSON( fun : AttributeToJSON | false ) : this {\r\n return this.metadata({\r\n toJSON : typeof fun === 'function' ? fun : ( fun ? ( x, k, o ) => x && x.toJSON( o ) : emptyFunction ) \r\n });\r\n }\r\n\r\n get dontSave(){\r\n return this.toJSON( false );\r\n }\r\n\r\n get null(){\r\n return this.value( null );\r\n }\r\n\r\n // Attribute get hook.\r\n get( fun ) : this {\r\n return this.metadata({\r\n getHooks : this.options.getHooks.concat( fun )\r\n });\r\n }\r\n\r\n // Attribute set hook.\r\n set( fun ) : this {\r\n function handleSetHook( next, prev, record : AttributesContainer, options ) {\r\n if( this.isChanged( next, prev ) ) {\r\n const changed = fun.call( record, next, this.name );\r\n return changed === void 0 ? prev : this.convert( changed, prev, record, options );\r\n }\r\n\r\n return prev;\r\n }\r\n\r\n return this.metadata({\r\n transforms : this.options.transforms.concat( handleSetHook )\r\n });\r\n }\r\n\r\n changeEvents( events : boolean ) : this {\r\n return this.metadata({ changeEvents : events });\r\n }\r\n\r\n // Subsribe to events from an attribute.\r\n events( map : EventsDefinition ) : this {\r\n const eventMap = new EventMap( map );\r\n\r\n function handleEventsSubscribtion( next, prev, record : AttributesContainer ){\r\n prev && prev.trigger && eventMap.unsubscribe( record, prev );\r\n\r\n next && next.trigger && eventMap.subscribe( record, next );\r\n }\r\n\r\n return this.metadata({\r\n changeHandlers : this.options.changeHandlers.concat( handleEventsSubscribtion )\r\n });\r\n }\r\n\r\n // Creates a copy of the spec.\r\n get has() : this {\r\n return this;\r\n }\r\n\r\n metadata( options : object ) : this {\r\n const cloned = new ChainableAttributeSpec( this.options );\r\n assign( cloned.options, options );\r\n return cloned as any;\r\n }\r\n\r\n value( x ) : this {\r\n return this.metadata({ value : x, hasCustomDefault : true });\r\n }\r\n\r\n static from( spec : any ) : ChainableAttributeSpec {\r\n return null; // dependency injection, see the top level index.ts\r\n }\r\n}\r\n\r\nfunction emptyFunction(){}\r\n\r\nexport function type( this : void, Type : ChainableAttributeSpec | F, value? : any ) : ChainableAttributeSpec {\r\n if( Type instanceof ChainableAttributeSpec ) return Type;\r\n\r\n const attrDef = new ChainableAttributeSpec({ type : Type }),\r\n defaultValue = Type && value === void 0 ? getMetatype( Type ).defaultValue : value;\r\n\r\n return defaultValue === void 0 ? attrDef : attrDef.value( defaultValue );\r\n}\r\n\r\nexport function shared( this : void, Constructor : C ) : ChainableAttributeSpec {\r\n return new ChainableAttributeSpec({\r\n value : null,\r\n type : Constructor,\r\n _metatype : SharedType\r\n });\r\n}\r\n\r\nexport { shared as refTo };\r\n\r\n// Create attribute metatype inferring the type from the value.\r\nexport function value( this : void, x : T ) : ChainableAttributeSpec T> {\r\n const Type = inferType( x ),\r\n // Transactional types inferred from values must have shared type. \r\n AttrDef = Type && Type.prototype instanceof Transactional ? shared( Type ) :\r\n type( Type );\r\n\r\n return AttrDef.value( x ) as any;\r\n}\r\n\r\n/*\r\nexport declare type InferConstructor = \r\n T extends number ? NumberConstructor :\r\n T extends string ? StringConstructor :\r\n T extends boolean ? BooleanConstructor :\r\n T extends Date ? DateConstructor :\r\n T extends Transactional ? new ( ...args : any[] ) => */\r\n\r\nfunction inferType( value : any ) : Function {\r\n switch( typeof value ) {\r\n case 'number' :\r\n return Number;\r\n case 'string' :\r\n return String;\r\n case 'boolean' :\r\n return Boolean;\r\n case 'function' :\r\n return Function;\r\n case 'undefined' :\r\n return void 0;\r\n case 'object' :\r\n return value ? value.constructor : void 0;\r\n }\r\n}","import { GenericComparator } from '../collection';\r\nimport { IOEndpoint } from '../io-tools';\r\nimport { Infer } from './attrDef';\r\nimport { LinkedModelHash } from './linked-attrs';\r\nimport { MakeModelConstructor, Model } from './model';\r\n\r\nexport const collection = Symbol(\"Methods definitions\");\r\nexport const metadata = Symbol(\"Methods definitions\");\r\n\r\n// TODO: getters and setters can go to the attributes object.\r\n// Methods can be added though the class.\r\n\r\nexport interface AnonimousModelDefinition {\r\n [metadata]? : {\r\n idAttribute? : string\r\n endpoint? : IOEndpoint\r\n }\r\n\r\n [collection]? : {\r\n itemEvents? : { [ event : string ] : true | string | (( ...args : any[] ) => void ) }\r\n comparator? : GenericComparator\r\n \r\n initialize?( models? : any[], options? : object ) : void\r\n parse?( json : any ) : object[]\r\n toJSON?( options? : any ) : any\r\n validate?() : any\r\n }\r\n\r\n [attribute : string] : any\r\n}\r\n\r\nexport function parseAnonimousModelDefinition({ [metadata] : md, [collection] : coll, ...attributes } : AnonimousModelDefinition){\r\n return {\r\n attributes,\r\n collection : coll,\r\n ...md\r\n }\r\n}\r\n\r\nexport type AnonymousAttributes =\r\n AnonymousModelConstructor\r\n\r\nexport type AnonymousModelConstructor =\r\n MakeModelConstructor<\r\n Model & ModelAttributes,\r\n A\r\n >\r\n\r\nexport type ModelAttributes =\r\n InferAttrs & {\r\n readonly $ : LinkedModelHash>\r\n }\r\n\r\nexport type MergeModelConstructors =\r\n MakeModelConstructor<\r\n InstanceType & InstanceType,\r\n First['attributes'] & Second['attributes']\r\n >\r\n\r\nexport type InferAttrs = {\r\n [K in Exclude]: Infer\r\n};","import { Model } from './model'\r\nimport { Linked } from '@linked/value'\r\nimport { Transactional } from '../transactions';\r\n\r\nexport function addAttributeLinks( Class : typeof Model ){\r\n const { prototype } = Class;\r\n const { _attributesArray } = prototype;\r\n\r\n const AttributeRefs = new Function('model', `\r\n this._model = model;\r\n ${ _attributesArray.map( ({ name }) => `this.$${name} = void 0; `).join( '\\n' )}\r\n `)\r\n\r\n AttributeRefs.prototype.__ModelAttrRef = LinkedAttr;\r\n\r\n for( let attr of _attributesArray ){\r\n const { name } = attr;\r\n \r\n Object.defineProperty( AttributeRefs.prototype, name, {\r\n get : new Function( attr.isMutableType() ? `\r\n var cached = this.$${name},\r\n value = this._model.${name},\r\n token = value && value._changeToken;\r\n\r\n return cached && cached._token === token ? cached :\r\n ( this.$${name} = new this.__ModelAttrRef( this._model, '${name}', value, token ) );\r\n ` : `\r\n var cached = this.$${name};\r\n\r\n return cached && cached.value === this._model.${name} ? cached :\r\n ( this.$${name} = new this.__ModelAttrRef( this._model, '${name}', this._model.${name} ) );\r\n `) as any\r\n });\r\n }\r\n\r\n prototype.__Attributes$ = AttributeRefs as any;\r\n}\r\n\r\nexport type LinkedModelHash= {\r\n readonly [ K in keyof T ] : LinkedAttr\r\n}\r\n\r\nexport class LinkedAttr extends Linked {\r\n constructor( protected model : Model, protected attr : string, value, protected _token ){\r\n super( value );\r\n }\r\n\r\n set( x : T ){\r\n this.model[ this.attr ] = x;\r\n }\r\n\r\n _error : any\r\n\r\n get error(){\r\n return this._error || ( this._error = this.model.getValidationError( this.attr ) );\r\n }\r\n\r\n set error( x : any ){\r\n this._error = x;\r\n }\r\n\r\n // Attribute's descriptor.\r\n get descriptor(){\r\n return this.model._attributes[ this.attr ];\r\n }\r\n}\r\n\r\nObject.defineProperty( LinkedAttr.prototype, '_changeToken', { value : null } );","import { IOEndpoint } from '../io-tools';\r\nimport { eventsApi, tools as _ } from '@type-r/mixture';\r\nimport { CompiledReference } from '../traversable';\r\nimport { ChainableAttributeSpec } from './attrDef';\r\nimport { AnyType } from './metatypes';\r\nimport { ConstructorsMixin, constructorsMixin } from './updates';\r\n\r\nexport interface ModelAttributesMixin extends ConstructorsMixin {\r\n // Attributes descriptors\r\n _attributes : AttributeDescriptors\r\n _attributesArray : AnyType[]\r\n \r\n // Attribute's property descriptors\r\n properties : PropertyDescriptorMap\r\n\r\n // Event map for record's local events.\r\n _localEvents? : eventsApi.EventMap,\r\n\r\n _endpoints : { [ name : string ] : IOEndpoint }\r\n}\r\n\r\nexport interface AttributeDescriptors {\r\n [ name : string ] : AnyType\r\n}\r\n\r\n// Create attribute from the type spec.\r\nexport function createAttribute( spec : any, name : string ) : AnyType {\r\n return AnyType.create( ChainableAttributeSpec.from( spec ).options, name );\r\n}\r\n\r\n// Create record mixin from the given record's attributes definition\r\nexport function createAttributesMixin( attributesDefinition : object, baseClassAttributes : AttributeDescriptors ) : ModelAttributesMixin {\r\n const myAttributes = _.transform( {} as AttributeDescriptors, attributesDefinition, createAttribute ),\r\n allAttributes = _.defaults( {} as AttributeDescriptors, myAttributes, baseClassAttributes );\r\n\r\n const ConstructorsMixin = constructorsMixin( allAttributes );\r\n\r\n return {\r\n ...ConstructorsMixin,\r\n _attributes : new ConstructorsMixin.AttributesCopy( allAttributes ),\r\n _attributesArray : Object.keys( allAttributes ).map( key => allAttributes[ key ] ),\r\n properties : _.transform( {}, myAttributes, x => x.createPropertyDescriptor() ),\r\n ...localEventsMixin( myAttributes ),\r\n _endpoints : _.transform( {}, allAttributes, attrDef => attrDef.options.endpoint )\r\n } \r\n}\r\n\r\ninterface LocalEventsMixin {\r\n _localEvents? : eventsApi.EventMap\r\n}\r\n\r\nfunction localEventsMixin( attrSpecs : AttributeDescriptors ) : LocalEventsMixin {\r\n let _localEvents : eventsApi.EventMap;\r\n\r\n for( var key in attrSpecs ){\r\n const attribute = attrSpecs[ key ],\r\n { _onChange } = attribute.options; \r\n\r\n if( _onChange ){\r\n _localEvents || ( _localEvents = new eventsApi.EventMap() );\r\n\r\n _localEvents.addEvent( 'change:' + key,\r\n typeof _onChange === 'string' ?\r\n createWatcherFromRef( _onChange, key ) : \r\n wrapWatcher( _onChange, key ) );\r\n }\r\n }\r\n\r\n return _localEvents ? { _localEvents } : {};\r\n}\r\n\r\nfunction wrapWatcher( watcher, key ){\r\n return function( record, value ){\r\n watcher.call( record, value, key );\r\n } \r\n}\r\n\r\nfunction createWatcherFromRef( ref : string, key : string ){\r\n const { local, resolve, tail } = new CompiledReference( ref, true );\r\n return local ?\r\n function( record, value ){\r\n record[ tail ]( value, key );\r\n } :\r\n function( record, value ){\r\n resolve( record )[ tail ]( value, key );\r\n }\r\n}","import { IOEndpoint, IONode, IOOptions, IOPromise, startIO } from '../io-tools';\r\nimport { TransactionOptions } from '../transactions';\r\n\r\nexport interface IOModel extends IONode {\r\n getEndpoint() : IOEndpoint\r\n save( options? : object ) : IOPromise\r\n fetch( options? : object ) : IOPromise\r\n destroy( options? : object ) : IOPromise\r\n toJSON( options? : object ) : any\r\n parse( data : any, options? : object ) : any\r\n isNew() : boolean\r\n id : string | number\r\n set( json : object, options : TransactionOptions ) : this\r\n}\r\n\r\nexport const IOModelMixin = {\r\n save( this : IOModel, options : IOOptions = {} ){\r\n const endpoint = this.getEndpoint(),\r\n json = this.toJSON({ ioMethod : 'save', ...options });\r\n\r\n return startIO(\r\n this,\r\n this.isNew() ?\r\n endpoint.create( json, options, this ) :\r\n endpoint.update( this.id, json, options, this ),\r\n options,\r\n\r\n update => {\r\n this.set( update, {\r\n parse : true,\r\n ioMethod : 'save',\r\n ...options\r\n } );\r\n }\r\n );\r\n },\r\n\r\n fetch( options : IOOptions = {} ){\r\n return startIO(\r\n this,\r\n this.getEndpoint().read( this.id, options, this ),\r\n options,\r\n\r\n json => this.set( json, { parse : true, ioMethod : 'fetch', ...options } )\r\n );\r\n },\r\n\r\n destroy( options : IOOptions = {} ){ \r\n return startIO(\r\n this,\r\n this.getEndpoint().destroy( this.id, options, this ),\r\n options,\r\n\r\n () => {\r\n const { collection } = this;\r\n if( collection ){\r\n collection.remove( this, options );\r\n }\r\n else{\r\n this.dispose();\r\n }\r\n\r\n return this;\r\n }\r\n )\r\n }\r\n}","/**\r\n * Model core implementing transactional updates.\r\n * The root of all definitions. \r\n */\r\n\r\nimport { define, definitions, isProduction, Logger, TheType, logger, LogLevel, mixinRules, tools } from '@type-r/mixture';\r\nimport { CollectionConstructor } from '../collection';\r\nimport { IOEndpoint } from '../io-tools';\r\nimport { CloneOptions, Owner, Transaction, Transactional, TransactionalDefinition, TransactionOptions } from '../transactions';\r\nimport { ChildrenErrors } from '../validation';\r\nimport { type } from './attrDef';\r\nimport { InferAttrs, ModelAttributes, AnonymousModelConstructor } from './define';\r\nimport { IOModel, IOModelMixin } from './io-mixin';\r\nimport { LinkedModelHash } from './linked-attrs';\r\nimport { AggregatedType, AnyType } from './metatypes';\r\nimport { AttributesConstructor, AttributesContainer, AttributesCopyConstructor, AttributesValues, setAttribute, shouldBeAnObject, unknownAttrsWarning, UpdateModelMixin } from './updates';\r\n\r\nexport interface MakeModelConstructor extends TheType\r\n{\r\n new ( attrs? : Partial>, options? : object ) : T\r\n prototype : T\r\n attributes : A\r\n Collection : CollectionConstructor\r\n}\r\n\r\nconst { assign, isEmpty } = tools;\r\n\r\n/*******************************************************\r\n * Model core implementation\r\n */\r\n\r\nexport interface ConstructorOptions extends TransactionOptions{\r\n clone? : boolean\r\n}\r\n\r\n// Client unique id counter\r\nlet _cidCounter : number = 0;\r\n\r\n/***************************************************************\r\n * Model Definition as accepted by Model.define( definition )\r\n */\r\nexport interface ModelDefinition extends TransactionalDefinition {\r\n idAttribute? : string\r\n attributes? : AttributesValues\r\n collection? : object\r\n Collection? : typeof Transactional\r\n}\r\n\r\nexport type LinkedAttributes = LinkedModelHash>\r\nexport type AttributesMixin = ModelAttributes\r\n\r\n@define({\r\n // Default client id prefix \r\n cidPrefix : 'm',\r\n\r\n // Name of the change event\r\n _changeEventName : 'change',\r\n\r\n // Default id attribute name\r\n idAttribute : 'id'\r\n})\r\n@definitions({\r\n defaults : mixinRules.merge,\r\n attributes : mixinRules.merge,\r\n collection : mixinRules.merge,\r\n Collection : mixinRules.value,\r\n idAttribute : mixinRules.protoValue\r\n})\r\nexport class Model extends Transactional implements IOModel, AttributesContainer, Iterable {\r\n /** @internal */\r\n static _metatype = AggregatedType;\r\n\r\n // Hack\r\n static onDefine( definition, BaseClass ){}\r\n\r\n static comparator( this : T, attr : keyof InstanceType, asc = true ) : ( a : InstanceType, b : InstanceType ) => -1 | 0 | 1 {\r\n const { compare } = tools;\r\n return asc ? \r\n ( a, b ) => compare( a[ attr ], b[ attr ] ) :\r\n ( a, b ) => -compare( a[ attr ], b[ attr ] ) as any;\r\n }\r\n\r\n static Collection : CollectionConstructor;\r\n static DefaultCollection : CollectionConstructor;\r\n \r\n // Attribute type for the record id.\r\n static id = type( String ).value( null );\r\n \r\n // Lazy object reference, serializable as id.\r\n static get ref(){\r\n return type( this )\r\n .toJSON( x => x ? x.id : null )\r\n .parse( x => {\r\n return { [ this.prototype.idAttribute ] : x };\r\n });\r\n }\r\n\r\n static extendAttrs( this : T, attrs : A ) : AnonymousModelConstructor {\r\n return this.defaults( attrs ) as any;\r\n }\r\n\r\n static defaults( attrs : AttributesValues ) : typeof Model {\r\n return this.extend({ attributes : attrs }) as any;\r\n }\r\n \r\n static attributes : AttributesValues\r\n\r\n /** @internal */\r\n _attributes$ : object = void 0\r\n\r\n /** @internal */\r\n __Attributes$ : new ( model : Model ) => object\r\n\r\n /** @internal */\r\n get $() : object {\r\n return this._attributes$ || ( this._attributes$ = new this.__Attributes$( this ) )\r\n }\r\n\r\n /********************\r\n * IO Methods\r\n */\r\n /** @internal */\r\n _endpoints : { [ name : string ] : IOEndpoint }\r\n\r\n /***********************************\r\n * Core Members\r\n */\r\n previousAttributes(){ return new this.AttributesCopy( this._previousAttributes ); } \r\n\r\n // Polymorphic accessor for aggregated attribute's canBeUpdated().\r\n /** @internal */\r\n get __inner_state__(){ return this.attributes; }\r\n\r\n get changed(){\r\n let changed = this._changedAttributes;\r\n\r\n if( !changed ){\r\n const prev = this._previousAttributes;\r\n changed = {};\r\n\r\n const { attributes } = this;\r\n\r\n for( let attr of this._attributesArray ){\r\n const key = attr.name,\r\n value = attributes[ key ];\r\n\r\n if( attr.isChanged( value, prev[ key ] ) ){\r\n changed[ key ] = value;\r\n }\r\n }\r\n\r\n this._changedAttributes = changed;\r\n }\r\n\r\n return changed; \r\n }\r\n\r\n changedAttributes( diff? : {} ) : boolean | {} {\r\n if( !diff ) return this.hasChanged() ? { ...this.changed } : false;\r\n\r\n var val, changed : {} | boolean = false,\r\n old = this._transaction ? this._previousAttributes : this.attributes,\r\n attrSpecs = this._attributes;\r\n\r\n for( var attr in diff ){\r\n if( !attrSpecs[ attr ].isChanged( old[ attr ], ( val = diff[ attr ] ) ) ) continue;\r\n (changed || (changed = {}))[ attr ] = val;\r\n }\r\n\r\n return changed; \r\n }\r\n\r\n hasChanged( key? : string ) : boolean {\r\n const { _previousAttributes } = this;\r\n if( !_previousAttributes ) return false;\r\n\r\n return key ?\r\n this._attributes[ key ].isChanged( this.attributes[ key ], _previousAttributes[ key ] ) :\r\n !isEmpty( this.changed );\r\n }\r\n\r\n previous( key : string ) : any {\r\n if( key ){\r\n const { _previousAttributes } = this;\r\n if( _previousAttributes ) return _previousAttributes[ key ];\r\n }\r\n \r\n return null;\r\n }\r\n\r\n isNew() : boolean {\r\n return this.id == null;\r\n }\r\n\r\n has( key : string ) : boolean {\r\n return this[ key ] != void 0;\r\n }\r\n\r\n // Return attribute value, setting an attribute to undefined.\r\n // TODO: If attribute was aggregated, don't dispose it.\r\n unset( key : string, options? ) : any {\r\n const value = this[ key ];\r\n this.set({ [ key ] : void 0 }, { unset : true, ...options });\r\n return value;\r\n }\r\n\r\n // Undocumented. Move to NestedTypes?\r\n clear( options? ) : this {\r\n const nullify = options && options.nullify;\r\n\r\n this.transaction( () =>{\r\n this.forEach( ( value, key ) => this[ key ] = nullify ? null : void 0 );\r\n }, options );\r\n\r\n return this;\r\n }\r\n\r\n // Returns Model owner skipping collections. TODO: Move out\r\n getOwner() : Owner {\r\n const owner : any = this._owner;\r\n\r\n // If there are no key, owner must be transactional object, and it's the collection.\r\n // We don't expect that collection can be the member of collection, so we're skipping just one level up. An optimization.\r\n return this._ownerKey ? owner : owner && owner._owner;\r\n }\r\n\r\n /***********************************\r\n * Identity managements\r\n */\r\n\r\n // Id attribute name ('id' by default)\r\n idAttribute : string;\r\n\r\n // Fixed 'id' property pointing to id attribute\r\n get id() : string { return this.attributes[ this.idAttribute ]; }\r\n set id( x : string ){ setAttribute( this, this.idAttribute, x ); }\r\n\r\n /***********************************\r\n * Dynamically compiled stuff\r\n */\r\n\r\n // Attributes specifications\r\n /** @internal */\r\n _attributes : { [ key : string ] : AnyType }\r\n\r\n /** @internal */\r\n _attributesArray : AnyType[]\r\n\r\n // Attributes object copy constructor\r\n Attributes : AttributesConstructor\r\n AttributesCopy : AttributesCopyConstructor\r\n\r\n // Create record default values, optionally augmenting given values.\r\n defaults( values = {} ){\r\n const defaults = {},\r\n { _attributesArray } = this;\r\n\r\n for( let attr of _attributesArray ){\r\n const key = attr.name,\r\n value = values[ key ];\r\n\r\n defaults[ key ] = value === void 0 ? attr.defaultValue() : value;\r\n }\r\n\r\n return defaults;\r\n }\r\n\r\n /***************************************************\r\n * Model construction\r\n */\r\n // Create record, optionally setting an owner\r\n constructor( a_values? : any, a_options? : ConstructorOptions ){\r\n super( _cidCounter++ );\r\n this.attributes = {};\r\n \r\n const options = a_options || {},\r\n values = ( options.parse ? this.parse( a_values, options ) : a_values ) || {};\r\n\r\n isProduction || typeCheck( this, values, options );\r\n\r\n this._previousAttributes = this.attributes = new this.Attributes( this, values, options );\r\n\r\n this.initialize( a_values, a_options );\r\n\r\n if( this._localEvents ) this._localEvents.subscribe( this, this );\r\n }\r\n\r\n // Initialization callback, to be overriden by the subclasses \r\n initialize( values? : Partial, options? ){}\r\n\r\n // Deeply clone record, optionally setting new owner.\r\n clone( options : CloneOptions = {} ) : this {\r\n const copy : this = new (this.constructor)( this.attributes, { clone : true } );\r\n \r\n if( options.pinStore ) copy._defaultStore = this.getStore();\r\n\r\n return copy;\r\n }\r\n\r\n /** @internal */\r\n _validateNested( errors : ChildrenErrors ) : number {\r\n var length = 0;\r\n\r\n const { attributes } = this;\r\n\r\n for( let attribute of this._attributesArray ){\r\n const { name } = attribute,\r\n error = attribute.validate( this, attributes[ name ], name );\r\n\r\n if( error ){\r\n errors[ name ] = error;\r\n length++;\r\n }\r\n }\r\n\r\n return length;\r\n }\r\n\r\n // Get attribute by key\r\n get( key : string ) : any {\r\n return this[ key ];\r\n }\r\n\r\n // Apply bulk in-place object update in scope of ad-hoc transaction \r\n set( values : any, options? : TransactionOptions ) : this {\r\n if( values ){ \r\n const transaction = this._createTransaction( values, options );\r\n transaction && transaction.commit();\r\n }\r\n\r\n return this;\r\n }\r\n\r\n /**\r\n * Serialization control\r\n */\r\n\r\n // Default record-level serializer, to be overriden by subclasses \r\n toJSON( options? : TransactionOptions ) : any {\r\n const json = {},\r\n { attributes } = this;\r\n\r\n for( let attribute of this._attributesArray ){\r\n const { name } = attribute,\r\n value = attributes[ name ];\r\n\r\n if( value !== void 0 ){\r\n // ...serialize it according to its spec.\r\n const asJson = attribute.toJSON.call( this, value, name, options );\r\n\r\n // ...skipping undefined values. Such an attributes are excluded.\r\n if( asJson !== void 0 ) json[ name ] = asJson; \r\n }\r\n }\r\n\r\n return json;\r\n }\r\n \r\n // Default record-level parser, to be overriden by the subclasses.\r\n parse( data, options? : TransactionOptions ){\r\n return data;\r\n }\r\n\r\n /**\r\n * Transactional control\r\n */\r\n deepSet( name : string, value : any, options? : any ){\r\n // Operation might involve series of nested object updates, thus it's wrapped in transaction.\r\n this.transaction( () => {\r\n const path = name.split( '.' ),\r\n l = path.length - 1,\r\n attr = path[ l ];\r\n\r\n let model = this;\r\n\r\n // Locate the model, traversing the path.\r\n for( let i = 0; i < l; i++ ){\r\n const key = path[ i ];\r\n\r\n // There might be collections in path, so use `get`.\r\n let next = model.get ? model.get( key ) : model[ key ];\r\n\r\n // Create models, if they are not exist.\r\n if( !next ){\r\n const attrSpecs = model._attributes;\r\n if( attrSpecs ){\r\n // If current object is model, create default attribute\r\n var newModel = attrSpecs[ key ].create();\r\n\r\n // If created object is model, nullify attributes when requested\r\n if( options && options.nullify && newModel._attributes ){\r\n newModel.clear( options );\r\n }\r\n\r\n model[ key ] = next = newModel;\r\n }\r\n // Silently fail in other case.\r\n else return;\r\n }\r\n \r\n model = next;\r\n }\r\n\r\n // Set model attribute.\r\n if( model.set ){\r\n model.set({ [ attr ] : value }, options );\r\n }\r\n else{\r\n model[ attr ] = value;\r\n }\r\n });\r\n\r\n return this\r\n }\r\n \r\n // Returns owner without the key (usually it's collection)\r\n get collection() : any {\r\n return this._ownerKey ? null : this._owner;\r\n }\r\n\r\n // Dispose object and all childrens\r\n dispose(){\r\n if( this._disposed ) return;\r\n\r\n const { attributes } = this;\r\n\r\n for( let attr of this._attributesArray ){\r\n attr.dispose( this, attributes[ attr.name ] );\r\n }\r\n \r\n super.dispose();\r\n }\r\n\r\n /** @internal */\r\n _log( level : LogLevel, topic: string, text : string, props : object, a_logger? : Logger ) : void {\r\n ( a_logger || logger ).trigger( level, topic, this.getClassName() + ' ' + text, {\r\n ...props,\r\n 'Model' : this,\r\n 'Attributes definition' : this._attributes\r\n });\r\n }\r\n\r\n getClassName() : string {\r\n return super.getClassName() || 'Model';\r\n }\r\n\r\n /** @internal */\r\n _createTransaction( values : object, options : TransactionOptions ) : Transaction { return void 0; }\r\n // Simulate attribute change \r\n forceAttributeChange : ( key : string, options : TransactionOptions ) => void\r\n\r\n /** @internal */\r\n _onChildrenChange : ( child : Transactional, options : TransactionOptions ) => void\r\n\r\n\r\n /**\r\n * Map methods\r\n */\r\n\r\n forEach( iteratee : ( value? : any, key? : string ) => void, context? : any ){\r\n const fun = context !== void 0 ? ( v, k ) => iteratee.call( context, v, k ) : iteratee,\r\n { attributes } = this;\r\n\r\n for( const key in this.attributes ){\r\n const value = attributes[ key ];\r\n if( value !== void 0 ) fun( value, key );\r\n }\r\n }\r\n\r\n mapObject( a_fun : ( value, key ) => any, context? : any ) : object {\r\n const fun = context === void 0 ? a_fun : a_fun.bind( context );\r\n return tools.transform( {}, this.attributes, fun );\r\n }\r\n\r\n [ Symbol.iterator ](){\r\n return new ModelEntriesIterator( this );\r\n }\r\n\r\n entries(){\r\n return new ModelEntriesIterator( this );\r\n }\r\n\r\n // Get array of attribute keys (Model) or record ids (Collection) \r\n keys() : string[] {\r\n const keys : string[] = [];\r\n\r\n this.forEach( ( value, key ) => keys.push( key ) );\r\n\r\n return keys;\r\n }\r\n};\r\n\r\nexport interface Model extends IOModel {}\r\nexport interface Model extends AttributesContainer {}\r\n\r\n\r\nassign( Model.prototype, UpdateModelMixin, IOModelMixin );\r\n\r\n/***********************************************\r\n * Helper functions\r\n */\r\n\r\nclass BaseModelAttributes {\r\n id : string\r\n\r\n constructor( record : Model, x : AttributesValues, options : TransactionOptions ) {\r\n this.id = x.id;\r\n }\r\n}\r\n\r\nModel.prototype.Attributes = BaseModelAttributes;\r\n\r\nclass BaseModelAttributesCopy {\r\n id : string\r\n\r\n constructor( x : AttributesValues ) {\r\n this.id = x.id;\r\n }\r\n}\r\n\r\nModel.prototype.AttributesCopy = BaseModelAttributesCopy;\r\n\r\nconst IdAttribute = AnyType.create({ value : void 0 }, 'id' );\r\nModel.prototype._attributes = { id : IdAttribute };\r\nModel.prototype._attributesArray = [ IdAttribute ];\r\n\r\nfunction typeCheck( record : Model, values : object, options ){\r\n if( shouldBeAnObject( record, values, options ) ){\r\n const { _attributes } = record;\r\n let unknown : string[];\r\n\r\n for( let name in values ){\r\n if( !_attributes[ name ] ){\r\n unknown || ( unknown = [] );\r\n unknown.push( `'${ name }'` );\r\n }\r\n }\r\n\r\n if( unknown ){\r\n unknownAttrsWarning( record, unknown, { values }, options );\r\n }\r\n }\r\n}\r\n\r\nexport class ModelEntriesIterator implements Iterator<[string, any]> {\r\n private idx = 0;\r\n \r\n constructor( private readonly record : Model){}\r\n\r\n next() : IteratorResult<[string, any]> {\r\n const { record } = this,\r\n metatype = record._attributesArray[ this.idx++ ];\r\n\r\n return {\r\n done : !metatype,\r\n value : metatype ? [ metatype.name, record[ metatype.name ] ] : void 0\r\n };\r\n }\r\n}","import { define, mixins, predefine, tools } from '@type-r/mixture';\r\nimport { Transactional } from '../transactions';\r\nimport { type } from './attrDef';\r\nimport { AnonimousModelDefinition, AnonymousAttributes, MergeModelConstructors, parseAnonimousModelDefinition } from './define';\r\nimport { addAttributeLinks } from './linked-attrs';\r\nimport { createAttributesMixin } from './mixin';\r\nimport { Model, ModelDefinition } from './model';\r\nexport { collection, metadata, AnonymousModelConstructor, InferAttrs } from './define'\r\nexport * from './attrDef';\r\nexport * from './metatypes';\r\nexport { AttributesMixin, LinkedAttributes } from './model';\r\nexport { Model };\r\n\r\nconst { assign, defaults } = tools;\r\n\r\nexport function attributes( b1 : B1, b2 : B2, b3 : B3, attrDefs : D ) : MergeModelConstructors,B3>,AnonymousAttributes>\r\nexport function attributes( b1 : B1, b2 : B2, attrDefs : D ) : MergeModelConstructors,AnonymousAttributes>\r\nexport function attributes( b1 : B1, attrDefs : D ) : MergeModelConstructors>;\r\nexport function attributes( attrDefs : D ) : AnonymousAttributes;\r\nexport function attributes( ...models : any[] ){\r\n const last = parseAnonimousModelDefinition( models[ models.length - 1 ] ),\r\n First = models.length > 1 ? models[ 0 ] : null,\r\n toMix = models.length > 2 ? models.slice( 1, models.length - 1 ) : null;\r\n\r\n class AnonimousModel extends ( First || Model ){\r\n }\r\n\r\n toMix && mixins( toMix )(AnonimousModel);\r\n define( last )( AnonimousModel );\r\n\r\n return AnonimousModel as any;\r\n}\r\n\r\nModel.onExtend = function( this : typeof Model, BaseClass : typeof Model ){\r\n Transactional.onExtend.call( this, BaseClass );\r\n\r\n // Create the default collection\r\n const Class = this;\r\n\r\n @predefine class DefaultCollection extends BaseClass.Collection {\r\n static model = Class;\r\n }\r\n\r\n this.DefaultCollection = DefaultCollection;\r\n\r\n // If there are no collection defined in statics, use the default collection.\r\n // It will appear in onDefine's definition, overriding all other settings.\r\n if( Class.Collection === BaseClass.Collection ){\r\n this.Collection = DefaultCollection;\r\n }\r\n}\r\n\r\nModel.onDefine = function( definition : ModelDefinition, BaseClass : typeof Model ){\r\n const baseProto : Model = BaseClass.prototype;\r\n\r\n // Compile attributes spec, creating definition mixin.\r\n const { properties, _localEvents, ...dynamicMixin } = createAttributesMixin( this.attributes = getAttributes( definition ), baseProto._attributes );\r\n assign( this.prototype, dynamicMixin );\r\n \r\n definition.properties = defaults( definition.properties || {}, properties );\r\n definition._localEvents = _localEvents;\r\n \r\n Transactional.onDefine.call( this, definition, BaseClass );\r\n\r\n // Finalize the definition of the default collection.\r\n this.DefaultCollection.define( definition.collection || {} );\r\n\r\n // assign collection from the definition.\r\n this.Collection = definition.Collection;\r\n this.Collection.prototype.model = this;\r\n\r\n if( definition.endpoint ) this.Collection.prototype._endpoint = definition.endpoint;\r\n\r\n addAttributeLinks( this );\r\n}\r\n\r\nfunction getAttributes({ defaults, attributes, idAttribute } : ModelDefinition ) {\r\n const definition = attributes || defaults || {};\r\n \r\n // If there is an undeclared idAttribute, add its definition as untyped generic attribute.\r\n if( idAttribute && !( idAttribute in definition ) ){\r\n definition[ idAttribute ] = void 0;\r\n }\r\n\r\n return definition;\r\n}\r\n\r\ndeclare var Reflect;\r\n\r\nexport function auto( value : any ) : PropertyDecorator;\r\nexport function auto( proto : object, attrName : string ) : void;\r\nexport function auto( proto, attrName? : string ) : any {\r\n if( typeof Reflect !== 'undefined' && Reflect.getMetadata ){\r\n if( attrName ){\r\n type( Reflect.getMetadata( \"design:type\", proto, attrName ) ).as( proto, attrName );\r\n }\r\n else{\r\n const value = proto;\r\n return ( proto : object, attrName : string ) : void => {\r\n type( Reflect.getMetadata( \"design:type\", proto, attrName ) ).value( value ).as( proto, attrName );\r\n }\r\n } \r\n }\r\n else{\r\n proto._log( 'error', 'Type-R:MissingImport', 'Add import \"reflect-metadata\"; as the first line of your app.' );\r\n } \r\n}","import { eventsApi, Logger } from '@type-r/mixture';\r\nimport { Model } from '../model';\r\nimport { ItemsBehavior, Owner, Transaction, Transactional, transactionApi, TransactionOptions } from '../transactions';\r\n\r\n\r\nconst { trigger2, trigger3, on, off } = eventsApi,\r\n { commit } = transactionApi,\r\n _aquire = transactionApi.aquire, _free = transactionApi.free;\r\n\r\n/** @private */\r\nexport interface CollectionCore extends Transactional, Owner {\r\n /** @internal */\r\n _byId : IdIndex\r\n\r\n models : Model[]\r\n model : typeof Model\r\n idAttribute : string // TODO: Refactor inconsistent idAttribute usage\r\n \r\n /** @internal */\r\n _comparator : Comparator\r\n \r\n get( objOrId : string | Model | Object ) : Model \r\n \r\n /** @internal */\r\n _itemEvents? : eventsApi.EventMap\r\n /** @internal */\r\n _shared : number\r\n /** @internal */\r\n _aggregationError : Model[]\r\n /** @internal */\r\n _log( level : string, topic : string, text : string, value : any, logger : Logger ) : void\r\n}\r\n\r\n// Collection's manipulation methods elements\r\nexport type Elements = ( Object | Model )[];\r\n\r\nexport interface CollectionOptions extends TransactionOptions {\r\n sort? : boolean\r\n}\r\n\r\nexport type Comparator = ( a : Model, b : Model ) => number; \r\n\r\n/** @private */\r\nexport function dispose( collection : CollectionCore ) : Model[]{\r\n const { models } = collection;\r\n\r\n collection.models = [];\r\n collection._byId = {};\r\n\r\n freeAll( collection, models );\r\n return models;\r\n}\r\n\r\n/** @private */\r\nexport function convertAndAquire( collection : CollectionCore, attrs : {} | Model, options : CollectionOptions ){\r\n const { model } = collection;\r\n \r\n let record : Model;\r\n\r\n if( collection._shared ){\r\n record = attrs instanceof model ? attrs : model.create( attrs, options );\r\n\r\n if( collection._shared & ItemsBehavior.listen ){\r\n on( record, record._changeEventName, collection._onChildrenChange, collection );\r\n }\r\n }\r\n else{\r\n record = attrs instanceof model ? ( options.merge ? attrs.clone() : attrs ) : model.create( attrs, options );\r\n\r\n if( record._owner ){\r\n if( record._owner !== collection ){\r\n _aquire( collection, record.clone() );\r\n const errors = collection._aggregationError || ( collection._aggregationError = [] );\r\n errors.push( record );\r\n }\r\n }\r\n else{\r\n _aquire( collection, record ); \r\n }\r\n } \r\n\r\n // Subscribe for events...\r\n const { _itemEvents } = collection;\r\n _itemEvents && _itemEvents.subscribe( collection, record );\r\n\r\n return record;\r\n}\r\n\r\n/** @private */\r\nexport function free( owner : CollectionCore, child : Model, unset? : boolean ) : void {\r\n if( owner._shared ){\r\n if( owner._shared & ItemsBehavior.listen ){\r\n off( child, child._changeEventName, owner._onChildrenChange, owner );\r\n }\r\n }\r\n else{\r\n _free( owner, child );\r\n unset || child.dispose();\r\n }\r\n\r\n const { _itemEvents } = owner;\r\n _itemEvents && _itemEvents.unsubscribe( owner, child );\r\n}\r\n\r\n/** @private */\r\nexport function freeAll( collection : CollectionCore, children : Model[] ) : Model[] {\r\n for( let child of children ){\r\n free( collection, child );\r\n }\r\n\r\n return children;\r\n}\r\n\r\n/**\r\n * Silently sort collection, if its required. Returns true if sort happened.\r\n * @private\r\n */ \r\nexport function sortElements( collection : CollectionCore, options : CollectionOptions ) : boolean {\r\n let { _comparator } = collection;\r\n if( _comparator && options.sort !== false ){\r\n collection.models.sort( _comparator );\r\n return true;\r\n }\r\n\r\n return false;\r\n}\r\n\r\n/**********************************\r\n * Collection Index\r\n * @private \r\n */\r\nexport interface IdIndex {\r\n [ id : string ] : Model\r\n}\r\n\r\n/** @private Add record */ \r\nexport function addIndex( index : IdIndex, model : Model ) : void {\r\n index[ model.cid ] = model;\r\n var id = model.id;\r\n \r\n if( id || ( id as any ) === 0 ){\r\n index[ id ] = model;\r\n }\r\n}\r\n\r\n/** @private Remove record */ \r\nexport function removeIndex( index : IdIndex, model : Model ) : void {\r\n delete index[ model.cid ];\r\n var id = model.id;\r\n if( id || ( id as any ) === 0 ){\r\n delete index[ id ];\r\n }\r\n}\r\n\r\nexport function updateIndex( index : IdIndex, model : Model ){\r\n delete index[ model.previous( model.idAttribute ) ];\r\n\r\n const { id } = model;\r\n id == null || ( index[ id ] = model );\r\n}\r\n\r\n/***\r\n * In Collections, transactions appears only when\r\n * add remove or change events might be emitted.\r\n * reset doesn't require transaction.\r\n * \r\n * Transaction holds information regarding events, and knows how to emit them.\r\n * \r\n * Two major optimization cases.\r\n * 1) Population of an empty collection\r\n * 2) Update of the collection (no or little changes) - it's crucial to reject empty transactions.\r\n */\r\n\r\n\r\n// Transaction class. Implements two-phase transactions on object's tree.\r\n/** @private */ \r\nexport class CollectionTransaction implements Transaction {\r\n // open transaction\r\n constructor( public object : CollectionCore,\r\n public isRoot : boolean,\r\n public added : Model[],\r\n public removed : Model[],\r\n public nested : Transaction[],\r\n public sorted : boolean ){}\r\n\r\n // commit transaction\r\n commit( initiator? : Transactional ){\r\n const { nested, object } = this,\r\n { _isDirty } = object;\r\n\r\n // Commit all nested transactions...\r\n for( let transaction of nested ){\r\n transaction.commit( object );\r\n }\r\n\r\n if( object._aggregationError ){\r\n logAggregationError( object, _isDirty );\r\n }\r\n\r\n // Just trigger 'change' on collection, it must be already triggered for models during nested commits.\r\n // ??? TODO: do it in nested transactions loop? This way appears to be more correct. \r\n for( let transaction of nested ){\r\n trigger2( object, 'change', transaction.object, _isDirty );\r\n }\r\n\r\n // Notify listeners on attribute changes...\r\n const { added, removed } = this;\r\n\r\n // Trigger `add` events for both model and collection.\r\n for( let record of added ){\r\n trigger3( record, 'add', record, object, _isDirty );\r\n trigger3( object, 'add', record, object, _isDirty );\r\n }\r\n\r\n // Trigger `remove` events for both model and collection.\r\n for( let record of removed ){\r\n trigger3( record, 'remove', record, object, _isDirty );\r\n trigger3( object, 'remove', record, object, _isDirty );\r\n }\r\n\r\n if( this.sorted ){\r\n trigger2( object, 'sort', object, _isDirty );\r\n }\r\n\r\n if( added.length || removed.length ){\r\n trigger2( object, 'update', object, _isDirty );\r\n }\r\n\r\n this.isRoot && commit( object, initiator );\r\n }\r\n}\r\n\r\nexport function logAggregationError( collection : CollectionCore, options : TransactionOptions ){\r\n collection._log( 'warn', 'Type-R:InvalidOwner', 'added records already have an owner and were cloned. Use explicit record.clone() to dismiss this warning.', collection._aggregationError, options.logger );\r\n collection._aggregationError = void 0;\r\n}","import { Model } from '../model';\r\nimport { Transaction, transactionApi } from '../transactions';\r\nimport { addIndex, CollectionCore, CollectionOptions, CollectionTransaction, convertAndAquire, logAggregationError, sortElements, updateIndex } from './commons';\r\n\r\nconst { begin, commit, markAsDirty } = transactionApi;\r\n\r\nexport interface AddOptions extends CollectionOptions {\r\n at? : number \r\n}\r\n\r\n/** @private */\r\nexport function addTransaction( collection : CollectionCore, items : any[], options : AddOptions, merge? : boolean ){\r\n const isRoot = begin( collection ),\r\n nested : Transaction[]= [];\r\n\r\n var added = appendElements( collection, items, nested, options, merge );\r\n\r\n if( added.length || nested.length ){\r\n let needSort = sortOrMoveElements( collection, added, options );\r\n if( markAsDirty( collection, options ) ){\r\n return new CollectionTransaction( collection, isRoot, added, [], nested, needSort );\r\n }\r\n\r\n if( collection._aggregationError ) logAggregationError( collection, options );\r\n }\r\n\r\n // No changes...\r\n isRoot && commit( collection );\r\n};\r\n\r\n// Handle sort or insert at options for add operation. Reurns true if sort happened.\r\n/** @private */ \r\nfunction sortOrMoveElements( collection : CollectionCore, added : Model[], options : AddOptions ) : boolean {\r\n let at = options.at;\r\n\r\n // if `at` option is given, it overrides sorting option...\r\n if( at != null ){\r\n // Take an original collection's length. \r\n const length = collection.models.length - added.length;\r\n\r\n // Crazy Backbone rules about `at` index. I don't know what that guys smoke.\r\n at = Number( at );\r\n if( at < 0 ) at += length + 1;\r\n if( at < 0 ) at = 0;\r\n if( at > length ) at = length;\r\n\r\n // Move added elements to desired position. In place.\r\n moveElements( collection.models, at, added );\r\n return false;\r\n }\r\n\r\n return sortElements( collection, options );\r\n}\r\n\r\n/** @private */\r\nfunction moveElements( source : any[], at : number, added : any[] ) : void {\r\n for( var j = source.length - 1, i = j - added.length; i >= at; i--, j-- ){\r\n source[ j ] = source[ i ];\r\n }\r\n\r\n for( i = 0, j = at; i < added.length; i++, j++ ){\r\n source[ j ] = added[ i ];\r\n }\r\n}\r\n\r\n// append data to model and index\r\n/** @private */\r\nfunction appendElements( collection : CollectionCore, a_items : any[], nested : Transaction[], a_options : AddOptions, forceMerge : boolean ){\r\n var { _byId, models } = collection,\r\n merge = ( forceMerge || a_options.merge ) && !collection._shared,\r\n parse = a_options.parse,\r\n idAttribute = collection.model.prototype.idAttribute,\r\n prevLength = models.length;\r\n\r\n for( const item of a_items ){\r\n let model = item ? _byId[ item[ idAttribute ] ] || _byId[ item.cid ] : null;\r\n\r\n if( model ){\r\n if( merge && item !== model ){\r\n var attrs = item.attributes || item;\r\n const transaction = model._createTransaction( attrs, a_options );\r\n transaction && nested.push( transaction );\r\n\r\n if( model.hasChanged( idAttribute ) ){\r\n updateIndex( _byId, model );\r\n }\r\n }\r\n }\r\n else{\r\n model = convertAndAquire( collection, item, a_options );\r\n models.push( model );\r\n addIndex( _byId, model );\r\n }\r\n }\r\n\r\n return models.slice( prevLength );\r\n}\r\n","import { Model } from '../model'\r\n\r\nexport type Predicate = ( ( val : R, key? : number ) => boolean ) | Partial;\r\n\r\n/**\r\n * Optimized array methods.\r\n */\r\nexport abstract class ArrayMixin {\r\n models : R[]\r\n abstract get( modelOrId : string | Partial ) : R;\r\n\r\n /**\r\n * Map and optionally filter the collection.\r\n * @param mapFilter filter an element out if `undefined` is returned \r\n * @param context optional `this` for `mapFilter`\r\n */\r\n map( mapFilter : ( val : R, key? : number ) => T, context? : any ) : T[]{\r\n const { models } = this,\r\n { length } = models,\r\n res = Array( length ),\r\n fun = context ? mapFilter.bind( context ) : mapFilter;\r\n\r\n for( var i = 0, j = 0; i < length; i++ ){\r\n const val = fun( models[ i ], i );\r\n val === void 0 || ( res[ j++ ] = val );\r\n }\r\n\r\n if( i !== j ){\r\n res.length = j;\r\n }\r\n\r\n return res;\r\n }\r\n\r\n /**\r\n * Iterate through the collection.\r\n * @param context optional `this` for `iteratee`.\r\n */\r\n each( fun : ( val : R, key? : number ) => any, context? : any ) : void {\r\n const { models } = this,\r\n { length } = models,\r\n iteratee = context ? fun.bind( context ) : fun;\r\n\r\n for( let i = 0; i < length; i++ ){\r\n iteratee( models[ i ], i );\r\n }\r\n }\r\n\r\n /**\r\n * Iterate through collection optionally returning the value.\r\n * @param doWhile break the loop if anything but `undefined` is returned, and return this value.\r\n * @param context optional `this` for `doWhile`.\r\n */\r\n firstMatch( doWhile : ( val : R, key? : number ) => T ) : T\r\n firstMatch( doWhile : ( this : C, val : R, key? : number ) => T, context : C ) : T\r\n firstMatch( doWhile : ( val : R, key? : number ) => T, context? : any ) : T {\r\n const { models } = this,\r\n { length } = models,\r\n iteratee = context ? doWhile.bind( context ) : doWhile;\r\n\r\n for( let i = 0; i < length; i++ ){\r\n const res = iteratee( models[ i ], i );\r\n if( res !== void 0 ) return res;\r\n }\r\n }\r\n\r\n /**\r\n * Proxy for the `array.reduce()`\r\n * @param iteratee \r\n */\r\n reduce( iteratee : (previousValue: R, currentValue: R, currentIndex?: number ) => R ) : R\r\n reduce( iteratee : (previousValue: T, currentValue: R, currentIndex?: number ) => T, init? : any ) : T\r\n reduce( iteratee : (previousValue: any, currentValue: any, currentIndex?: number ) => any, init? : any ) : T | R {\r\n return init === void 0 ? this.models.reduce( iteratee ) : this.models.reduce( iteratee, init );\r\n }\r\n\r\n // Slice out a sub-array of models from the collection.\r\n slice( begin? : number, end? : number ) : R[] {\r\n return this.models.slice( begin, end );\r\n }\r\n \r\n indexOf( modelOrId : string | Partial ) : number {\r\n return this.models.indexOf( this.get( modelOrId ) );\r\n }\r\n\r\n includes( idOrObj : string | Partial ) : boolean {\r\n return Boolean( this.get( idOrObj ) );\r\n }\r\n\r\n filter( iteratee : Predicate, context? : any ) : R[] {\r\n const fun = toPredicateFunction( iteratee );\r\n return this.map( m => fun( m ) ? m : void 0, context );\r\n }\r\n\r\n find( iteratee : Predicate, context? : any ) : R {\r\n const fun = toPredicateFunction( iteratee );\r\n return this.firstMatch( m => fun( m ) ? m : void 0, context );\r\n }\r\n\r\n some( iteratee : Predicate, context? : any ) : boolean {\r\n return Boolean( this.find( iteratee, context ) );\r\n }\r\n\r\n forEach( iteratee : ( val : R, key? : number ) => void, context? : any ) : void {\r\n this.each( iteratee, context );\r\n }\r\n\r\n values() : IterableIterator {\r\n return this.models.values();\r\n }\r\n\r\n entries() : IterableIterator<[ number, R ]>{\r\n return this.models.entries();\r\n }\r\n\r\n every( iteratee : Predicate, context? : any ) : boolean {\r\n const fun = toPredicateFunction( iteratee );\r\n return this.firstMatch( m => fun( m ) ? void 0 : false, context ) === void 0;\r\n }\r\n\r\n pluck( key : K ) : R[K][] {\r\n return this.map( model => model[ key ] );\r\n }\r\n\r\n first() : R { return this.models[ 0 ]; }\r\n\r\n last() : R { return this.models[ this.models.length - 1 ]; }\r\n\r\n at( a_index : number ) : R {\r\n const index = a_index < 0 ? a_index + this.models.length : a_index; \r\n return this.models[ index ];\r\n }\r\n\r\n groupBy( attr : keyof R | (( m : R ) => string )) : { [ key : string ] : R[] };\r\n groupBy(\r\n attr : keyof R | (( m : R ) => string ),\r\n a_reducer : ( acc : A, model? : R, key? : string ) => A\r\n ) : { [ key : string ] : A };\r\n groupBy(\r\n attr : keyof R | (( m : R ) => string ),\r\n a_reducer? : ( acc : A, model? : R, key? : string ) => A\r\n ){\r\n const map : any = typeof attr === 'string' ?\r\n x => x[ attr ] :\r\n attr;\r\n\r\n const reducer = a_reducer || defaultGrouping;\r\n\r\n const results = {};\r\n\r\n for( let model of this.models ){\r\n const key = map( model );\r\n if( key != null ){\r\n results[ key ] = reducer( results[ key ], model, key );\r\n }\r\n }\r\n\r\n return results;\r\n }\r\n}\r\n\r\nconst defaultGrouping = ( acc = [], x ) => ( acc.push( x ), acc );\r\n\r\nconst noOp = x => x;\r\n\r\nfunction toPredicateFunction( iteratee : Predicate ){\r\n if( iteratee == null ) return noOp;\r\n\r\n switch( typeof iteratee ){\r\n case 'function' : return iteratee;\r\n case 'object' :\r\n const keys = Object.keys( iteratee );\r\n \r\n return x => {\r\n for( let key of keys ){\r\n if( iteratee[ key ] !== x[ key ] )\r\n return false;\r\n }\r\n\r\n return true;\r\n }\r\n default : throw new Error( 'Invalid iteratee' );\r\n }\r\n}","/*************\r\n * Remove items from collections.\r\n * \r\n * Cannot be a part of two-phase transaction on object tree.\r\n * Can be executed in the scope of ad-hoc transaction or from the trigger, though.\r\n *\r\n * Implemented with low-level API. \r\n * Most frequent operation - single element remove. Thus, it have the fast-path.\r\n */\r\n\r\nimport { eventsApi } from '@type-r/mixture';\r\nimport { Model } from '../model';\r\nimport { transactionApi, TransactionOptions } from '../transactions';\r\nimport { CollectionCore, CollectionTransaction, free, removeIndex } from './commons';\r\n\r\nconst { trigger2, trigger3 } = eventsApi,\r\n { markAsDirty, begin, commit } = transactionApi;\r\n\r\n/** @private */\r\nexport function removeOne( collection : CollectionCore, el : Model | {} | string, options : TransactionOptions ) : Model {\r\n var model : Model = collection.get( el );\r\n\r\n if( model ){\r\n const isRoot = begin( collection ),\r\n models = collection.models;\r\n\r\n // Remove model form the collection. \r\n models.splice( models.indexOf( model ), 1 );\r\n removeIndex( collection._byId, model );\r\n \r\n // Mark transaction as dirty. \r\n const notify = markAsDirty( collection, options );\r\n\r\n // Send out events.\r\n if( notify ){\r\n trigger3( model, 'remove', model, collection, options );\r\n trigger3( collection, 'remove', model, collection, options );\r\n } \r\n\r\n free( collection, model, options.unset );\r\n\r\n notify && trigger2( collection, 'update', collection, options );\r\n\r\n // Commit transaction.\r\n isRoot && commit( collection );\r\n\r\n return model;\r\n }\r\n};\r\n\r\n/** Optimized for removing many elements\r\n * 1. Remove elements from the index, checking for duplicates\r\n * 2. Create new models array matching index\r\n * 3. Send notifications and remove references\r\n */\r\n\r\n/** @private */\r\nexport function removeMany( collection : CollectionCore, toRemove : any[], options ){\r\n const removed = _removeFromIndex( collection, toRemove, options.unset );\r\n if( removed.length ){\r\n const isRoot = begin( collection );\r\n\r\n _reallocate( collection, removed.length );\r\n\r\n if( markAsDirty( collection, options ) ){\r\n const transaction = new CollectionTransaction( collection, isRoot, [], removed, [], false );\r\n transaction.commit();\r\n }\r\n else{\r\n // Commit transaction.\r\n isRoot && commit( collection );\r\n }\r\n }\r\n\r\n return removed;\r\n};\r\n\r\n// remove models from the index...\r\n/** @private */\r\nfunction _removeFromIndex( collection, toRemove, unset : boolean ){\r\n var removed = Array( toRemove.length ),\r\n _byId = collection._byId;\r\n\r\n for( var i = 0, j = 0; i < toRemove.length; i++ ){\r\n var model = collection.get( toRemove[ i ] );\r\n if( model ){\r\n removed[ j++ ] = model;\r\n removeIndex( _byId, model );\r\n free( collection, model, unset );\r\n }\r\n }\r\n\r\n removed.length = j;\r\n\r\n return removed;\r\n}\r\n\r\n// Allocate new models array removing models not present in the index.\r\n/** @private */\r\nfunction _reallocate( collection, removed ){\r\n var prev = collection.models,\r\n models = collection.models = Array( prev.length - removed ),\r\n _byId = collection._byId;\r\n\r\n for( var i = 0, j = 0; i < prev.length; i++ ){\r\n var model = prev[ i ];\r\n\r\n if( _byId[ model.cid ] ){\r\n models[ j++ ] = model;\r\n }\r\n }\r\n\r\n models.length = j;\r\n}","import { Model } from '../model';\r\nimport { Transaction, transactionApi } from '../transactions';\r\nimport { addIndex, CollectionCore, CollectionOptions, CollectionTransaction, convertAndAquire, Elements, free, freeAll, IdIndex, logAggregationError, sortElements } from './commons';\r\n\r\nconst { begin, commit, markAsDirty } = transactionApi;\r\n\r\n/** @private */\r\nconst silentOptions = { silent : true };\r\n\r\n/** @private */\r\nexport function emptySetTransaction( collection : CollectionCore, items : Elements, options : CollectionOptions, silent? : boolean ){\r\n const isRoot = begin( collection );\r\n\r\n const added = _reallocateEmpty( collection, items, options );\r\n\r\n if( added.length ){\r\n const needSort = sortElements( collection, options );\r\n\r\n if( markAsDirty( collection, silent ? silentOptions : options ) ){\r\n // 'added' is the reference to this.models. Need to copy it.\r\n return new CollectionTransaction( collection, isRoot, added.slice(), [], [], needSort );\r\n }\r\n\r\n if( collection._aggregationError ) logAggregationError( collection, options );\r\n }\r\n\r\n // No changes...\r\n isRoot && commit( collection );\r\n};\r\n\r\n/** @private */\r\nexport function setTransaction( collection, items, options ){\r\n const isRoot = begin( collection ),\r\n nested = [];\r\n\r\n var previous = collection.models,\r\n added = _reallocate( collection, items, nested, options );\r\n\r\n const reusedCount = collection.models.length - added.length,\r\n removed = reusedCount < previous.length ? (\r\n reusedCount ? _garbageCollect( collection, previous ) :\r\n freeAll( collection, previous )\r\n ) : []; \r\n \r\n const addedOrChanged = nested.length || added.length,\r\n // As we are reallocating models array, it needs to be sorted even if there are no changes.\r\n sorted = ( sortElements( collection, options ) && addedOrChanged ) || added.length || options.sorted;\r\n\r\n if( addedOrChanged || removed.length || sorted ){\r\n if( markAsDirty( collection, options ) ){ \r\n return new CollectionTransaction( collection, isRoot, added, removed, nested, sorted );\r\n }\r\n\r\n if( collection._aggregationError ) logAggregationError( collection, options );\r\n }\r\n\r\n isRoot && commit( collection );\r\n};\r\n\r\n// Remove references to all previous elements, which are not present in collection.\r\n// Returns an array with removed elements.\r\n/** @private */\r\nfunction _garbageCollect( collection : CollectionCore, previous : Model[] ) : Model[]{\r\n const { _byId } = collection,\r\n removed = [];\r\n\r\n // Filter out removed models and remove them from the index...\r\n for( let record of previous ){\r\n if( !_byId[ record.cid ] ){\r\n removed.push( record );\r\n free( collection, record );\r\n }\r\n }\r\n\r\n return removed;\r\n}\r\n\r\n// reallocate model and index\r\n/** @private */\r\nfunction _reallocate( collection : CollectionCore, source : any[], nested : Transaction[], options ){\r\n var models = Array( source.length ),\r\n _byId : IdIndex = {},\r\n merge = ( options.merge == null ? true : options.merge ) && !collection._shared,\r\n _prevById = collection._byId,\r\n prevModels = collection.models, \r\n idAttribute = collection.model.prototype.idAttribute,\r\n toAdd = [],\r\n orderKept = true;\r\n\r\n // for each item in source set...\r\n for( var i = 0, j = 0; i < source.length; i++ ){\r\n var item = source[ i ],\r\n model : Model = null;\r\n\r\n if( item ){\r\n var id = item[ idAttribute ],\r\n cid = item.cid;\r\n\r\n if( _byId[ id ] || _byId[ cid ] ) continue;\r\n\r\n model = _prevById[ id ] || _prevById[ cid ];\r\n }\r\n\r\n if( model ){\r\n if( merge && item !== model ){\r\n if( orderKept && prevModels[ j ] !== model ) orderKept = false;\r\n\r\n var attrs = item.attributes || item;\r\n const transaction = model._createTransaction( attrs, options );\r\n transaction && nested.push( transaction );\r\n }\r\n }\r\n else{\r\n model = convertAndAquire( collection, item, options );\r\n toAdd.push( model );\r\n }\r\n\r\n models[ j++ ] = model;\r\n addIndex( _byId, model );\r\n }\r\n\r\n models.length = j;\r\n collection.models = models;\r\n collection._byId = _byId;\r\n\r\n if( !orderKept ) options.sorted = true;\r\n\r\n return toAdd;\r\n}\r\n\r\n/** @private */\r\nfunction _reallocateEmpty( self, source, options ){\r\n var len = source ? source.length : 0,\r\n models = Array( len ),\r\n _byId : IdIndex = {},\r\n idAttribute = self.model.prototype.idAttribute;\r\n\r\n for( var i = 0, j = 0; i < len; i++ ){\r\n var src = source[ i ];\r\n\r\n if( src && ( _byId[ src[ idAttribute ] ] || _byId[ src.cid ] ) ){\r\n continue;\r\n }\r\n\r\n var model = convertAndAquire( self, src, options );\r\n models[ j++ ] = model;\r\n addIndex( _byId, model );\r\n }\r\n\r\n models.length = j;\r\n self._byId = _byId;\r\n\r\n return self.models = models;\r\n}","import { Linked } from '@linked/value';\r\nimport { define, definitions, EventMap, eventsApi, EventsDefinition, Logger, logger, LogLevel, Mixable, mixinRules, mixins, TheType } from '@type-r/mixture';\r\nimport { IOPromise, startIO } from '../io-tools';\r\nimport { AggregatedType, Model, SharedType, shared, AnonymousModelConstructor, attributes } from '../model';\r\nimport { CloneOptions, ItemsBehavior, Transactional, TransactionalDefinition, transactionApi, TransactionOptions } from '../transactions';\r\nimport { AddOptions, addTransaction } from './add';\r\nimport { ArrayMixin } from './arrayMethods';\r\nimport { CollectionCore, CollectionTransaction, Elements, free, sortElements, updateIndex } from './commons';\r\nimport { removeMany, removeOne } from './remove';\r\nimport { emptySetTransaction, setTransaction } from './set';\r\n\r\nconst { trigger2 } = eventsApi,\r\n { begin, commit, markAsDirty } = transactionApi;\r\n\r\nlet _count = 0;\r\n\r\nexport type GenericComparator = string | ( ( x : Model ) => number ) | ( ( a : Model, b : Model ) => number ); \r\n\r\nexport interface CollectionOptions extends TransactionOptions {\r\n comparator? : GenericComparator\r\n model? : typeof Model\r\n}\r\n\r\nexport interface CollectionDefinition extends TransactionalDefinition {\r\n model? : typeof Model,\r\n itemEvents? : EventsDefinition\r\n _itemEvents? : EventMap\r\n}\r\n\r\nclass CollectionRefsType extends SharedType {\r\n static defaultValue = [];\r\n}\r\n\r\nexport interface CollectionConstructor extends TheType {\r\n new ( records? : ElementsArg, options?: CollectionOptions ) : Collection\r\n prototype : Collection\r\n Refs : CollectionConstructor\r\n};\r\n\r\ntype CollectionOf = M['Collection'] extends CollectionConstructor> ? M['Collection'] : CollectionConstructor>;\r\n\r\n@define({\r\n // Default client id prefix \r\n cidPrefix : 'c',\r\n model : Model,\r\n _changeEventName : 'changes',\r\n _aggregationError : null\r\n})\r\n@mixins( ArrayMixin )\r\n@definitions({\r\n comparator : mixinRules.value,\r\n model : mixinRules.protoValue,\r\n itemEvents : mixinRules.merge\r\n})\r\nexport class Collection< R extends Model = Model> extends Transactional implements CollectionCore, Iterable {\r\n /** @internal */\r\n _shared : number\r\n /** @internal */\r\n _aggregationError : R[]\r\n\r\n /**\r\n * EXPERIMENTAL notation to extract proper collection type from the model in TypeScript.\r\n * \r\n * attrName : Collection.of( User );\r\n * \r\n * const users = new ( Collection.of( User ) )\r\n */\r\n static of( Ctor : M ) : CollectionOf;\r\n static of( spec : M ) : CollectionOf>;\r\n static of( Ctor : M ) : CollectionOf {\r\n return typeof Ctor === 'function' ?\r\n Ctor.Collection as any :\r\n attributes( Ctor ).Collection;\r\n }\r\n\r\n /**\r\n * EXPERIMENTAL notation to extract proper collection type from the model in TypeScript.\r\n * \r\n * attrName : Collection.ofRefs( User );\r\n * \r\n * const users = new ( Collection.ofRefs( User ) )\r\n */\r\n static ofRefs( Ctor : M ) : CollectionOf {\r\n return Ctor.Collection.Refs as any;\r\n }\r\n\r\n\r\n static Subset : typeof Collection\r\n static Refs : any\r\n static refsTo = shared;\r\n\r\n /** @internal */\r\n static _SubsetOf : typeof Collection\r\n \r\n createSubset( models : ElementsArg, options? : CollectionOptions) : Collection{\r\n throw new ReferenceError( 'Failed dependency injection' )\r\n }\r\n\r\n static onExtend( BaseClass : typeof Transactional ){\r\n // Cached subset collection must not be inherited.\r\n const Ctor = this;\r\n this._SubsetOf = null;\r\n\r\n function RefsCollection( a, b, listen? ){\r\n Ctor.call( this, a, b, ItemsBehavior.share | ( listen ? ItemsBehavior.listen : 0 ) );\r\n }\r\n\r\n Mixable.mixins.populate( RefsCollection );\r\n RefsCollection.create = Collection.create;\r\n \r\n RefsCollection.prototype = this.prototype;\r\n RefsCollection._metatype = CollectionRefsType;\r\n\r\n this.Refs = this.Subset = RefsCollection;\r\n\r\n Transactional.onExtend.call( this, BaseClass );\r\n }\r\n \r\n static onDefine( definition : CollectionDefinition, BaseClass : any ){\r\n if( definition.itemEvents ){\r\n const eventsMap = new EventMap( BaseClass.prototype._itemEvents );\r\n eventsMap.addEventsMap( definition.itemEvents );\r\n this.prototype._itemEvents = eventsMap;\r\n }\r\n\r\n if( definition.comparator !== void 0 ) this.prototype.comparator = definition.comparator;\r\n\r\n Transactional.onDefine.call( this, definition );\r\n }\r\n \r\n /** @internal */\r\n _itemEvents : EventMap\r\n\r\n /***********************************\r\n * Core Members\r\n */\r\n // Array of the records\r\n models : R[]\r\n\r\n // Polymorphic accessor for aggregated attribute's canBeUpdated().\r\n /** @internal */\r\n get __inner_state__(){ return this.models; }\r\n\r\n // Index by id and cid\r\n /** @internal */\r\n _byId : { [ id : string ] : R }\r\n\r\n set comparator( x : GenericComparator ){\r\n\r\n switch( typeof x ){\r\n case 'string' :\r\n this._comparator = ( a, b ) => {\r\n const aa = a[ x ], bb = b[ x ];\r\n if( aa === bb ) return 0;\r\n return aa < bb ? -1 : + 1;\r\n } \r\n break;\r\n case 'function' :\r\n if( x.length === 1 ){\r\n this._comparator = ( a, b ) => {\r\n const aa = (x).call( this, a ), bb = (x).call( this, b );\r\n if( aa === bb ) return 0;\r\n return aa < bb ? -1 : + 1;\r\n }\r\n }\r\n else{\r\n this._comparator = ( a, b ) => (x).call( this, a, b );\r\n }\r\n break;\r\n \r\n default :\r\n this._comparator = null;\r\n }\r\n }\r\n \r\n // TODO: Improve typing\r\n getStore() : Transactional {\r\n return this._store || ( this._store = this._owner ? this._owner.getStore() : this._defaultStore );\r\n }\r\n\r\n /** @internal */\r\n _store : Transactional\r\n\r\n get comparator(){ return this._comparator; }\r\n\r\n /** @internal */\r\n _comparator : ( a : R, b : R ) => number\r\n\r\n /** @internal */\r\n _onChildrenChange( record : R, options : TransactionOptions = {}, initiator? : Transactional ){\r\n // Ignore updates from nested transactions.\r\n if( initiator === this ) return;\r\n\r\n const { idAttribute } = this;\r\n\r\n if( record.hasChanged( idAttribute ) ){\r\n updateIndex( this._byId, record );\r\n }\r\n\r\n const isRoot = begin( this );\r\n\r\n if( markAsDirty( this, options ) ){\r\n // Forward change event from the record.\r\n trigger2( this, 'change', record, options )\r\n }\r\n\r\n isRoot && commit( this );\r\n }\r\n\r\n get( objOrId : string | { id? : string, cid? : string } ) : R {\r\n if( objOrId == null ) return;\r\n\r\n if( typeof objOrId === 'object' ){\r\n const id = objOrId[ this.idAttribute ];\r\n return ( id !== void 0 && this._byId[ id ] ) || this._byId[ objOrId.cid ];\r\n }\r\n else{\r\n return this._byId[ objOrId ];\r\n } \r\n }\r\n\r\n [ Symbol.iterator ]() : IterableIterator {\r\n return this.models[ Symbol.iterator ]();\r\n }\r\n\r\n // Loop through the members in the scope of transaction.\r\n // Transactional version of each()\r\n updateEach( iteratee : ( val : R, key? : number ) => void ){\r\n const isRoot = transactionApi.begin( this );\r\n this.each( iteratee );\r\n isRoot && transactionApi.commit( this );\r\n }\r\n\r\n /** @internal */\r\n _validateNested( errors : {} ) : number {\r\n // Don't validate if not aggregated.\r\n if( this._shared ) return 0;\r\n\r\n let count = 0;\r\n\r\n this.each( record => {\r\n const error = record.validationError;\r\n if( error ){\r\n errors[ record.cid ] = error;\r\n count++;\r\n }\r\n });\r\n\r\n return count;\r\n }\r\n\r\n model : typeof Model\r\n\r\n // idAttribute extracted from the model type.\r\n idAttribute : string\r\n\r\n constructor( records? : ElementsArg, options : CollectionOptions = {}, shared? : number ){\r\n super( _count++ );\r\n this.models = [];\r\n this._byId = {};\r\n \r\n this.comparator = this.comparator;\r\n\r\n if( options.comparator !== void 0 ){\r\n this.comparator = options.comparator;\r\n options.comparator = void 0;\r\n }\r\n \r\n this.model = this.model;\r\n \r\n if( options.model ){\r\n this.model = options.model;\r\n options.model = void 0;\r\n }\r\n\r\n this.idAttribute = this.model.prototype.idAttribute; //TODO: Remove?\r\n\r\n this._shared = shared || 0;\r\n\r\n if( records ){\r\n const elements = toElements( this, records, options );\r\n emptySetTransaction( this, elements, options, true );\r\n }\r\n\r\n this.initialize.apply( this, arguments );\r\n\r\n if( this._localEvents ) this._localEvents.subscribe( this, this );\r\n }\r\n\r\n initialize(){}\r\n\r\n // Deeply clone collection, optionally setting new owner.\r\n clone( options : CloneOptions = {} ) : this {\r\n const models = this._shared & ItemsBehavior.share ? this.models : this.map( model => model.clone() ),\r\n copy : this = new (this.constructor)( models, { model : this.model, comparator : this.comparator }, this._shared );\r\n \r\n if( options.pinStore ) copy._defaultStore = this.getStore();\r\n \r\n return copy;\r\n }\r\n\r\n toJSON( options? : object ) : any {\r\n return this.map( model => model.toJSON( options ) );\r\n }\r\n\r\n // Apply bulk in-place object update in scope of ad-hoc transaction \r\n set( elements : ElementsArg = [], options : TransactionOptions = {} ) : this {\r\n if( (options).add !== void 0 ){\r\n this._log( 'warn', \"Type-R:InvalidOption\", \"Collection.set doesn't support 'add' option, behaving as if options.add === true.\", options );\r\n }\r\n\r\n // Handle reset option here - no way it will be populated from the top as nested transaction.\r\n if( options.reset ){\r\n this.reset( elements, options )\r\n }\r\n else{\r\n const transaction = this._createTransaction( elements, options );\r\n transaction && transaction.commit();\r\n } \r\n\r\n return this; \r\n }\r\n\r\n /**\r\n * Enable or disable live updates.\r\n * \r\n * `true` enables full collection synchronization.\r\n * `false` cancel live updates.\r\n * `json => true | false` - filter updates\r\n */\r\n liveUpdates( enabled : LiveUpdatesOption ) : IOPromise {\r\n if( enabled ){\r\n this.liveUpdates( false );\r\n\r\n const filter = typeof enabled === 'function' ? enabled : () => true;\r\n\r\n this._liveUpdates = {\r\n updated : json => {\r\n filter( json ) && this.add( json, { parse : true, merge : true } );\r\n },\r\n\r\n removed : id => this.remove( id )\r\n };\r\n\r\n return this.getEndpoint().subscribe( this._liveUpdates, this ).then( () => this );\r\n }\r\n else{\r\n if( this._liveUpdates ){\r\n this.getEndpoint().unsubscribe( this._liveUpdates, this );\r\n this._liveUpdates = null;\r\n }\r\n\r\n // TODO: Return the resolved promise.\r\n }\r\n }\r\n\r\n /** @internal */\r\n _liveUpdates : object\r\n\r\n fetch( a_options : { liveUpdates? : LiveUpdatesOption } & TransactionOptions & { [ key : string ] : any } = {} ) : IOPromise {\r\n const options = { parse : true, ...a_options },\r\n endpoint = this.getEndpoint();\r\n\r\n return startIO(\r\n this,\r\n endpoint.list( options, this ),\r\n options,\r\n\r\n json => {\r\n let result : any = this.set( json, { parse : true, ioMethod : 'fetch', ...options } as TransactionOptions );\r\n \r\n if( options.liveUpdates ){\r\n result = this.liveUpdates( options.liveUpdates );\r\n }\r\n\r\n return result;\r\n }\r\n );\r\n }\r\n\r\n dispose() : void {\r\n if( this._disposed ) return;\r\n\r\n const aggregated = !this._shared;\r\n\r\n for( let record of this.models ){\r\n free( this, record );\r\n\r\n if( aggregated ) record.dispose();\r\n }\r\n\r\n this.liveUpdates( false );\r\n\r\n super.dispose();\r\n }\r\n\r\n reset( a_elements? : ElementsArg, options : TransactionOptions = {} ) : R[] {\r\n const isRoot = begin( this ),\r\n previousModels = this.models;\r\n\r\n // Make all changes required, but be silent.\r\n if( a_elements ){ \r\n emptySetTransaction( this, toElements( this, a_elements, options ), options, true );\r\n }\r\n else{\r\n this._byId = {};\r\n this.models = [];\r\n }\r\n\r\n markAsDirty( this, options );\r\n\r\n options.silent || trigger2( this, 'reset', this, { previousModels, ...options } );\r\n\r\n // Dispose models which are not in the updated collection.\r\n const { _byId } = this;\r\n \r\n for( let toDispose of previousModels ){\r\n _byId[ toDispose.cid ] || free( this, toDispose );\r\n }\r\n\r\n isRoot && commit( this );\r\n return this.models;\r\n }\r\n\r\n // Add elements to collection.\r\n add( a_elements : ElementsArg , options : AddOptions = {} ){\r\n const elements = toElements( this, a_elements, options ),\r\n transaction = this.models.length ?\r\n addTransaction( this, elements, options ) :\r\n emptySetTransaction( this, elements, options );\r\n\r\n if( transaction ){\r\n transaction.commit();\r\n return transaction.added;\r\n }\r\n }\r\n\r\n // Remove elements. \r\n remove( recordsOrIds : any, options : CollectionOptions = {} ) : R[] | R {\r\n if( recordsOrIds ){\r\n return Array.isArray( recordsOrIds ) ?\r\n removeMany( this, recordsOrIds, options ) as R[]:\r\n removeOne( this, recordsOrIds, options ) as R;\r\n }\r\n\r\n return [];\r\n }\r\n\r\n $includes( idOrObj : R ) : Linked {\r\n return new LinkedIncludes( this, idOrObj );\r\n }\r\n\r\n // Apply bulk object update without any notifications, and return open transaction.\r\n // Used internally to implement two-phase commit. \r\n /** @internal */\r\n _createTransaction( a_elements : ElementsArg, options : TransactionOptions = {} ) : CollectionTransaction | void {\r\n const elements = toElements( this, a_elements, options );\r\n\r\n if( this.models.length ){\r\n return options.remove === false ?\r\n addTransaction( this, elements, options, true ) :\r\n setTransaction( this, elements, options );\r\n }\r\n else{\r\n return emptySetTransaction( this, elements, options );\r\n }\r\n }\r\n\r\n /** @internal */\r\n static _metatype = AggregatedType;\r\n\r\n /***********************************\r\n * Collection manipulation methods\r\n */\r\n\r\n sort( options : TransactionOptions = {} ) : this {\r\n if( sortElements( this, options ) ){\r\n const isRoot = begin( this );\r\n \r\n if( markAsDirty( this, options ) ){\r\n trigger2( this, 'sort', this, options );\r\n }\r\n\r\n isRoot && commit( this );\r\n }\r\n\r\n return this;\r\n }\r\n\r\n // Remove and return given model.\r\n unset( modelOrId : R | string, options? ) : R {\r\n const value = this.get( modelOrId );\r\n this.remove( modelOrId, { unset : true, ...options } );\r\n return value;\r\n }\r\n\r\n modelId( attrs : {} ) : any {\r\n return attrs[ this.model.prototype.idAttribute ];\r\n }\r\n\r\n // Toggle model in collection.\r\n toggle( model : R, a_next? : boolean ) : boolean {\r\n var prev = Boolean( this.get( model ) ),\r\n next = a_next === void 0 ? !prev : Boolean( a_next );\r\n\r\n if( prev !== next ){\r\n if( prev ){\r\n this.remove( model );\r\n }\r\n else{\r\n this.add( model );\r\n }\r\n }\r\n\r\n return next;\r\n }\r\n\r\n /** @internal */\r\n _log( level : LogLevel, topic : string, text : string, value : object, a_logger? : Logger ) : void {\r\n ( a_logger || logger ).trigger( level, topic, `${ this.model.prototype.getClassName() }.${ this.getClassName() }: ` + text, {\r\n Argument : value,\r\n 'Attributes spec' : this.model.prototype._attributes\r\n });\r\n }\r\n\r\n getClassName() : string {\r\n return super.getClassName() || 'Collection';\r\n }\r\n\r\n /***********************************\r\n * Proxied Array methods\r\n */\r\n\r\n get length() : number { return this.models.length; }\r\n\r\n // Add a model to the end of the collection.\r\n push(model : ElementsArg, options? : CollectionOptions ) {\r\n return this.add(model, { at: this.length, ...options });\r\n }\r\n\r\n // Remove a model from the end of the collection.\r\n pop( options? : CollectionOptions ) : R {\r\n var model = this.at(this.length - 1);\r\n this.remove(model, { unset : true, ...options });\r\n return model;\r\n }\r\n\r\n // Add a model to the beginning of the collection.\r\n unshift(model : ElementsArg, options? : CollectionOptions ) {\r\n return this.add(model, { at: 0, ...options });\r\n }\r\n \r\n // Remove a model from the beginning of the collection.\r\n shift( options? : CollectionOptions ) : R {\r\n const model = this.at(0);\r\n this.remove( model, { unset : true, ...options } );\r\n return model;\r\n }\r\n}\r\n\r\n\r\nexport interface Collection extends ArrayMixin{}\r\n\r\nexport type LiveUpdatesOption = boolean | ( ( x : any ) => boolean );\r\n\r\nexport type ElementsArg = Partial | Partial[]\r\n\r\n// TODO: make is safe for parse to return null (?)\r\nfunction toElements( collection : Collection, elements : ElementsArg, options : CollectionOptions ) : Elements {\r\n const parsed = options.parse ? collection.parse( elements, options ) : elements; \r\n return Array.isArray( parsed ) ? parsed : [ parsed ];\r\n}\r\n\r\nModel.Collection = Collection;\r\n\r\nclass LinkedIncludes extends Linked {\r\n constructor(\r\n private collection,\r\n private model : Model ){\r\n super( collection.get( model ) )\r\n }\r\n\r\n set( x : boolean ) : void {\r\n this.collection.toggle( this.model );\r\n }\r\n}\r\n","import { Collection } from '../collection';\r\nimport { Model } from '../model';\r\nimport { CompiledReference } from '../traversable';\r\n\r\nexport type CollectionReference = ( () => Collection ) | Collection | string; \r\n\r\n/** @private */\r\nexport function parseReference( collectionRef : CollectionReference ) : ( root : Model ) => Collection {\r\n switch( typeof collectionRef ){\r\n case 'function' :\r\n return root => (collectionRef).call( root );\r\n case 'object' :\r\n return () => collectionRef;\r\n case 'string' :\r\n const { resolve } = new CompiledReference( collectionRef );\r\n return resolve;\r\n }\r\n}","import { AnyType, ChainableAttributeSpec, Model } from '../model';\r\nimport { CollectionReference, parseReference } from './commons';\r\n\r\n\r\n/********\r\n * Reference to model by id.\r\n * \r\n * Untyped attribute. Holds model id, when unresolved. When resolved, is substituted\r\n * with a real model.\r\n * \r\n * No model changes are detected and counted as owner's change. That's intentional.\r\n */\r\n\r\n/** @private */\r\ntype ModelRefValue = Model | string;\r\n\r\n/** @private */\r\nclass ModelRefType extends AnyType {\r\n // It is always serialized as an id, whenever it's resolved or not. \r\n toJSON( value : ModelRefValue ){\r\n return value && typeof value === 'object' ? value.id : value;\r\n }\r\n\r\n // Wne \r\n clone( value : ModelRefValue ){\r\n return value && typeof value === 'object' ? value.id : value;\r\n }\r\n\r\n // Model refs by id are equal when their ids are equal.\r\n isChanged( a : ModelRefValue, b : ModelRefValue){\r\n var aId = a && ( (a).id == null ? a : (a).id ),\r\n bId = b && ( (b).id == null ? b : (b).id );\r\n\r\n return aId !== bId;\r\n }\r\n\r\n // Refs are always valid.\r\n validate( model, value, name ){}\r\n}\r\n\r\nfunction theMemberOf( this : void, masterCollection : CollectionReference, T? : R ) : ChainableAttributeSpec {\r\n const getMasterCollection = parseReference( masterCollection );\r\n\r\n const typeSpec = new ChainableAttributeSpec({\r\n value : null,\r\n _metatype : ModelRefType\r\n });\r\n \r\n return typeSpec\r\n .get( function( objOrId : ModelRefValue, name : string ) : Model {\r\n if( typeof objOrId === 'object' ) return objOrId;\r\n\r\n // So, we're dealing with an id reference. Resolve it.\r\n const collection = getMasterCollection( this );\r\n let record : Model = null;\r\n\r\n // If master collection exists and is not empty...\r\n if( collection && collection.length ){\r\n // Silently update attribute with record from this collection.\r\n record = collection.get( objOrId ) || null;\r\n this.attributes[ name ] = record;\r\n\r\n // Subscribe for events manually. delegateEvents won't be invoked.\r\n record && this._attributes[ name ].handleChange( record, null, this, {} );\r\n }\r\n\r\n return record;\r\n });\r\n}\r\n\r\nexport { theMemberOf as memberOf }\r\n\r\ndeclare module '../model' {\r\n namespace Model {\r\n export const memberOf : ( this : R, masterCollection : CollectionReference ) => ChainableAttributeSpec;\r\n }\r\n}\r\n\r\n( Model as any ).memberOf = theMemberOf;","import { Collection, CollectionConstructor, ElementsArg, CollectionOptions } from '../collection';\r\nimport { define, tools } from '@type-r/mixture';\r\nimport { AggregatedType, ChainableAttributeSpec, Model, type } from '../model';\r\nimport { ItemsBehavior, transactionApi } from '../transactions';\r\nimport { CollectionReference, parseReference } from './commons';\r\n\r\n\r\ntype ModelsIds = ( string | number )[];\r\n\r\n// TODO: Change the last parameter to be the Model constructor. Extract the proper Collection type.\r\nexport function subsetOf, R extends Model>( this : void, masterCollection : CollectionReference, T? : X ) : ChainableAttributeSpec>{\r\n const CollectionClass = T || Collection,\r\n // Lazily define class for subset collection, if it's not defined already...\r\n SubsetOf = CollectionClass._SubsetOf || ( CollectionClass._SubsetOf = defineSubsetCollection( CollectionClass as any ) as any ),\r\n getMasterCollection = parseReference( masterCollection );\r\n\r\n return type( SubsetOf ).get(\r\n function( refs ){\r\n !refs || refs.resolvedWith || refs.resolve( getMasterCollection( this ) );\r\n return refs;\r\n }\r\n );\r\n}\r\n\r\n\r\ntype subsetOfType = typeof subsetOf;\r\n\r\ndeclare module \"../collection\" {\r\n namespace Collection {\r\n export const subsetOf : subsetOfType;\r\n } \r\n}\r\n\r\n( Collection as any ).subsetOf = subsetOf;\r\n\r\n\r\nCollection.prototype.createSubset = function( this : Collection, models : any, options ) : SubsetCollection {\r\n const SubsetOf = subsetOf( this, this.constructor as any ).options.type,\r\n subset = new SubsetOf( models, options );\r\n \r\n subset.resolve( this );\r\n return subset as any;\r\n}\r\n\r\nconst subsetOfBehavior = ItemsBehavior.share | ItemsBehavior.persistent;\r\n\r\nfunction defineSubsetCollection( CollectionClass : typeof Collection ) {\r\n @define class SubsetOfCollection extends CollectionClass {\r\n refs : any[];\r\n resolvedWith : Collection = null;\r\n\r\n _metatype : AggregatedType\r\n\r\n get __inner_state__(){ return this.refs || this.models; }\r\n\r\n constructor( recordsOrIds?, options? ){\r\n super( [], options, subsetOfBehavior );\r\n this.refs = toArray( recordsOrIds );\r\n }\r\n\r\n // Remove should work fine as it already accepts ids. Add won't...\r\n add( a_elements, options = {} ){\r\n const { resolvedWith } = this,\r\n toAdd = toArray( a_elements );\r\n \r\n if( resolvedWith ){\r\n // If the collection is resolved already, everything is simple.\r\n return super.add( resolveRefs( resolvedWith, toAdd ), options );\r\n }\r\n else{\r\n // Collection is not resolved yet. So, we prepare the delayed computation.\r\n if( toAdd.length ){\r\n const isRoot = transactionApi.begin( this );\r\n\r\n // Save elements to resolve in future...\r\n this.refs = this.refs ? this.refs.concat( toAdd ) : toAdd.slice();\r\n\r\n transactionApi.markAsDirty( this, options );\r\n\r\n // And throw the 'changes' event.\r\n isRoot && transactionApi.commit( this );\r\n }\r\n }\r\n }\r\n\r\n reset( a_elements?, options = {} ){\r\n const { resolvedWith } = this,\r\n elements = toArray( a_elements );\r\n \r\n return resolvedWith ?\r\n // Collection is resolved, so parse ids and forward the call to set.\r\n super.reset( resolveRefs( resolvedWith, elements ), options ) :\r\n // Collection is not resolved yet. So, we prepare the delayed computation.\r\n delaySet( this, elements, options ) as any || [];\r\n }\r\n\r\n _createTransaction( a_elements, options? ){\r\n const { resolvedWith } = this,\r\n elements = toArray( a_elements );\r\n \r\n return resolvedWith ?\r\n // Collection is resolved, so parse ids and forward the call to set.\r\n super._createTransaction( resolveRefs( resolvedWith, elements ), options ) :\r\n // Collection is not resolved yet. So, we prepare the delayed computation.\r\n delaySet( this, elements, options );\r\n }\r\n\r\n // Serialized as an array of model ids.\r\n toJSON() : ModelsIds {\r\n return this.refs ?\r\n this.refs.map( objOrId => objOrId.id || objOrId ) :\r\n this.models.map( model => model.id );\r\n }\r\n\r\n // Subset is always valid.\r\n _validateNested(){ return 0; }\r\n\r\n get length() : number {\r\n return this.models.length || ( this.refs ? this.refs.length : 0 );\r\n }\r\n\r\n // Must be shallow copied on clone.\r\n clone( owner? ){\r\n var Ctor = (this).constructor,\r\n copy = new Ctor( [], {\r\n model : this.model,\r\n comparator : this.comparator\r\n });\r\n\r\n if( this.resolvedWith ){\r\n // TODO: bug here. \r\n copy.resolvedWith = this.resolvedWith;\r\n copy.refs = null;\r\n copy.reset( this.models, { silent : true } );\r\n }\r\n else{\r\n copy.refs = this.refs.slice();\r\n }\r\n\r\n return copy;\r\n }\r\n\r\n // Clean up the custom parse method possibly defined in the base class.\r\n parse( raw : any ) : Model[] {\r\n return raw;\r\n }\r\n\r\n resolve( collection : Collection ) : this {\r\n if( collection && collection.length ){\r\n this.resolvedWith = collection;\r\n\r\n if( this.refs ){\r\n this.reset( this.refs, { silent : true } );\r\n this.refs = null;\r\n }\r\n }\r\n\r\n return this;\r\n }\r\n\r\n getModelIds() : ModelsIds { return this.toJSON(); }\r\n\r\n toggle( modelOrId : any, val : boolean ) : boolean {\r\n return super.toggle( this.resolvedWith.get( modelOrId ), val );\r\n }\r\n\r\n addAll() : Model[] {\r\n if( this.resolvedWith ){\r\n this.set( this.resolvedWith.models );\r\n return this.models;\r\n }\r\n\r\n throw new Error( \"Cannot add elemens because the subset collection is not resolved yet.\" );\r\n }\r\n\r\n toggleAll() : Model[] {\r\n return this.length ? this.reset() : this.addAll();\r\n }\r\n }\r\n\r\n // Clean up all custom item events to prevent memory leaks.\r\n SubsetOfCollection.prototype._itemEvents = void 0;\r\n\r\n return SubsetOfCollection;\r\n}\r\n\r\nexport interface SubsetCollection extends Collection{\r\n getModelIds() : string[]\r\n addAll() : M[]\r\n toggleAll() : M[]\r\n resolve( baseCollection : Collection ) : this\r\n}\r\n\r\nexport interface SubsetCollectionConstructor {\r\n new ( records? : ElementsArg | string[], options?: CollectionOptions ) : SubsetCollection\r\n prototype : SubsetCollection\r\n};\r\n\r\nfunction resolveRefs( master, elements ){\r\n const records = [];\r\n \r\n for( let el of elements ){\r\n const record = master.get( el );\r\n if( record ) records.push( record );\r\n }\r\n\r\n return records;\r\n}\r\n\r\nfunction delaySet( collection, elements, options ) : void {\r\n if( tools.notEqual( collection.refs, elements ) ){\r\n const isRoot = transactionApi.begin( collection );\r\n\r\n // Save elements to resolve in future...\r\n collection.refs = elements.slice();\r\n\r\n transactionApi.markAsDirty( collection, options );\r\n \r\n // And throw the 'changes' event.\r\n isRoot && transactionApi.commit( collection );\r\n }\r\n}\r\n\r\nfunction toArray( elements ){\r\n return elements ? ( \r\n Array.isArray( elements ) ? elements : [ elements ]\r\n ) : [];\r\n}","import { Model } from '../model';\r\nimport { Transactional } from '../transactions';\r\n\r\nlet _store : Store = null;\r\n\r\nexport class Store extends Model {\r\n getStore() : Store { return this; }\r\n \r\n // delegate item lookup to owner, and to the global store if undefined\r\n get( name : string ) : any {\r\n // Lookup for resource in the current store. \r\n let local = this[ name ];\r\n\r\n // If something is found or it's the global store, return result.\r\n if( local || this === this._defaultStore ) return local;\r\n\r\n // Forward failed lookup to owner or global store.\r\n return this._owner ? this._owner.get( name ) : this._defaultStore.get( name ); \r\n }\r\n\r\n static get global(){ return _store; }\r\n static set global( store : Store ){\r\n if( _store ){\r\n _store.dispose();\r\n }\r\n\r\n Transactional.prototype._defaultStore = _store = store;\r\n }\r\n}\r\n\r\nStore.global = new Store();","// Dummy polyfill to prevent exception in IE.\r\nif( typeof Symbol === 'undefined' ){\r\n Object.defineProperty( window, 'Symbol', { value : { iterator : 'Symbol.iterator' }, configurable : true });\r\n}\r\n\r\nimport { Events, Mixable as Class, log } from '@type-r/mixture';\r\nimport { CollectionConstructor } from './collection';\r\n// Define synonims for NestedTypes backward compatibility.\r\nimport { attributes, ChainableAttributeSpec, Model, type as _type, value } from './model';\r\nimport { AnonymousModelConstructor } from './model/define'\r\nimport { isEmpty } from '@type-r/mixture/lib/tools';\r\n\r\n/**\r\n * Export everything \r\n */\r\nexport { Linked } from '@linked/value';\r\nexport * from '@type-r/mixture';\r\nexport * from './collection';\r\nexport * from './io-tools';\r\nexport * from './model';\r\nexport * from './relations';\r\nexport * from './transactions';\r\nexport { Model as Record, Class };\r\n\r\n\r\nexport const { on, off, trigger, once, listenTo, stopListening, listenToOnce } = Events;\r\n\r\n/** Wrap model or collection method in transaction. */\r\nexport function transaction< F extends Function >( method : F ) : F {\r\n return function( ...args ){\r\n let result;\r\n \r\n this.transaction( () => {\r\n result = method.apply( this, args );\r\n });\r\n \r\n return result;\r\n }\r\n}\r\n\r\nexport function type Model>( t : T[] ) : ChainableAttributeSpec>>;\r\nexport function type( t : T[] ) : ChainableAttributeSpec>>>;\r\nexport function type( t : T | ChainableAttributeSpec ) : ChainableAttributeSpec;\r\nexport function type( t : T ) : ChainableAttributeSpec>;\r\nexport function type( t : T ){\r\n return Array.isArray( t ) ?\r\n _type( _toModel( t[ 0 ] ).Collection ) :\r\n _type( _toModel( t ) );\r\n}\r\n\r\nconst _toModel = t =>\r\n t != null && Object.getPrototypeOf( t ) === Object.prototype ?\r\n attributes( t ) :\r\n t;\r\n\r\nChainableAttributeSpec.from = ( spec : any ) : ChainableAttributeSpec => {\r\n // Pass metatype through untouched...\r\n if( spec && spec instanceof ChainableAttributeSpec ) {\r\n return spec;\r\n }\r\n\r\n if( typeof spec === 'function' ) return type( spec );\r\n\r\n if( Array.isArray( spec ) ){\r\n if( spec.length !== 1 ||\r\n !spec[ 0 ] || (\r\n typeof spec[ 0 ] !== 'function' &&\r\n Object.getPrototypeOf( spec[ 0 ] ) !== Object.prototype\r\n )\r\n ) {\r\n log( 'error', 'Type-R:WrongDeclaration', `Since v4.1, [ ModelType ] and [{ attr1, attr2, }] declares collection of models. Use Array or value([ 1, 2, ... ]) to declare plain array attributes.` );\r\n return value( spec );\r\n }\r\n\r\n return type( spec );\r\n }\r\n\r\n if( spec && typeof spec === 'object' ){\r\n if( Object.getPrototypeOf( spec ) !== Object.prototype ){\r\n log( 'error', 'Type-R:WrongDeclaration', `Since v4.1, non-primitive values must be wrapped in value(...). All objects are treated as attribute specs and define nested models.` );\r\n return value( spec )\r\n }\r\n\r\n if( isEmpty( spec ) ){\r\n log( 'error', 'Type-R:WrongDeclaration', `Since v4.1, objects are treated as attribute specs and define nested models. Use Object or value({...}) for an object attribute type.` );\r\n return value( spec )\r\n }\r\n\r\n return type( spec )\r\n }\r\n\r\n return value( spec );\r\n}\r\n "],"names":["defaults","dest","source","name","hasOwnProperty","arguments","length","i","other","isValidJSON","value","proto","Object","getPrototypeOf","prototype","Array","every","getBaseClass","Class","constructor","isEmpty","obj","key","some","fun","ArrayProto","arr","result","someArray","someObject","predicate","x","omit","discard","transform","assign","once","func","memo","first","apply","this","DateProto","Date","ObjectProto","notEqual","a","b","protoA","arraysNotEqual","keysA","keys","objectsNotEqual","HashProto","create","hashMap","hash","compare","av","valueOf","bv","definition","_i","names","names_1","_a","name_1","prop","desc","getOwnPropertyDescriptor","o","EventMap","map","handlers","concat","addEvent","split","eventSplitter","getBubblingHandler","callback","name_2","push","EventDescriptor","target","event_1","on","event_2","off","slice","addEventsMap","handler","_bubblingHandlers","event","c","d","e","trigger5","trigger3","trigger2","context","next","listOff","_events","filteredHead","prev","head","ev","_callback","listSend3","call","EventHandler","once_1","_once","name_3","strings","api","events","test","self","queue","all","listSend2","listSend4","listSend5","f","listSend6","extendStatics","setPrototypeOf","__proto__","p","__extends","__","__assign","t","s","n","__rest","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__decorate","decorators","r","Reflect","decorate","defineProperty","Mixable","protoProps","staticProps","BaseClass","mixins","defineMixin","merge","mergeObject","getStaticDefinitions","onDefine","definitions","mergeInheritedMembers","spec","statics","TheSubclass","__extends_1","predefine","define","Constructor","__super__","MixinsState","get","populate","onExtend","ClassOrDefinition","Ctor","rules","definitionRules","definitionDecorator","definitionKey","rule","appliedMixins","mixins_1","mixin","isArray","sourceMixins","mergeRules","ctors","ctors_1","unshift","object","ignore","dontMix","getOwnPropertyNames","forEachOwnProp","sourceProp","_this","assignProperty","mixinRules","protoValue","baseProto","resolveRule","function","caller","list","destProp","configurable","pipe","classFirst","classLast","_idCount","uniqueId","Messenger","localEvents","_localEvents","properties","eventsMap","defineProperties","toPropertyDescriptor","addReference","a_source","_listeningTo","removeAll","second","cid","_disposed","stopListening","initialize","Events","listener","isProduction","process","env","NODE_ENV","logEvents","Logger","level","filter","topic","msg","props","args","toString","console","Error","counter","_super","window","something","__inner_state__","body","join","JSON","stringify","logger","logEvents_1","logToConsole","throwingLogger","throwOn","log","trigger","bind","startIO","promise","options","thenDo","abortIO","_ioPromise","then","resp","triggerAndBubble","catch","err","abort","eventSource","collection","referenceMask","reference","splitTail","path","match","substr","tail","pop","local","resolve","Function","shift","resolveReference","root","action","skip","getStore","getOwner","ValidationError","iteratee","error","nested","each","eachError","_validateNested","validate","helpers","arrayHelpers","objectHelpers","dummyHelpers","Linked","clone","link","remove","iterator","mapped","element","at","array","splice","j","y","set","ClonedValueLink","checked","onChange","Boolean","update","truthyValue","EqualsValueLink","undefined","defaultValue","EnabledValueLink","ContainsRef","_","PropValueLink","links","_value$","whenValid","defaultError","CustomValueLink","state","unwrap","sourceKey","trim","sourceVal","tslib_1.__extends","parent","nextValue","el","removeAt","field","values","ItemsBehavior","Transactional","endpoint","_endpoint","Transactional_1","_owner","_ownerKey","_changeEventName","listenTo","isRoot","transactionApi","begin","commit","transaction","_changeToken","json","strict","validationError","eachValidationError","getClassName","data","_defaultStore","getOwnerEndpoint","_endpoints","_validationError","getValidationError","cidPrefix","_transaction","markAsDirty","dirty","silent","_isDirty","initiator","originalOptions","_onChildrenChange","aquire","owner","child","ReferenceError","free","_begin","_markAsDirty","setAttribute","record","_attributes","doUpdate","attributes","_previousAttributes","AttributesCopy","_changedAttributes","UpdateModelMixin","attribute","propagateChanges","forceAttributeChange","_createTransaction","a_values","unknown","changes","parse","shouldBeAnObject","unknownAttrsWarning","ModelTransaction","nested_1","_log","nested_2","changes_1","_b","emptyOptions","AnyType","model","handleChange","toJSON","type","getHook","v","isChanged","code","text","New value","Prev. value","a_options","getHooks","transforms","changeHandlers","changeEvents","hasCustomDefault","tools.isValidJSON","isRequired","wrapIsRequired","convert","getHook_1","reduce","chainGetHooks","validate_1","chainTransforms","chainChangeHandlers","doInit","prevHook","nextHook","prevTransform","nextTransform","prevHandler","nextHandler","ImmutableClassType","PrimitiveType","NumericType","num","isFinite","ArrayType","ObjectType","doNothing","FunctionType","DateType","date","timestamp","getTime","toISOString","supportsDate","isNaN","struct","minutesOffset","isoDatePattern","exec","k","numericKeys","UTC","safeParseDate","AggregatedType","canBeUpdated","nestedTransaction","_shared","persistent","_handleChange","unset","dispose","shareAndListen","listen","share","SharedType","implicitObject","_onChange","builtins","String","Number","metatypes","getMetatype","_metatype","idx","resolveBuiltins","ChainableAttributeSpec","check","metadata","required","ref","emptyFunction","changed","eventMap","unsubscribe","subscribe","cloned","Type","attrDef","shared","inferType","Symbol","LinkedAttr","attr","_error","_token","createAttribute","from","createAttributesMixin","attributesDefinition","baseClassAttributes","myAttributes","_.transform","allAttributes","_.defaults","ConstructorsMixin","attrDefs","attrs","Attributes","constructorsMixin","_attributesArray","createPropertyDescriptor","attrSpecs","eventsApi.EventMap","createWatcherFromRef","wrapWatcher","localEventsMixin","watcher","IOModelMixin","save","getEndpoint","ioMethod","isNew","id","fetch","read","destroy","_cidCounter","Model","asc","idAttribute","extend","_attributes$","__Attributes$","diff","hasChanged","val","old","nullify","forEach","_attributesArray_1","copy","pinStore","errors","asJson","l","newModel","clear","a_logger","Attributes definition","a_fun","tools.transform","ModelEntriesIterator","Collection","typeCheck","BaseModelAttributes","BaseModelAttributesCopy","IdAttribute","metatype","done","models","last","md","_c","coll","parseAnonimousModelDefinition","First","toMix","AnonimousModel","DefaultCollection","dynamicMixin","AttributeRefs","__ModelAttrRef","isMutableType","addAttributeLinks","_aquire","_free","convertAndAquire","_aggregationError","_itemEvents","sortElements","_comparator","sort","addIndex","index","removeIndex","updateIndex","previous","CollectionTransaction","logAggregationError","added","removed","added_1","_d","removed_1","_e","sorted","addTransaction","items","a_items","forceMerge","_byId","prevLength","a_items_1","item","appendElements","needSort","length_1","moveElements","sortOrMoveElements","ArrayMixin","mapFilter","res","doWhile","init","end","modelOrId","idOrObj","toPredicateFunction","m","firstMatch","find","entries","a_index","a_reducer","reducer","defaultGrouping","results","acc","noOp","keys_1","keys_2","removeMany","toRemove","_removeFromIndex","_reallocate","silentOptions","emptySetTransaction","len","src","_reallocateEmpty","setTransaction","_prevById","prevModels","toAdd","orderKept","reusedCount","previous_1","_garbageCollect","children","children_1","freeAll","addedOrChanged","_count","CollectionRefsType","Refs","RefsCollection","_SubsetOf","Collection_1","Subset","itemEvents","comparator","aa","bb","_store","objOrId","count","elements","add","reset","enabled","liveUpdates","filter_1","_liveUpdates","updated","aggregated","a_elements","previousModels","toElements","previousModels_1","toDispose","recordsOrIds","notify","removeOne","LinkedIncludes","a_next","Argument","Attributes spec","records","parsed","toggle","parseReference","collectionRef","ModelRefType","theMemberOf","masterCollection","T","getMasterCollection","subsetOf","CollectionClass","SubsetOf","subsetOfBehavior","refs","toArray","SubsetOfCollection","resolvedWith","resolveRefs","delaySet","raw","addAll","defineSubsetCollection","memberOf","createSubset","subset","master","elements_1","tools.notEqual","Store","store","global","listenToOnce","_type","_toModel","attrName","getMetadata","value_1","as","reject","onAbort","fn","Promise","a_resolve","a_reject","listName","method"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sources":["../../mixture/src/tools.ts","../../mixture/src/eventsource.ts","../../node_modules/tslib/tslib.es6.js","../../mixture/src/mixins.ts","../../mixture/src/events.ts","../../mixture/src/logging.ts","../src/io-tools.ts","../src/traversable.ts","../src/validation.ts","../../node_modules/@linked/value/node_modules/tslib/tslib.es6.js","../../node_modules/@linked/value/src/helpers.ts","../../node_modules/@linked/value/src/index.ts","../src/transactions.ts","../src/model/updates.ts","../src/model/metatypes/any.ts","../src/model/metatypes/basic.ts","../src/model/metatypes/date.ts","../src/model/metatypes/owned.ts","../src/model/metatypes/shared.ts","../src/model/metatypes/index.ts","../src/model/attrDef.ts","../src/model/define.ts","../src/model/linked-attrs.ts","../src/model/mixin.ts","../src/model/io-mixin.ts","../src/model/model.ts","../src/model/index.ts","../src/collection/commons.ts","../src/collection/add.ts","../src/collection/arrayMethods.ts","../src/collection/remove.ts","../src/collection/set.ts","../src/collection/index.ts","../src/relations/commons.ts","../src/relations/from.ts","../src/relations/subsetOf.ts","../src/relations/store.ts","../src/index.ts"],"sourcesContent":[" /** Similar to underscore `_.defaults` */\nexport function defaults< T >( dest : T, ...sources : Object[] ) : T\nexport function defaults< T >( dest : T, source : Object ) : T {\n for( var name in source ) {\n if( source.hasOwnProperty( name ) && !dest.hasOwnProperty( name ) ) {\n dest[ name ] = source[ name ];\n }\n }\n\n if( arguments.length > 2 ){\n for( let i = 2; i < arguments.length; i++ ){\n const other = arguments[ i ];\n other && defaults( dest, other );\n }\n }\n\n return dest;\n}\n\n/** Check if value is raw JSON */\nexport function isValidJSON( value : any ) : boolean {\n if( value === null ){\n return true;\n }\n\n switch( typeof value ){\n case 'number' :\n case 'string' :\n case 'boolean' :\n return true;\n\n case 'object':\n var proto = Object.getPrototypeOf( value );\n\n if( proto === Object.prototype || proto === Array.prototype ){\n return every( value, isValidJSON );\n }\n }\n\n return false;\n}\n\n/** Get the base class constructor function.\n * @param Class Subclass constructor function.\n * @returns Base class constructor function.\n */\nexport function getBaseClass( Class : Function ) {\n return Object.getPrototypeOf( Class.prototype ).constructor\n}\n\nexport function assignToClassProto( Class, definition : T, ...names : K[] ) : void {\n for( let name of names ){\n const value = definition[ name ];\n value === void 0 || ( Class.prototype[ name ] = value );\n }\n}\n\n/** Checks whenever given object is an empty hash `{}` */\nexport function isEmpty( obj : {} ) : boolean {\n if( obj ){\n for( let key in obj ){\n if( obj.hasOwnProperty( key ) ){\n return false;\n }\n }\n }\n\n return true;\n}\n\nexport type Iteratee = ( value : any, key? : string | number ) => any;\n\nfunction someArray( arr : any[], fun : Iteratee ) : any {\n let result;\n\n for( let i = 0; i < arr.length; i++ ){\n if( result = fun( arr[ i ], i ) ){\n return result;\n }\n }\n}\n\nfunction someObject( obj : {}, fun : Iteratee ) : any {\n let result;\n\n for( let key in obj ){\n if( obj.hasOwnProperty( key ) ){\n if( result = fun( obj[ key ], key ) ){\n return result;\n }\n }\n }\n}\n\n/** Similar to underscore `_.some` */\nexport function some( obj, fun : Iteratee ) : any {\n if( Object.getPrototypeOf( obj ) === ArrayProto ){\n return someArray( obj, fun );\n }\n else{\n return someObject( obj, fun );\n }\n}\n\n/** Similar to underscore `_.every` */\nexport function every( obj : { }, predicate : Iteratee ) : boolean {\n return !some( obj, x => !predicate( x ) );\n}\n\n/** Similar to `getOwnPropertyDescriptor`, but traverse the whole prototype chain. */\nexport function getPropertyDescriptor( obj : {}, prop : string ) : PropertyDescriptor {\n let desc : PropertyDescriptor;\n\n for( let proto = obj; !desc && proto; proto = Object.getPrototypeOf( proto ) ) {\n desc = Object.getOwnPropertyDescriptor( proto, prop );\n }\n\n return desc;\n}\n\n/** Similar to underscore `_.omit` */\nexport function omit( source : {}, ...rest : string[] ) : {}\nexport function omit( source ) : {} {\n const dest = {}, discard = {};\n\n for( let i = 1; i < arguments.length; i ++ ){\n discard[ arguments[ i ] ] = true;\n }\n\n for( var name in source ) {\n if( !discard.hasOwnProperty( name ) && source.hasOwnProperty( name ) ) {\n dest[ name ] = source[ name ];\n }\n }\n\n return dest;\n}\n\n/** map `source` object properties with a given function, and assign the result to the `dest` object.\n * When `fun` returns `undefined`, skip this value. \n */\nexport function transform< A, B >( dest : { [ key : string ] : A }, source : { [ key : string ] : B }, fun : ( value : B, key : string ) => A | void ) : { [ key : string ] : A } {\n for( var name in source ) {\n if( source.hasOwnProperty( name ) ) {\n var value = fun( source[ name ], name );\n value === void 0 || ( dest[ name ] = < A >value );\n }\n }\n\n return dest;\n}\n\nexport function fastAssign< A >( dest : A, source : {} ) : A {\n for( var name in source ) {\n dest[ name ] = source[ name ];\n }\n\n return dest;\n}\n\nexport function fastDefaults< A >( dest : A, source : {} ) : A {\n for( var name in source ) {\n if( dest[ name ] === void 0 ){\n dest[ name ] = source[ name ];\n }\n }\n\n return dest;\n}\n\n/** Similar to underscore `_.extend` and `Object.assign` */\nexport function assign< T >( dest : T, ...sources : Object[] ) : T\nexport function assign< T >( dest : T, source : Object ) : T {\n for( var name in source ) {\n if( source.hasOwnProperty( name ) ) {\n dest[ name ] = source[ name ];\n }\n }\n\n if( arguments.length > 2 ){\n for( let i = 2; i < arguments.length; i++ ){\n const other = arguments[ i ];\n other && assign( dest, other );\n }\n }\n\n return dest;\n}\n\n/** Similar to underscore `_.keys` */\nexport function keys( o : any ) : string[]{\n return o ? Object.keys( o ) : [];\n}\n\n/** Similar to underscore `_.once` */\nexport function once( func : Function ) : Function {\n var memo, first = true;\n return function() {\n if ( first ) {\n first = false;\n memo = func.apply(this, arguments);\n func = null;\n }\n return memo;\n };\n}\n\nconst ArrayProto = Array.prototype,\n DateProto = Date.prototype,\n ObjectProto = Object.prototype;\n\n/**\n * Determine whenever two values are not equal, deeply traversing \n * arrays and plain JS objects (hashes). Dates are compared by enclosed timestamps, all other\n * values are compared with strict comparison.\n */\nexport function notEqual( a : any, b : any) : boolean {\n if( a === b ) return false;\n\n if( a && b && typeof a == 'object' && typeof b == 'object' ) {\n const protoA = Object.getPrototypeOf( a );\n\n if( protoA !== Object.getPrototypeOf( b ) ) return true;\n\n switch( protoA ){\n case DateProto : return +a !== +b;\n case ArrayProto : return arraysNotEqual( a, b );\n case ObjectProto :\n case null:\n return objectsNotEqual( a, b );\n }\n }\n\n return true;\n}\n\nfunction objectsNotEqual( a, b ) {\n const keysA = Object.keys( a );\n\n if( keysA.length !== Object.keys( b ).length ) return true;\n\n for( let i = 0; i < keysA.length; i++ ) {\n const key = keysA[ i ];\n\n if( !b.hasOwnProperty( key ) || notEqual( a[ key ], b[ key ] ) ) {\n return true;\n }\n }\n\n return false;\n}\n\nfunction arraysNotEqual( a, b ) {\n if( a.length !== b.length ) return true;\n\n for( let i = 0; i < a.length; i++ ) {\n if( notEqual( a[ i ], b[ i ] ) ) return true;\n }\n\n return false;\n}\n\n/**\n * Create an object without Object prototype members except hasOwnProperty.\n * @param obj - optional parameter to populate the hash map from.\n */\nconst HashProto = Object.create( null );\nHashProto.hasOwnProperty = ObjectProto.hasOwnProperty;\n\nexport function hashMap( obj? ){\n const hash = Object.create( HashProto );\n return obj ? assign( hash, obj ) : hash;\n}\n\nexport function compare( a : any, b : any ) : -1 | 0 | 1 {\n // Handle strictly equal values.\n if( a == b ) return 0;\n\n // Handle nulls.\n if( a == null ) return -1;\n if( b == null ) return 1;\n\n // No nulls. Convert values to primitives.\n const av = a.valueOf(),\n bv = b.valueOf();\n\n return av < bv ? -1 :\n av > bv ? 1 :\n 0;\n}","import { once as _once } from './tools'\n\n/*******************\n * Prebuilt events map, used for optimized bulk event subscriptions.\n *\n * const events = new EventMap({\n * 'change' : true, // Resend this event from self as it is.\n * 'change:attr' : 'localTargetFunction',\n * 'executedInTargetContext' : function(){ ... }\n * 'executedInNativeContext' : '^props.handler'\n * })\n */\nexport interface EventsDefinition {\n [ events : string ] : Function | string | boolean\n}\n\nexport class EventMap {\n handlers : EventDescriptor[] = [];\n\n constructor( map? : EventsDefinition | EventMap ){\n if( map ){\n if( map instanceof EventMap ){\n this.handlers = map.handlers.slice();\n }\n else{\n map && this.addEventsMap( map );\n }\n }\n }\n\n merge( map : EventMap ){\n this.handlers = this.handlers.concat( map.handlers );\n }\n\n addEventsMap( map : EventsDefinition ){\n for( let names in map ){\n this.addEvent( names, map[ names ] )\n }\n }\n\n bubbleEvents( names : string ){\n for( let name of names.split( eventSplitter ) ){\n this.addEvent( name, getBubblingHandler( name ) );\n }\n }\n\n addEvent( names : string, callback : Function | string | boolean ){\n const { handlers } = this;\n\n for( let name of names.split( eventSplitter ) ){\n handlers.push( new EventDescriptor( name, callback ) );\n }\n }\n\n subscribe( target : {}, source : EventSource ){\n for( let event of this.handlers ){\n on( source, event.name, event.callback, target );\n }\n }\n\n unsubscribe( target : {}, source : EventSource ){\n for( let event of this.handlers ){\n off( source, event.name, event.callback, target );\n }\n }\n}\n\nexport class EventDescriptor {\n callback : Function\n\n constructor(\n public name : string,\n callback : Function | string | boolean\n ){\n if( callback === true ){\n this.callback = getBubblingHandler( name );\n }\n else if( typeof callback === 'string' ){\n this.callback =\n function localCallback(){\n const handler = this[ callback ];\n handler && handler.apply( this, arguments );\n };\n }\n else{\n this.callback = callback;\n }\n }\n}\n\nconst _bubblingHandlers = {};\n\nfunction getBubblingHandler( event : string ){\n return _bubblingHandlers[ event ] || (\n _bubblingHandlers[ event ] = function( a?, b?, c?, d?, e? ){\n if( d !== void 0 || e !== void 0 ) trigger5( this, event, a, b, c, d, e );\n if( c !== void 0 ) trigger3( this, event, a, b, c );\n else trigger2( this, event, a, b );\n }\n );\n}\n\nexport interface HandlersByEvent {\n [ name : string ] : EventHandler\n}\n\nexport class EventHandler {\n constructor( public callback : Callback, public context : any, public next = null ){}\n}\n\nfunction listOff( _events : HandlersByEvent, name : string, callback : Callback, context : any ){\n const head = _events[ name ];\n\n let filteredHead, prev;\n\n for( let ev = head; ev; ev = ev.next ){\n // Element must be kept\n if( ( callback && callback !== ev.callback && callback !== ev.callback._callback ) ||\n ( context && context !== ev.context ) ){\n \n prev = ev;\n filteredHead || ( filteredHead = ev );\n }\n // Element must be skipped\n else{\n if( prev ) prev.next = ev.next;\n }\n }\n\n if( head !== filteredHead ) _events[ name ] = filteredHead;\n}\n\nfunction listSend2( head : EventHandler, a, b ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b );\n}\n\nfunction listSend3( head : EventHandler, a, b, c ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c );\n}\n\nfunction listSend4( head : EventHandler, a, b, c, d ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c, d );\n}\n\nfunction listSend5( head : EventHandler, a, b, c, d, e ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c, d, e );\n}\n\nfunction listSend6( head : EventHandler, a, b, c, d, e, f ){\n for( let ev = head; ev; ev = ev.next ) ev.callback.call( ev.context, a, b, c, d, e, f );\n}\n\nexport interface Callback extends Function {\n _callback? : Function\n}\n\nexport function on( source : EventSource, name : string, callback : Callback, context? : any ) : void {\n if( callback ){\n const _events = source._events || ( source._events = Object.create( null ) );\n _events[ name ] = new EventHandler( callback, context, _events[ name ] );\n }\n}\n\nexport function once( source : EventSource, name : string, callback : Callback, context? : any ) : void {\n if( callback ){\n const once : Callback = _once( function(){\n off( source, name, once );\n callback.apply(this, arguments);\n });\n\n once._callback = callback;\n on( source, name, once, context );\n }\n}\n\nexport function off( source : EventSource, name? : string, callback? : Callback, context? : any ) : void {\n const { _events } = source;\n if( _events ){\n if( callback || context ) {\n if( name ){\n listOff( _events, name, callback, context );\n }\n else{\n for( let name in _events ){\n listOff( _events, name, callback, context );\n }\n }\n }\n else if( name ){\n _events[ name ] = void 0;\n }\n else{\n source._events = void 0;\n }\n }\n}\n\nexport interface EventSource {\n /** @internal */\n _events : HandlersByEvent\n}\n\nconst eventSplitter = /\\s+/;\n\nexport function strings( api : ApiEntry, source : EventSource, events : string, callback : Callback, context ){\n if( eventSplitter.test( events ) ){\n const names = events.split( eventSplitter );\n for( let name of names ) api( source, name, callback, context );\n }\n else api( source, events, callback, context );\n}\n\nexport type ApiEntry = ( source : EventSource, event : string, callback : Callback, context? : any ) => void\n\n/*********************************\n * Event-triggering API\n */\n\n export function trigger2( self : EventSource, name : string, a, b ) : void {\n const { _events } = self;\n if( _events ){\n const queue = _events[ name ],\n { all } = _events;\n\n listSend2( queue, a, b );\n listSend3( all, name, a, b );\n }\n};\n\nexport function trigger3( self : EventSource, name : string, a, b, c ) : void{\n const { _events } = self;\n if( _events ){\n const queue = _events[ name ],\n { all } = _events;\n\n listSend3( queue, a, b, c );\n listSend4( all, name, a, b, c );\n }\n};\n\nexport function trigger5( self : EventSource, name : string, a, b, c, d, e ) : void{\n const { _events } = self;\n if( _events ){\n const queue = _events[ name ],\n { all } = _events;\n\n listSend5( queue, a, b, c, d, e );\n listSend6( all, name, a, b, c, d, e );\n }\n};","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\r\n if (m) return m.call(o);\r\n if (o && typeof o.length === \"number\") return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n\r\nexport function __classPrivateFieldGet(receiver, privateMap) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to get private field on non-instance\");\r\n }\r\n return privateMap.get(receiver);\r\n}\r\n\r\nexport function __classPrivateFieldSet(receiver, privateMap, value) {\r\n if (!privateMap.has(receiver)) {\r\n throw new TypeError(\"attempted to set private field on non-instance\");\r\n }\r\n privateMap.set(receiver, value);\r\n return value;\r\n}\r\n","/*****************************************************************\n * Mixins engine and @define metaprogramming class extensions\n *\n * Vlad Balin & Volicon, (c) 2016-2017\n */\nimport { __extends } from 'tslib';\nimport { assign, defaults, getBaseClass, hashMap, transform } from './tools';\n\nexport interface Subclass< T > extends MixableConstructor {\n new ( ...args ) : T\n prototype : T\n}\n\nexport interface MixableConstructor extends Function{\n __super__? : object;\n mixins? : MixinsState;\n onExtend? : ( BaseClass : Function ) => void;\n onDefine? : ( definition : object, BaseClass : Function ) => void;\n define? : ( definition? : object, statics? : object ) => MixableConstructor;\n extend? : ( definition? : T, statics? : object ) => Subclass;\n}\n\nexport interface MixableDefinition {\n mixins? : Mixin[]\n}\n\n/**\n * Base class, holding metaprogramming class extensions.\n * Supports mixins and Class.define metaprogramming method.\n */\nexport class Mixable {\n static onExtend : ( BaseClass : Function ) => void;\n static onDefine : ( definition : object, BaseClass : Function ) => object; \n static __super__ : object\n static mixins : MixinsState;\n\n /** \n * Must be called after inheritance and before 'define'.\n */\n static define( protoProps : MixableDefinition = {}, staticProps? : object ) : MixableConstructor {\n const BaseClass : MixableConstructor = getBaseClass( this );\n\n // Assign statics.\n staticProps && assign( this, staticProps );\n\n // Extract and apply mixins from the definition.\n const { mixins, ...defineMixin } = protoProps;\n mixins && this.mixins.merge( mixins );\n\n // Unshift definition to the the prototype.\n this.mixins.mergeObject( this.prototype, defineMixin, true );\n\n // Unshift definition from statics to the prototype.\n this.mixins.mergeObject( this.prototype, this.mixins.getStaticDefinitions( BaseClass ), true );\n\n // Call onDefine hook, if it's present.\n this.onDefine && this.onDefine( this.mixins.definitions, BaseClass );\n \n // Apply merge rules to inherited members. No mixins can be added after this point.\n this.mixins.mergeInheritedMembers( BaseClass );\n\n return this;\n }\n\n /** Backbone-compatible extend method to be used in ES5 and for backward compatibility */\n static extend< T extends object>(spec? : T, statics? : {} ) : Subclass< T > {\n let TheSubclass : Subclass< T >;\n\n // 1. Create the subclass (ES5 compatibility shim).\n // If constructor function is given...\n if( spec && spec.hasOwnProperty( 'constructor' ) ){\n // ...we need to manually call internal TypeScript __extend function. Hack! Hack!\n TheSubclass = spec.constructor as any;\n __extends( TheSubclass, this );\n }\n // Otherwise, create the subclall in usual way.\n else{\n TheSubclass = class Subclass extends this {} as any;\n }\n\n predefine( TheSubclass );\n spec && TheSubclass.define( spec, statics );\n\n return TheSubclass;\n }\n}\n\n/** @decorator `@predefine` for forward definitions. Can be used with [[Mixable]] classes only.\n * Forwards the call to the [[Mixable.predefine]];\n */\nexport function predefine( Constructor : MixableConstructor ) : void {\n const BaseClass : MixableConstructor = getBaseClass( Constructor );\n\n // Legacy systems support\n Constructor.__super__ = BaseClass.prototype;\n \n // Initialize mixins structures...\n Constructor.define || MixinsState.get( Mixable ).populate( Constructor );\n\n // Make sure Ctor.mixins are ready before the callback...\n MixinsState.get( Constructor );\n\n // Call extend hook.\n Constructor.onExtend && Constructor.onExtend( BaseClass );\n}\n\n/** @decorator `@define` for metaprogramming magic. Can be used with [[Mixable]] classes only.\n * Forwards the call to [[Mixable.define]].\n */\nexport function define( ClassOrDefinition : Function ) : void;\nexport function define( ClassOrDefinition : object ) : ClassDecorator;\nexport function define( ClassOrDefinition : object | MixableConstructor ){\n // @define class\n if( typeof ClassOrDefinition === 'function' ){\n predefine( ClassOrDefinition );\n ( ClassOrDefinition as MixableConstructor ).define();\n }\n // @define({ prop : val, ... }) class\n else{\n return function( Ctor : MixableConstructor ){\n predefine( Ctor );\n Ctor.define( ClassOrDefinition );\n } as any;\n }\n}\n\nexport function definitions( rules : MixinMergeRules ) : ClassDecorator {\n return ( Class : Function ) => {\n const mixins = MixinsState.get( Class );\n mixins.definitionRules = defaults( hashMap(), rules, mixins.definitionRules );\n }\n}\n\n// Create simple property list decorator\nexport function propertyListDecorator( listName: string ) : PropertyDecorator {\n return function propList(proto, name : string) {\n const list = proto.hasOwnProperty( listName ) ?\n proto[ listName ] : (proto[ listName ] = (proto[ listName ] || []).slice()); \n\n list.push(name);\n }\n}\n\nexport function definitionDecorator( definitionKey, value ){\n return ( proto : object, name : string ) => {\n MixinsState\n .get( proto.constructor )\n .mergeObject( proto, {\n [ definitionKey ] : {\n [ name ] : value\n }\n });\n }\n}\n\nexport class MixinsState {\n mergeRules : MixinMergeRules;\n definitionRules : MixinMergeRules;\n definitions : object = {};\n appliedMixins : Mixin[];\n\n // Return mixins state for the class. Initialize if it's not exist.\n static get( Class ) : MixinsState {\n const { mixins } = Class;\n \n return mixins && Class === mixins.Class ? mixins :\n Class.mixins = new MixinsState( Class );\n }\n\n constructor( public Class : MixableConstructor ){\n const { mixins } = getBaseClass( Class );\n\n this.mergeRules = ( mixins && mixins.mergeRules ) || hashMap();\n this.definitionRules = ( mixins && mixins.definitionRules ) || hashMap();\n this.appliedMixins = ( mixins && mixins.appliedMixins ) || [];\n }\n\n getStaticDefinitions( BaseClass : Function ){\n const definitions = hashMap(),\n { Class } = this;\n\n return transform( definitions, this.definitionRules, ( rule, name ) =>{\n if( BaseClass[ name ] !== Class[ name ]){\n return Class[ name ];\n }\n });\n }\n\n merge( mixins : Mixin[] ){\n const proto = this.Class.prototype,\n { mergeRules } = this;\n\n // Copy applied mixins array as it's going to be updated.\n const appliedMixins = this.appliedMixins = this.appliedMixins.slice();\n\n // Apply mixins in sequence...\n for( let mixin of mixins ) {\n // Mixins array should be flattened.\n if( Array.isArray( mixin ) ) {\n this.merge( mixin );\n }\n // Don't apply mixins twice.\n else if( appliedMixins.indexOf( mixin ) < 0 ){\n appliedMixins.push( mixin );\n\n // For constructors, merge _both_ static and prototype members.\n if( typeof mixin === 'function' ){\n // Merge static members\n this.mergeObject( this.Class, mixin );\n\n // merge definitionRules and mergeRules\n const sourceMixins = ( mixin as any ).mixins;\n if( sourceMixins ){\n this.mergeRules = defaults( hashMap(), this.mergeRules, sourceMixins.mergeRules );\n this.definitionRules = defaults( hashMap(), this.definitionRules, sourceMixins.definitionRules );\n this.appliedMixins = this.appliedMixins.concat( sourceMixins.appliedMixins );\n }\n\n // Prototypes are merged according with rules.\n this.mergeObject( proto, mixin.prototype );\n }\n // Handle plain object mixins.\n else {\n this.mergeObject( proto, mixin );\n }\n }\n }\n }\n\n populate( ...ctors : Function[] ){\n for( let Ctor of ctors ) {\n MixinsState.get( Ctor ).merge([ this.Class ]);\n }\n }\n\n mergeObject( dest : object, source : object, unshift? : boolean ) {\n forEachOwnProp( source, name => {\n const sourceProp = Object.getOwnPropertyDescriptor( source, name );\n let rule : MixinMergeRule;\n\n if( rule = this.definitionRules[ name ] ){\n assignProperty( this.definitions, name, sourceProp, rule, unshift );\n }\n\n if( !rule || rule === mixinRules.protoValue ){\n assignProperty( dest, name, sourceProp, this.mergeRules[ name ], unshift );\n }\n });\n }\n\n mergeInheritedMembers( BaseClass : Function ){\n const { mergeRules, Class } = this;\n\n if( mergeRules ){\n const proto = Class.prototype,\n baseProto = BaseClass.prototype;\n\n for( let name in mergeRules ) {\n const rule = mergeRules[ name ];\n\n if( proto.hasOwnProperty( name ) && name in baseProto ){\n proto[ name ] = resolveRule( proto[ name ], baseProto[ name ], rule );\n }\n }\n }\n }\n}\n\nconst dontMix = {\n function : hashMap({\n length : true,\n prototype : true,\n caller : true,\n arguments : true,\n name : true,\n __super__ : true\n }),\n \n object : hashMap({\n constructor : true\n }) \n}\n\nfunction forEachOwnProp( object : object, fun : ( name : string ) => void ){\n const ignore = dontMix[ typeof object ];\n\n for( let name of Object.getOwnPropertyNames( object ) ) {\n ignore[ name ] || fun( name );\n }\n}\n\nexport interface MixinMergeRules {\n [ name : string ] : MixinMergeRule\n}\n\nexport type MixinMergeRule = ( a : any, b : any ) => any\nexport type Mixin = { [ key : string ] : any } | Function\n\n// @mixins( A, B, ... ) decorator.\nexport interface MixinRulesDecorator {\n ( rules : MixinMergeRules ) : ClassDecorator\n value( a : object, b : object) : object;\n protoValue( a : object, b : object) : object;\n merge( a : object, b : object ) : object;\n pipe( a: Function, b : Function ) : Function;\n defaults( a: Function, b : Function ) : Function;\n classFirst( a: Function, b : Function ) : Function;\n classLast( a: Function, b : Function ) : Function;\n every( a: Function, b : Function ) : Function;\n some( a: Function, b : Function ) : Function;\n}\n\nexport const mixins = ( ...list : Mixin[] ) => (\n ( Class : Function ) => MixinsState.get( Class ).merge( list )\n);\n\n// @mixinRules({ name : rule, ... }) decorator.\nexport const mixinRules = ( ( rules : MixinMergeRules ) => (\n ( Class : Function ) => {\n const mixins = MixinsState.get( Class );\n mixins.mergeRules = defaults( rules, mixins.mergeRules );\n }\n) ) as MixinRulesDecorator;\n\n// Pre-defined mixin merge rules\n\nmixinRules.value = ( a, b ) => a;\n\nmixinRules.protoValue = ( a, b ) => a;\n\n// Recursively merge members\nmixinRules.merge = ( a, b ) => defaults( {}, a, b );\n\n // Execute methods in pipe, with the class method executed last.\nmixinRules.pipe = ( a, b ) => (\n function( x : any ) : any {\n return a.call( this, b.call( this, x ) );\n }\n);\n\n // Assume methods return an object, and merge results with defaults (class method executed first)\nmixinRules.defaults = ( a : Function, b : Function ) => (\n function() : object {\n return defaults( a.apply( this, arguments ), b.apply( this, arguments ) );\n }\n);\n\n// Execute methods in sequence staring with the class method.\nmixinRules.classFirst = ( a : Function, b : Function ) => (\n function() : void {\n a.apply( this, arguments );\n b.apply( this, arguments );\n }\n);\n\n // Execute methods in sequence ending with the class method.\nmixinRules.classLast = ( a : Function, b : Function ) => (\n function() : void {\n b.apply( this, arguments );\n a.apply( this, arguments );\n }\n)\n\n // Execute methods in sequence returning the first falsy result.\nmixinRules.every = ( a : Function, b : Function ) =>(\n function() : any {\n return a.apply( this, arguments ) && b.apply( this, arguments );\n }\n);\n // Execute methods in sequence returning the first truthy result.\nmixinRules.some = ( a : Function, b : Function ) =>(\n function() : any {\n return a.apply( this, arguments ) || b.apply( this, arguments );\n }\n);\n\n/**\n * Helpers\n */\n\nfunction assignProperty( dest : object, name : string, sourceProp : PropertyDescriptor, rule : MixinMergeRule, unshift? : boolean ){\n// Destination prop is defined, thus the merge rules must be applied.\n if( dest.hasOwnProperty( name ) ){\n const destProp = Object.getOwnPropertyDescriptor( dest, name );\n\n if( destProp.configurable && 'value' in destProp ){\n dest[ name ] = unshift ?\n resolveRule( sourceProp.value, destProp.value, rule ) :\n resolveRule( destProp.value, sourceProp.value, rule ) ;\n }\n }\n // If destination is empty, just copy the prop over.\n else{\n Object.defineProperty( dest, name, sourceProp );\n }\n}\n\nfunction resolveRule( dest, source, rule : MixinMergeRule ){\n // When destination is empty, take the source.\n if( dest === void 0 ) return source;\n\n // In these cases we take non-empty destination:\n if( !rule || source === void 0 ) return dest;\n\n // In other cases we must merge values.\n return rule( dest, source );\n}","import * as _eventsApi from './eventsource';\nimport { EventMap, EventsDefinition, EventSource, HandlersByEvent } from './eventsource';\nimport { define, definitions, Mixable, MixableConstructor, mixinRules, MixinsState } from './mixins';\nimport { omit, transform } from './tools';\n\nconst { strings, on, off, once, trigger5, trigger2, trigger3 } = _eventsApi;\n\nlet _idCount = 0;\n\nfunction uniqueId() : string {\n return 'l' + _idCount++;\n}\n\nexport { EventMap, EventsDefinition };\n\nexport interface MessengerDefinition {\n _localEvents? : EventMap\n localEvents? : EventsDefinition\n properties? : PropertyMap\n [ name : string ] : any\n}\n\nexport interface PropertyMap {\n [ name : string ] : Property\n}\n\nexport type Property = PropertyDescriptor | ( () => any )\n\nexport interface MessengersByCid {\n [ cid : string ] : Messenger\n}\n\nexport type EventCallbacks = { [ events : string ] : EventCallback }\nexport type EventCallback = ( this : Context, ...args : any[] ) => void\n\n/*************************\n * Messenger is mixable class with capabilities of sending and receiving synchronous events.\n * This class itself can serve as both mixin and base class.\n */\n\n@define\n@definitions({\n properties : mixinRules.merge,\n localEvents : mixinRules.merge\n})\nexport class Messenger implements Mixable, EventSource {\n // Define extendable mixin static properties.\n /** @internal */\n static __super__ : object;\n static mixins : MixinsState;\n static onExtend : ( BaseClass : Function ) => void;\n static define : ( definition? : MessengerDefinition, statics? : object ) => MixableConstructor;\n static extend : ( definition? : MessengerDefinition, statics? : object ) => MixableConstructor;\n static onDefine({ localEvents, _localEvents, properties } : MessengerDefinition, BaseClass? : typeof Mixable ){\n // Handle localEvents definition\n if( localEvents || _localEvents ){\n const eventsMap = new EventMap( this.prototype._localEvents );\n\n localEvents && eventsMap.addEventsMap( localEvents );\n _localEvents && eventsMap.merge( _localEvents );\n \n this.prototype._localEvents = eventsMap;\n }\n\n // Handle properties definitions...\n if( properties ){\n Object.defineProperties( this.prototype, transform( {}, properties, toPropertyDescriptor ) );\n }\n }\n\n /** @internal */ \n _events : HandlersByEvent = void 0;\n\n /** @internal */ \n _listeningTo : MessengersByCid = void 0\n\n /** Unique client-only id. */\n cid : string\n\n /** Prototype-only property to manage automatic local events subscription */ \n protected _localEvents : EventMap\n\n constructor(){\n this.cid = uniqueId();\n this.initialize.apply( this, arguments );\n\n // TODO: local events subscribe?\n }\n\n /** Method is called at the end of the constructor */\n initialize() : void {}\n \n on( events : string | EventCallbacks, callback?, context? ) : this {\n if( typeof events === 'string' ) strings( on, this, events, callback, context );\n else for( let name in events ) strings( on, this, name, events[ name ], context || callback );\n\n return this;\n }\n\n once( events : string | EventCallbacks, callback?, context? ) : this {\n if( typeof events === 'string' ) strings( once, this, events, callback, context );\n else for( let name in events ) strings( once, this, name, events[ name ], context || callback );\n\n return this;\n }\n\n off( events? : string | EventCallbacks, callback?, context? ) : this {\n if( !events ) off( this, void 0, callback, context );\n else if( typeof events === 'string' ) strings( off, this, events, callback, context );\n else for( let name in events ) strings( off, this, name, events[ name ], context || callback );\n\n return this;\n }\n\n // Trigger one or many events, firing all bound callbacks. Callbacks are\n // passed the same arguments as `trigger` is, apart from the event name\n // (unless you're listening on `\"all\"`, which will cause your callback to\n // receive the true name of the event as the first argument).\n trigger(name : string, a?, b?, c?, d?, e? ) : this {\n if( d !== void 0 || e !== void 0 ) trigger5( this, name, a, b, c, d, e );\n else if( c !== void 0 ) trigger3( this, name, a, b, c );\n else trigger2( this, name, a, b );\n return this;\n }\n\n listenTo( source : Messenger, a : string | EventCallbacks, b? : Function ) : this {\n if( source ){\n addReference( this, source );\n source.on( a, !b && typeof a === 'object' ? this : b, this );\n }\n\n return this;\n }\n\n listenToOnce( source : Messenger, a : string | EventCallbacks, b? : Function ) : this {\n if( source ){\n addReference( this, source );\n source.once( a, !b && typeof a === 'object' ? this : b, this );\n }\n\n return this;\n }\n\n stopListening( a_source? : Messenger, a? : string | EventCallbacks, b? : Function ) : this {\n const { _listeningTo } = this;\n if( _listeningTo ){\n const removeAll = !( a || b ),\n second = !b && typeof a === 'object' ? this : b;\n\n if( a_source ){\n const source = _listeningTo[ a_source.cid ];\n if( source ){\n if( removeAll ) delete _listeningTo[ a_source.cid ];\n source.off( a, second, this );\n }\n }\n else if( a_source == null ){\n for( let cid in _listeningTo ) _listeningTo[ cid ].off( a, second, this );\n\n if( removeAll ) ( this._listeningTo = void 0 );\n }\n }\n\n return this;\n }\n\n /**\n * Destructor. Stops messenger from listening to all objects,\n * and stop others from listening to the messenger. \n */\n _disposed : boolean\n\n dispose() : void {\n if( this._disposed ) return;\n\n this.stopListening();\n this.off();\n\n this._disposed = true;\n }\n}\n\n/**\n * Backbone 1.2 API conformant Events mixin.\n */\nexport const Events : Messenger = omit( Messenger.prototype, 'constructor', 'initialize' );\n\n/**\n * Messenger Private Helpers \n */\n\nfunction toPropertyDescriptor( x : Property ) : PropertyDescriptor {\n if( x ){\n return typeof x === 'function' ? { get : < () => any >x, configurable : true } : x;\n }\n}\n\nfunction addReference( listener : Messenger, source : Messenger ){\n const listeningTo = listener._listeningTo || (listener._listeningTo = Object.create( null ) ),\n cid = source.cid || ( source.cid = uniqueId() );\n\n listeningTo[ cid ] = source;\n}","import { Messenger } from './events'\nimport { define } from './mixins';\n\ndeclare var process : any;\n\nexport type LogLevel = 'error' | 'warn' | 'debug' | 'info' | 'log';\nexport type LoggerEventHandler = ( topic : string, msg : string, props : object ) => void;\n\nexport const isProduction = typeof process !== 'undefined' && process.env && process.env.NODE_ENV === 'production',\n logEvents : LogLevel[] = isProduction ?\n [ 'error', 'info' ] :\n [ 'error', 'warn', 'debug', 'info', 'log' ];\n\n@define\nexport class Logger extends Messenger {\n counter : { [ level in LogLevel ]? : number } = {}\n\n // Log events of the given log level to the console, optionally filtered by topic\n logToConsole( level : LogLevel, filter? : RegExp ) : this {\n return this.on( level, ( topic, msg, props ) => {\n if( !filter || filter.test( topic ) ){\n const args = [ `[${topic}] ${msg}` ];\n \n for( let name in props ){\n args.push( `\\n\\t${name}:`, toString( props[ name ] ) );\n }\n \n console[ level ].apply( console, args );\n }\n });\n }\n\n // Fire exception on the events of the given log level, optionally filtered by topic\n throwOn( level : LogLevel, filter? : RegExp ) : this {\n return this.on( level, ( topic, msg, props ) => {\n if( !filter || filter.test( topic ) ){\n throw new Error( `[${topic}] ${msg}` );\n }\n });\n }\n\n // Count log events of the given level, optionally filtered by topic\n count( level : LogLevel, filter? : RegExp ) : this {\n return this.on( level, ( topic, msg, props ) => {\n if( !filter || filter.test( topic ) ){\n this.counter[ level ] = ( this.counter[ level ] || 0 ) + 1;\n }\n });\n }\n\n trigger : ( level : LogLevel, topic : string, message : string, props? : object ) => this;\n \n off : ( event? : LogLevel ) => this;\n\n\n on( handlers : { [ name in LogLevel ] : LoggerEventHandler } ) : this;\n on( handlers : LogLevel, handler : LoggerEventHandler ) : this;\n on( handlers : 'all', handler : ( level : LogLevel, topic : string, msg : string, props : object ) => void ) : this;\n on( a : any, b? : any ){\n return super.on( a, b );\n }\n}\n\n/**\n * Convert objects to the plain text friendly format.\n * primitives as in JSON.\n */\nlet toString = typeof window === 'undefined' ? \n something => {\n if( something && typeof something === 'object' ){\n // Support custom object wrappers...\n const value = something.__inner_state__ || something,\n isArray = Array.isArray( value );\n\n const body = isArray ? `[ length = ${ value.length } ]` : `{ ${ Object.keys( value ).join( ', ' )} }`;\n\n return something.constructor.name + ' ' + body;\n }\n\n return JSON.stringify( something );\n }\n : x => x;\n\nexport const logger = new Logger();\n\nif( typeof console !== 'undefined' ) {\n for( let event of logEvents ){\n logger.logToConsole( event );\n }\n}\n\nexport const throwingLogger = new Logger();\nthrowingLogger.throwOn( 'error' ).throwOn( 'warn' );\n\nexport const log : typeof logger.trigger = logger.trigger.bind( logger );\n","export interface IONode {\n /** @internal */\n _endpoint : IOEndpoint\n\n /** @internal */\n _ioPromise : IOPromise< this >\n}\n\nexport interface IOPromise extends Promise {\n abort? : () => void\n}\n\nexport interface IOEndpoint {\n list( options : IOOptions, collection? ) : IOPromise\n create( json : any, options : IOOptions, record? ) : IOPromise\n update( id : string | number, json :any, options : IOOptions, record? ) : IOPromise\n read( id : string | number, options : IOOptions, record? ) : IOPromise\n destroy( id : string | number, options : IOOptions, record? ) : IOPromise\n subscribe( events : IOEvents, collection? ) : IOPromise\n unsubscribe( events : IOEvents, collection? ) : void\n}\n\nexport interface IOOptions {\n ioMethod? : 'save' | 'fetch'\n}\n\nexport interface IOEvents {\n updated? : ( json : any ) => void\n removed? : ( json : any ) => void\n}\n\nexport function getOwnerEndpoint( self ) : IOEndpoint {\n // Check if we are the member of the collection...\n const { collection } = self;\n if( collection ){\n return getOwnerEndpoint( collection );\n }\n\n // Now, if we're the member of the model...\n if( self._owner ){\n const { _endpoints } = self._owner;\n return _endpoints && _endpoints[ self._ownerKey ];\n }\n}\n\n/**\n * Create abortable promise.\n * Adds `promise.abort()` function which rejects the promise by default\n * initialize() function takes third optional argument `abort : ( resolve, reject ) => void`,\n * which can be used to add custom abort handling.\n */\ndeclare var Promise: PromiseConstructorLike;\n\nexport function createIOPromise( initialize : InitIOPromise ) : IOPromise{\n let resolve, reject, onAbort;\n\n function abort( fn ){\n onAbort = fn;\n }\n\n const promise : IOPromise = new Promise( ( a_resolve, a_reject ) =>{\n reject = a_reject;\n resolve = a_resolve;\n initialize( resolve, reject, abort );\n }) as IOPromise;\n\n promise.abort = () => {\n onAbort ? onAbort( resolve, reject ) : reject( new Error( \"I/O Aborted\" ) );\n }\n\n return promise;\n}\n\nexport type InitIOPromise = ( resolve : ( x? : any ) => void, reject : ( x? : any ) => void, abort? : ( fn : Function ) => void ) => void;\n\nexport function startIO( self : IONode, promise : IOPromise, options : IOOptions, thenDo : ( json : any ) => any ) : IOPromise {\n // Stop pending I/O first...\n abortIO( self );\n\n self._ioPromise = promise\n .then( resp => {\n self._ioPromise = null;\n \n const result = thenDo ? thenDo( resp ) : resp;\n \n triggerAndBubble( self, 'sync', self, resp, options );\n \n return result;\n } ) \n .catch( err => {\n self._ioPromise = null;\n \n // Overlaps with a new `error` event.\n triggerAndBubble( self, 'error', self, err, options );\n \n throw err;\n } ) as IOPromise;\n\n self._ioPromise.abort = promise.abort;\n\n return self._ioPromise;\n}\n\nexport function abortIO( self : IONode ){\n if( self._ioPromise && self._ioPromise.abort ){\n self._ioPromise.abort();\n self._ioPromise = null;\n }\n}\n\nexport function triggerAndBubble( eventSource, ...args ){\n eventSource.trigger.apply( eventSource, args );\n const { collection } = eventSource;\n collection && collection.trigger.apply( collection, args ); \n}","/**\n * Traversable objects and symbolic references\n */\nexport interface Traversable {\n getStore() : Traversable\n getOwner() : Traversable\n get( key : string ) : any \n}\n\nconst referenceMask = /\\^|(store\\.[^.]+)|([^.]+)/g;\n\n// Compile reference to function\nexport type ResolveReference = ( root : Traversable ) => any; \n\nexport class CompiledReference {\n resolve : ResolveReference\n tail : string\n local : boolean\n\n constructor( reference : string, splitTail : boolean = false ){\n const path = reference\n .match( referenceMask )\n .map( key => {\n if( key === '^' || key === 'owner' ) return 'getOwner()';\n\n if( key[ 0 ] === '~' ) return `getStore().get(\"${ key.substr( 1 ) }\")`;\n\n if( key.indexOf( 'store.' ) === 0 ) return `getStore().get(\"${ key.substr( 6 ) }\")`;\n \n return key;\n } );\n \n this.tail = splitTail && path.pop();\n this.local = !path.length;\n \n this.resolve = new Function( 'self', `\n var v = self.${ path.shift() };\n \n ${ path.map( x => `\n v = v && v.${ x };\n `).join('')}\n\n return v;\n ` );\n }\n}\n\nexport function resolveReference( root : Traversable, reference : string, action : ( object, key : string ) => any ) : any {\n const path = reference.match( referenceMask ),\n skip = path.length - 1;\n \n let self = root;\n\n for( var i = 0; i < skip; i++ ){\n const key = path[ i ];\n switch( key ){\n case '~' : self = self.getStore(); break;\n case '^' : self = self.getOwner(); break;\n default : self = self.get( key );\n }\n\n // Do nothing if object on the path doesn't exist.\n if( !self ) return;\n }\n\n return action( self, path[ skip ] );\n}","export interface ChildrenErrors {\n [ key : string ] : ValidationError | any\n} \n\nexport interface Validatable {\n /** @internal */\n _validateNested( errors : ChildrenErrors ) : number;\n \n validate( self : any ) : any\n get( key : string ) : any\n}\n\n// Validation error object.\nexport class ValidationError {\n // Invalid nested object keys \n nested : ChildrenErrors \n length : number\n\n // Local error\n error : any\n\n constructor( obj : Validatable ){\n this.length = obj._validateNested( this.nested = {} );\n\n if( this.error = obj.validate( obj ) ){\n this.length++;\n }\n }\n\n each( iteratee : ( value : any, key : string ) => void ) : void {\n const { error, nested } = this;\n\n if( error ) iteratee( error, null );\n\n for( const key in nested ){\n iteratee( nested[ key ], key );\n }\n }\n\n eachError( iteratee : ( error : any, key : string, object : Validatable ) => void, object : Validatable ) : void {\n this.each( ( value : any, key : string ) => {\n if( value instanceof ValidationError ){\n (value).eachError( iteratee, object.get( key ) );\n }\n else{\n iteratee( value, key, object );\n }\n });\n }\n}","/*! *****************************************************************************\r\nCopyright (c) Microsoft Corporation. All rights reserved.\r\nLicensed under the Apache License, Version 2.0 (the \"License\"); you may not use\r\nthis file except in compliance with the License. You may obtain a copy of the\r\nLicense at http://www.apache.org/licenses/LICENSE-2.0\r\n\r\nTHIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY\r\nKIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED\r\nWARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,\r\nMERCHANTABLITY OR NON-INFRINGEMENT.\r\n\r\nSee the Apache Version 2.0 License for specific language governing permissions\r\nand limitations under the License.\r\n***************************************************************************** */\r\n/* global Reflect, Promise */\r\n\r\nvar extendStatics = function(d, b) {\r\n extendStatics = Object.setPrototypeOf ||\r\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\r\n function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };\r\n return extendStatics(d, b);\r\n};\r\n\r\nexport function __extends(d, b) {\r\n extendStatics(d, b);\r\n function __() { this.constructor = d; }\r\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\r\n}\r\n\r\nexport var __assign = function() {\r\n __assign = Object.assign || function __assign(t) {\r\n for (var s, i = 1, n = arguments.length; i < n; i++) {\r\n s = arguments[i];\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\r\n }\r\n return t;\r\n }\r\n return __assign.apply(this, arguments);\r\n}\r\n\r\nexport function __rest(s, e) {\r\n var t = {};\r\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n t[p] = s[p];\r\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n t[p[i]] = s[p[i]];\r\n }\r\n return t;\r\n}\r\n\r\nexport function __decorate(decorators, target, key, desc) {\r\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\r\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\r\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\r\n return c > 3 && r && Object.defineProperty(target, key, r), r;\r\n}\r\n\r\nexport function __param(paramIndex, decorator) {\r\n return function (target, key) { decorator(target, key, paramIndex); }\r\n}\r\n\r\nexport function __metadata(metadataKey, metadataValue) {\r\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\r\n}\r\n\r\nexport function __awaiter(thisArg, _arguments, P, generator) {\r\n return new (P || (P = Promise))(function (resolve, reject) {\r\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\r\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\r\n function step(result) { result.done ? resolve(result.value) : new P(function (resolve) { resolve(result.value); }).then(fulfilled, rejected); }\r\n step((generator = generator.apply(thisArg, _arguments || [])).next());\r\n });\r\n}\r\n\r\nexport function __generator(thisArg, body) {\r\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\r\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\r\n function verb(n) { return function (v) { return step([n, v]); }; }\r\n function step(op) {\r\n if (f) throw new TypeError(\"Generator is already executing.\");\r\n while (_) try {\r\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\r\n if (y = 0, t) op = [op[0] & 2, t.value];\r\n switch (op[0]) {\r\n case 0: case 1: t = op; break;\r\n case 4: _.label++; return { value: op[1], done: false };\r\n case 5: _.label++; y = op[1]; op = [0]; continue;\r\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\r\n default:\r\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\r\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\r\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\r\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\r\n if (t[2]) _.ops.pop();\r\n _.trys.pop(); continue;\r\n }\r\n op = body.call(thisArg, _);\r\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\r\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\r\n }\r\n}\r\n\r\nexport function __exportStar(m, exports) {\r\n for (var p in m) if (!exports.hasOwnProperty(p)) exports[p] = m[p];\r\n}\r\n\r\nexport function __values(o) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator], i = 0;\r\n if (m) return m.call(o);\r\n return {\r\n next: function () {\r\n if (o && i >= o.length) o = void 0;\r\n return { value: o && o[i++], done: !o };\r\n }\r\n };\r\n}\r\n\r\nexport function __read(o, n) {\r\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\r\n if (!m) return o;\r\n var i = m.call(o), r, ar = [], e;\r\n try {\r\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\r\n }\r\n catch (error) { e = { error: error }; }\r\n finally {\r\n try {\r\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\r\n }\r\n finally { if (e) throw e.error; }\r\n }\r\n return ar;\r\n}\r\n\r\nexport function __spread() {\r\n for (var ar = [], i = 0; i < arguments.length; i++)\r\n ar = ar.concat(__read(arguments[i]));\r\n return ar;\r\n}\r\n\r\nexport function __spreadArrays() {\r\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\r\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\r\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\r\n r[k] = a[j];\r\n return r;\r\n};\r\n\r\nexport function __await(v) {\r\n return this instanceof __await ? (this.v = v, this) : new __await(v);\r\n}\r\n\r\nexport function __asyncGenerator(thisArg, _arguments, generator) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\r\n return i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i;\r\n function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; }\r\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\r\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\r\n function fulfill(value) { resume(\"next\", value); }\r\n function reject(value) { resume(\"throw\", value); }\r\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\r\n}\r\n\r\nexport function __asyncDelegator(o) {\r\n var i, p;\r\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\r\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: n === \"return\" } : f ? f(v) : v; } : f; }\r\n}\r\n\r\nexport function __asyncValues(o) {\r\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\r\n var m = o[Symbol.asyncIterator], i;\r\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\r\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\r\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\r\n}\r\n\r\nexport function __makeTemplateObject(cooked, raw) {\r\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\r\n return cooked;\r\n};\r\n\r\nexport function __importStar(mod) {\r\n if (mod && mod.__esModule) return mod;\r\n var result = {};\r\n if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];\r\n result.default = mod;\r\n return result;\r\n}\r\n\r\nexport function __importDefault(mod) {\r\n return (mod && mod.__esModule) ? mod : { default: mod };\r\n}\r\n","/**\r\n * Select appropriate helpers function for particular value type.\r\n */\r\nexport interface IterableLink {\r\n value : any\r\n at( key : number | string ) : any\r\n}\r\n\r\nexport type Iterator = ( link : any, key : string | number ) => any;\r\n\r\nexport interface Helper {\r\n map( link : IterableLink, iterator : Iterator ) : any[]\r\n clone( obj : any ) : any,\r\n remove( obj : any, key : string | number ) : any\r\n}\r\n\r\nconst ArrayProto = Array.prototype,\r\n ObjectProto = Object.prototype;\r\n\r\nexport function helpers( value ) : Helper {\r\n if( value && typeof value === 'object' ){\r\n switch( Object.getPrototypeOf( value ) ){\r\n case ArrayProto : return arrayHelpers;\r\n case ObjectProto : return objectHelpers;\r\n }\r\n }\r\n\r\n return dummyHelpers;\r\n}\r\n\r\n// Do nothing for types other than Array and plain Object.\r\nconst dummyHelpers : Helper = {\r\n clone( value ){ return value; },\r\n map( link : IterableLink, fun ){ return []; },\r\n remove( value ){ return value; }\r\n};\r\n\r\n// `map` and `clone` for plain JS objects\r\nexport const objectHelpers : Helper = {\r\n // Map through the link to object\r\n map( link : IterableLink, iterator : Iterator ) : any[] {\r\n let mapped = [],\r\n { value } = link\r\n\r\n for( let key in value ){\r\n if( value.hasOwnProperty( key ) ){\r\n const element = iterator( link.at( key ), key );\r\n element === void 0 || ( mapped.push( element ) ); \r\n }\r\n }\r\n\r\n return mapped;\r\n },\r\n\r\n remove( object : {}, key : string ) : {} {\r\n delete object[ key ];\r\n return object;\r\n },\r\n\r\n // Shallow clone plain JS object\r\n clone( object : {} ) : {} {\r\n return { ...object };\r\n }\r\n};\r\n\r\n// `map` and `clone` helpers for arrays.\r\nexport const arrayHelpers : Helper = {\r\n // Shallow clone array\r\n clone( array : any[] ) : any[] {\r\n return array.slice();\r\n },\r\n\r\n remove( array : any[], i : number ) : any[] {\r\n array.splice( i, 1 );\r\n return array;\r\n },\r\n\r\n // Map through the link to array\r\n map( link : IterableLink, iterator : Iterator ) : any[] {\r\n const length = link.value.length,\r\n mapped = Array( length );\r\n\r\n for( var i = 0, j = 0; i < length; i++ ){\r\n const y = iterator( link.at( i ), i );\r\n y === void 0 || ( mapped[ j++ ] = y );\r\n }\r\n\r\n mapped.length === j || ( mapped.length = j );\r\n\r\n return mapped;\r\n }\r\n};","/**\r\n * Advanced React links for purely functional two-way data binding\r\n *\r\n * MIT License, (c) 2016 Vlad Balin, Volicon.\r\n */\r\nimport { arrayHelpers, helpers } from './helpers';\r\n\r\nexport * from './helpers'\r\n\r\n/** \r\n * `Linked` class is an abstract linked value - the value, the function to update this value, and its validation error.\r\n * The enclosed value is considered as immutable.\r\n */ \r\nexport abstract class Linked{\r\n /** Validation error. Usually is a string with error text, but can hold any type. */ \r\n error : any = void 0\r\n \r\n /** Set linked value */ \r\n abstract set( x : T ) : void\r\n\r\n constructor( public value : T ){}\r\n\r\n /** EXPERIMENTAL: Support useRef interface. */ \r\n get current(){ return this.value; }\r\n set current( x : T ){ this.set( x ); }\r\n\r\n // Private accessor for whenChanged. Uniform with Type-R models and collections API.\r\n protected get _changeToken(){\r\n return this.value;\r\n }\r\n\r\n /** Produce the new link executing the given function before the link value will be updated. */\r\n onChange( handler : ( x : T ) => void ) : Linked {\r\n return new ClonedValueLink( this, ( x : T ) => {\r\n handler( x );\r\n this.set( x );\r\n });\r\n }\r\n\r\n /** Produce the new link which transform the value before `set` with a given function. */\r\n pipe( handler : Linked.Transform ) : Linked< T > {\r\n return new ClonedValueLink( this, x =>{\r\n const next = handler( x, this.value );\r\n next === void 0 || this.set( next );\r\n } );\r\n }\r\n\r\n /** \r\n * Create React component props for the component.\r\n * \r\n * \r\n */ \r\n get props() :\r\n T extends boolean ? { checked : boolean, onChange : ( e : any ) => void } :\r\n { value : T, onChange : ( e : any ) => void }\r\n {\r\n return typeof this.value === 'boolean' ? {\r\n checked : this.value,\r\n onChange : e => this.set( Boolean( e.target.checked ) as any )\r\n }:{\r\n value : this.value,\r\n onChange : e => this.set( e.target.value )\r\n } as any;\r\n }\r\n\r\n /** Update the linked value using given transform function. */ \r\n update( transform : Linked.Transform, e? : Object ) : void {\r\n const next = transform( this.clone(), e );\r\n next === void 0 || this.set( next );\r\n }\r\n\r\n // Create UI event handler function which will update the link with a given transform function.\r\n action( transform : Linked.Transform< T > ) : Linked.EventHandler {\r\n return e => this.update( transform, e );\r\n }\r\n\r\n equals( truthyValue : T ) : Linked {\r\n return new EqualsValueLink( this, truthyValue );\r\n }\r\n\r\n get true( this : Linked ){\r\n return () => this.set( true );\r\n }\r\n\r\n get false( this : Linked ){\r\n return () => this.set( false );\r\n }\r\n\r\n get null(){\r\n return () => this.set( null );\r\n }\r\n\r\n get isTruthy(){\r\n return this.value ? true : undefined;\r\n }\r\n\r\n enabled( defaultValue? : T ) : Linked {\r\n return new EnabledValueLink( this, defaultValue || \"\" );\r\n }\r\n\r\n // Array-only links methods\r\n contains( this : Linked, element : E ) : Linked{\r\n return new ContainsRef( this, element );\r\n }\r\n\r\n push( this : Linked, ...args : E[] ) : void;\r\n push(){\r\n const array = arrayHelpers.clone( this.value );\r\n Array.prototype.push.apply( array, arguments );\r\n this.set( array );\r\n }\r\n\r\n unshift( this : Linked, ...args : E[] ) : void;\r\n unshift() : void {\r\n const array = arrayHelpers.clone( this.value );\r\n Array.prototype.unshift.apply( array, arguments );\r\n this.set( array );\r\n }\r\n\r\n \r\n splice( this : Linked, start : number, deleteCount? : number ) : void;\r\n splice() : void {\r\n const array = arrayHelpers.clone( this.value );\r\n Array.prototype.splice.apply( array, arguments );\r\n this.set( array );\r\n }\r\n\r\n // Array and objects universal collection methods\r\n map( this : Linked, iterator : ( link : PropValueLink, idx : number ) => Z ) : Z[];\r\n map( this : Linked<{[ key : string ] : E }>, iterator : ( link : PropValueLink, idx : string ) => Z ) : Z[];\r\n map( iterator ) {\r\n return helpers( this.value ).map( this, iterator );\r\n }\r\n\r\n removeAt( this : Linked, key : number ) : void;\r\n removeAt( this : Linked<{ [ key : string ] : E }>, key : string ) : void;\r\n removeAt( key ){\r\n const { value } = this,\r\n _ = helpers( value );\r\n\r\n this.set( _.remove( _.clone( value ), key ) );\r\n }\r\n\r\n at( this : Linked, key : number ) : PropValueLink;\r\n at( key : K ) : PropValueLink;\r\n at( key ){\r\n return new PropValueLink( this, key );\r\n }\r\n\r\n clone() : T {\r\n let { value } = this;\r\n return helpers( value ).clone( value );\r\n }\r\n\r\n /**\r\n * Convert link to object to the object of links. Optionally filter by \r\n */\r\n pick< K extends keyof T >( ...keys : K[]) : {[ P in K ]: Linked}\r\n pick() {\r\n let links = {}, keys = arguments.length ? arguments : Object.keys( this.value );\r\n\r\n for( let i = 0; i < keys.length; i++ ){\r\n const key : string = keys[ i ];\r\n links[ key ] = new PropValueLink( this, key );\r\n }\r\n\r\n return links;\r\n }\r\n\r\n /**\r\n * Convert link to object to the object of links.\r\n * Memorises the result, subsequent calls are cheap.\r\n */\r\n get $() : T extends object ? Linked.Hash : never {\r\n if( !this._value$ ){\r\n let links : Linked.Hash = this._value$ = {},\r\n { value } = this;\r\n\r\n for( let key in value ){\r\n if( value.hasOwnProperty( key ) ){\r\n links[ key ] = new PropValueLink( this, key );\r\n }\r\n }\r\n }\r\n\r\n return this._value$ as any;\r\n }\r\n\r\n private _value$ : object\r\n\r\n /**\r\n * Validate link with validness predicate and optional custom error object. Can be chained.\r\n */\r\n check( whenValid : Linked.Validator, error? : any ) : this {\r\n if( !this.error && !whenValid( this.value ) ){\r\n this.error = error || whenValid.error || defaultError;\r\n }\r\n\r\n return this;\r\n }\r\n}\r\n\r\nexport namespace Linked {\r\n export interface Validator< T >{\r\n ( value : T ) : boolean\r\n error? : any\r\n } \r\n\r\n export type Transform< T > = ( value : T, event? : {} ) => T\r\n export type EventHandler = ( event : {} ) => void\r\n\r\n export type Hash = {\r\n [K in keyof T] : Linked\r\n }\r\n\r\n /** Create linked value out of its value and the set function */ \r\n export function value( value : T, set : ( x : T ) => void ) : Linked{\r\n return new CustomValueLink( value, set );\r\n }\r\n\r\n export function mutable( state : T ) : Linked{\r\n return new CustomValueLink( state, x => {\r\n for( let key in x ){\r\n if( x.hasOwnProperty( key ) ){\r\n state[ key ] = x[ key ];\r\n }\r\n }\r\n } );\r\n }\r\n\r\n /**\r\n * Unwrap object with links, returning an object of a similar shape filled with link values.\r\n */\r\n export function getValues( links : Linked.Hash ) : T {\r\n return unwrap( links, 'value' ) as any;\r\n }\r\n\r\n /**\r\n * Unwrap object with links, returning an object of a similar shape filled with link errors.\r\n */\r\n export function getErrors( links : Linked.Hash ) : { [ name in keyof T ] : any } {\r\n return unwrap( links, 'error' ) as any;\r\n }\r\n\r\n /**\r\n * Return true if an object with links contains any errors.\r\n */\r\n export function hasErrors( links : Linked.Hash ) : boolean {\r\n for( let key in links ){\r\n if( links.hasOwnProperty( key ) && links[ key ].error ){\r\n return true;\r\n }\r\n }\r\n\r\n return false;\r\n }\r\n\r\n /**\r\n * Assing links with values from the source object.\r\n */\r\n export function setValues( links : Linked.Hash, source : T ) : void {\r\n if( source ){\r\n for( let key in links ){\r\n const sourceKey = trim( key );\r\n if( source.hasOwnProperty( sourceKey ) ){\r\n const sourceVal = source[ sourceKey ];\r\n sourceVal === void 0 || links[ key ].set( sourceVal );\r\n }\r\n } \r\n }\r\n }\r\n\r\n}\r\n\r\nclass CustomValueLink< T > extends Linked< T > {\r\n set( x ){}\r\n\r\n constructor( value : T, set : ( x : T ) => void ){\r\n super( value );\r\n this.set = set;\r\n }\r\n}\r\n\r\nclass ClonedValueLink< T > extends Linked< T > {\r\n set( x ){}\r\n\r\n constructor( parent : Linked< T >, set : ( x : T ) => void ){\r\n super( parent.value );\r\n this.set = set;\r\n\r\n const { error } = parent;\r\n if( error ) this.error = error;\r\n }\r\n}\r\n\r\nclass EqualsValueLink extends Linked< boolean > {\r\n constructor( public parent : Linked< any >, public truthyValue ){\r\n super( parent.value === truthyValue );\r\n }\r\n\r\n set( x : boolean ) : void {\r\n this.parent.set( x ? this.truthyValue : null );\r\n }\r\n}\r\n\r\nclass EnabledValueLink extends Linked< boolean > {\r\n constructor( public parent : Linked< any >, public defaultValue ){\r\n super( parent.value != null );\r\n }\r\n\r\n set( x : boolean ){\r\n this.parent.set( x ? this.defaultValue : null );\r\n }\r\n}\r\n\r\nclass ContainsRef extends Linked< boolean > {\r\n constructor( public parent : Linked< any >, public element : any ){\r\n super( parent.value.indexOf( element ) >= 0 );\r\n }\r\n\r\n set( x : boolean ){\r\n var next = Boolean( x );\r\n\r\n if( this.value !== next ){\r\n var arr : any[] = this.parent.value,\r\n nextValue = x ? arr.concat( this.element ) : arr.filter( el => el !== this.element );\r\n\r\n this.parent.set( nextValue );\r\n }\r\n }\r\n}\r\n\r\nconst defaultError = 'Invalid value';\r\n\r\n/**\r\n * Link to array or object element enclosed in parent link.\r\n * Performs purely functional update of the parent, shallow copying its value on `set`.\r\n */\r\nexport class PropValueLink< E, K > extends Linked< E > {\r\n constructor( private parent : Linked< any >, public key : K ){\r\n super( parent.value[ key ] );\r\n }\r\n\r\n remove(){\r\n this.parent.removeAt( this.key );\r\n }\r\n\r\n update( transform : Linked.Transform, e? : Object ) : void {\r\n const { key } = this;\r\n\r\n this.parent.update( obj => {\r\n const prev = obj[ key ],\r\n next = transform( helpers( prev ).clone( prev ), e );\r\n\r\n if( next !== void 0 ){\r\n obj[ key ] = next;\r\n return obj;\r\n }\r\n } );\r\n }\r\n\r\n // Set new element value to parent array or object, performing purely functional update.\r\n set( next : E ) : void {\r\n /*\r\n this.update( prev => {\r\n if( prev !== next ) return next\r\n })*/\r\n\r\n // A bit more efficient implementation.\r\n const { key } = this;\r\n\r\n this.parent.update( obj => {\r\n if( obj[ key ] !== next ){\r\n obj[ key ] = next;\r\n return obj;\r\n }\r\n });\r\n\r\n \r\n };\r\n}\r\n\r\nfunction unwrap( links : Linked.Hash, field : string) : object {\r\n const values = {};\r\n\r\n for( let key in links ){\r\n if( links.hasOwnProperty( key ) ){\r\n const value = links[ key ][ field ];\r\n if( value !== void 0 ){\r\n values[ trim( key ) ] = value;\r\n }\r\n }\r\n }\r\n\r\n return values;\r\n}\r\n\r\nfunction trim( key : string ){\r\n return key[ 0 ] === '$' ? key.slice( 1 ) : key;\r\n}","import { abortIO, IOEndpoint, IONode, IOPromise } from './io-tools';\nimport { EventCallbacks, define, definitions, eventsApi, Logger, LogLevel, Messenger, MessengerDefinition, MessengersByCid, mixinRules, mixins, MixinsState, throwingLogger } from '@type-r/mixture';\nimport { resolveReference, Traversable } from './traversable';\nimport { ChildrenErrors, Validatable, ValidationError } from './validation';\nimport { Linked } from '@linked/value/lib';\n\nconst { trigger3, on, off } = eventsApi;\n/***\n * Abstract class implementing ownership tree, tho-phase transactions, and validation. \n * 1. createTransaction() - apply changes to an object tree, and if there are some events to send, transaction object is created.\n * 2. transaction.commit() - send and process all change events, and close transaction.\n */\n\n/** @private */\nexport interface TransactionalDefinition extends MessengerDefinition {\n endpoint? : IOEndpoint\n}\n\nexport enum ItemsBehavior {\n share = 0b0001,\n listen = 0b0010,\n persistent = 0b0100\n}\n\n// Transactional object interface\n\n/**\n * Used to access the version token of the object,\n * which changes every time something inside of the object is changed.\n * \n * useEffect( () => data.fetch(), [ state[versionToken] ])\n */\nexport const versionToken = '_changeToken';\nexport const defaultStore = '_defaultStore';\n\nexport interface Transactional extends Messenger {}\n\n@define\n@definitions({\n endpoint : mixinRules.value\n})\n@mixins( Messenger )\nexport abstract class Transactional implements Messenger, IONode, Validatable, Traversable {\n // Mixins are hard in TypeScript. We need to copy type signatures over...\n // Here goes 'Mixable' mixin.\n static endpoint : IOEndpoint;\n \n /** @internal */\n static __super__ : object;\n \n static mixins : MixinsState;\n static define : ( definition? : TransactionalDefinition, statics? : object ) => typeof Transactional;\n static extend : ( definition? : T, statics? : object ) => any;\n\n static onDefine( definitions : TransactionalDefinition, BaseClass : typeof Transactional ){\n if( definitions.endpoint ) this.prototype._endpoint = definitions.endpoint;\n Messenger.onDefine.call( this, definitions, BaseClass );\n };\n\n static onExtend( BaseClass : typeof Transactional ) : void {\n // Make sure we don't inherit class factories.\n if( BaseClass.create === this.create ) {\n this.create = Transactional.create;\n }\n }\n\n // Define extendable mixin static properties.\n static create any>( this : M, a? : any, b? : any ) : InstanceType {\n return new (this as any)( a, b );\n }\n\n // State accessor.\n /** @internal */\n abstract get __inner_state__() : any;\n\n // Shared modifier (used by collections of shared models)\n /** @internal */\n _shared? : number; \n \n dispose() : void {\n if( this._disposed ) return;\n \n abortIO( this );\n this._owner = void 0;\n this._ownerKey = void 0;\n this.off();\n this.stopListening();\n this._disposed = true;\n }\n \n cidPrefix : string\n\n // Unique version token replaced on change\n /** @internal */\n _changeToken : {} = {}\n\n // true while inside of the transaction\n /** @internal */\n _transaction : boolean = false;\n\n // Holds current transaction's options, when in the middle of transaction and there're changes but is an unsent change event\n /** @internal */\n _isDirty : TransactionOptions = null;\n\n // Backreference set by owner (Model, Collection, or other object)\n /** @internal */\n _owner : Owner = void 0;\n\n // Key supplied by owner. Used by record to identify attribute key.\n // Only collections doesn't set the key, which is used to distinguish collections.\n /** @internal */ \n _ownerKey : string = void 0;\n\n // Name of the change event\n /** @internal */\n _changeEventName : string\n\n /**\n * Subsribe for the changes.\n */\n onChanges( handler : Function, target? : Messenger ){\n on( this, this._changeEventName, handler, target );\n }\n\n /**\n * Unsubscribe from changes.\n */\n offChanges( handler? : Function, target? : Messenger ){\n off( this, this._changeEventName, handler, target );\n }\n\n /**\n * Listen to changes event. \n */\n listenToChanges( target : Transactional, handler ){\n this.listenTo( target, target._changeEventName, handler );\n }\n\n constructor( cid : string | number ){\n this.cid = this.cidPrefix + cid;\n }\n\n // Deeply clone ownership subtree\n abstract clone( options? : CloneOptions ) : this\n \n // Execute given function in the scope of ad-hoc transaction.\n transaction( fun : ( self : this ) => void, options : TransactionOptions = {} ) : void{\n const isRoot = transactionApi.begin( this );\n const update = fun.call( this, this );\n update && this.set( update );\n isRoot && transactionApi.commit( this );\n }\n\n // Assign transactional object \"by value\", copying aggregated items.\n assignFrom( a_source : Transactional | Object | Linked ) : this {\n // Unpack linked value.\n const source = a_source instanceof Linked ? a_source.value : a_source;\n\n // Need to delay change events until change token will by synced.\n this.transaction( () =>{\n this.set( ( source as any).__inner_state__ || source, { merge : true } );\n\n // Synchronize change tokens\n const { _changeToken } = source as any;\n \n if( _changeToken ){\n this._changeToken = _changeToken;\n } \n });\n\n return this;\n }\n\n // Create object from JSON. Throw if validation fail.\n static from Transactional >( this : T, json : any, { strict, ...options } : { strict? : boolean } & TransactionOptions = {} ) : InstanceType{\n const obj : Transactional = ( this as any ).create( json, { ...options, logger : strict ? throwingLogger : void 0 } );\n\n if( strict && obj.validationError ){\n obj.eachValidationError( ( error, key, obj ) => {\n throw new Error( `${ obj.getClassName() }.${ key }: ${ error }` );\n });\n }\n\n return obj as any;\n }\n\n // Apply bulk object update without any notifications, and return open transaction.\n // Used internally to implement two-phase commit.\n // Returns null if there are no any changes.\n /** @internal */\n abstract _createTransaction( values : any, options? : TransactionOptions ) : Transaction | void\n\n // Apply bulk in-place object update in scope of ad-hoc transaction \n abstract set( values : any, options? : TransactionOptions ) : this;\n\n \n // Parse function applied when 'parse' option is set for transaction.\n parse( data : any, options? : TransactionOptions ) : any { return data }\n\n // Convert object to the serializable JSON structure\n abstract toJSON( options? : object ) : {}\n\n /*******************\n * Traversals and member access\n */\n \n // Get object member by its key.\n abstract get( key : string ) : any\n\n // Get object member by symbolic reference.\n deepGet( reference : string ) : any {\n return resolveReference( this, reference, ( object, key ) => object.get ? object.get( key ) : object[ key ] );\n }\n\n //_isCollection : boolean\n\n // Return owner skipping collections.\n getOwner() : Owner {\n return this._owner;\n }\n\n // Store used when owner chain store lookup failed. Static value in the prototype. \n /** @internal */\n _defaultStore : Transactional\n\n // Locate the closest store. Store object stops traversal by overriding this method. \n getStore() : Transactional {\n const { _owner } = this;\n return _owner ? _owner.getStore() : this._defaultStore;\n }\n\n\n /***************************************************\n * Iteration API\n */\n\n // Loop through the members. Must be efficiently implemented in container class.\n\n /** @internal */\n _endpoint : IOEndpoint\n \n /** @internal */\n _ioPromise : IOPromise\n\n hasPendingIO() : IOPromise { return this._ioPromise; }\n\n //fetch( options? : object ) : IOPromise { throw new Error( \"Not implemented\" ); }\n\n getEndpoint() : IOEndpoint {\n return getOwnerEndpoint( this ) || this._endpoint;\n }\n \n /*********************************\n * Validation API\n */\n\n // Lazily evaluated validation error\n /** @internal */\n _validationError : ValidationError = void 0\n\n // Validate ownership tree and return valudation error \n get validationError() : ValidationError {\n const error = this._validationError || ( this._validationError = new ValidationError( this ) );\n return error.length ? error : null; \n }\n\n // Validate nested members. Returns errors count.\n /** @internal */\n abstract _validateNested( errors : ChildrenErrors ) : number\n\n // Object-level validator. Returns validation error.\n validate( obj? : Transactional ) : any {}\n\n // Return validation error (or undefined) for nested object with the given key. \n getValidationError( key? : string ) : any {\n var error = this.validationError;\n return ( key ? error && error.nested[ key ] : error ) || null;\n }\n\n // Get validation error for the given symbolic reference.\n deepValidationError( reference : string ) : any {\n return resolveReference( this, reference, ( object, key ) => object.getValidationError( key ) );\n }\n\n // Iterate through all validation errors across the ownership tree.\n eachValidationError( iteratee : ( error : any, key : string, object : Transactional ) => void ) : void {\n const { validationError } = this;\n validationError && validationError.eachError( iteratee, this );\n }\n\n // Check whenever member with a given key is valid. \n isValid( key? : string ) : boolean {\n return !this.getValidationError( key );\n }\n\n valueOf() : Object { return this.cid; }\n toString(){ return this.cid; }\n\n // Get class name for an object instance. Works fine with ES6 classes definitions (not in IE).\n getClassName() : string {\n const { name } = this.constructor;\n if( name !== 'Subclass' ) return name;\n }\n\n // Logging interface for run time errors and warnings.\n /** @internal */\n abstract _log( level : LogLevel, topic : string, text : string, value : any, logger? : Logger ) : void\n}\n\nexport interface CloneOptions {\n // 'Pin store' shall assign this._defaultStore = this.getStore();\n pinStore? : boolean\n}\n\n// Owner must accept children update events. It's an only way children communicates with an owner.\n/** @private */\nexport interface Owner extends Traversable, Messenger {\n /** @internal */\n _onChildrenChange( child : Transactional, options : TransactionOptions ) : void;\n \n getOwner() : Owner\n getStore() : Transactional\n}\n\n// Transaction object used for two-phase commit protocol.\n// Must be implemented by subclasses.\n// Transaction must be created if there are actual changes and when markIsDirty returns true.\n/** @private */ \nexport interface Transaction {\n // Object transaction is being made on.\n object : Transactional\n\n // Send out change events, process update triggers, and close transaction.\n // Nested transactions must be marked with isNested flag (it suppress owner notification).\n commit( initiator? : Transactional )\n}\n\n// Options for distributed transaction \nexport interface TransactionOptions {\n // Invoke parsing \n parse? : boolean\n\n // Optional logger\n logger? : Logger\n\n // Suppress change notifications and update triggers\n silent? : boolean\n\n // Update existing transactional members in place, or skip the update (ignored by models)\n merge? : boolean // =true\n\n // Should collections remove elements in set (ignored by models) \n remove? : boolean // =true\n\n // Always replace enclosed objects with new instances\n reset? : boolean // = false\n\n // Do not dispose aggregated members\n unset? : boolean\n\n validate? : boolean\n\n // IO method name if the transaction is initiated as a result of IO operation\n ioMethod? : 'save' | 'fetch'\n\n // The hint for IOEndpoint\n // If `true`, `record.save()` will behave as \"upsert\" operation for the records having id.\n upsert? : boolean\n}\n\n/**\n * Low-level transactions API. Must be used like this:\n * const isRoot = begin( record );\n * ...\n * isRoot && commit( record, options );\n * \n * When committing nested transaction, the flag must be set to true. \n * commit( object, options, isNested ) \n */\n\nexport const transactionApi = {\n // Start transaction. Return true if it's the root one.\n /** @private */\n begin( object : Transactional ) : boolean {\n return object._transaction ? false : ( object._transaction = true ); \n },\n\n // Mark object having changes inside of the current transaction.\n // Returns true whenever there notifications are required.\n /** @private */\n markAsDirty( object : Transactional, options : TransactionOptions ) : boolean {\n // If silent option is in effect, don't set isDirty flag.\n const dirty = !options.silent;\n if( dirty ) object._isDirty = options;\n \n // Reset version token.\n object._changeToken = {};\n\n // Object is changed, so validation must happen again. Clear the cache.\n object._validationError = void 0;\n\n return dirty;\n },\n\n // Commit transaction. Send out change event and notify owner. Returns true if there were changes.\n // Must be executed for the root transaction only.\n /** @private */\n commit( object : Transactional, initiator? : Transactional ){\n let originalOptions = object._isDirty;\n\n if( originalOptions ){\n // Send the sequence of change events, handling chained handlers.\n while( object._isDirty ){\n const options = object._isDirty;\n object._isDirty = null; \n trigger3( object, object._changeEventName, object, options, initiator );\n }\n \n // Mark transaction as closed.\n object._transaction = false;\n\n // Notify owner on changes out of transaction scope. \n const { _owner } = object; \n if( _owner && _owner !== initiator ){ // If it's the nested transaction, owner is already aware there are some changes.\n _owner._onChildrenChange( object, originalOptions );\n }\n }\n else{\n // No changes. Silently close transaction.\n object._isDirty = null;\n object._transaction = false;\n }\n },\n\n /************************************\n * Ownership management\n */\n\n // Add reference to the record.\n /** @private */\n aquire( owner : Owner, child : Transactional, key? : string ) : void {\n if( child._owner ) throw new ReferenceError( 'Trying to aquire ownership for an object already having an owner' );\n\n child._owner = owner;\n child._ownerKey = key;\n },\n\n // Remove reference to the record.\n /** @private */\n free( owner : Owner, child : Transactional ) : void {\n if( owner === child._owner ){\n child._owner = void 0;\n child._ownerKey = void 0;\n }\n }\n}\n\nfunction getOwnerEndpoint( self : Transactional ) : IOEndpoint {\n // Check if we are the member of the collection...\n const { collection } = self as any;\n if( collection ){\n return getOwnerEndpoint( collection );\n }\n\n // Now, if we're the member of the model...\n if( self._owner ){\n const { _endpoints } = self._owner as any;\n return _endpoints && _endpoints[ self._ownerKey ];\n }\n}\n","import { eventsApi } from '@type-r/mixture';\nimport { Owner, Transaction, Transactional, transactionApi, TransactionOptions } from \"../transactions\";\nconst { begin : _begin, markAsDirty : _markAsDirty, commit } = transactionApi;\n\nconst { trigger3 } = eventsApi;\n\nexport interface ConstructorsMixin {\n Attributes : AttributesConstructor\n AttributesCopy : AttributesCopyConstructor\n}\n\nexport interface ConstructorOptions extends TransactionOptions{\n clone? : boolean\n}\n\nexport type AttributesConstructor = new ( record : AttributesContainer, values : object, options : TransactionOptions ) => AttributesValues;\nexport type AttributesCopyConstructor = new ( values : object ) => AttributesValues;\n\nexport interface AttributesContainer extends Transactional, Owner, ConstructorsMixin {\n // Attribute descriptors.\n /** @internal */\n _attributes : AttributesDescriptors\n\n // Attribute values.\n attributes : AttributesValues\n\n // Previous attribute values.\n /** @internal */\n _previousAttributes : AttributesValues\n\n // Changed attributes cache. \n /** @internal */\n _changedAttributes : AttributesValues\n}\n\nexport interface AttributesValues {\n [ name : string ] : any\n}\n\nexport interface AttributesDescriptors {\n [ name : string ] : AttributeUpdatePipeline\n}\n\nexport interface AttributeUpdatePipeline{\n doUpdate( value, record : AttributesContainer, options : TransactionOptions, nested? : Transaction[] ) : boolean\n}\n\n // Optimized single attribute transactional update. To be called from attributes setters\n // options.silent === false, parse === false. \nexport function setAttribute( record : AttributesContainer, name : string, value : any ) : void {\n // Open the transaction.\n const isRoot = begin( record ),\n options = {};\n\n // Update attribute. \n if( record._attributes[ name ].doUpdate( value, record, options ) ){\n // Notify listeners on changes.\n markAsDirty( record, options );\n trigger3( record, 'change:' + name, record, record.attributes[ name ], options );\n }\n\n // Close the transaction.\n isRoot && commit( record );\n}\n\nfunction begin( record : AttributesContainer ){\n if( _begin( record ) ){\n record._previousAttributes = new record.AttributesCopy( record.attributes );\n record._changedAttributes = null;\n return true;\n }\n \n return false;\n}\n\nfunction markAsDirty( record : AttributesContainer, options : TransactionOptions ){\n // Need to recalculate changed attributes, when we have nested set in change:attr handler\n if( record._changedAttributes ){\n record._changedAttributes = null;\n }\n\n return _markAsDirty( record, options );\n}\n\n/**\n * TODO: There's an opportunity to create an optimized pipeline for primitive types and Date, which makes the majority\n * of attributes. It might create the major speedup.\n * \n * Create the dedicated pipeline for owned and shared attributes as well.\n * \n * Three elements of the pipeline:\n * - from constructor\n * - from assignment\n * - from `set`\n */\n\nexport const UpdateModelMixin = {\n// Need to override it here, since begin/end transaction brackets are overriden. \n transaction( this : AttributesContainer, fun : ( self : AttributesContainer ) => void, options : TransactionOptions = {} ) : void{\n const isRoot = begin( this );\n fun.call( this, this );\n isRoot && commit( this );\n },\n \n // Handle nested changes. TODO: propagateChanges == false, same in transaction.\n _onChildrenChange( child : Transactional, options : TransactionOptions ) : void {\n const { _ownerKey } = child,\n attribute = this._attributes[ _ownerKey ];\n\n if( !attribute /* TODO: Must be an opposite, likely the bug */ || attribute.propagateChanges ) this.forceAttributeChange( _ownerKey, options );\n },\n\n // Simulate attribute change \n forceAttributeChange( key : string, options : TransactionOptions = {} ){\n // Touch an attribute in bounds of transaction\n const isRoot = begin( this );\n\n if( markAsDirty( this, options ) ){\n trigger3( this, 'change:' + key, this, this.attributes[ key ], options );\n }\n \n isRoot && commit( this );\n },\n\n _createTransaction( this : AttributesContainer, a_values : {}, options : TransactionOptions = {} ) : Transaction {\n const isRoot = begin( this ),\n changes : string[] = [],\n nested : ModelTransaction[]= [],\n { _attributes } = this,\n values = options.parse ? this.parse( a_values, options ) : a_values;\n\n let unknown;\n\n if( shouldBeAnObject( this, values, options ) ){\n for( let name in values ){\n const spec = _attributes[ name ];\n\n if( spec ){\n if( spec.doUpdate( values[ name ], this, options, nested ) ){\n changes.push( name );\n }\n }\n else{\n unknown || ( unknown = [] );\n unknown.push( `'${ name }'` );\n }\n }\n\n if( unknown ){\n unknownAttrsWarning( this, unknown, { values }, options );\n }\n }\n \n if( changes.length && markAsDirty( this, options ) ){\n return new ModelTransaction( this, isRoot, nested, changes );\n }\n \n // No changes, but there might be silent attributes with open transactions.\n for( let pendingTransaction of nested ){\n pendingTransaction.commit( this );\n }\n\n isRoot && commit( this );\n }\n};\n\nexport function unknownAttrsWarning( record : AttributesContainer, unknown : string[], props, options ){\n record._log( 'warn', 'Type-R:UnknownAttrs', `undefined attributes ${ unknown.join(', ')} are ignored.`, props, options.logger );\n}\n\n// One of the main performance tricks of Type-R.\n// Create loop unrolled constructors for internal attribute hash,\n// so the hidden class JIT optimization will be engaged and they will become static structs.\n// It dramatically improves record performance.\nexport function constructorsMixin( attrDefs : AttributesDescriptors ) : ConstructorsMixin {\n const attrs = Object.keys( attrDefs );\n\n const AttributesCopy : AttributesCopyConstructor = new Function( 'values', `\n ${ attrs.map( attr =>`\n this.${ attr } = values.${ attr };\n `).join( '' ) }\n `) as any;\n\n AttributesCopy.prototype = Object.prototype;\n\n const Attributes : AttributesConstructor = new Function( 'record', 'values', 'options', `\n var _attrs = record._attributes;\n\n ${ attrs.map( attr =>`\n this.${ attr } = _attrs.${ attr }.doInit( values.${ attr }, record, options );\n `).join( '' ) }\n `) as any;\n\n Attributes.prototype = Object.prototype;\n\n return { Attributes, AttributesCopy };\n}\n\nexport function shouldBeAnObject( record : AttributesContainer, values : object, options ){\n if( Object.prototype.toString.call( values ) === '[object Object]' ) return true;\n\n record._log( 'error', 'Type-R:InvalidObject', 'update with non-object is ignored!', { values }, options.logger );\n return false;\n}\n\n// Transaction class. Implements two-phase transactions on object's tree. \n// Transaction must be created if there are actual changes and when markIsDirty returns true. \nexport class ModelTransaction implements Transaction {\n // open transaction\n constructor( public object : AttributesContainer,\n public isRoot : boolean,\n public nested : Transaction[],\n public changes : string[] ){}\n\n // commit transaction\n commit( initiator? : AttributesContainer ) : void {\n const { nested, object, changes } = this;\n\n // Commit all pending nested transactions...\n for( let transaction of nested ){ \n transaction.commit( object );\n }\n\n // Notify listeners on attribute changes...\n // Transaction is never created when silent option is set, so just send events out.\n const { attributes, _isDirty } = object;\n for( let key of changes ){\n trigger3( object, 'change:' + key, object, attributes[ key ], _isDirty );\n }\n\n this.isRoot && commit( object, initiator );\n }\n}\n","import { IOEndpoint } from '../../io-tools';\nimport { LogLevel, tools, Logger } from '@type-r/mixture';\nimport { TransactionOptions, Transactional } from '../../transactions';\nimport { AttributesContainer, AttributeUpdatePipeline, ModelTransaction, setAttribute } from '../updates';\n\nconst { notEqual, assign} = tools;\n\nexport type Transform = ( this : AnyType, next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) => any;\nexport type ChangeHandler = ( this : AnyType, next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) => void;\n\nexport interface AttributeOptions {\n _metatype? : typeof AnyType\n validate? : ( record : AttributesContainer, value : any, key : string ) => any\n isRequired? : boolean\n changeEvents? : boolean\n\n endpoint? : IOEndpoint\n\n type? : Function\n value? : any\n hasCustomDefault? : boolean\n\n parse? : Parse\n toJSON? : AttributeToJSON\n \n getHooks? : GetHook[]\n transforms? : Transform[]\n changeHandlers? : ChangeHandler[]\n\n _onChange? : ChangeAttrHandler\n}\n\nexport type Parse = ( value : any, key? : string ) => any;\nexport type GetHook = ( value : any, key? : string ) => any;\nexport type AttributeToJSON = ( value : any, key? : string ) => any\nexport type AttributeParse = ( value : any, key? : string ) => any\nexport type ChangeAttrHandler = ( ( value : any, attr? : string ) => void ) | string;\n\n// TODO: interface differs from options, do something obout it\nconst emptyOptions : TransactionOptions = {};\n\n/**\n * Typeless attribute. Is the base class for all other attributes.\n */\nexport class AnyType implements AttributeUpdatePipeline {\n // Factory method to create attribute from options \n static create : ( options : AttributeOptions, name : string ) => AnyType;\n \n /**\n * Update pipeline functions\n * =========================\n *\n * Stage 0. canBeUpdated( value )\n * - presence of this function implies attribute's ability to update in place.\n */\n canBeUpdated( prev, next, options : TransactionOptions ) : any {}\n\n /**\n * Stage 1. Transform stage\n */\n transform( next : any, prev : any, model : AttributesContainer, options : TransactionOptions ) : any { return next; }\n\n // convert attribute type to `this.type`.\n convert( next : any, prev : any, model : AttributesContainer, options : TransactionOptions ) : any { return next; }\n\n /**\n * Stage 2. Check if attr value is changed\n */\n isChanged( a : any, b : any ) : boolean {\n return notEqual( a, b );\n }\n\n /**\n * Stage 3. Handle attribute change\n */\n handleChange( next : any, prev : any, model : AttributesContainer, options : TransactionOptions ) {}\n\n /**\n * End update pipeline definitions.\n */\n\n // create empty object passing backbone options to constructor...\n create() { return void 0; }\n\n // generic clone function for typeless attributes\n // Must be overriden in sublass\n clone( value : any, record : AttributesContainer ) {\n return value;\n }\n\n dispose( record : AttributesContainer, value : any ) : void {\n this.handleChange( void 0, value, record, emptyOptions );\n }\n\n validate( record : AttributesContainer, value : any, key : string ) : any {}\n\n toJSON( value, key, options? : object ) {\n return value && value.toJSON ? value.toJSON( options ) : value;\n }\n\n isMutableType(){\n return this.type && this.type.prototype instanceof Transactional;\n }\n\n createPropertyDescriptor() : PropertyDescriptor | void {\n const { name, getHook } = this;\n\n if( name !== 'id' ){\n return {\n // call to optimized set function for single argument.\n set( value ){\n setAttribute( this, name, value );\n },\n\n // attach get hook to the getter function, if it present\n get : (\n getHook ?\n function() {\n return getHook.call( this, this.attributes[ name ], name );\n } :\n function() { return this.attributes[ name ]; }\n ),\n\n configurable : true\n }\n }\n }\n\n value : any\n\n // Used as global default value for the given metatype\n static defaultValue : any;\n\n type : Function\n\n initialize( name : string, options : TransactionOptions ){}\n\n options : AttributeOptions\n\n doInit( value, record : AttributesContainer, options : TransactionOptions ){\n const v = value === void 0 ? this.defaultValue() : value,\n x = this.transform( v, void 0, record, options );\n \n this.handleChange( x, void 0, record, options );\n return x;\n }\n\n doUpdate( value, record : AttributesContainer, options : TransactionOptions, nested? : ModelTransaction[] ){\n const { name } = this,\n { attributes } = record,\n prev = attributes[ name ];\n\n const next = this.transform( value, prev, record, options );\n attributes[ name ] = next;\n\n if( this.isChanged( next, prev ) ) {\n // Do the rest of the job after assignment\n this.handleChange( next, prev, record, options );\n return true;\n }\n\n return false;\n }\n\n propagateChanges : boolean\n\n protected _log( level : LogLevel, code : string, text : string, value, record : AttributesContainer, logger : Logger ){\n record._log( level, code, `${record.getClassName()}.${ this.name } ${ text }`, {\n 'New value' : value,\n 'Prev. value' : record.attributes[ this.name ]\n }, logger );\n }\n\n defaultValue(){\n return this.value;\n }\n\n constructor( public name : string, a_options : AttributeOptions ) { \n // Save original options...\n this.options = a_options;\n\n // Clone options.\n const options : AttributeOptions = { getHooks : [], transforms : [], changeHandlers : [], ...a_options };\n options.getHooks = options.getHooks.slice();\n options.transforms = options.transforms.slice();\n options.changeHandlers = options.changeHandlers.slice();\n\n const {\n value, type, parse, toJSON, changeEvents,\n validate, getHooks, transforms, changeHandlers\n } = options;\n\n // Initialize default value...\n this.value = value;\n this.type = type;\n\n // TODO: An opportunity to optimize for attribute subtype.\n if( !options.hasCustomDefault && type ){\n this.defaultValue = this.create;\n }\n else if( tools.isValidJSON( value ) ){ \n // JSON literals must be deep copied.\n this.defaultValue = new Function( `return ${ JSON.stringify( value ) };` ) as any;\n }\n else{\n this.defaultValue = this.defaultValue;\n }\n\n // Changes must be bubbled when they are not disabled for an attribute and transactional object.\n this.propagateChanges = changeEvents !== false;\n\n this.toJSON = toJSON === void 0 ? this.toJSON : toJSON;\n\n this.validate = validate || this.validate;\n \n if( options.isRequired ){\n this.validate = wrapIsRequired( this.validate );\n }\n\n /**\n * Assemble pipelines...\n */\n\n // `convert` is default transform, which is always present...\n transforms.unshift( this.convert );\n\n // Get hook from the attribute will be used first...\n if( this.get ) getHooks.unshift( this.get );\n\n // let subclasses configure the pipeline...\n this.initialize.call( this, options );\n\n // let attribute spec configure the pipeline...\n if( getHooks.length ){\n const getHook = this.getHook = getHooks.reduce( chainGetHooks );\n\n const { validate } = this;\n this.validate = function( record : AttributesContainer, value : any, key : string ){\n return validate.call( this, record, getHook.call( record, value, key ), key );\n }\n }\n \n this.transform = transforms.length ? transforms.reduce( chainTransforms ) : this.transform;\n \n this.handleChange = changeHandlers.length ? changeHandlers.reduce( chainChangeHandlers ) : this.handleChange;\n\n // Attribute-level parse transform are attached as update hooks modifiers...\n const { doInit, doUpdate } = this;\n this.doInit = parse ? function( value, record : AttributesContainer, options : TransactionOptions ){\n return doInit.call( this, options.parse && value !== void 0 ? parse.call( record, value, this.name ) : value, record, options );\n } : doInit;\n\n this.doUpdate = parse ? function( value, record : AttributesContainer, options : TransactionOptions, nested? : ModelTransaction[] ){\n return doUpdate.call( this, options.parse && value !== void 0 ? parse.call( record, value, this.name ) : value, record, options, nested );\n } : doUpdate;\n }\n\n getHook : ( value, key : string ) => any = null\n get : ( value, key : string ) => any\n}\n\n\nfunction chainGetHooks( prevHook : GetHook, nextHook : GetHook ) : GetHook {\n return function( value, name ) {\n return nextHook.call( this, prevHook.call( this, value, name ), name );\n }\n}\n\nfunction chainTransforms( prevTransform : Transform, nextTransform : Transform ) : Transform {\n return function( next, prev, record, options ) {\n return nextTransform.call( this, prevTransform.call( this, next, prev, record, options ), prev, record, options );\n }\n}\n\nfunction chainChangeHandlers( prevHandler : ChangeHandler, nextHandler : ChangeHandler ) : ChangeHandler {\n return function( next, prev, record, options ) {\n prevHandler.call( this, next, prev, record, options );\n nextHandler.call( this, next, prev, record, options );\n }\n}\n\nfunction wrapIsRequired( validate ){\n return function( record : AttributesContainer, value : any, key : string ){\n return value ? validate.call( this, record, value, key ) : 'Required';\n }\n}","/**\n * Built-in JSON types attributes: Object, Array, Number, String, Boolean, and immutable class.\n * \n * Adds type assertions, default validation, and optimized update pipeline.\n */\n\nimport { TransactionOptions } from '../../transactions';\nimport { AnyType } from './any';\nimport { AttributesContainer } from '../updates';\n\n/**\n * Custom class must be immutable class which implements toJSON() method\n * with a constructor taking json.\n */\nexport class ImmutableClassType extends AnyType {\n type : new ( value? : any ) => {}\n\n create(){\n return new this.type();\n }\n\n convert( next : any ) : any {\n return next == null || next instanceof this.type ? next : new this.type( next );\n }\n\n toJSON( value, key? : string, options? : object ){\n return value && value.toJSON ? value.toJSON( options ) : value;\n }\n\n clone( value ) {\n return new this.type( this.toJSON( value ) );\n }\n\n isChanged( a, b ){\n return a !== b;\n }\n}\n\n/**\n * Optimized attribute of primitive type.\n * \n * Primitives has specialized simplified pipeline.\n */\nexport class PrimitiveType extends AnyType {\n type : NumberConstructor | StringConstructor | BooleanConstructor\n\n dispose(){}\n create() { return this.type(); }\n\n toJSON( value ) { return value; }\n\n convert( next ) { return next == null ? next : this.type( next ); }\n\n isChanged( a, b ) { return a !== b; }\n\n clone( value ) { return value; }\n\n doInit( value, record : AttributesContainer, options : TransactionOptions ){\n return this.transform( value === void 0 ? this.value : value, void 0, record, options );\n }\n\n doUpdate( value, record, options, nested ){\n const { name } = this,\n { attributes } = record,\n prev = attributes[ name ];\n \n return prev !== ( attributes[ name ] = this.transform( value, prev, record, options ) );\n }\n\n initialize(){\n if( !this.options.hasCustomDefault ){\n this.value = this.type();\n }\n }\n}\n\n// Number type with special validation algothim.\n/** @private */ \nexport class NumericType extends PrimitiveType {\n type : NumberConstructor\n\n create(){\n return 0;\n }\n\n convert( next, prev?, record?, options? ) {\n const num = next == null ? next : this.type( next );\n\n if( num !== num ){\n this._log( 'error', 'Type-R:InvalidNumber', 'Number attribute is assigned with an invalid number', next, record, options.logger );\n }\n \n return num;\n }\n\n validate( model, value, name ) {\n // Whatever is not symmetrically serializable to JSON, is not valid by default.\n if( value != null && !isFinite( value ) ) {\n return name + ' is not valid number';\n }\n }\n}\n\n/**\n * Compatibility wrapper for Array type.\n * @private\n */ \nexport class ArrayType extends AnyType {\n toJSON( value ) { return value; }\n dispose(){}\n create(){ return []; }\n\n convert( next, prev, record, options ) {\n // Fix incompatible constructor behaviour of Array...\n if( next == null || Array.isArray( next ) ) return next;\n\n this._log( 'error', 'Type-R:InvalidArray', 'Array attribute assigned with non-array value', next, record, options.logger );\n\n return [];\n }\n\n clone( value ){\n return value && value.slice();\n }\n}\n\nexport class ObjectType extends AnyType {\n create(){ return {}; }\n\n convert( next, prev, record, options ) {\n if( next == null || typeof next === 'object' ) return next;\n \n this._log( 'error', 'Type-R:InvalidObject', 'Object attribute is assigned with non-object value', next, record, options.logger );\n return {};\n }\n}\n\nexport function doNothing(){}\n\nexport class FunctionType extends AnyType {\n // Functions are not serialized.\n toJSON( value ) { return void 0; }\n create(){ return doNothing; }\n dispose(){}\n\n convert( next, prev, record, options ) {\n // Fix incompatible constructor behaviour of Function...\n if( next == null || typeof next === 'function' ) return next;\n\n this._log( 'error', 'Type-R:InvalidFunction', 'Function attribute assigned with non-function value', next, record, options.logger );\n\n return doNothing;\n }\n\n // Functions are not cloned.\n clone( value ){ return value; }\n}\n","/**\n * Date attribute type.\n * \n * Implements validation, cross-browser compatibility fixes, variety of Date serialization formats,\n * and optimized update pipeline.\n */\nimport { TransactionOptions } from '../../transactions';\nimport { AnyType } from './any';\nimport { AttributesContainer } from '../updates';\n\n// Date Attribute\n/** @private */\nexport class DateType extends AnyType {\n create(){\n return new Date();\n }\n \n convert( next : any, a, record, options ){\n if( next == null || next instanceof Date ) return next;\n\n const date = new Date( next ),\n timestamp = date.getTime();\n\n if( timestamp !== timestamp ){\n this._log( 'error', 'Type-R:InvalidDate', 'Date attribute assigned with invalid date', next, record, options.logger );\n }\n\n return date;\n }\n\n validate( model, value, name ) {\n if( value != null ){\n const timestamp = value.getTime(); \n if( timestamp !== timestamp ) return name + ' is Invalid Date';\n }\n }\n\n toJSON( value ) { return value && value.toISOString(); }\n\n isChanged( a, b ) { return ( a && a.getTime() ) !== ( b && b.getTime() ); }\n\n doInit( value, record : AttributesContainer, options : TransactionOptions ){\n // Date don't have handleChanges step.\n return this.transform( value === void 0 ? this.defaultValue() : value, void 0, record, options );\n }\n\n doUpdate( value, record, options, nested ){\n const { name } = this,\n { attributes } = record,\n prev = attributes[ name ];\n \n // Date don't have handleChanges step.\n return this.isChanged( prev , attributes[ name ] = this.transform( value, prev, record, options ) );\n }\n\n clone( value ) { return value && new Date( value.getTime() ); }\n dispose(){}\n}\n\n// If ISO date is not supported by date constructor (such as in Safari), polyfill it.\nfunction supportsDate( date ){\n return !isNaN( ( new Date( date ) ).getTime() );\n}\n\nif( !supportsDate('2011-11-29T15:52:30.5') ||\n !supportsDate('2011-11-29T15:52:30.52') ||\n !supportsDate('2011-11-29T15:52:18.867') ||\n !supportsDate('2011-11-29T15:52:18.867Z') ||\n !supportsDate('2011-11-29T15:52:18.867-03:30') ){\n\n DateType.prototype.convert = function( value ){\n return value == null || value instanceof Date ? value : new Date( safeParseDate( value ) );\n }\n}\n\nconst numericKeys = [ 1, 4, 5, 6, 7, 10, 11 ],\n isoDatePattern = /^(\\d{4}|[+\\-]\\d{6})(?:-(\\d{2})(?:-(\\d{2}))?)?(?:T(\\d{2}):(\\d{2})(?::(\\d{2})(?:\\.(\\d{3}))?)?(?:(Z)|([+\\-])(\\d{2})(?::(\\d{2}))?)?)?$/;\n\nfunction safeParseDate( date : string ) : number {\n var timestamp, struct : any[], minutesOffset = 0;\n\n if( ( struct = isoDatePattern.exec( date )) ) {\n // avoid NaN timestamps caused by undefined values being passed to Date.UTC\n for( var i = 0, k; ( k = numericKeys[ i ] ); ++i ) {\n struct[ k ] = +struct[ k ] || 0;\n }\n\n // allow undefined days and months\n struct[ 2 ] = (+struct[ 2 ] || 1) - 1;\n struct[ 3 ] = +struct[ 3 ] || 1;\n\n if( struct[ 8 ] !== 'Z' && struct[ 9 ] !== undefined ) {\n minutesOffset = struct[ 10 ] * 60 + struct[ 11 ];\n\n if( struct[ 9 ] === '+' ) {\n minutesOffset = 0 - minutesOffset;\n }\n }\n\n timestamp =\n Date.UTC( struct[ 1 ], struct[ 2 ], struct[ 3 ], struct[ 4 ], struct[ 5 ] + minutesOffset, struct[ 6 ],\n struct[ 7 ] );\n }\n else {\n timestamp = Date.parse( date );\n }\n\n return timestamp;\n}","import { ItemsBehavior, Transactional, transactionApi, TransactionOptions } from '../../transactions';\nimport { ValidationError } from '../../validation';\nimport { AnyType } from './any';\nimport { AttributesContainer, ConstructorOptions } from '../updates';\n\nconst { free, aquire } = transactionApi;\n\nexport class AggregatedType extends AnyType {\n type : typeof Transactional\n\n clone( value : Transactional ) : Transactional {\n return value ? value.clone() : value;\n }\n\n toJSON( x, key : string, options : object ){ return x && x.toJSON( options ); }\n\n doInit( value, record : AttributesContainer, options : ConstructorOptions ){\n const v = options.clone ? this.clone( value ) : (\n value === void 0 ? this.defaultValue() : value\n );\n\n const x = this.transform( v, void 0, record, options );\n this.handleChange( x, void 0, record, options );\n return x;\n }\n\n doUpdate( value, record, options, nested : any[] ){ // Last to things can be wrapped to an object, either transaction or ad-hoc\n const key = this.name, { attributes } = record; \n const prev = attributes[ key ];\n let update;\n\n // This can be moved to transactional attribute. And chained with the rest.\n if( update = this.canBeUpdated( prev, value, options ) ) { // todo - skip empty updates.\n const nestedTransaction = prev._createTransaction( update, options );\n // TODO: sync update tokens\n if( nestedTransaction ){\n if( nested ){\n nested.push( nestedTransaction );\n }\n else{\n nestedTransaction.commit( record );\n }\n\n if( this.propagateChanges ) return true;\n }\n\n return false;\n }\n\n const next = this.transform( value, prev, record, options );\n attributes[ key ] = next;\n\n if( this.isChanged( next, prev ) ) { // Primitives and nested comparison can be inlined.\n // Do the rest of the job after assignment\n this.handleChange( next, prev, record, options );\n\n return true;\n }\n\n return false;\n }\n\n canBeUpdated( prev : Transactional, next : any, options : TransactionOptions ) : any {\n // If an object already exists, and new value is of incompatible type, let object handle the update.\n if( prev && next != null ){\n if( next instanceof this.type ){\n // In case if merge option explicitly specified, force merge.\n if( options.merge ) return next.__inner_state__;\n }\n else{\n return next;\n }\n }\n }\n\n convert( next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) : Transactional {\n // Invoke class factory to handle abstract classes\n if( next == null ) return next;\n \n if( next instanceof this.type ){\n if( next._shared && !( next._shared & ItemsBehavior.persistent ) ) { // TODO: think more about shared types assignment compatibility. \n this._log( 'error', 'Type-R:InvalidCollection', 'aggregated collection attribute is assigned with shared collection type', next, record, options.logger );\n }\n\n // With explicit 'merge' option we need to clone an object if its previous value was 'null'.\n // This is an only case we could be here when merge === true.\n if( options.merge ) return next.clone();\n\n if( next._owner ){\n this._log( 'warn', 'Type-R:InvalidOwner', 'object alreay has an owner and was cloned. Use explicit object.clone() to dismiss this warning.', next, record, options.logger );\n return next.clone();\n }\n\n return next;\n }\n\n return ( this.type as any).create( next, options );\n }\n\n dispose ( record : AttributesContainer, value : Transactional ){\n if( value ){\n this.handleChange( void 0, value, record, {} );\n }\n }\n\n validate( record : AttributesContainer, value : Transactional ) : ValidationError {\n var error = value && value.validationError;\n if( error ) return error;\n }\n\n create() : Transactional {\n return (this.type).create(); // this the subclass of Transactional here.\n }\n\n initialize( options ){\n options.changeHandlers.unshift( this._handleChange );\n }\n\n _handleChange( next : Transactional, prev : Transactional, record : AttributesContainer, options : TransactionOptions ){\n if( prev ){\n free( record, prev );\n options.unset || prev.dispose();\n } \n \n if( next ) aquire( record, next, this.name );\n }\n}","import { eventsApi } from '@type-r/mixture';\nimport { ItemsBehavior, Transactional, transactionApi, TransactionOptions } from '../../transactions';\nimport { AnyType } from './any';\nimport { AttributesContainer, ConstructorOptions } from '../updates';\nimport { ChainableAttributeSpec } from '../attrDef';\n\nconst { on, off } = eventsApi,\n { free, aquire } = transactionApi;\n\n/************************\n * Shared attribute definition.\n * - Not serialized.\n * - Listening to the changes.\n * - Doesn't take ownership when assigned with object of proper type.\n * - Takes ownership on objects which are converted.\n */\n\nconst shareAndListen = ItemsBehavior.listen | ItemsBehavior.share;\n\n/** @private */\nexport class SharedType extends AnyType {\n type : typeof Transactional\n\n doInit( value, record : AttributesContainer, options : ConstructorOptions ){\n const v = options.clone ? this.clone( value, record ) : (\n value === void 0 ? this.defaultValue() : value\n );\n\n const x = this.transform( v, void 0, record, options );\n this.handleChange( x, void 0, record, options );\n return x;\n }\n\n doUpdate( value, record, options, nested : any[] ){ // Last to things can be wrapped to an object, either transaction or ad-hoc\n const key = this.name, { attributes } = record; \n const prev = attributes[ key ];\n let update;\n\n // This can be moved to transactional attribute. And chained with the rest.\n if( update = this.canBeUpdated( prev, value, options ) ) { // todo - skip empty updates.\n const nestedTransaction = prev._createTransaction( update, options );\n if( nestedTransaction ){\n if( nested ){\n nested.push( nestedTransaction );\n }\n else{\n nestedTransaction.commit( record );\n }\n\n if( this.propagateChanges ) return true;\n }\n\n return false;\n }\n\n const next = this.transform( value, prev, record, options );\n attributes[ key ] = next;\n\n if( this.isChanged( next, prev ) ) { // Primitives and nested comparison can be inlined.\n // Do the rest of the job after assignment\n this.handleChange( next, prev, record, options );\n\n return true;\n }\n\n return false;\n }\n\n clone( value : Transactional, record : AttributesContainer ) : Transactional {\n // References are not cloned.\n if( !value || value._owner !== record ) return value;\n\n // Implicitly created objects are cloned.\n const clone = value.clone();\n aquire( record, clone, this.name );\n return clone;\n }\n\n // Do not serialize by default.\n toJSON(){}\n\n canBeUpdated( prev : Transactional, next : any, options : TransactionOptions ) : any {\n // If an object already exists, and new value is of incompatible type, let object handle the update.\n if( prev && next != null && !( next instanceof this.type ) ){\n return next;\n }\n }\n\n convert( next : any, prev : any, record : AttributesContainer, options : TransactionOptions ) : Transactional {\n if( next == null || next instanceof this.type ) return next;\n\n // Convert type using implicitly created transactional object.\n const implicitObject = new ( this.type as any )( next, options, shareAndListen );\n\n // To prevent a leak, we need to take an ownership on it.\n aquire( record, implicitObject, this.name );\n\n return implicitObject;\n }\n\n // Refs are always valid.\n validate( model, value, name ){}\n\n // They are always created as null.\n create() : Transactional {\n return null;\n }\n\n // Listening to the change events\n _handleChange( next : Transactional, prev : Transactional, record : AttributesContainer, options ){\n if( prev ){\n // If there was an implicitly created object, remove an ownership.\n if( prev._owner === record ){\n free( record, prev );\n options.unset || prev.dispose();\n }\n else{\n off( prev, prev._changeEventName, this._onChange, record );\n }\n } \n \n if( next ){\n // No need to take an ownership for an implicit object - already done in convert or clone.\n if( next._owner !== record ){\n on( next, next._changeEventName, this._onChange, record );\n }\n } \n }\n\n dispose( record : AttributesContainer, value : Transactional ){\n if( value ){\n this.handleChange( void 0, value, record, {} );\n }\n }\n\n _onChange : ( child : Transactional, options : TransactionOptions, initiator : Transactional ) => void \n\n initialize( options ){\n // Create change event handler which knows current attribute name. \n const attribute = this;\n this._onChange = this.propagateChanges ? function( child, options, initiator ){\n this === initiator || this.forceAttributeChange( attribute.name, options );\n } : ignore;\n\n options.changeHandlers.unshift( this._handleChange );\n }\n}\n\nfunction ignore(){}","import { PrimitiveType, NumericType, ObjectType, ImmutableClassType, FunctionType, ArrayType } from './basic';\nimport { DateType } from './date';\nimport { AnyType, AttributeOptions } from './any';\n\nexport * from './any';\nexport * from './basic';\nexport * from './date';\nexport * from './owned';\nexport * from './shared';\n\n/**\n * Every record attribute type has the corresponding metatype controlling its behavior.\n * For built-in types, Type-R uses the predefined list to resolve metatype in order to avoid global objects modifications.\n * For user-defined types, static `_metatype` constructor member is used.\n */\n\nconst builtins : Function[] = [ String, Number, Boolean, Date, Object, Array, Function ],\n metatypes = [ PrimitiveType, NumericType, PrimitiveType, DateType, ObjectType, ArrayType, FunctionType ];\n\nexport function getMetatype( Ctor : Function ){\n return ( Ctor as any )._metatype || resolveBuiltins( Ctor );\n}\n\nAnyType.create = ( options : AttributeOptions, name : string ) => {\n const type = options.type,\n AttributeCtor = options._metatype || ( type ? getMetatype( type ): AnyType );\n\n return new AttributeCtor( name, options );\n}\n\nfunction resolveBuiltins( Ctor : Function ){\n const idx = builtins.indexOf( Ctor );\n return idx < 0 ? ImmutableClassType : metatypes[ idx ];\n}","/**\n * Type spec engine. Declare attributes using chainable syntax,\n * and returns object with spec.\n */\nimport { Linked } from '@linked/value';\nimport { definitionDecorator, EventMap, EventsDefinition, tools } from '@type-r/mixture';\nimport { Collection } from '../collection';\nimport { IOEndpoint } from '../io-tools';\nimport { Transactional } from '../transactions';\nimport { AttributeOptions, AttributeToJSON, getMetatype, Parse, SharedType } from './metatypes';\nimport { Model } from './model';\nimport { ModelAttributes } from './define'\nimport { AttributesContainer } from './updates';\n\nconst { assign } = tools;\n\nexport interface AttributeCheck {\n ( value : any, key : string ) : boolean\n error? : any\n}\n\n\n// Infer the proper TS type from a Type-R attribute spec.\nexport type Infer =\n A extends Function ? TrueReturnType :\n A extends ChainableAttributeSpec ? TrueReturnType :\n A extends Array ? (\n T extends new (...args : any[]) => infer M ? (\n M extends Model ? Collection : never\n ) :\n T extends object ? Collection> :\n T[]\n ) :\n A extends object ? Model & ModelAttributes :\n A | null;\n\n// Extract the proper TS return type for a function or constructor.\ntype TrueReturnType =\n F extends DateConstructor ? Date | null :\n F extends typeof Linked ? Linked :\n F extends ( ...args : any[] ) => infer R ? R | null :\n F extends new ( ...args : any[] ) => infer R ? R | null:\n void;\n\nexport class ChainableAttributeSpec{\n options : AttributeOptions & { type? : F };\n\n constructor( options : AttributeOptions ) {\n // Shallow copy options, fill it with defaults.\n this.options = { getHooks : [], transforms : [], changeHandlers : []};\n if( options ) assign( this.options, options );\n }\n\n check( check : AttributeCheck, error? : any ) : this {\n function validate( model, value, name ){\n if( !check.call( model, value, name ) ){\n const msg = error || check.error || name + ' is not valid';\n return typeof msg === 'function' ? msg.call( model, name ) : msg;\n }\n }\n\n const prev = this.options.validate;\n\n return this.metadata({\n validate : prev ? (\n function( model, value, name ){\n return prev( model, value, name ) || validate( model, value, name );\n }\n ) : validate\n });\n }\n\n get as() : PropertyDecorator {\n return definitionDecorator( 'attributes', this );\n }\n\n get isRequired() : this {\n return this.required;\n }\n\n get required() : this {\n return this.metadata({ isRequired : true }); \n }\n\n endpoint( endpoint : IOEndpoint ) : this {\n return this.metadata({ endpoint });\n }\n\n watcher( ref : string | ( ( value : any, key : string ) => void ) ) : this {\n return this.metadata({ _onChange : ref });\n }\n\n // Attribute-specific parse transform\n parse( fun : Parse ) : this {\n return this.metadata({ parse : fun });\n }\n\n toJSON( fun : AttributeToJSON | false ) : this {\n return this.metadata({\n toJSON : typeof fun === 'function' ? fun : ( fun ? ( x, k, o ) => x && x.toJSON( o ) : emptyFunction ) \n });\n }\n\n get dontSave(){\n return this.toJSON( false );\n }\n\n get null(){\n return this.value( null );\n }\n\n // Attribute get hook.\n get( fun ) : this {\n return this.metadata({\n getHooks : this.options.getHooks.concat( fun )\n });\n }\n\n // Attribute set hook.\n set( fun ) : this {\n function handleSetHook( next, prev, record : AttributesContainer, options ) {\n if( this.isChanged( next, prev ) ) {\n const changed = fun.call( record, next, this.name );\n return changed === void 0 ? prev : this.convert( changed, prev, record, options );\n }\n\n return prev;\n }\n\n return this.metadata({\n transforms : this.options.transforms.concat( handleSetHook )\n });\n }\n\n changeEvents( events : boolean ) : this {\n return this.metadata({ changeEvents : events });\n }\n\n // Subsribe to events from an attribute.\n events( map : EventsDefinition ) : this {\n const eventMap = new EventMap( map );\n\n function handleEventsSubscribtion( next, prev, record : AttributesContainer ){\n prev && prev.trigger && eventMap.unsubscribe( record, prev );\n\n next && next.trigger && eventMap.subscribe( record, next );\n }\n\n return this.metadata({\n changeHandlers : this.options.changeHandlers.concat( handleEventsSubscribtion )\n });\n }\n\n // Creates a copy of the spec.\n get has() : this {\n return this;\n }\n\n metadata( options : object ) : this {\n const cloned = new ChainableAttributeSpec( this.options );\n assign( cloned.options, options );\n return cloned as any;\n }\n\n value( x ) : this {\n return this.metadata({ value : x, hasCustomDefault : true });\n }\n\n static from( spec : any ) : ChainableAttributeSpec {\n return null; // dependency injection, see the top level index.ts\n }\n}\n\nfunction emptyFunction(){}\n\nexport function type( this : void, Type : ChainableAttributeSpec | F, value? : any ) : ChainableAttributeSpec {\n if( Type instanceof ChainableAttributeSpec ) return Type;\n\n const attrDef = new ChainableAttributeSpec({ type : Type }),\n defaultValue = Type && value === void 0 ? getMetatype( Type ).defaultValue : value;\n\n return defaultValue === void 0 ? attrDef : attrDef.value( defaultValue );\n}\n\nexport function shared( this : void, Constructor : C ) : ChainableAttributeSpec {\n return new ChainableAttributeSpec({\n value : null,\n type : Constructor,\n _metatype : SharedType\n });\n}\n\nexport { shared as refTo };\n\n// Create attribute metatype inferring the type from the value.\nexport function value( this : void, x : T ) : ChainableAttributeSpec T> {\n const Type = inferType( x ),\n // Transactional types inferred from values must have shared type. \n AttrDef = Type && Type.prototype instanceof Transactional ? shared( Type ) :\n type( Type );\n\n return AttrDef.value( x ) as any;\n}\n\n/*\nexport declare type InferConstructor = \n T extends number ? NumberConstructor :\n T extends string ? StringConstructor :\n T extends boolean ? BooleanConstructor :\n T extends Date ? DateConstructor :\n T extends Transactional ? new ( ...args : any[] ) => */\n\nfunction inferType( value : any ) : Function {\n switch( typeof value ) {\n case 'number' :\n return Number;\n case 'string' :\n return String;\n case 'boolean' :\n return Boolean;\n case 'function' :\n return Function;\n case 'undefined' :\n return void 0;\n case 'object' :\n return value ? value.constructor : void 0;\n }\n}","import { GenericComparator } from '../collection';\nimport { IOEndpoint } from '../io-tools';\nimport { Infer } from './attrDef';\nimport { LinkedModelHash } from './linked-attrs';\nimport { MakeModelConstructor, Model } from './model';\n\nexport const collection = Symbol(\"Methods definitions\");\nexport const metadata = Symbol(\"Methods definitions\");\n\n// TODO: getters and setters can go to the attributes object.\n// Methods can be added though the class.\n\nexport interface AnonimousModelDefinition {\n [metadata]? : {\n idAttribute? : string\n endpoint? : IOEndpoint\n }\n\n [collection]? : {\n itemEvents? : { [ event : string ] : true | string | (( ...args : any[] ) => void ) }\n comparator? : GenericComparator\n \n initialize?( models? : any[], options? : object ) : void\n parse?( json : any ) : object[]\n toJSON?( options? : any ) : any\n validate?() : any\n }\n\n [attribute : string] : any\n}\n\nexport function parseAnonimousModelDefinition({ [metadata] : md, [collection] : coll, ...attributes } : AnonimousModelDefinition){\n return {\n attributes,\n collection : coll,\n ...md\n }\n}\n\nexport type AnonymousAttributes =\n AnonymousModelConstructor\n\nexport type AnonymousModelConstructor =\n MakeModelConstructor<\n Model & ModelAttributes,\n A\n >\n\nexport type ModelAttributes =\n InferAttrs & {\n readonly $ : LinkedModelHash>\n }\n\nexport type MergeModelConstructors =\n MakeModelConstructor<\n InstanceType & InstanceType,\n First['attributes'] & Second['attributes']\n >\n\nexport type InferAttrs = {\n [K in Exclude]: Infer\n};","import { Model } from './model'\nimport { Linked } from '@linked/value'\nimport { Transactional } from '../transactions';\n\nexport function addAttributeLinks( Class : typeof Model ){\n const { prototype } = Class;\n const { _attributesArray } = prototype;\n\n const AttributeRefs = new Function('model', `\n this._model = model;\n ${ _attributesArray.map( ({ name }) => `this.$${name} = void 0; `).join( '\\n' )}\n `)\n\n AttributeRefs.prototype.__ModelAttrRef = LinkedAttr;\n\n for( let attr of _attributesArray ){\n const { name } = attr;\n \n Object.defineProperty( AttributeRefs.prototype, name, {\n get : new Function( attr.isMutableType() ? `\n var cached = this.$${name},\n value = this._model.${name},\n token = value && value._changeToken;\n\n return cached && cached._token === token ? cached :\n ( this.$${name} = new this.__ModelAttrRef( this._model, '${name}', value, token ) );\n ` : `\n var cached = this.$${name};\n\n return cached && cached.value === this._model.${name} ? cached :\n ( this.$${name} = new this.__ModelAttrRef( this._model, '${name}', this._model.${name} ) );\n `) as any\n });\n }\n\n prototype.__Attributes$ = AttributeRefs as any;\n}\n\nexport type LinkedModelHash= {\n readonly [ K in keyof T ] : LinkedAttr\n}\n\nexport class LinkedAttr extends Linked {\n constructor( protected model : Model, protected attr : string, value, protected _token ){\n super( value );\n }\n\n set( x : T ){\n this.model[ this.attr ] = x;\n }\n\n _error : any\n\n // Attribute's descriptor.\n get descriptor(){\n return this.model._attributes[ this.attr ];\n }\n}\n\nObject.defineProperty( LinkedAttr.prototype, '_changeToken', { value : null } );\nObject.defineProperty( LinkedAttr.prototype, 'error', {\n get : function(){\n return this._error || ( this._error = this.model.getValidationError( this.attr ) );\n },\n set : function( x : any ){\n this._error = x;\n }\n});\n","import { IOEndpoint } from '../io-tools';\nimport { eventsApi, tools as _ } from '@type-r/mixture';\nimport { CompiledReference } from '../traversable';\nimport { ChainableAttributeSpec } from './attrDef';\nimport { AnyType } from './metatypes';\nimport { ConstructorsMixin, constructorsMixin } from './updates';\n\nexport interface ModelAttributesMixin extends ConstructorsMixin {\n // Attributes descriptors\n _attributes : AttributeDescriptors\n _attributesArray : AnyType[]\n \n // Attribute's property descriptors\n properties : PropertyDescriptorMap\n\n // Event map for record's local events.\n _localEvents? : eventsApi.EventMap,\n\n _endpoints : { [ name : string ] : IOEndpoint }\n}\n\nexport interface AttributeDescriptors {\n [ name : string ] : AnyType\n}\n\n// Create attribute from the type spec.\nexport function createAttribute( spec : any, name : string ) : AnyType {\n return AnyType.create( ChainableAttributeSpec.from( spec ).options, name );\n}\n\n// Create record mixin from the given record's attributes definition\nexport function createAttributesMixin( attributesDefinition : object, baseClassAttributes : AttributeDescriptors ) : ModelAttributesMixin {\n const myAttributes = _.transform( {} as AttributeDescriptors, attributesDefinition, createAttribute ),\n allAttributes = _.defaults( {} as AttributeDescriptors, myAttributes, baseClassAttributes );\n\n const ConstructorsMixin = constructorsMixin( allAttributes );\n\n return {\n ...ConstructorsMixin,\n _attributes : new ConstructorsMixin.AttributesCopy( allAttributes ),\n _attributesArray : Object.keys( allAttributes ).map( key => allAttributes[ key ] ),\n properties : _.transform( {}, myAttributes, x => x.createPropertyDescriptor() ),\n ...localEventsMixin( myAttributes ),\n _endpoints : _.transform( {}, allAttributes, attrDef => attrDef.options.endpoint )\n } \n}\n\ninterface LocalEventsMixin {\n _localEvents? : eventsApi.EventMap\n}\n\nfunction localEventsMixin( attrSpecs : AttributeDescriptors ) : LocalEventsMixin {\n let _localEvents : eventsApi.EventMap;\n\n for( var key in attrSpecs ){\n const attribute = attrSpecs[ key ],\n { _onChange } = attribute.options; \n\n if( _onChange ){\n _localEvents || ( _localEvents = new eventsApi.EventMap() );\n\n _localEvents.addEvent( 'change:' + key,\n typeof _onChange === 'string' ?\n createWatcherFromRef( _onChange, key ) : \n wrapWatcher( _onChange, key ) );\n }\n }\n\n return _localEvents ? { _localEvents } : {};\n}\n\nfunction wrapWatcher( watcher, key ){\n return function( record, value ){\n watcher.call( record, value, key );\n } \n}\n\nfunction createWatcherFromRef( ref : string, key : string ){\n const { local, resolve, tail } = new CompiledReference( ref, true );\n return local ?\n function( record, value ){\n record[ tail ]( value, key );\n } :\n function( record, value ){\n resolve( record )[ tail ]( value, key );\n }\n}","import { IOEndpoint, IONode, IOOptions, IOPromise, startIO } from '../io-tools';\nimport { TransactionOptions } from '../transactions';\n\nexport interface IOModel extends IONode {\n getEndpoint() : IOEndpoint\n save( options? : object ) : IOPromise\n fetch( options? : object ) : IOPromise\n destroy( options? : object ) : IOPromise\n toJSON( options? : object ) : any\n parse( data : any, options? : object ) : any\n isNew() : boolean\n id : string | number\n set( json : object, options : TransactionOptions ) : this\n}\n\nexport const IOModelMixin = {\n save( this : IOModel, options : IOOptions = {} ){\n const endpoint = this.getEndpoint(),\n json = this.toJSON({ ioMethod : 'save', ...options });\n\n return startIO(\n this,\n this.isNew() ?\n endpoint.create( json, options, this ) :\n endpoint.update( this.id, json, options, this ),\n options,\n\n update => {\n this.set( update, {\n parse : true,\n ioMethod : 'save',\n ...options\n } );\n }\n );\n },\n\n fetch( options : IOOptions = {} ){\n return startIO(\n this,\n this.getEndpoint().read( this.id, options, this ),\n options,\n\n json => this.set( json, { parse : true, ioMethod : 'fetch', ...options } )\n );\n },\n\n destroy( options : IOOptions = {} ){ \n return startIO(\n this,\n this.getEndpoint().destroy( this.id, options, this ),\n options,\n\n () => {\n const { collection } = this;\n if( collection ){\n collection.remove( this, options );\n }\n else{\n this.dispose();\n }\n\n return this;\n }\n )\n }\n}","/**\n * Model core implementing transactional updates.\n * The root of all definitions. \n */\n\nimport { define, definitions, isProduction, Logger, TheType, logger, LogLevel, mixinRules, tools } from '@type-r/mixture';\nimport { CollectionConstructor } from '../collection';\nimport { IOEndpoint } from '../io-tools';\nimport { CloneOptions, Owner, Transaction, Transactional, TransactionalDefinition, TransactionOptions } from '../transactions';\nimport { ChildrenErrors } from '../validation';\nimport { type } from './attrDef';\nimport { InferAttrs, ModelAttributes, AnonymousModelConstructor } from './define';\nimport { IOModel, IOModelMixin } from './io-mixin';\nimport { LinkedModelHash } from './linked-attrs';\nimport { AggregatedType, AnyType } from './metatypes';\nimport { AttributesConstructor, AttributesContainer, AttributesCopyConstructor, AttributesValues, setAttribute, shouldBeAnObject, unknownAttrsWarning, UpdateModelMixin } from './updates';\n\nexport interface MakeModelConstructor extends TheType\n{\n new ( attrs? : Partial>, options? : object ) : T\n prototype : T\n attributes : A\n Collection : CollectionConstructor\n}\n\nconst { assign, isEmpty } = tools;\n\n/*******************************************************\n * Model core implementation\n */\n\nexport interface ConstructorOptions extends TransactionOptions{\n clone? : boolean\n}\n\n// Client unique id counter\nlet _cidCounter : number = 0;\n\n/***************************************************************\n * Model Definition as accepted by Model.define( definition )\n */\nexport interface ModelDefinition extends TransactionalDefinition {\n idAttribute? : string\n attributes? : AttributesValues\n collection? : object\n Collection? : typeof Transactional\n}\n\nexport type LinkedAttributes = LinkedModelHash>\nexport type AttributesMixin = ModelAttributes\n\n@define({\n // Default client id prefix \n cidPrefix : 'm',\n\n // Name of the change event\n _changeEventName : 'change',\n\n // Default id attribute name\n idAttribute : 'id'\n})\n@definitions({\n defaults : mixinRules.merge,\n attributes : mixinRules.merge,\n collection : mixinRules.merge,\n Collection : mixinRules.value,\n idAttribute : mixinRules.protoValue\n})\nexport class Model extends Transactional implements IOModel, AttributesContainer, Iterable {\n /** @internal */\n static _metatype = AggregatedType;\n\n // Hack\n static onDefine( definition, BaseClass ){}\n\n static comparator( this : T, attr : keyof InstanceType, asc = true ) : ( a : InstanceType, b : InstanceType ) => -1 | 0 | 1 {\n const { compare } = tools;\n return asc ? \n ( a, b ) => compare( a[ attr ], b[ attr ] ) :\n ( a, b ) => -compare( a[ attr ], b[ attr ] ) as any;\n }\n\n static Collection : CollectionConstructor;\n static DefaultCollection : CollectionConstructor;\n \n // Attribute type for the record id.\n static id = type( String ).value( null );\n \n // Lazy object reference, serializable as id.\n static get ref(){\n return type( this )\n .toJSON( x => x ? x.id : null )\n .parse( x => {\n return { [ this.prototype.idAttribute ] : x };\n });\n }\n\n static extendAttrs( this : T, attrs : A ) : AnonymousModelConstructor {\n return this.defaults( attrs ) as any;\n }\n\n static defaults( attrs : AttributesValues ) : typeof Model {\n return this.extend({ attributes : attrs }) as any;\n }\n \n static attributes : AttributesValues\n\n /** @internal */\n _attributes$ : object = void 0\n\n /** @internal */\n __Attributes$ : new ( model : Model ) => object\n\n /** @internal */\n get $() : object {\n return this._attributes$ || ( this._attributes$ = new this.__Attributes$( this ) )\n }\n\n /********************\n * IO Methods\n */\n /** @internal */\n _endpoints : { [ name : string ] : IOEndpoint }\n\n /***********************************\n * Core Members\n */\n previousAttributes(){ return new this.AttributesCopy( this._previousAttributes ); } \n\n // Polymorphic accessor for aggregated attribute's canBeUpdated().\n /** @internal */\n get __inner_state__(){ return this.attributes; }\n\n get changed(){\n let changed = this._changedAttributes;\n\n if( !changed ){\n const prev = this._previousAttributes;\n changed = {};\n\n const { attributes } = this;\n\n for( let attr of this._attributesArray ){\n const key = attr.name,\n value = attributes[ key ];\n\n if( attr.isChanged( value, prev[ key ] ) ){\n changed[ key ] = value;\n }\n }\n\n this._changedAttributes = changed;\n }\n\n return changed; \n }\n\n changedAttributes( diff? : {} ) : boolean | {} {\n if( !diff ) return this.hasChanged() ? { ...this.changed } : false;\n\n var val, changed : {} | boolean = false,\n old = this._transaction ? this._previousAttributes : this.attributes,\n attrSpecs = this._attributes;\n\n for( var attr in diff ){\n if( !attrSpecs[ attr ].isChanged( old[ attr ], ( val = diff[ attr ] ) ) ) continue;\n (changed || (changed = {}))[ attr ] = val;\n }\n\n return changed; \n }\n\n hasChanged( key? : string ) : boolean {\n const { _previousAttributes } = this;\n if( !_previousAttributes ) return false;\n\n return key ?\n this._attributes[ key ].isChanged( this.attributes[ key ], _previousAttributes[ key ] ) :\n !isEmpty( this.changed );\n }\n\n previous( key : string ) : any {\n if( key ){\n const { _previousAttributes } = this;\n if( _previousAttributes ) return _previousAttributes[ key ];\n }\n \n return null;\n }\n\n isNew() : boolean {\n return this.id == null;\n }\n\n has( key : string ) : boolean {\n return this[ key ] != void 0;\n }\n\n // Return attribute value, setting an attribute to undefined.\n // TODO: If attribute was aggregated, don't dispose it.\n unset( key : string, options? ) : any {\n const value = this[ key ];\n this.set({ [ key ] : void 0 }, { unset : true, ...options });\n return value;\n }\n\n // Undocumented. Move to NestedTypes?\n clear( options? ) : this {\n const nullify = options && options.nullify;\n\n this.transaction( () =>{\n this.forEach( ( value, key ) => this[ key ] = nullify ? null : void 0 );\n }, options );\n\n return this;\n }\n\n // Returns Model owner skipping collections. TODO: Move out\n getOwner() : Owner {\n const owner : any = this._owner;\n\n // If there are no key, owner must be transactional object, and it's the collection.\n // We don't expect that collection can be the member of collection, so we're skipping just one level up. An optimization.\n return this._ownerKey ? owner : owner && owner._owner;\n }\n\n /***********************************\n * Identity managements\n */\n\n // Id attribute name ('id' by default)\n idAttribute : string;\n\n // Fixed 'id' property pointing to id attribute\n get id() : string { return this.attributes[ this.idAttribute ]; }\n set id( x : string ){ setAttribute( this, this.idAttribute, x ); }\n\n /***********************************\n * Dynamically compiled stuff\n */\n\n // Attributes specifications\n /** @internal */\n _attributes : { [ key : string ] : AnyType }\n\n /** @internal */\n _attributesArray : AnyType[]\n\n // Attributes object copy constructor\n Attributes : AttributesConstructor\n AttributesCopy : AttributesCopyConstructor\n\n // Create record default values, optionally augmenting given values.\n defaults( values = {} ){\n const defaults = {},\n { _attributesArray } = this;\n\n for( let attr of _attributesArray ){\n const key = attr.name,\n value = values[ key ];\n\n defaults[ key ] = value === void 0 ? attr.defaultValue() : value;\n }\n\n return defaults;\n }\n\n /***************************************************\n * Model construction\n */\n // Create record, optionally setting an owner\n constructor( a_values? : any, a_options? : ConstructorOptions ){\n super( _cidCounter++ );\n this.attributes = {};\n \n const options = a_options || {},\n values = ( options.parse ? this.parse( a_values, options ) : a_values ) || {};\n\n isProduction || typeCheck( this, values, options );\n\n this._previousAttributes = this.attributes = new this.Attributes( this, values, options );\n\n this.initialize( a_values, a_options );\n\n if( this._localEvents ) this._localEvents.subscribe( this, this );\n }\n\n // Initialization callback, to be overriden by the subclasses \n initialize( values? : Partial, options? ){}\n\n // Deeply clone record, optionally setting new owner.\n clone( options : CloneOptions = {} ) : this {\n const copy : this = new (this.constructor)( this.attributes, { clone : true } );\n \n if( options.pinStore ) copy._defaultStore = this.getStore();\n\n return copy;\n }\n\n /** @internal */\n _validateNested( errors : ChildrenErrors ) : number {\n var length = 0;\n\n const { attributes } = this;\n\n for( let attribute of this._attributesArray ){\n const { name } = attribute,\n error = attribute.validate( this, attributes[ name ], name );\n\n if( error ){\n errors[ name ] = error;\n length++;\n }\n }\n\n return length;\n }\n\n // Get attribute by key\n get( key : string ) : any {\n return this[ key ];\n }\n\n // Apply bulk in-place object update in scope of ad-hoc transaction \n set( values : any, options? : TransactionOptions ) : this {\n if( values ){ \n const transaction = this._createTransaction( values, options );\n transaction && transaction.commit();\n }\n\n return this;\n }\n\n /**\n * Serialization control\n */\n\n // Default record-level serializer, to be overriden by subclasses \n toJSON( options? : TransactionOptions ) : any {\n const json = {},\n { attributes } = this;\n\n for( let attribute of this._attributesArray ){\n const { name } = attribute,\n value = attributes[ name ];\n\n if( value !== void 0 ){\n // ...serialize it according to its spec.\n const asJson = attribute.toJSON.call( this, value, name, options );\n\n // ...skipping undefined values. Such an attributes are excluded.\n if( asJson !== void 0 ) json[ name ] = asJson; \n }\n }\n\n return json;\n }\n \n // Default record-level parser, to be overriden by the subclasses.\n parse( data, options? : TransactionOptions ){\n return data;\n }\n\n /**\n * Transactional control\n */\n deepSet( name : string, value : any, options? : any ){\n // Operation might involve series of nested object updates, thus it's wrapped in transaction.\n this.transaction( () => {\n const path = name.split( '.' ),\n l = path.length - 1,\n attr = path[ l ];\n\n let model = this;\n\n // Locate the model, traversing the path.\n for( let i = 0; i < l; i++ ){\n const key = path[ i ];\n\n // There might be collections in path, so use `get`.\n let next = model.get ? model.get( key ) : model[ key ];\n\n // Create models, if they are not exist.\n if( !next ){\n const attrSpecs = model._attributes;\n if( attrSpecs ){\n // If current object is model, create default attribute\n var newModel = attrSpecs[ key ].create();\n\n // If created object is model, nullify attributes when requested\n if( options && options.nullify && newModel._attributes ){\n newModel.clear( options );\n }\n\n model[ key ] = next = newModel;\n }\n // Silently fail in other case.\n else return;\n }\n \n model = next;\n }\n\n // Set model attribute.\n if( model.set ){\n model.set({ [ attr ] : value }, options );\n }\n else{\n model[ attr ] = value;\n }\n });\n\n return this\n }\n \n // Returns owner without the key (usually it's collection)\n get collection() : any {\n return this._ownerKey ? null : this._owner;\n }\n\n // Dispose object and all childrens\n dispose(){\n if( this._disposed ) return;\n\n const { attributes } = this;\n\n for( let attr of this._attributesArray ){\n attr.dispose( this, attributes[ attr.name ] );\n }\n \n super.dispose();\n }\n\n /** @internal */\n _log( level : LogLevel, topic: string, text : string, props : object, a_logger? : Logger ) : void {\n ( a_logger || logger ).trigger( level, topic, this.getClassName() + ' ' + text, {\n ...props,\n 'Model' : this,\n 'Attributes definition' : this._attributes\n });\n }\n\n getClassName() : string {\n return super.getClassName() || 'Model';\n }\n\n /** @internal */\n _createTransaction( values : object, options : TransactionOptions ) : Transaction { return void 0; }\n // Simulate attribute change \n forceAttributeChange : ( key : string, options : TransactionOptions ) => void\n\n /** @internal */\n _onChildrenChange : ( child : Transactional, options : TransactionOptions ) => void\n\n\n /**\n * Map methods\n */\n\n forEach( iteratee : ( value? : any, key? : string ) => void, context? : any ){\n const fun = context !== void 0 ? ( v, k ) => iteratee.call( context, v, k ) : iteratee,\n { attributes } = this;\n\n for( const key in this.attributes ){\n const value = attributes[ key ];\n if( value !== void 0 ) fun( value, key );\n }\n }\n\n mapObject( a_fun : ( value, key ) => any, context? : any ) : object {\n const fun = context === void 0 ? a_fun : a_fun.bind( context );\n return tools.transform( {}, this.attributes, fun );\n }\n\n [ Symbol.iterator ](){\n return new ModelEntriesIterator( this );\n }\n\n entries(){\n return new ModelEntriesIterator( this );\n }\n\n // Get array of attribute keys (Model) or record ids (Collection) \n keys() : string[] {\n const keys : string[] = [];\n\n this.forEach( ( value, key ) => keys.push( key ) );\n\n return keys;\n }\n};\n\nexport interface Model extends IOModel {}\nexport interface Model extends AttributesContainer {}\n\n\nassign( Model.prototype, UpdateModelMixin, IOModelMixin );\n\n/***********************************************\n * Helper functions\n */\n\nclass BaseModelAttributes {\n id : string\n\n constructor( record : Model, x : AttributesValues, options : TransactionOptions ) {\n this.id = x.id;\n }\n}\n\nModel.prototype.Attributes = BaseModelAttributes;\n\nclass BaseModelAttributesCopy {\n id : string\n\n constructor( x : AttributesValues ) {\n this.id = x.id;\n }\n}\n\nModel.prototype.AttributesCopy = BaseModelAttributesCopy;\n\nconst IdAttribute = AnyType.create({ value : void 0 }, 'id' );\nModel.prototype._attributes = { id : IdAttribute };\nModel.prototype._attributesArray = [ IdAttribute ];\n\nfunction typeCheck( record : Model, values : object, options ){\n if( shouldBeAnObject( record, values, options ) ){\n const { _attributes } = record;\n let unknown : string[];\n\n for( let name in values ){\n if( !_attributes[ name ] ){\n unknown || ( unknown = [] );\n unknown.push( `'${ name }'` );\n }\n }\n\n if( unknown ){\n unknownAttrsWarning( record, unknown, { values }, options );\n }\n }\n}\n\nexport class ModelEntriesIterator implements Iterator<[string, any]> {\n private idx = 0;\n \n constructor( private readonly record : Model){}\n\n next() : IteratorResult<[string, any]> {\n const { record } = this,\n metatype = record._attributesArray[ this.idx++ ];\n\n return {\n done : !metatype,\n value : metatype ? [ metatype.name, record[ metatype.name ] ] : void 0\n };\n }\n}","import { define, mixins, predefine, tools } from '@type-r/mixture';\nimport { Transactional } from '../transactions';\nimport { type } from './attrDef';\nimport { AnonimousModelDefinition, AnonymousAttributes, MergeModelConstructors, parseAnonimousModelDefinition } from './define';\nimport { addAttributeLinks } from './linked-attrs';\nimport { createAttributesMixin } from './mixin';\nimport { Model, ModelDefinition } from './model';\nexport { collection, metadata, AnonymousModelConstructor, InferAttrs } from './define'\nexport * from './attrDef';\nexport * from './metatypes';\nexport { AttributesMixin, LinkedAttributes } from './model';\nexport { Model };\n\nconst { assign, defaults } = tools;\n\nexport function attributes( b1 : B1, b2 : B2, b3 : B3, attrDefs : D ) : MergeModelConstructors,B3>,AnonymousAttributes>\nexport function attributes( b1 : B1, b2 : B2, attrDefs : D ) : MergeModelConstructors,AnonymousAttributes>\nexport function attributes( b1 : B1, attrDefs : D ) : MergeModelConstructors>;\nexport function attributes( attrDefs : D ) : AnonymousAttributes;\nexport function attributes( ...models : any[] ){\n const last = parseAnonimousModelDefinition( models[ models.length - 1 ] ),\n First = models.length > 1 ? models[ 0 ] : null,\n toMix = models.length > 2 ? models.slice( 1, models.length - 1 ) : null;\n\n class AnonimousModel extends ( First || Model ){\n }\n\n toMix && mixins( toMix )(AnonimousModel);\n define( last )( AnonimousModel );\n\n return AnonimousModel as any;\n}\n\nModel.onExtend = function( this : typeof Model, BaseClass : typeof Model ){\n Transactional.onExtend.call( this, BaseClass );\n\n // Create the default collection\n const Class = this;\n\n @predefine class DefaultCollection extends BaseClass.Collection {\n static model = Class;\n }\n\n this.DefaultCollection = DefaultCollection;\n\n // If there are no collection defined in statics, use the default collection.\n // It will appear in onDefine's definition, overriding all other settings.\n if( Class.Collection === BaseClass.Collection ){\n this.Collection = DefaultCollection;\n }\n}\n\nModel.onDefine = function( definition : ModelDefinition, BaseClass : typeof Model ){\n const baseProto : Model = BaseClass.prototype;\n\n // Compile attributes spec, creating definition mixin.\n const { properties, _localEvents, ...dynamicMixin } = createAttributesMixin( this.attributes = getAttributes( definition ), baseProto._attributes );\n assign( this.prototype, dynamicMixin );\n \n definition.properties = defaults( definition.properties || {}, properties );\n definition._localEvents = _localEvents;\n \n Transactional.onDefine.call( this, definition, BaseClass );\n\n // Finalize the definition of the default collection.\n this.DefaultCollection.define( definition.collection || {} );\n\n // assign collection from the definition.\n this.Collection = definition.Collection;\n this.Collection.prototype.model = this;\n\n if( definition.endpoint ) this.Collection.prototype._endpoint = definition.endpoint;\n\n addAttributeLinks( this );\n}\n\nfunction getAttributes({ defaults, attributes, idAttribute } : ModelDefinition ) {\n const definition = attributes || defaults || {};\n \n // If there is an undeclared idAttribute, add its definition as untyped generic attribute.\n if( idAttribute && !( idAttribute in definition ) ){\n definition[ idAttribute ] = void 0;\n }\n\n return definition;\n}\n\ndeclare var Reflect;\n\nexport function auto( value : any ) : PropertyDecorator;\nexport function auto( proto : object, attrName : string ) : void;\nexport function auto( proto, attrName? : string ) : any {\n if( typeof Reflect !== 'undefined' && Reflect.getMetadata ){\n if( attrName ){\n type( Reflect.getMetadata( \"design:type\", proto, attrName ) ).as( proto, attrName );\n }\n else{\n const value = proto;\n return ( proto : object, attrName : string ) : void => {\n type( Reflect.getMetadata( \"design:type\", proto, attrName ) ).value( value ).as( proto, attrName );\n }\n } \n }\n else{\n proto._log( 'error', 'Type-R:MissingImport', 'Add import \"reflect-metadata\"; as the first line of your app.' );\n } \n}","import { eventsApi, Logger } from '@type-r/mixture';\nimport { Model } from '../model';\nimport { ItemsBehavior, Owner, Transaction, Transactional, transactionApi, TransactionOptions } from '../transactions';\n\n\nconst { trigger2, trigger3, on, off } = eventsApi,\n { commit } = transactionApi,\n _aquire = transactionApi.aquire, _free = transactionApi.free;\n\n/** @private */\nexport interface CollectionCore extends Transactional, Owner {\n /** @internal */\n _byId : IdIndex\n\n models : Model[]\n model : typeof Model\n idAttribute : string // TODO: Refactor inconsistent idAttribute usage\n \n /** @internal */\n _comparator : Comparator\n \n get( objOrId : string | Model | Object ) : Model \n \n /** @internal */\n _itemEvents? : eventsApi.EventMap\n /** @internal */\n _shared : number\n /** @internal */\n _aggregationError : Model[]\n /** @internal */\n _log( level : string, topic : string, text : string, value : any, logger : Logger ) : void\n}\n\n// Collection's manipulation methods elements\nexport type Elements = ( Object | Model )[];\n\nexport interface CollectionOptions extends TransactionOptions {\n sort? : boolean\n}\n\nexport type Comparator = ( a : Model, b : Model ) => number; \n\n/** @private */\nexport function dispose( collection : CollectionCore ) : Model[]{\n const { models } = collection;\n\n collection.models = [];\n collection._byId = {};\n\n freeAll( collection, models );\n return models;\n}\n\n/** @private */\nexport function convertAndAquire( collection : CollectionCore, attrs : {} | Model, options : CollectionOptions ){\n const { model } = collection;\n \n let record : Model;\n\n if( collection._shared ){\n record = attrs instanceof model ? attrs : model.create( attrs, options );\n\n if( collection._shared & ItemsBehavior.listen ){\n on( record, record._changeEventName, collection._onChildrenChange, collection );\n }\n }\n else{\n record = attrs instanceof model ? ( options.merge ? attrs.clone() : attrs ) : model.create( attrs, options );\n\n if( record._owner ){\n if( record._owner !== collection ){\n _aquire( collection, record.clone() );\n const errors = collection._aggregationError || ( collection._aggregationError = [] );\n errors.push( record );\n }\n }\n else{\n _aquire( collection, record ); \n }\n } \n\n // Subscribe for events...\n const { _itemEvents } = collection;\n _itemEvents && _itemEvents.subscribe( collection, record );\n\n return record;\n}\n\n/** @private */\nexport function free( owner : CollectionCore, child : Model, unset? : boolean ) : void {\n if( owner._shared ){\n if( owner._shared & ItemsBehavior.listen ){\n off( child, child._changeEventName, owner._onChildrenChange, owner );\n }\n }\n else{\n _free( owner, child );\n unset || child.dispose();\n }\n\n const { _itemEvents } = owner;\n _itemEvents && _itemEvents.unsubscribe( owner, child );\n}\n\n/** @private */\nexport function freeAll( collection : CollectionCore, children : Model[] ) : Model[] {\n for( let child of children ){\n free( collection, child );\n }\n\n return children;\n}\n\n/**\n * Silently sort collection, if its required. Returns true if sort happened.\n * @private\n */ \nexport function sortElements( collection : CollectionCore, options : CollectionOptions ) : boolean {\n let { _comparator } = collection;\n if( _comparator && options.sort !== false ){\n collection.models.sort( _comparator );\n return true;\n }\n\n return false;\n}\n\n/**********************************\n * Collection Index\n * @private \n */\nexport interface IdIndex {\n [ id : string ] : Model\n}\n\n/** @private Add record */ \nexport function addIndex( index : IdIndex, model : Model ) : void {\n index[ model.cid ] = model;\n var id = model.id;\n \n if( id || ( id as any ) === 0 ){\n index[ id ] = model;\n }\n}\n\n/** @private Remove record */ \nexport function removeIndex( index : IdIndex, model : Model ) : void {\n delete index[ model.cid ];\n var id = model.id;\n if( id || ( id as any ) === 0 ){\n delete index[ id ];\n }\n}\n\nexport function updateIndex( index : IdIndex, model : Model ){\n delete index[ model.previous( model.idAttribute ) ];\n\n const { id } = model;\n id == null || ( index[ id ] = model );\n}\n\n/***\n * In Collections, transactions appears only when\n * add remove or change events might be emitted.\n * reset doesn't require transaction.\n * \n * Transaction holds information regarding events, and knows how to emit them.\n * \n * Two major optimization cases.\n * 1) Population of an empty collection\n * 2) Update of the collection (no or little changes) - it's crucial to reject empty transactions.\n */\n\n\n// Transaction class. Implements two-phase transactions on object's tree.\n/** @private */ \nexport class CollectionTransaction implements Transaction {\n // open transaction\n constructor( public object : CollectionCore,\n public isRoot : boolean,\n public added : Model[],\n public removed : Model[],\n public nested : Transaction[],\n public sorted : boolean ){}\n\n // commit transaction\n commit( initiator? : Transactional ){\n const { nested, object } = this,\n { _isDirty } = object;\n\n // Commit all nested transactions...\n for( let transaction of nested ){\n transaction.commit( object );\n }\n\n if( object._aggregationError ){\n logAggregationError( object, _isDirty );\n }\n\n // Just trigger 'change' on collection, it must be already triggered for models during nested commits.\n // ??? TODO: do it in nested transactions loop? This way appears to be more correct. \n for( let transaction of nested ){\n trigger2( object, 'change', transaction.object, _isDirty );\n }\n\n // Notify listeners on attribute changes...\n const { added, removed } = this;\n\n // Trigger `add` events for both model and collection.\n for( let record of added ){\n trigger3( record, 'add', record, object, _isDirty );\n trigger3( object, 'add', record, object, _isDirty );\n }\n\n // Trigger `remove` events for both model and collection.\n for( let record of removed ){\n trigger3( record, 'remove', record, object, _isDirty );\n trigger3( object, 'remove', record, object, _isDirty );\n }\n\n if( this.sorted ){\n trigger2( object, 'sort', object, _isDirty );\n }\n\n if( added.length || removed.length ){\n trigger2( object, 'update', object, _isDirty );\n }\n\n this.isRoot && commit( object, initiator );\n }\n}\n\nexport function logAggregationError( collection : CollectionCore, options : TransactionOptions ){\n collection._log( 'warn', 'Type-R:InvalidOwner', 'added records already have an owner and were cloned. Use explicit record.clone() to dismiss this warning.', collection._aggregationError, options.logger );\n collection._aggregationError = void 0;\n}","import { Model } from '../model';\nimport { Transaction, transactionApi } from '../transactions';\nimport { addIndex, CollectionCore, CollectionOptions, CollectionTransaction, convertAndAquire, logAggregationError, sortElements, updateIndex } from './commons';\n\nconst { begin, commit, markAsDirty } = transactionApi;\n\nexport interface AddOptions extends CollectionOptions {\n at? : number \n}\n\n/** @private */\nexport function addTransaction( collection : CollectionCore, items : any[], options : AddOptions, merge? : boolean ){\n const isRoot = begin( collection ),\n nested : Transaction[]= [];\n\n var added = appendElements( collection, items, nested, options, merge );\n\n if( added.length || nested.length ){\n let needSort = sortOrMoveElements( collection, added, options );\n if( markAsDirty( collection, options ) ){\n return new CollectionTransaction( collection, isRoot, added, [], nested, needSort );\n }\n\n if( collection._aggregationError ) logAggregationError( collection, options );\n }\n\n // No changes...\n isRoot && commit( collection );\n};\n\n// Handle sort or insert at options for add operation. Reurns true if sort happened.\n/** @private */ \nfunction sortOrMoveElements( collection : CollectionCore, added : Model[], options : AddOptions ) : boolean {\n let at = options.at;\n\n // if `at` option is given, it overrides sorting option...\n if( at != null ){\n // Take an original collection's length. \n const length = collection.models.length - added.length;\n\n // Crazy Backbone rules about `at` index. I don't know what that guys smoke.\n at = Number( at );\n if( at < 0 ) at += length + 1;\n if( at < 0 ) at = 0;\n if( at > length ) at = length;\n\n // Move added elements to desired position. In place.\n moveElements( collection.models, at, added );\n return false;\n }\n\n return sortElements( collection, options );\n}\n\n/** @private */\nfunction moveElements( source : any[], at : number, added : any[] ) : void {\n for( var j = source.length - 1, i = j - added.length; i >= at; i--, j-- ){\n source[ j ] = source[ i ];\n }\n\n for( i = 0, j = at; i < added.length; i++, j++ ){\n source[ j ] = added[ i ];\n }\n}\n\n// append data to model and index\n/** @private */\nfunction appendElements( collection : CollectionCore, a_items : any[], nested : Transaction[], a_options : AddOptions, forceMerge : boolean ){\n var { _byId, models } = collection,\n merge = ( forceMerge || a_options.merge ) && !collection._shared,\n parse = a_options.parse,\n idAttribute = collection.model.prototype.idAttribute,\n prevLength = models.length;\n\n for( const item of a_items ){\n let model = item ? _byId[ item[ idAttribute ] ] || _byId[ item.cid ] : null;\n\n if( model ){\n if( merge && item !== model ){\n var attrs = item.attributes || item;\n const transaction = model._createTransaction( attrs, a_options );\n transaction && nested.push( transaction );\n\n if( model.hasChanged( idAttribute ) ){\n updateIndex( _byId, model );\n }\n }\n }\n else{\n model = convertAndAquire( collection, item, a_options );\n models.push( model );\n addIndex( _byId, model );\n }\n }\n\n return models.slice( prevLength );\n}\n","import { Model } from '../model'\n\nexport type Predicate = ( ( val : R, key? : number ) => boolean ) | Partial;\n\n/**\n * Optimized array methods.\n */\nexport abstract class ArrayMixin {\n models : R[]\n abstract get( modelOrId : string | Partial ) : R;\n\n /**\n * Map and optionally filter the collection.\n * @param mapFilter filter an element out if `undefined` is returned \n * @param context optional `this` for `mapFilter`\n */\n map( mapFilter : ( val : R, key? : number ) => T, context? : any ) : T[]{\n const { models } = this,\n { length } = models,\n res = Array( length ),\n fun = context ? mapFilter.bind( context ) : mapFilter;\n\n for( var i = 0, j = 0; i < length; i++ ){\n const val = fun( models[ i ], i );\n val === void 0 || ( res[ j++ ] = val );\n }\n\n if( i !== j ){\n res.length = j;\n }\n\n return res;\n }\n\n /**\n * Iterate through the collection.\n * @param context optional `this` for `iteratee`.\n */\n each( fun : ( val : R, key? : number ) => any, context? : any ) : void {\n const { models } = this,\n { length } = models,\n iteratee = context ? fun.bind( context ) : fun;\n\n for( let i = 0; i < length; i++ ){\n iteratee( models[ i ], i );\n }\n }\n\n /**\n * Iterate through collection optionally returning the value.\n * @param doWhile break the loop if anything but `undefined` is returned, and return this value.\n * @param context optional `this` for `doWhile`.\n */\n firstMatch( doWhile : ( val : R, key? : number ) => T ) : T\n firstMatch( doWhile : ( this : C, val : R, key? : number ) => T, context : C ) : T\n firstMatch( doWhile : ( val : R, key? : number ) => T, context? : any ) : T {\n const { models } = this,\n { length } = models,\n iteratee = context ? doWhile.bind( context ) : doWhile;\n\n for( let i = 0; i < length; i++ ){\n const res = iteratee( models[ i ], i );\n if( res !== void 0 ) return res;\n }\n }\n\n /**\n * Proxy for the `array.reduce()`\n * @param iteratee \n */\n reduce( iteratee : (previousValue: R, currentValue: R, currentIndex?: number ) => R ) : R\n reduce( iteratee : (previousValue: T, currentValue: R, currentIndex?: number ) => T, init? : any ) : T\n reduce( iteratee : (previousValue: any, currentValue: any, currentIndex?: number ) => any, init? : any ) : T | R {\n return init === void 0 ? this.models.reduce( iteratee ) : this.models.reduce( iteratee, init );\n }\n\n // Slice out a sub-array of models from the collection.\n slice( begin? : number, end? : number ) : R[] {\n return this.models.slice( begin, end );\n }\n \n indexOf( modelOrId : string | Partial ) : number {\n return this.models.indexOf( this.get( modelOrId ) );\n }\n\n includes( idOrObj : string | Partial ) : boolean {\n return Boolean( this.get( idOrObj ) );\n }\n\n filter( iteratee : Predicate, context? : any ) : R[] {\n const fun = toPredicateFunction( iteratee );\n return this.map( m => fun( m ) ? m : void 0, context );\n }\n\n find( iteratee : Predicate, context? : any ) : R {\n const fun = toPredicateFunction( iteratee );\n return this.firstMatch( m => fun( m ) ? m : void 0, context );\n }\n\n some( iteratee : Predicate, context? : any ) : boolean {\n return Boolean( this.find( iteratee, context ) );\n }\n\n forEach( iteratee : ( val : R, key? : number ) => void, context? : any ) : void {\n this.each( iteratee, context );\n }\n\n values() : IterableIterator {\n return this.models.values();\n }\n\n entries() : IterableIterator<[ number, R ]>{\n return this.models.entries();\n }\n\n every( iteratee : Predicate, context? : any ) : boolean {\n const fun = toPredicateFunction( iteratee );\n return this.firstMatch( m => fun( m ) ? void 0 : false, context ) === void 0;\n }\n\n pluck( key : K ) : R[K][] {\n return this.map( model => model[ key ] );\n }\n\n first() : R { return this.models[ 0 ]; }\n\n last() : R { return this.models[ this.models.length - 1 ]; }\n\n at( a_index : number ) : R {\n const index = a_index < 0 ? a_index + this.models.length : a_index; \n return this.models[ index ];\n }\n\n groupBy( attr : keyof R | (( m : R ) => string )) : { [ key : string ] : R[] };\n groupBy(\n attr : keyof R | (( m : R ) => string ),\n a_reducer : ( acc : A, model? : R, key? : string ) => A\n ) : { [ key : string ] : A };\n groupBy(\n attr : keyof R | (( m : R ) => string ),\n a_reducer? : ( acc : A, model? : R, key? : string ) => A\n ){\n const map : any = typeof attr === 'string' ?\n x => x[ attr ] :\n attr;\n\n const reducer = a_reducer || defaultGrouping;\n\n const results = {};\n\n for( let model of this.models ){\n const key = map( model );\n if( key != null ){\n results[ key ] = reducer( results[ key ], model, key );\n }\n }\n\n return results;\n }\n}\n\nconst defaultGrouping = ( acc = [], x ) => ( acc.push( x ), acc );\n\nconst noOp = x => x;\n\nfunction toPredicateFunction( iteratee : Predicate ){\n if( iteratee == null ) return noOp;\n\n switch( typeof iteratee ){\n case 'function' : return iteratee;\n case 'object' :\n const keys = Object.keys( iteratee );\n \n return x => {\n for( let key of keys ){\n if( iteratee[ key ] !== x[ key ] )\n return false;\n }\n\n return true;\n }\n default : throw new Error( 'Invalid iteratee' );\n }\n}","/*************\n * Remove items from collections.\n * \n * Cannot be a part of two-phase transaction on object tree.\n * Can be executed in the scope of ad-hoc transaction or from the trigger, though.\n *\n * Implemented with low-level API. \n * Most frequent operation - single element remove. Thus, it have the fast-path.\n */\n\nimport { eventsApi } from '@type-r/mixture';\nimport { Model } from '../model';\nimport { transactionApi, TransactionOptions } from '../transactions';\nimport { CollectionCore, CollectionTransaction, free, removeIndex } from './commons';\n\nconst { trigger2, trigger3 } = eventsApi,\n { markAsDirty, begin, commit } = transactionApi;\n\n/** @private */\nexport function removeOne( collection : CollectionCore, el : Model | {} | string, options : TransactionOptions ) : Model {\n var model : Model = collection.get( el );\n\n if( model ){\n const isRoot = begin( collection ),\n models = collection.models;\n\n // Remove model form the collection. \n models.splice( models.indexOf( model ), 1 );\n removeIndex( collection._byId, model );\n \n // Mark transaction as dirty. \n const notify = markAsDirty( collection, options );\n\n // Send out events.\n if( notify ){\n trigger3( model, 'remove', model, collection, options );\n trigger3( collection, 'remove', model, collection, options );\n } \n\n free( collection, model, options.unset );\n\n notify && trigger2( collection, 'update', collection, options );\n\n // Commit transaction.\n isRoot && commit( collection );\n\n return model;\n }\n};\n\n/** Optimized for removing many elements\n * 1. Remove elements from the index, checking for duplicates\n * 2. Create new models array matching index\n * 3. Send notifications and remove references\n */\n\n/** @private */\nexport function removeMany( collection : CollectionCore, toRemove : any[], options ){\n const removed = _removeFromIndex( collection, toRemove, options.unset );\n if( removed.length ){\n const isRoot = begin( collection );\n\n _reallocate( collection, removed.length );\n\n if( markAsDirty( collection, options ) ){\n const transaction = new CollectionTransaction( collection, isRoot, [], removed, [], false );\n transaction.commit();\n }\n else{\n // Commit transaction.\n isRoot && commit( collection );\n }\n }\n\n return removed;\n};\n\n// remove models from the index...\n/** @private */\nfunction _removeFromIndex( collection, toRemove, unset : boolean ){\n var removed = Array( toRemove.length ),\n _byId = collection._byId;\n\n for( var i = 0, j = 0; i < toRemove.length; i++ ){\n var model = collection.get( toRemove[ i ] );\n if( model ){\n removed[ j++ ] = model;\n removeIndex( _byId, model );\n free( collection, model, unset );\n }\n }\n\n removed.length = j;\n\n return removed;\n}\n\n// Allocate new models array removing models not present in the index.\n/** @private */\nfunction _reallocate( collection, removed ){\n var prev = collection.models,\n models = collection.models = Array( prev.length - removed ),\n _byId = collection._byId;\n\n for( var i = 0, j = 0; i < prev.length; i++ ){\n var model = prev[ i ];\n\n if( _byId[ model.cid ] ){\n models[ j++ ] = model;\n }\n }\n\n models.length = j;\n}","import { Model } from '../model';\nimport { Transaction, transactionApi } from '../transactions';\nimport { addIndex, CollectionCore, CollectionOptions, CollectionTransaction, convertAndAquire, Elements, free, freeAll, IdIndex, logAggregationError, sortElements } from './commons';\n\nconst { begin, commit, markAsDirty } = transactionApi;\n\n/** @private */\nconst silentOptions = { silent : true };\n\n/** @private */\nexport function emptySetTransaction( collection : CollectionCore, items : Elements, options : CollectionOptions, silent? : boolean ){\n const isRoot = begin( collection );\n\n const added = _reallocateEmpty( collection, items, options );\n\n if( added.length ){\n const needSort = sortElements( collection, options );\n\n if( markAsDirty( collection, silent ? silentOptions : options ) ){\n // 'added' is the reference to this.models. Need to copy it.\n return new CollectionTransaction( collection, isRoot, added.slice(), [], [], needSort );\n }\n\n if( collection._aggregationError ) logAggregationError( collection, options );\n }\n\n // No changes...\n isRoot && commit( collection );\n};\n\n/** @private */\nexport function setTransaction( collection, items, options ){\n const isRoot = begin( collection ),\n nested = [];\n\n var previous = collection.models,\n added = _reallocate( collection, items, nested, options );\n\n const reusedCount = collection.models.length - added.length,\n removed = reusedCount < previous.length ? (\n reusedCount ? _garbageCollect( collection, previous ) :\n freeAll( collection, previous )\n ) : []; \n \n const addedOrChanged = nested.length || added.length,\n // As we are reallocating models array, it needs to be sorted even if there are no changes.\n sorted = ( sortElements( collection, options ) && addedOrChanged ) || added.length || options.sorted;\n\n if( addedOrChanged || removed.length || sorted ){\n if( markAsDirty( collection, options ) ){ \n return new CollectionTransaction( collection, isRoot, added, removed, nested, sorted );\n }\n\n if( collection._aggregationError ) logAggregationError( collection, options );\n }\n\n isRoot && commit( collection );\n};\n\n// Remove references to all previous elements, which are not present in collection.\n// Returns an array with removed elements.\n/** @private */\nfunction _garbageCollect( collection : CollectionCore, previous : Model[] ) : Model[]{\n const { _byId } = collection,\n removed = [];\n\n // Filter out removed models and remove them from the index...\n for( let record of previous ){\n if( !_byId[ record.cid ] ){\n removed.push( record );\n free( collection, record );\n }\n }\n\n return removed;\n}\n\n// reallocate model and index\n/** @private */\nfunction _reallocate( collection : CollectionCore, source : any[], nested : Transaction[], options ){\n var models = Array( source.length ),\n _byId : IdIndex = {},\n merge = ( options.merge == null ? true : options.merge ) && !collection._shared,\n _prevById = collection._byId,\n prevModels = collection.models, \n idAttribute = collection.model.prototype.idAttribute,\n toAdd = [],\n orderKept = true;\n\n // for each item in source set...\n for( var i = 0, j = 0; i < source.length; i++ ){\n var item = source[ i ],\n model : Model = null;\n\n if( item ){\n var id = item[ idAttribute ],\n cid = item.cid;\n\n if( _byId[ id ] || _byId[ cid ] ) continue;\n\n model = _prevById[ id ] || _prevById[ cid ];\n }\n\n if( model ){\n if( merge && item !== model ){\n if( orderKept && prevModels[ j ] !== model ) orderKept = false;\n\n var attrs = item.attributes || item;\n const transaction = model._createTransaction( attrs, options );\n transaction && nested.push( transaction );\n }\n }\n else{\n model = convertAndAquire( collection, item, options );\n toAdd.push( model );\n }\n\n models[ j++ ] = model;\n addIndex( _byId, model );\n }\n\n models.length = j;\n collection.models = models;\n collection._byId = _byId;\n\n if( !orderKept ) options.sorted = true;\n\n return toAdd;\n}\n\n/** @private */\nfunction _reallocateEmpty( self, source, options ){\n var len = source ? source.length : 0,\n models = Array( len ),\n _byId : IdIndex = {},\n idAttribute = self.model.prototype.idAttribute;\n\n for( var i = 0, j = 0; i < len; i++ ){\n var src = source[ i ];\n\n if( src && ( _byId[ src[ idAttribute ] ] || _byId[ src.cid ] ) ){\n continue;\n }\n\n var model = convertAndAquire( self, src, options );\n models[ j++ ] = model;\n addIndex( _byId, model );\n }\n\n models.length = j;\n self._byId = _byId;\n\n return self.models = models;\n}","import { Linked } from '@linked/value';\nimport { define, definitions, EventMap, eventsApi, EventsDefinition, Logger, logger, LogLevel, Mixable, mixinRules, mixins, TheType } from '@type-r/mixture';\nimport { createIOPromise, IOPromise, startIO } from '../io-tools';\nimport { AggregatedType, Model, SharedType, shared, AnonymousModelConstructor, attributes } from '../model';\nimport { CloneOptions, ItemsBehavior, Transactional, TransactionalDefinition, transactionApi, TransactionOptions } from '../transactions';\nimport { AddOptions, addTransaction } from './add';\nimport { ArrayMixin } from './arrayMethods';\nimport { CollectionCore, CollectionTransaction, Elements, free, sortElements, updateIndex } from './commons';\nimport { removeMany, removeOne } from './remove';\nimport { emptySetTransaction, setTransaction } from './set';\n\nconst { trigger2 } = eventsApi,\n { begin, commit, markAsDirty } = transactionApi;\n\nlet _count = 0;\n\nexport type GenericComparator = string | ( ( x : Model ) => number ) | ( ( a : Model, b : Model ) => number ); \n\nexport interface CollectionOptions extends TransactionOptions {\n comparator? : GenericComparator\n model? : typeof Model\n}\n\nexport interface CollectionDefinition extends TransactionalDefinition {\n model? : typeof Model,\n itemEvents? : EventsDefinition\n _itemEvents? : EventMap\n}\n\nclass CollectionRefsType extends SharedType {\n static defaultValue = [];\n}\n\nexport interface CollectionConstructor extends TheType {\n new ( records? : ElementsArg, options?: CollectionOptions ) : Collection\n prototype : Collection\n Refs : CollectionConstructor\n};\n\ntype CollectionOf = M['Collection'] extends CollectionConstructor> ? M['Collection'] : CollectionConstructor>;\n\n@define({\n // Default client id prefix \n cidPrefix : 'c',\n model : Model,\n _changeEventName : 'changes',\n _aggregationError : null\n})\n@mixins( ArrayMixin )\n@definitions({\n comparator : mixinRules.value,\n model : mixinRules.protoValue,\n itemEvents : mixinRules.merge\n})\nexport class Collection< R extends Model = Model> extends Transactional implements CollectionCore, Iterable {\n /** @internal */\n _shared : number\n /** @internal */\n _aggregationError : R[]\n\n /**\n * EXPERIMENTAL notation to extract proper collection type from the model in TypeScript.\n * \n * attrName : Collection.of( User );\n * \n * const users = new ( Collection.of( User ) )\n */\n static of( Ctor : M ) : CollectionOf;\n static of( spec : M ) : CollectionOf>;\n static of( Ctor : M ) : CollectionOf {\n return typeof Ctor === 'function' ?\n Ctor.Collection as any :\n attributes( Ctor ).Collection as any;\n }\n\n /**\n * EXPERIMENTAL notation to extract proper collection type from the model in TypeScript.\n * \n * attrName : Collection.ofRefs( User );\n * \n * const users = new ( Collection.ofRefs( User ) )\n */\n static ofRefs( Ctor : M ) : CollectionOf {\n return Ctor.Collection.Refs as any;\n }\n\n\n static Subset : typeof Collection\n static Refs : any\n static refsTo = shared;\n\n /** @internal */\n static _SubsetOf : typeof Collection\n \n createSubset( models : ElementsArg, options? : CollectionOptions) : Collection{\n throw new ReferenceError( 'Failed dependency injection' )\n }\n\n static onExtend( BaseClass : typeof Transactional ){\n // Cached subset collection must not be inherited.\n const Ctor = this;\n this._SubsetOf = null;\n\n function RefsCollection( a, b, listen? ){\n Ctor.call( this, a, b, ItemsBehavior.share | ( listen ? ItemsBehavior.listen : 0 ) );\n }\n\n Mixable.mixins.populate( RefsCollection );\n RefsCollection.create = Collection.create;\n \n RefsCollection.prototype = this.prototype;\n RefsCollection._metatype = CollectionRefsType;\n\n this.Refs = this.Subset = RefsCollection;\n\n Transactional.onExtend.call( this, BaseClass );\n }\n \n static onDefine( definition : CollectionDefinition, BaseClass : any ){\n if( definition.itemEvents ){\n const eventsMap = new EventMap( BaseClass.prototype._itemEvents );\n eventsMap.addEventsMap( definition.itemEvents );\n this.prototype._itemEvents = eventsMap;\n }\n\n if( definition.comparator !== void 0 ) this.prototype.comparator = definition.comparator;\n\n Transactional.onDefine.call( this, definition );\n }\n \n /** @internal */\n _itemEvents : EventMap\n\n /***********************************\n * Core Members\n */\n // Array of the records\n models : R[]\n\n // Polymorphic accessor for aggregated attribute's canBeUpdated().\n /** @internal */\n get __inner_state__(){ return this.models; }\n\n // Index by id and cid\n /** @internal */\n _byId : { [ id : string ] : R }\n\n set comparator( x : GenericComparator ){\n\n switch( typeof x ){\n case 'string' :\n this._comparator = ( a, b ) => {\n const aa = a[ x ], bb = b[ x ];\n if( aa === bb ) return 0;\n return aa < bb ? -1 : + 1;\n } \n break;\n case 'function' :\n if( x.length === 1 ){\n this._comparator = ( a, b ) => {\n const aa = (x).call( this, a ), bb = (x).call( this, b );\n if( aa === bb ) return 0;\n return aa < bb ? -1 : + 1;\n }\n }\n else{\n this._comparator = ( a, b ) => (x).call( this, a, b );\n }\n break;\n \n default :\n this._comparator = null;\n }\n }\n \n // TODO: Improve typing\n getStore() : Transactional {\n return this._store || ( this._store = this._owner ? this._owner.getStore() : this._defaultStore );\n }\n\n /** @internal */\n _store : Transactional\n\n get comparator(){ return this._comparator; }\n\n /** @internal */\n _comparator : ( a : R, b : R ) => number\n\n /** @internal */\n _onChildrenChange( record : R, options : TransactionOptions = {}, initiator? : Transactional ){\n // Ignore updates from nested transactions.\n if( initiator === this ) return;\n\n const { idAttribute } = this;\n\n if( record.hasChanged( idAttribute ) ){\n updateIndex( this._byId, record );\n }\n\n const isRoot = begin( this );\n\n if( markAsDirty( this, options ) ){\n // Forward change event from the record.\n trigger2( this, 'change', record, options )\n }\n\n isRoot && commit( this );\n }\n\n get( objOrId : string | { id? : string, cid? : string } ) : R {\n if( objOrId == null ) return;\n\n if( typeof objOrId === 'object' ){\n const id = objOrId[ this.idAttribute ];\n return ( id !== void 0 && this._byId[ id ] ) || this._byId[ objOrId.cid ];\n }\n else{\n return this._byId[ objOrId ];\n } \n }\n\n [ Symbol.iterator ]() : IterableIterator {\n return this.models[ Symbol.iterator ]();\n }\n\n // Loop through the members in the scope of transaction.\n // Transactional version of each()\n updateEach( iteratee : ( val : R, key? : number ) => void ){\n const isRoot = transactionApi.begin( this );\n this.each( iteratee );\n isRoot && transactionApi.commit( this );\n }\n\n /** @internal */\n _validateNested( errors : {} ) : number {\n // Don't validate if not aggregated.\n if( this._shared ) return 0;\n\n let count = 0;\n\n this.each( record => {\n const error = record.validationError;\n if( error ){\n errors[ record.cid ] = error;\n count++;\n }\n });\n\n return count;\n }\n\n model : typeof Model\n\n // idAttribute extracted from the model type.\n idAttribute : string\n\n constructor( records? : ElementsArg, options : CollectionOptions = {}, shared? : number ){\n super( _count++ );\n this.models = [];\n this._byId = {};\n \n this.comparator = this.comparator;\n\n if( options.comparator !== void 0 ){\n this.comparator = options.comparator;\n options.comparator = void 0;\n }\n \n this.model = this.model;\n \n if( options.model ){\n this.model = options.model;\n options.model = void 0;\n }\n\n this.idAttribute = this.model.prototype.idAttribute; //TODO: Remove?\n\n this._shared = shared || 0;\n\n if( records ){\n const elements = toElements( this, records, options );\n emptySetTransaction( this, elements, options, true );\n }\n\n this.initialize.apply( this, arguments );\n\n if( this._localEvents ) this._localEvents.subscribe( this, this );\n }\n\n initialize(){}\n\n // Deeply clone collection, optionally setting new owner.\n clone( options : CloneOptions = {} ) : this {\n const models = this._shared & ItemsBehavior.share ? this.models : this.map( model => model.clone() ),\n copy : this = new (this.constructor)( models, { model : this.model, comparator : this.comparator }, this._shared );\n \n if( options.pinStore ) copy._defaultStore = this.getStore();\n \n return copy;\n }\n\n toJSON( options? : object ) : any {\n return this.map( model => model.toJSON( options ) );\n }\n\n // Apply bulk in-place object update in scope of ad-hoc transaction \n set( elements : ElementsArg = [], options : TransactionOptions = {} ) : this {\n if( (options).add !== void 0 ){\n this._log( 'warn', \"Type-R:InvalidOption\", \"Collection.set doesn't support 'add' option, behaving as if options.add === true.\", options );\n }\n\n // Handle reset option here - no way it will be populated from the top as nested transaction.\n if( options.reset ){\n this.reset( elements, options )\n }\n else{\n const transaction = this._createTransaction( elements, options );\n transaction && transaction.commit();\n } \n\n return this; \n }\n\n /**\n * Enable or disable live updates.\n * \n * `true` enables full collection synchronization.\n * `false` cancel live updates.\n * `json => true | false` - filter updates\n */\n liveUpdates( enabled : LiveUpdatesOption ) : IOPromise {\n if( enabled ){\n return this._subscribeLiveUpdates( enabled ).then( () => this );\n }\n else{\n if( this._liveUpdates ){\n this.getEndpoint().unsubscribe( this._liveUpdates, this );\n this._liveUpdates = null;\n }\n\n // TODO: Return the resolved promise.\n }\n }\n\n /** @internal */\n _liveUpdates : object\n\n /** @internal */\n _subscribeLiveUpdates( enabled : LiveUpdatesOption ) : IOPromise {\n this.liveUpdates( false );\n\n const filter = typeof enabled === 'function' ? enabled : () => true;\n\n this._liveUpdates = {\n updated : json => {\n filter( json ) && this.add( json, { parse : true, merge : true } );\n },\n\n removed : id => this.remove( id )\n };\n\n return this.getEndpoint().subscribe( this._liveUpdates, this );\n }\n\n fetch( a_options : { liveUpdates? : LiveUpdatesOption } & TransactionOptions & { [ key : string ] : any } = {} ) : IOPromise {\n const options = { parse : true, ...a_options },\n endpoint = this.getEndpoint();\n\n const promise = options.liveUpdates ?\n createIOPromise( ( resolve, reject, onAbort ) => {\n let list : IOPromise;\n const subscription = this._subscribeLiveUpdates( options.liveUpdates );\n\n subscription\n .then( () => {\n list = endpoint.list( options, this );\n return list;\n })\n .then( resolve, error => {\n this.liveUpdates( false );\n reject( error );\n });\n\n onAbort( ( resolve, reject ) => {\n list && list.abort && list.abort();\n subscription.abort && subscription.abort();\n this.liveUpdates( false );\n reject( new Error( 'I/O Aborted' ) );\n });\n }) :\n endpoint.list( options, this );\n\n return startIO(\n this,\n promise,\n options,\n\n json => this.set( json, { parse : true, ioMethod : 'fetch', ...options } as TransactionOptions )\n );\n }\n\n dispose() : void {\n if( this._disposed ) return;\n\n const aggregated = !this._shared;\n\n for( let record of this.models ){\n free( this, record );\n\n if( aggregated ) record.dispose();\n }\n\n this.liveUpdates( false );\n\n super.dispose();\n }\n\n reset( a_elements? : ElementsArg, options : TransactionOptions = {} ) : R[] {\n const isRoot = begin( this ),\n previousModels = this.models;\n\n // Make all changes required, but be silent.\n if( a_elements ){ \n emptySetTransaction( this, toElements( this, a_elements, options ), options, true );\n }\n else{\n this._byId = {};\n this.models = [];\n }\n\n markAsDirty( this, options );\n\n options.silent || trigger2( this, 'reset', this, { previousModels, ...options } );\n\n // Dispose models which are not in the updated collection.\n const { _byId } = this;\n \n for( let toDispose of previousModels ){\n _byId[ toDispose.cid ] || free( this, toDispose );\n }\n\n isRoot && commit( this );\n return this.models;\n }\n\n // Add elements to collection.\n add( a_elements : ElementsArg , options : AddOptions = {} ){\n const elements = toElements( this, a_elements, options ),\n transaction = this.models.length ?\n addTransaction( this, elements, options ) :\n emptySetTransaction( this, elements, options );\n\n if( transaction ){\n transaction.commit();\n return transaction.added;\n }\n }\n\n // Remove elements. \n remove( recordsOrIds : any, options : CollectionOptions = {} ) : R[] | R {\n if( recordsOrIds ){\n return Array.isArray( recordsOrIds ) ?\n removeMany( this, recordsOrIds, options ) as R[]:\n removeOne( this, recordsOrIds, options ) as R;\n }\n\n return [];\n }\n\n $includes( idOrObj : R ) : Linked {\n return new LinkedIncludes( this, idOrObj );\n }\n\n // Apply bulk object update without any notifications, and return open transaction.\n // Used internally to implement two-phase commit. \n /** @internal */\n _createTransaction( a_elements : ElementsArg, options : TransactionOptions = {} ) : CollectionTransaction | void {\n const elements = toElements( this, a_elements, options );\n\n if( this.models.length ){\n return options.remove === false ?\n addTransaction( this, elements, options, true ) :\n setTransaction( this, elements, options );\n }\n else{\n return emptySetTransaction( this, elements, options );\n }\n }\n\n /** @internal */\n static _metatype = AggregatedType;\n\n /***********************************\n * Collection manipulation methods\n */\n\n sort( options : TransactionOptions = {} ) : this {\n if( sortElements( this, options ) ){\n const isRoot = begin( this );\n \n if( markAsDirty( this, options ) ){\n trigger2( this, 'sort', this, options );\n }\n\n isRoot && commit( this );\n }\n\n return this;\n }\n\n // Remove and return given model.\n unset( modelOrId : R | string, options? ) : R {\n const value = this.get( modelOrId );\n this.remove( modelOrId, { unset : true, ...options } );\n return value;\n }\n\n modelId( attrs : {} ) : any {\n return attrs[ this.model.prototype.idAttribute ];\n }\n\n // Toggle model in collection.\n toggle( model : R, a_next? : boolean ) : boolean {\n var prev = Boolean( this.get( model ) ),\n next = a_next === void 0 ? !prev : Boolean( a_next );\n\n if( prev !== next ){\n if( prev ){\n this.remove( model );\n }\n else{\n this.add( model );\n }\n }\n\n return next;\n }\n\n /** @internal */\n _log( level : LogLevel, topic : string, text : string, value : object, a_logger? : Logger ) : void {\n ( a_logger || logger ).trigger( level, topic, `${ this.model.prototype.getClassName() }.${ this.getClassName() }: ` + text, {\n Argument : value,\n 'Attributes spec' : this.model.prototype._attributes\n });\n }\n\n getClassName() : string {\n return super.getClassName() || 'Collection';\n }\n\n /***********************************\n * Proxied Array methods\n */\n\n get length() : number { return this.models.length; }\n\n // Add a model to the end of the collection.\n push(model : ElementsArg, options? : CollectionOptions ) {\n return this.add(model, { at: this.length, ...options });\n }\n\n // Remove a model from the end of the collection.\n pop( options? : CollectionOptions ) : R {\n var model = this.at(this.length - 1);\n this.remove(model, { unset : true, ...options });\n return model;\n }\n\n // Add a model to the beginning of the collection.\n unshift(model : ElementsArg, options? : CollectionOptions ) {\n return this.add(model, { at: 0, ...options });\n }\n \n // Remove a model from the beginning of the collection.\n shift( options? : CollectionOptions ) : R {\n const model = this.at(0);\n this.remove( model, { unset : true, ...options } );\n return model;\n }\n}\n\n\nexport interface Collection extends ArrayMixin{}\n\nexport type LiveUpdatesOption = boolean | ( ( x : any ) => boolean );\n\nexport type ElementsArg = Partial | Partial[]\n\n// TODO: make is safe for parse to return null (?)\nfunction toElements( collection : Collection, elements : ElementsArg, options : CollectionOptions ) : Elements {\n const parsed = options.parse ? collection.parse( elements, options ) : elements; \n return Array.isArray( parsed ) ? parsed : [ parsed ];\n}\n\nModel.Collection = Collection;\n\nclass LinkedIncludes extends Linked {\n constructor(\n private collection,\n private model : Model ){\n super( collection.get( model ) )\n }\n\n set( x : boolean ) : void {\n this.collection.toggle( this.model );\n }\n}\n","import { Collection } from '../collection';\nimport { Model } from '../model';\nimport { CompiledReference } from '../traversable';\n\nexport type CollectionReference = ( () => Collection ) | Collection | string; \n\n/** @private */\nexport function parseReference( collectionRef : CollectionReference ) : ( root : Model ) => Collection {\n switch( typeof collectionRef ){\n case 'function' :\n return root => (collectionRef).call( root );\n case 'object' :\n return () => collectionRef;\n case 'string' :\n const { resolve } = new CompiledReference( collectionRef );\n return resolve;\n }\n}","import { AnyType, ChainableAttributeSpec, Model } from '../model';\nimport { CollectionReference, parseReference } from './commons';\n\n\n/********\n * Reference to model by id.\n * \n * Untyped attribute. Holds model id, when unresolved. When resolved, is substituted\n * with a real model.\n * \n * No model changes are detected and counted as owner's change. That's intentional.\n */\n\n/** @private */\ntype ModelRefValue = Model | string;\n\n/** @private */\nclass ModelRefType extends AnyType {\n // It is always serialized as an id, whenever it's resolved or not. \n toJSON( value : ModelRefValue ){\n return value && typeof value === 'object' ? value.id : value;\n }\n\n // Wne \n clone( value : ModelRefValue ){\n return value && typeof value === 'object' ? value.id : value;\n }\n\n // Model refs by id are equal when their ids are equal.\n isChanged( a : ModelRefValue, b : ModelRefValue){\n var aId = a && ( (a).id == null ? a : (a).id ),\n bId = b && ( (b).id == null ? b : (b).id );\n\n return aId !== bId;\n }\n\n // Refs are always valid.\n validate( model, value, name ){}\n}\n\nfunction theMemberOf( this : void, masterCollection : CollectionReference, T? : R ) : ChainableAttributeSpec {\n const getMasterCollection = parseReference( masterCollection );\n\n const typeSpec = new ChainableAttributeSpec({\n value : null,\n _metatype : ModelRefType\n });\n \n return typeSpec\n .get( function( objOrId : ModelRefValue, name : string ) : Model {\n if( typeof objOrId === 'object' ) return objOrId;\n\n // So, we're dealing with an id reference. Resolve it.\n const collection = getMasterCollection( this );\n let record : Model = null;\n\n // If master collection exists and is not empty...\n if( collection && collection.length ){\n // Silently update attribute with record from this collection.\n record = collection.get( objOrId ) || null;\n this.attributes[ name ] = record;\n\n // Subscribe for events manually. delegateEvents won't be invoked.\n record && this._attributes[ name ].handleChange( record, null, this, {} );\n }\n\n return record;\n });\n}\n\nexport { theMemberOf as memberOf }\n\ndeclare module '../model' {\n namespace Model {\n export const memberOf : ( this : R, masterCollection : CollectionReference ) => ChainableAttributeSpec;\n }\n}\n\n( Model as any ).memberOf = theMemberOf;","import { Collection, CollectionConstructor, ElementsArg, CollectionOptions } from '../collection';\nimport { define, tools } from '@type-r/mixture';\nimport { AggregatedType, ChainableAttributeSpec, Model, type } from '../model';\nimport { ItemsBehavior, transactionApi } from '../transactions';\nimport { CollectionReference, parseReference } from './commons';\n\n\ntype ModelsIds = ( string | number )[];\n\n// TODO: Change the last parameter to be the Model constructor. Extract the proper Collection type.\nexport function subsetOf, R extends Model>( this : void, masterCollection : CollectionReference, T? : X ) : ChainableAttributeSpec>{\n const CollectionClass = T || Collection,\n // Lazily define class for subset collection, if it's not defined already...\n SubsetOf = CollectionClass._SubsetOf || ( CollectionClass._SubsetOf = defineSubsetCollection( CollectionClass as any ) as any ),\n getMasterCollection = parseReference( masterCollection );\n\n return type( SubsetOf ).get(\n function( refs ){\n !refs || refs.resolvedWith || refs.resolve( getMasterCollection( this ) );\n return refs;\n }\n );\n}\n\n\ntype subsetOfType = typeof subsetOf;\n\ndeclare module \"../collection\" {\n namespace Collection {\n export const subsetOf : subsetOfType;\n } \n}\n\n( Collection as any ).subsetOf = subsetOf;\n\n\nCollection.prototype.createSubset = function( this : Collection, models : any, options ) : SubsetCollection {\n const SubsetOf = subsetOf( this, this.constructor as any ).options.type,\n subset = new SubsetOf( models, options );\n \n subset.resolve( this );\n return subset as any;\n}\n\nconst subsetOfBehavior = ItemsBehavior.share | ItemsBehavior.persistent;\n\nfunction defineSubsetCollection( CollectionClass : typeof Collection ) {\n @define class SubsetOfCollection extends CollectionClass {\n refs : any[];\n resolvedWith : Collection = null;\n\n _metatype : AggregatedType\n\n get __inner_state__(){ return this.refs || this.models; }\n\n constructor( recordsOrIds?, options? ){\n super( [], options, subsetOfBehavior );\n this.refs = toArray( recordsOrIds );\n }\n\n // Remove should work fine as it already accepts ids. Add won't...\n add( a_elements, options = {} ){\n const { resolvedWith } = this,\n toAdd = toArray( a_elements );\n \n if( resolvedWith ){\n // If the collection is resolved already, everything is simple.\n return super.add( resolveRefs( resolvedWith, toAdd ), options );\n }\n else{\n // Collection is not resolved yet. So, we prepare the delayed computation.\n if( toAdd.length ){\n const isRoot = transactionApi.begin( this );\n\n // Save elements to resolve in future...\n this.refs = this.refs ? this.refs.concat( toAdd ) : toAdd.slice();\n\n transactionApi.markAsDirty( this, options );\n\n // And throw the 'changes' event.\n isRoot && transactionApi.commit( this );\n }\n }\n }\n\n reset( a_elements?, options = {} ){\n const { resolvedWith } = this,\n elements = toArray( a_elements );\n \n return resolvedWith ?\n // Collection is resolved, so parse ids and forward the call to set.\n super.reset( resolveRefs( resolvedWith, elements ), options ) :\n // Collection is not resolved yet. So, we prepare the delayed computation.\n delaySet( this, elements, options ) as any || [];\n }\n\n _createTransaction( a_elements, options? ){\n const { resolvedWith } = this,\n elements = toArray( a_elements );\n \n return resolvedWith ?\n // Collection is resolved, so parse ids and forward the call to set.\n super._createTransaction( resolveRefs( resolvedWith, elements ), options ) :\n // Collection is not resolved yet. So, we prepare the delayed computation.\n delaySet( this, elements, options );\n }\n\n // Serialized as an array of model ids.\n toJSON() : ModelsIds {\n return this.refs ?\n this.refs.map( objOrId => objOrId.id || objOrId ) :\n this.models.map( model => model.id );\n }\n\n // Subset is always valid.\n _validateNested(){ return 0; }\n\n get length() : number {\n return this.models.length || ( this.refs ? this.refs.length : 0 );\n }\n\n // Must be shallow copied on clone.\n clone( owner? ){\n var Ctor = (this).constructor,\n copy = new Ctor( [], {\n model : this.model,\n comparator : this.comparator\n });\n\n if( this.resolvedWith ){\n // TODO: bug here. \n copy.resolvedWith = this.resolvedWith;\n copy.refs = null;\n copy.reset( this.models, { silent : true } );\n }\n else{\n copy.refs = this.refs.slice();\n }\n\n return copy;\n }\n\n // Clean up the custom parse method possibly defined in the base class.\n parse( raw : any ) : Model[] {\n return raw;\n }\n\n resolve( collection : Collection ) : this {\n if( collection && collection.length ){\n this.resolvedWith = collection;\n\n if( this.refs ){\n this.reset( this.refs, { silent : true } );\n this.refs = null;\n }\n }\n\n return this;\n }\n\n getModelIds() : ModelsIds { return this.toJSON(); }\n\n toggle( modelOrId : any, val : boolean ) : boolean {\n return super.toggle( this.resolvedWith.get( modelOrId ), val );\n }\n\n addAll() : Model[] {\n if( this.resolvedWith ){\n this.set( this.resolvedWith.models );\n return this.models;\n }\n\n throw new Error( \"Cannot add elemens because the subset collection is not resolved yet.\" );\n }\n\n toggleAll() : Model[] {\n return this.length ? this.reset() : this.addAll();\n }\n }\n\n // Clean up all custom item events to prevent memory leaks.\n SubsetOfCollection.prototype._itemEvents = void 0;\n\n return SubsetOfCollection;\n}\n\nexport interface SubsetCollection extends Collection{\n getModelIds() : string[]\n addAll() : M[]\n toggleAll() : M[]\n resolve( baseCollection : Collection ) : this\n}\n\nexport interface SubsetCollectionConstructor {\n new ( records? : ElementsArg | string[], options?: CollectionOptions ) : SubsetCollection\n prototype : SubsetCollection\n};\n\nfunction resolveRefs( master, elements ){\n const records = [];\n \n for( let el of elements ){\n const record = master.get( el );\n if( record ) records.push( record );\n }\n\n return records;\n}\n\nfunction delaySet( collection, elements, options ) : void {\n if( tools.notEqual( collection.refs, elements ) ){\n const isRoot = transactionApi.begin( collection );\n\n // Save elements to resolve in future...\n collection.refs = elements.slice();\n\n transactionApi.markAsDirty( collection, options );\n \n // And throw the 'changes' event.\n isRoot && transactionApi.commit( collection );\n }\n}\n\nfunction toArray( elements ){\n return elements ? ( \n Array.isArray( elements ) ? elements : [ elements ]\n ) : [];\n}","import { Model } from '../model';\nimport { Transactional } from '../transactions';\n\nlet _store : Store = null;\n\nexport class Store extends Model {\n getStore() : Store { return this; }\n \n // delegate item lookup to owner, and to the global store if undefined\n get( name : string ) : any {\n // Lookup for resource in the current store. \n let local = this[ name ];\n\n // If something is found or it's the global store, return result.\n if( local || this === this._defaultStore ) return local;\n\n // Forward failed lookup to owner or global store.\n return this._owner ? this._owner.get( name ) : this._defaultStore.get( name ); \n }\n\n static get global(){ return _store; }\n static set global( store : Store ){\n if( _store ){\n _store.dispose();\n }\n\n Transactional.prototype._defaultStore = _store = store;\n }\n}\n\nStore.global = new Store();","// Dummy polyfill to prevent exception in IE.\nif( typeof Symbol === 'undefined' ){\n Object.defineProperty( window, 'Symbol', { value : { iterator : 'Symbol.iterator' }, configurable : true });\n}\n\nimport { Events, Mixable as Class, log } from '@type-r/mixture';\nimport { CollectionConstructor } from './collection';\n// Define synonims for NestedTypes backward compatibility.\nimport { attributes, ChainableAttributeSpec, Model, type as _type, value } from './model';\nimport { AnonymousModelConstructor } from './model/define'\nimport { isEmpty } from '@type-r/mixture/lib/tools';\n\n/**\n * Export everything \n */\nexport { Linked } from '@linked/value';\nexport * from '@type-r/mixture';\nexport * from './collection';\nexport * from './io-tools';\nexport * from './model';\nexport * from './relations';\nexport * from './transactions';\nexport { Model as Record, Class };\n\n\nexport const { on, off, trigger, once, listenTo, stopListening, listenToOnce } = Events;\n\n/** Wrap model or collection method in transaction. */\nexport function transaction< F extends Function >( method : F ) : F {\n return function( ...args ){\n let result;\n \n this.transaction( () => {\n result = method.apply( this, args );\n });\n \n return result;\n }\n}\n\nexport function type Model>( t : T[] ) : ChainableAttributeSpec>>;\nexport function type( t : T[] ) : ChainableAttributeSpec>>>;\nexport function type( t : T | ChainableAttributeSpec ) : ChainableAttributeSpec;\nexport function type( t : T ) : ChainableAttributeSpec>;\nexport function type( t : T ){\n return Array.isArray( t ) ?\n _type( _toModel( t[ 0 ] ).Collection ) :\n _type( _toModel( t ) );\n}\n\nconst _toModel = t =>\n t != null && Object.getPrototypeOf( t ) === Object.prototype ?\n attributes( t ) :\n t;\n\nChainableAttributeSpec.from = ( spec : any ) : ChainableAttributeSpec => {\n // Pass metatype through untouched...\n if( spec && spec instanceof ChainableAttributeSpec ) {\n return spec;\n }\n\n if( typeof spec === 'function' ) return type( spec );\n\n if( Array.isArray( spec ) ){\n if( spec.length !== 1 ||\n !spec[ 0 ] || (\n typeof spec[ 0 ] !== 'function' &&\n Object.getPrototypeOf( spec[ 0 ] ) !== Object.prototype\n )\n ) {\n log( 'error', 'Type-R:WrongDeclaration', `Since v4.1, [ ModelType ] and [{ attr1, attr2, }] declares collection of models. Use Array or value([ 1, 2, ... ]) to declare plain array attributes.` );\n return value( spec );\n }\n\n return type( spec );\n }\n\n if( spec && typeof spec === 'object' ){\n if( Object.getPrototypeOf( spec ) !== Object.prototype ){\n log( 'error', 'Type-R:WrongDeclaration', `Since v4.1, non-primitive values must be wrapped in value(...). All objects are treated as attribute specs and define nested models.` );\n return value( spec )\n }\n\n if( isEmpty( spec ) ){\n log( 'error', 'Type-R:WrongDeclaration', `Since v4.1, objects are treated as attribute specs and define nested models. Use Object or value({...}) for an object attribute type.` );\n return value( spec )\n }\n\n return type( spec )\n }\n\n return value( spec );\n}\n "],"names":["defaults","dest","source","name","hasOwnProperty","arguments","length","i","other","isValidJSON","value","proto","Object","getPrototypeOf","prototype","Array","every","getBaseClass","Class","constructor","isEmpty","obj","key","some","fun","ArrayProto","arr","result","someArray","someObject","predicate","x","omit","discard","transform","assign","once","func","memo","first","apply","this","DateProto","Date","ObjectProto","notEqual","a","b","protoA","arraysNotEqual","keysA","keys","objectsNotEqual","HashProto","create","hashMap","hash","compare","av","valueOf","bv","definition","_i","names","names_1","_a","name_1","prop","desc","getOwnPropertyDescriptor","o","EventMap","map","handlers","concat","addEvent","split","eventSplitter","getBubblingHandler","callback","name_2","push","EventDescriptor","target","event_1","on","event_2","off","slice","addEventsMap","handler","_bubblingHandlers","event","c","d","e","trigger5","trigger3","trigger2","context","next","listOff","_events","filteredHead","prev","head","ev","_callback","listSend3","call","EventHandler","once_1","_once","name_3","strings","api","events","test","self","queue","all","listSend2","listSend4","listSend5","f","listSend6","extendStatics","setPrototypeOf","__proto__","p","__extends","__","__assign","t","s","n","__rest","indexOf","getOwnPropertySymbols","propertyIsEnumerable","__decorate","decorators","r","Reflect","decorate","defineProperty","Mixable","protoProps","staticProps","BaseClass","mixins","defineMixin","merge","mergeObject","getStaticDefinitions","onDefine","definitions","mergeInheritedMembers","spec","statics","TheSubclass","__extends_1","predefine","define","Constructor","__super__","MixinsState","get","populate","onExtend","ClassOrDefinition","Ctor","rules","definitionRules","definitionDecorator","definitionKey","rule","appliedMixins","mixins_1","mixin","isArray","sourceMixins","mergeRules","ctors","ctors_1","unshift","object","ignore","dontMix","getOwnPropertyNames","forEachOwnProp","sourceProp","_this","assignProperty","mixinRules","protoValue","baseProto","resolveRule","function","caller","list","destProp","configurable","pipe","classFirst","classLast","_eventsApi.strings","_eventsApi.on","_eventsApi.off","_eventsApi.once","_eventsApi.trigger5","_eventsApi.trigger2","_eventsApi.trigger3","_idCount","uniqueId","Messenger","localEvents","_localEvents","properties","eventsMap","defineProperties","toPropertyDescriptor","addReference","a_source","_listeningTo","removeAll","second","cid","_disposed","stopListening","initialize","Events","listener","isProduction","process","env","NODE_ENV","logEvents","Logger","level","filter","topic","msg","props","args","toString","console","Error","counter","_super","window","something","__inner_state__","body","join","JSON","stringify","logger","logEvents_1","logToConsole","throwingLogger","throwOn","log","trigger","bind","createIOPromise","resolve","reject","onAbort","abort","fn","promise","Promise","a_resolve","a_reject","startIO","options","thenDo","abortIO","_ioPromise","then","resp","triggerAndBubble","catch","err","eventSource","collection","referenceMask","reference","splitTail","path","match","substr","tail","pop","local","Function","shift","resolveReference","root","action","skip","getStore","getOwner","ValidationError","iteratee","error","nested","each","eachError","_validateNested","validate","helpers","arrayHelpers","objectHelpers","dummyHelpers","Linked","clone","link","remove","iterator","mapped","element","at","array","splice","j","y","set","ClonedValueLink","checked","onChange","Boolean","update","truthyValue","EqualsValueLink","undefined","defaultValue","EnabledValueLink","ContainsRef","_","PropValueLink","links","_value$","whenValid","defaultError","CustomValueLink","state","unwrap","sourceKey","trim","sourceVal","tslib_1.__extends","parent","nextValue","el","removeAt","field","values","ItemsBehavior","eventsApi.trigger3","eventsApi.on","eventsApi.off","Transactional","endpoint","_endpoint","Transactional_1","_owner","_ownerKey","_changeEventName","listenTo","isRoot","transactionApi","begin","commit","transaction","_changeToken","json","strict","validationError","eachValidationError","getClassName","data","_defaultStore","getOwnerEndpoint","_endpoints","_validationError","getValidationError","cidPrefix","_transaction","markAsDirty","dirty","silent","_isDirty","initiator","originalOptions","_onChildrenChange","aquire","owner","child","ReferenceError","free","_begin","_markAsDirty","setAttribute","record","_attributes","doUpdate","attributes","_previousAttributes","AttributesCopy","_changedAttributes","UpdateModelMixin","attribute","propagateChanges","forceAttributeChange","_createTransaction","a_values","unknown","changes","parse","shouldBeAnObject","unknownAttrsWarning","ModelTransaction","nested_1","_log","nested_2","changes_1","_b","tools.notEqual","emptyOptions","AnyType","model","handleChange","toJSON","type","getHook","v","isChanged","code","text","New value","Prev. value","a_options","getHooks","transforms","changeHandlers","changeEvents","hasCustomDefault","tools.isValidJSON","isRequired","wrapIsRequired","convert","getHook_1","reduce","chainGetHooks","validate_1","chainTransforms","chainChangeHandlers","doInit","prevHook","nextHook","prevTransform","nextTransform","prevHandler","nextHandler","ImmutableClassType","PrimitiveType","NumericType","num","isFinite","ArrayType","ObjectType","doNothing","FunctionType","DateType","date","timestamp","getTime","toISOString","supportsDate","isNaN","struct","minutesOffset","isoDatePattern","exec","k","numericKeys","UTC","safeParseDate","AggregatedType","canBeUpdated","nestedTransaction","_shared","persistent","_handleChange","unset","dispose","shareAndListen","listen","share","SharedType","implicitObject","_onChange","builtins","String","Number","metatypes","getMetatype","_metatype","idx","resolveBuiltins","tools.assign","ChainableAttributeSpec","check","metadata","required","ref","emptyFunction","changed","eventMap","unsubscribe","subscribe","cloned","Type","attrDef","shared","inferType","Symbol","LinkedAttr","attr","_token","createAttribute","from","createAttributesMixin","attributesDefinition","baseClassAttributes","myAttributes","_.transform","allAttributes","_.defaults","ConstructorsMixin","attrDefs","attrs","Attributes","constructorsMixin","_attributesArray","createPropertyDescriptor","attrSpecs","eventsApi.EventMap","createWatcherFromRef","wrapWatcher","localEventsMixin","watcher","CompiledReference","_error","IOModelMixin","save","getEndpoint","ioMethod","isNew","id","fetch","read","destroy","tools.isEmpty","_cidCounter","Model","asc","tools.compare","idAttribute","extend","_attributes$","__Attributes$","diff","hasChanged","val","old","nullify","forEach","_attributesArray_1","copy","pinStore","errors","asJson","l","newModel","clear","a_logger","Attributes definition","a_fun","tools.transform","ModelEntriesIterator","Collection","typeCheck","BaseModelAttributes","BaseModelAttributesCopy","IdAttribute","metatype","done","tools.defaults","models","last","md","_c","coll","parseAnonimousModelDefinition","First","toMix","AnonimousModel","DefaultCollection","getAttributes","dynamicMixin","AttributeRefs","__ModelAttrRef","isMutableType","addAttributeLinks","eventsApi.trigger2","_aquire","_free","convertAndAquire","_aggregationError","_itemEvents","sortElements","_comparator","sort","addIndex","index","removeIndex","updateIndex","previous","CollectionTransaction","logAggregationError","added","removed","added_1","_d","removed_1","_e","sorted","addTransaction","items","a_items","forceMerge","_byId","prevLength","a_items_1","item","appendElements","needSort","length_1","moveElements","sortOrMoveElements","ArrayMixin","mapFilter","res","doWhile","init","end","modelOrId","idOrObj","toPredicateFunction","m","firstMatch","find","entries","a_index","a_reducer","reducer","defaultGrouping","results","acc","noOp","keys_1","keys_2","removeMany","toRemove","_removeFromIndex","_reallocate","silentOptions","emptySetTransaction","len","src","_reallocateEmpty","setTransaction","_prevById","prevModels","toAdd","orderKept","reusedCount","previous_1","_garbageCollect","children","children_1","freeAll","addedOrChanged","_count","CollectionRefsType","Refs","RefsCollection","_SubsetOf","Collection_1","Subset","itemEvents","comparator","aa","bb","_store","objOrId","count","elements","add","reset","enabled","_subscribeLiveUpdates","_liveUpdates","liveUpdates","updated","subscription","aggregated","a_elements","previousModels","toElements","previousModels_1","toDispose","recordsOrIds","notify","removeOne","LinkedIncludes","a_next","Argument","Attributes spec","records","parsed","toggle","parseReference","collectionRef","ModelRefType","theMemberOf","masterCollection","T","getMasterCollection","subsetOf","CollectionClass","SubsetOf","subsetOfBehavior","refs","toArray","SubsetOfCollection","resolvedWith","resolveRefs","delaySet","raw","addAll","defineSubsetCollection","memberOf","createSubset","subset","master","elements_1","Store","store","global","listenToOnce","_type","_toModel","attrName","getMetadata","value_1","as","listName","method"],"mappings":"4MAEgBA,EAAeC,EAAUC,GACrC,IAAK,IAAIC,KAAQD,EACTA,EAAOE,eAAgBD,KAAWF,EAAKG,eAAgBD,KACvDF,EAAME,GAASD,EAAQC,IAI/B,GAAuB,EAAnBE,UAAUC,OACV,IAAK,IAAIC,EAAI,EAAGA,EAAIF,UAAUC,OAAQC,IAAK,CACvC,IAAMC,EAAQH,UAAWE,GACzBC,GAASR,EAAUC,EAAMO,GAIjC,OAAOP,WAIKQ,EAAaC,GACzB,GAAc,OAAVA,EACA,OAAO,EAGX,cAAeA,GACf,IAAK,SACL,IAAK,SACL,IAAK,UACD,OAAO,EAEX,IAAK,SACD,IAAIC,EAAQC,OAAOC,eAAgBH,GAEnC,GAAIC,IAAUC,OAAOE,WAAaH,IAAUI,MAAMD,UAC9C,OAAOE,EAAON,EAAOD,GAI7B,OAAO,WAOKQ,EAAcC,GAC1B,OAAON,OAAOC,eAAgBK,EAAMJ,WAAYK,qBAWpCC,EAASC,GACrB,GAAIA,EACA,IAAK,IAAIC,KAAOD,EACZ,GAAIA,EAAIjB,eAAgBkB,GACpB,OAAO,EAKnB,OAAO,WA4BKC,EAAMF,EAAKG,GACvB,OAAIZ,OAAOC,eAAgBQ,KAAUI,EAxBzC,SAAoBC,EAAaF,GAG7B,IAFA,IAAIG,EAEKpB,EAAI,EAAGA,EAAImB,EAAIpB,OAAQC,IAC5B,GAAIoB,EAASH,EAAKE,EAAKnB,GAAKA,GACxB,OAAOoB,EAoBJC,CAAWP,EAAKG,GAf/B,SAAqBH,EAAUG,GAC3B,IAAIG,EAEJ,IAAK,IAAIL,KAAOD,EACZ,GAAIA,EAAIjB,eAAgBkB,KAChBK,EAASH,EAAKH,EAAKC,GAAOA,IAC1B,OAAOK,EAYRE,CAAYR,EAAKG,YAKhBR,EAAOK,EAAWS,GAC9B,OAAQP,EAAMF,EAAK,SAAAU,GAAK,OAACD,EAAWC,cAgBxBC,EAAM9B,GAGlB,IAFA,IAAMD,EAAO,GAAIgC,EAAU,GAElB1B,EAAI,EAAGA,EAAIF,UAAUC,OAAQC,IAClC0B,EAAS5B,UAAWE,KAAQ,EAGhC,IAAK,IAAIJ,KAAQD,GACR+B,EAAQ7B,eAAgBD,IAAUD,EAAOE,eAAgBD,KAC1DF,EAAME,GAASD,EAAQC,IAI/B,OAAOF,WAMKiC,EAAmBjC,EAAiCC,EAAmCsB,GACnG,IAAK,IAAIrB,KAAQD,EACb,GAAIA,EAAOE,eAAgBD,GAAS,CAChC,IAAIO,EAAQc,EAAKtB,EAAQC,GAAQA,QACvB,IAAVO,IAAsBT,EAAME,GAAcO,GAIlD,OAAOT,WAuBKkC,EAAalC,EAAUC,GACnC,IAAK,IAAIC,KAAQD,EACTA,EAAOE,eAAgBD,KACvBF,EAAME,GAASD,EAAQC,IAI/B,GAAuB,EAAnBE,UAAUC,OACV,IAAK,IAAIC,EAAI,EAAGA,EAAIF,UAAUC,OAAQC,IAAK,CACvC,IAAMC,EAAQH,UAAWE,GACzBC,GAAS2B,EAAQlC,EAAMO,GAI/B,OAAOP,WASKmC,EAAMC,GAClB,IAAIC,EAAMC,GAAQ,EAClB,OAAO,WAMH,OALKA,IACDA,GAAQ,EACRD,EAAOD,EAAKG,MAAMC,KAAMpC,WACxBgC,EAAO,MAEJC,GAIf,IAAMb,EAAaV,MAAMD,UACnB4B,EAAYC,KAAK7B,UACjB8B,EAAchC,OAAOE,mBAOX+B,EAAUC,EAASC,GAC/B,GAAID,IAAMC,EAAI,OAAO,EAErB,GAAID,GAAKC,GAAiB,iBAALD,GAA6B,iBAALC,EAAgB,CACzD,IAAMC,EAASpC,OAAOC,eAAgBiC,GAEtC,GAAIE,IAAWpC,OAAOC,eAAgBkC,GAAM,OAAO,EAEnD,OAAQC,GACJ,KAAKN,EAAc,OAAQI,IAAOC,EAClC,KAAKtB,EAAc,OA0B/B,SAAyBqB,EAAGC,GACxB,GAAID,EAAExC,SAAWyC,EAAEzC,OAAS,OAAO,EAEnC,IAAK,IAAIC,EAAI,EAAGA,EAAIuC,EAAExC,OAAQC,IAC1B,GAAIsC,EAAUC,EAAGvC,GAAKwC,EAAGxC,IAAQ,OAAO,EAG5C,OAAO,EAjC2B0C,CAAgBH,EAAGC,GAC7C,KAAKH,EACL,KAAK,KACD,OAOhB,SAA0BE,EAAGC,GACzB,IAAMG,EAAQtC,OAAOuC,KAAML,GAE3B,GAAII,EAAM5C,SAAWM,OAAOuC,KAAMJ,GAAIzC,OAAS,OAAO,EAEtD,IAAK,IAAIC,EAAI,EAAGA,EAAI2C,EAAM5C,OAAQC,IAAM,CACpC,IAAMe,EAAM4B,EAAO3C,GAEnB,IAAKwC,EAAE3C,eAAgBkB,IAASuB,EAAUC,EAAGxB,GAAOyB,EAAGzB,IACnD,OAAO,EAIf,OAAO,EApBY8B,CAAiBN,EAAGC,IAIvC,OAAO,EAiCX,IAAMM,EAAYzC,OAAO0C,OAAQ,eAGjBC,EAASlC,GACrB,IAAMmC,EAAO5C,OAAO0C,OAAQD,GAC5B,OAAOhC,EAAMc,EAAQqB,EAAMnC,GAAQmC,WAGvBC,EAASX,EAASC,GAE9B,GAAID,GAAKC,EAAI,OAAO,EAGpB,GAAS,MAALD,EAAY,OAAQ,EACxB,GAAS,MAALC,EAAY,OAAO,EAGvB,IAAMW,EAAKZ,EAAEa,UACTC,EAAKb,EAAEY,UAEX,OAAQD,EAAKE,GAAM,EACNA,EAALF,EAAU,EACV,EArBZL,EAAUjD,eAAiBwC,EAAYxC,wGAzNmBc,EAAO2C,OAAgB,aAAAC,mBAAAA,IAAAC,oBAC7E,IAAiB,QAAAC,IAAAC,WAAAA,IAAO,CAAnB,IAAIC,OACCxD,EAAQmD,EAAYK,QAChB,IAAVxD,IAAsBQ,EAAMJ,UAAWoD,GAASxD,6DAyDjBW,EAAU8C,GAG7C,IAFA,IAAIC,EAEKzD,EAAQU,GAAM+C,GAAQzD,EAAOA,EAAQC,OAAOC,eAAgBF,GACjEyD,EAAOxD,OAAOyD,yBAA0B1D,EAAOwD,GAGnD,OAAOC,0CAmCsBnE,EAAUC,GACvC,IAAK,IAAIC,KAAQD,EACbD,EAAME,GAASD,EAAQC,GAG3B,OAAOF,yBAGwBA,EAAUC,GACzC,IAAK,IAAIC,KAAQD,OACQ,IAAjBD,EAAME,KACNF,EAAME,GAASD,EAAQC,IAI/B,OAAOF,0BAuBWqE,GAClB,OAAOA,EAAI1D,OAAOuC,KAAMmB,GAAM,+CCjK9BC,kBAAA,SAAOC,GACH/B,KAAKgC,SAAWhC,KAAKgC,SAASC,OAAQF,EAAIC,WAG9CF,yBAAA,SAAcC,GACV,IAAK,IAAIT,KAASS,EACd/B,KAAKkC,SAAUZ,EAAOS,EAAKT,KAInCQ,yBAAA,SAAcR,GACV,IAAiB,QAAAE,EAAAF,EAAMa,MAAOC,GAAbf,WAAAA,IAA8B,CAA1C,IAAII,OACLzB,KAAKkC,SAAUT,EAAMY,EAAoBZ,MAIjDK,qBAAA,SAAUR,EAAgBgB,GAGtB,IAFQ,IAAAN,EAAahC,kBAEJwB,EAAAF,EAAMa,MAAOC,GAAbf,WAAAA,IAA8B,CAA1C,IAAIkB,OACLP,EAASQ,KAAM,IAAIC,EAAiBF,EAAMD,MAIlDR,sBAAA,SAAWY,EAAajF,GACpB,IAAkB,QAAA+D,EAAAxB,KAAKgC,SAALX,WAAAA,IAAe,CAA5B,IAAIsB,OACLC,EAAInF,EAAQkF,EAAMjF,KAAMiF,EAAML,SAAUI,KAIhDZ,wBAAA,SAAaY,EAAajF,GACtB,IAAkB,QAAA+D,EAAAxB,KAAKgC,SAALX,WAAAA,IAAe,CAA5B,IAAIwB,OACLC,EAAKrF,EAAQoF,EAAMnF,KAAMmF,EAAMP,SAAUI,QA3CjD,WAAaX,GAFb/B,cAA+B,GAGvB+B,IACIA,aAAeD,EACf9B,KAAKgC,SAAWD,EAAIC,SAASe,QAG7BhB,GAAO/B,KAAKgD,aAAcjB,IA0C1C,MAGI,SACWrE,EACP4E,GADOtC,UAAAtC,EAIHsC,KAAKsC,UADQ,IAAbA,EACgBD,EAAoB3E,GAEX,iBAAb4E,EAER,WACI,IAAMW,EAAUjD,KAAMsC,GACtBW,GAAWA,EAAQlD,MAAOC,KAAMpC,YAId0E,GAKhCY,EAAoB,GAE1B,SAASb,EAAoBc,GACzB,OAAOD,EAAmBC,KACtBD,EAAmBC,GAAU,SAAU9C,EAAIC,EAAI8C,EAAIC,EAAIC,QACzC,IAAND,QAAsB,IAANC,GAAeC,EAAUvD,KAAMmD,EAAO9C,EAAGC,EAAG8C,EAAGC,EAAGC,QAC5D,IAANF,EAAeI,EAAUxD,KAAMmD,EAAO9C,EAAGC,EAAG8C,GAC3CK,EAAUzD,KAAMmD,EAAO9C,EAAGC,KAS3C,MACI,SAAoBgC,EAA4BoB,EAAsBC,gBAAAA,QAAlD3D,cAAAsC,EAA4BtC,aAAA0D,EAAsB1D,UAAA2D,GAG1E,SAASC,EAASC,EAA2BnG,EAAe4E,EAAqBoB,GAK7E,IAJA,IAEII,EAAcC,EAFZC,EAAOH,EAASnG,GAIbuG,EAAKD,EAAMC,EAAIA,EAAKA,EAAGN,KAEtBrB,GAAYA,IAAa2B,EAAG3B,UAAYA,IAAa2B,EAAG3B,SAAS4B,WACjER,GAAWA,IAAYO,EAAGP,SAE5BK,EAAOE,EACWH,EAAlBA,GAAiCG,GAI7BF,IAAOA,EAAKJ,KAAOM,EAAGN,MAI9BK,IAASF,IAAeD,EAASnG,GAASoG,GAOlD,SAASK,EAAWH,EAAqB3D,EAAGC,EAAG8C,GAC3C,IAAK,IAAIa,EAAKD,EAAMC,EAAIA,EAAKA,EAAGN,KAAOM,EAAG3B,SAAS8B,KAAMH,EAAGP,QAASrD,EAAGC,EAAG8C,YAmB/DR,EAAInF,EAAsBC,EAAe4E,EAAqBoB,GAC1E,GAAIpB,EAAU,CACV,IAAMuB,EAAUpG,EAAOoG,UAAapG,EAAOoG,QAAU1F,OAAO0C,OAAQ,OACpEgD,EAASnG,GAAS,IAAI2G,EAAc/B,EAAUoB,EAASG,EAASnG,cAIxDiC,EAAMlC,EAAsBC,EAAe4E,EAAqBoB,GAC5E,GAAIpB,EAAU,CACV,IAAMgC,EAAkBC,EAAO,WAC3BzB,EAAKrF,EAAQC,EAAM4G,GACnBhC,EAASvC,MAAMC,KAAMpC,aAGzB0G,EAAKJ,UAAY5B,EACjBM,EAAInF,EAAQC,EAAM4G,EAAMZ,aAIhBZ,EAAKrF,EAAsBC,EAAgB4E,EAAsBoB,GACrE,IAAAG,EAAYpG,UACpB,GAAIoG,EACA,GAAIvB,GAAYoB,EACZ,GAAIhG,EACAkG,EAASC,EAASnG,EAAM4E,EAAUoB,QAGlC,IAAK,IAAIc,KAAQX,EACbD,EAASC,EAASW,EAAMlC,EAAUoB,QAIrChG,EACLmG,EAASnG,QAAS,EAGlBD,EAAOoG,aAAU,EAU7B,IAAMzB,EAAgB,eAENqC,EAASC,EAAgBjH,EAAsBkH,EAAiBrC,EAAqBoB,GACjG,GAAItB,EAAcwC,KAAMD,GAEpB,IADA,QACiBpD,EADHoD,EAAOxC,MAAOC,GACXf,WAAAA,KAAQqD,EAAKjH,OAAc6E,EAAUoB,QAErDgB,EAAKjH,EAAQkH,EAAQrC,EAAUoB,YASvBD,EAAUoB,EAAoBnH,EAAe2C,EAAGC,GACrD,IAAAuD,EAAYgB,UACpB,GAAIhB,EAAS,CACH,IAAAiB,EAAQjB,EAASnG,GACjBqH,EAAQlB,OA1FtB,SAAoBG,EAAqB3D,EAAGC,GACxC,IAAK,IAAI2D,EAAKD,EAAMC,EAAIA,EAAKA,EAAGN,KAAOM,EAAG3B,SAAS8B,KAAMH,EAAGP,QAASrD,EAAGC,GA2FpE0E,CAAWF,EAAOzE,EAAGC,GACrB6D,EAAWY,EAAKrH,EAAM2C,EAAGC,aAIjBkD,EAAUqB,EAAoBnH,EAAe2C,EAAGC,EAAG8C,GACvD,IAAAS,EAAYgB,UACpB,GAAIhB,EAAS,CACH,IAAAiB,EAAQjB,EAASnG,GACjBqH,EAAQlB,MAEdM,EAAWW,EAAOzE,EAAGC,EAAG8C,GA/FhC,SAAoBY,EAAqB3D,EAAGC,EAAG8C,EAAGC,GAC9C,IAAK,IAAIY,EAAKD,EAAMC,EAAIA,EAAKA,EAAGN,KAAOM,EAAG3B,SAAS8B,KAAMH,EAAGP,QAASrD,EAAGC,EAAG8C,EAAGC,GA+F1E4B,CAAWF,EAAKrH,EAAM2C,EAAGC,EAAG8C,aAIpBG,EAAUsB,EAAoBnH,EAAe2C,EAAGC,EAAG8C,EAAGC,EAAGC,GAC7D,IAAAO,EAAYgB,UACpB,GAAIhB,EAAS,CACH,IAAAiB,EAAQjB,EAASnG,GACjBqH,EAAQlB,OApGtB,SAAoBG,EAAqB3D,EAAGC,EAAG8C,EAAGC,EAAGC,GACjD,IAAK,IAAIW,EAAKD,EAAMC,EAAIA,EAAKA,EAAGN,KAAOM,EAAG3B,SAAS8B,KAAMH,EAAGP,QAASrD,EAAGC,EAAG8C,EAAGC,EAAGC,GAqG7E4B,CAAWJ,EAAOzE,EAAGC,EAAG8C,EAAGC,EAAGC,GAlGtC,SAAoBU,EAAqB3D,EAAGC,EAAG8C,EAAGC,EAAGC,EAAG6B,GACpD,IAAK,IAAIlB,EAAKD,EAAMC,EAAIA,EAAKA,EAAGN,KAAOM,EAAG3B,SAAS8B,KAAMH,EAAGP,QAASrD,EAAGC,EAAG8C,EAAGC,EAAGC,EAAG6B,GAkGhFC,CAAWL,EAAKrH,EAAM2C,EAAGC,EAAG8C,EAAGC,EAAGC,oICvOtC+B,EAAgB,SAAShC,EAAG/C,GAI5B,OAHA+E,EAAgBlH,OAAOmH,gBAClB,CAAEC,UAAW,cAAgBjH,OAAS,SAAU+E,EAAG/C,GAAK+C,EAAEkC,UAAYjF,IACvE,SAAU+C,EAAG/C,GAAK,IAAK,IAAIkF,KAAKlF,EAAOA,EAAE3C,eAAe6H,KAAInC,EAAEmC,GAAKlF,EAAEkF,MACpDnC,EAAG/C,IAGrB,SAASmF,EAAUpC,EAAG/C,GAEzB,SAASoF,IAAO1F,KAAKtB,YAAc2E,EADnCgC,EAAchC,EAAG/C,GAEjB+C,EAAEhF,UAAkB,OAANiC,EAAanC,OAAO0C,OAAOP,IAAMoF,EAAGrH,UAAYiC,EAAEjC,UAAW,IAAIqH,GAG5E,IAAIC,EAAW,WAQlB,OAPAA,EAAWxH,OAAOuB,QAAU,SAAkBkG,GAC1C,IAAK,IAAIC,EAAG/H,EAAI,EAAGgI,EAAIlI,UAAUC,OAAQC,EAAIgI,EAAGhI,IAE5C,IAAK,IAAI0H,KADTK,EAAIjI,UAAUE,GACOK,OAAOE,UAAUV,eAAeyG,KAAKyB,EAAGL,KAAII,EAAEJ,GAAKK,EAAEL,IAE9E,OAAOI,IAEK7F,MAAMC,KAAMpC,YAGzB,SAASmI,EAAOF,EAAGvC,GACtB,IAAIsC,EAAI,GACR,IAAK,IAAIJ,KAAKK,EAAO1H,OAAOE,UAAUV,eAAeyG,KAAKyB,EAAGL,IAAMlC,EAAE0C,QAAQR,GAAK,IAC9EI,EAAEJ,GAAKK,EAAEL,IACb,GAAS,MAALK,GAAqD,mBAAjC1H,OAAO8H,sBACtB,CAAA,IAAInI,EAAI,EAAb,IAAgB0H,EAAIrH,OAAO8H,sBAAsBJ,GAAI/H,EAAI0H,EAAE3H,OAAQC,IAC3DwF,EAAE0C,QAAQR,EAAE1H,IAAM,GAAKK,OAAOE,UAAU6H,qBAAqB9B,KAAKyB,EAAGL,EAAE1H,MACvE8H,EAAEJ,EAAE1H,IAAM+H,EAAEL,EAAE1H,KAE1B,OAAO8H,EAGJ,SAASO,EAAWC,EAAY1D,EAAQ7D,EAAK8C,GAChD,IAA2H0B,EAAvHD,EAAIxF,UAAUC,OAAQwI,EAAIjD,EAAI,EAAIV,EAAkB,OAATf,EAAgBA,EAAOxD,OAAOyD,yBAAyBc,EAAQ7D,GAAO8C,EACrH,GAAuB,iBAAZ2E,SAAoD,mBAArBA,QAAQC,SAAyBF,EAAIC,QAAQC,SAASH,EAAY1D,EAAQ7D,EAAK8C,QACpH,IAAK,IAAI7D,EAAIsI,EAAWvI,OAAS,EAAQ,GAALC,EAAQA,KAASuF,EAAI+C,EAAWtI,MAAIuI,GAAKjD,EAAI,EAAIC,EAAEgD,GAAS,EAAJjD,EAAQC,EAAEX,EAAQ7D,EAAKwH,GAAKhD,EAAEX,EAAQ7D,KAASwH,GAChJ,OAAW,EAAJjD,GAASiD,GAAKlI,OAAOqI,eAAe9D,EAAQ7D,EAAKwH,GAAIA,SCjBrDI,SAAP,SAAeC,EAAqCC,gBAArCD,MACX,IAAME,EAAiCpI,EAAcwB,MAGrD2G,GAAejH,EAAQM,KAAM2G,GAGrB,IAAAE,EAA2BH,SAAhBI,IAAgBJ,EAA7B,YAeN,OAdAG,GAAU7G,KAAK6G,OAAOE,MAAOF,GAG7B7G,KAAK6G,OAAOG,YAAahH,KAAK3B,UAAWyI,GAAa,GAGtD9G,KAAK6G,OAAOG,YAAahH,KAAK3B,UAAW2B,KAAK6G,OAAOI,qBAAsBL,IAAa,GAGxF5G,KAAKkH,UAAYlH,KAAKkH,SAAUlH,KAAK6G,OAAOM,YAAaP,GAGzD5G,KAAK6G,OAAOO,sBAAuBR,GAE5B5G,MAIJyG,SAAP,SAAiCY,EAAWC,GACxC,IAAIC,IAWc,4DAMlB,OAbIF,GAAQA,EAAK1J,eAAgB,eAG7B8H,EADA8B,EAAcF,EAAK3I,YACKsB,OAIawH,MAAAxH,MAArCuH,KAGJE,EAAWF,GACXF,GAAQE,EAAYG,OAAQL,EAAMC,GAE3BC,MArDf,uBA4DgBE,EAAWE,GACvB,IAAMf,EAAiCpI,EAAcmJ,GAGrDA,EAAYC,UAAYhB,EAAUvI,UAGlCsJ,EAAYD,QAAUG,EAAYC,IAAKrB,GAAUsB,SAAUJ,GAG3DE,EAAYC,IAAKH,GAGjBA,EAAYK,UAAYL,EAAYK,SAAUpB,YAQlCc,EAAQO,GAEpB,GAAiC,mBAAtBA,EAMP,OAAO,SAAUC,GACbT,EAAWS,GACXA,EAAKR,OAAQO,IAPjBR,EAAWQ,GACTA,EAA0CP,kBAWpCP,EAAagB,GACzB,OAAO,SAAE1J,GACL,IAAMoI,EAASgB,EAAYC,IAAKrJ,GAChCoI,EAAOuB,gBAAkB7K,EAAUuD,IAAWqH,EAAOtB,EAAOuB,2BAcpDC,EAAqBC,EAAerK,GAChD,OAAO,SAAEC,EAAgBR,WACrBmK,EACKC,IAAK5J,EAAMQ,aACXsI,YAAa9I,UACRoK,WACI5K,GAASO,iBAapB4J,MAAP,SAAYpJ,GACA,IAAAoI,EAAWpI,SAEnB,OAAOoI,GAAUpI,IAAUoI,EAAOpI,MAAQoI,EACrCpI,EAAMoI,OAAS,IAAIgB,EAAapJ,IAWzCoJ,iCAAA,SAAsBjB,GACZ,IAAAO,EAAcrG,IACdrC,EAAUuB,WAEhB,OAAOP,EAAW0H,EAAanH,KAAKoI,gBAAiB,SAAEG,EAAM7K,GACzD,GAAIkJ,EAAWlJ,KAAWe,EAAOf,GAC7B,OAAOe,EAAOf,MAK1BmK,kBAAA,SAAOhB,GAQH,IAPM,IAAA3I,EAAa8B,KAAKvB,MAAMJ,UAIxBmK,GAHexI,gBAGCA,KAAKwI,cAAgBxI,KAAKwI,cAAczF,aAG5C0F,IAAApH,WAAAA,IAAS,CAAtB,IAAIqH,OAEL,GAAIpK,MAAMqK,QAASD,GACf1I,KAAK+G,MAAO2B,QAGX,GAAIF,EAAcxC,QAAS0C,GAAU,EAItC,GAHAF,EAAchG,KAAMkG,GAGC,mBAAVA,EAAsB,CAE7B1I,KAAKgH,YAAahH,KAAKvB,MAAOiK,GAG9B,IAAME,EAAiBF,EAAe7B,OAClC+B,IACA5I,KAAK6I,WAAatL,EAAUuD,IAAWd,KAAK6I,WAAYD,EAAaC,YACrE7I,KAAKoI,gBAAkB7K,EAAUuD,IAAWd,KAAKoI,gBAAiBQ,EAAaR,iBAC/EpI,KAAKwI,cAAgBxI,KAAKwI,cAAcvG,OAAQ2G,EAAaJ,gBAIjExI,KAAKgH,YAAa9I,EAAOwK,EAAMrK,gBAI/B2B,KAAKgH,YAAa9I,EAAOwK,KAMzCb,qBAAA,eAAU,aAAAxG,mBAAAA,IAAAyH,kBACN,IAAiB,QAAAC,IAAAvH,WAAAA,IAAQ,CAApB,IAAI0G,OACLL,EAAYC,IAAKI,GAAOnB,MAAM,CAAE/G,KAAKvB,UAI7CoJ,wBAAA,SAAarK,EAAeC,EAAiBuL,GAA7C,YAgDJ,SAAyBC,EAAiBlK,GAGtC,IAFA,IAAMmK,EAASC,SAAgBF,OAEdzH,EAAArD,OAAOiL,oBAAqBH,GAA5B5H,WAAAA,IAAuC,CAAnD,IAAIkB,OACL2G,EAAQ3G,IAAUxD,EAAKwD,IAnDvB8G,CAAgB5L,EAAQ,SAAAC,GACpB,IACI6K,EADEe,EAAanL,OAAOyD,yBAA0BnE,EAAQC,IAGxD6K,EAAOgB,EAAKnB,gBAAiB1K,KAC7B8L,EAAgBD,EAAKpC,YAAazJ,EAAM4L,EAAYf,EAAMS,GAGzDT,GAAQA,IAASkB,EAAWC,YAC7BF,EAAgBhM,EAAME,EAAM4L,EAAYC,EAAKV,WAAYnL,GAAQsL,MAK7EnB,kCAAA,SAAuBjB,GACb,IAAEiC,EAAsB7I,gBAAVvB,EAAUuB,WAE9B,GAAI6I,EAAY,CACZ,IAAM3K,EAAQO,EAAMJ,UAChBsL,EAAY/C,EAAUvI,UAE1B,IAAK,IAAIoD,KAAQoH,EAAa,CAC1B,IAAMN,EAAOM,EAAYpH,GAErBvD,EAAMP,eAAgB8D,IAAUA,KAAQkI,IACxCzL,EAAOuD,GAASmI,EAAa1L,EAAOuD,GAAQkI,EAAWlI,GAAQ8G,UA5F/E,WAAoB9J,GAAAuB,WAAAvB,EAXpBuB,iBAAuB,GAYX,IAAA6G,EAAWrI,EAAcC,UAEjCuB,KAAK6I,WAAehC,GAAUA,EAAOgC,YAAgB/H,IACrDd,KAAKoI,gBAAoBvB,GAAUA,EAAOuB,iBAAqBtH,IAC/Dd,KAAKwI,cAAkB3B,GAAUA,EAAO2B,eAAmB,GA8FnE,IAAMW,EAAU,CACZU,SAAW/I,EAAQ,CACfjD,QAAS,EACTQ,WAAY,EACZyL,QAAS,EACTlM,WAAY,EACZF,MAAO,EACPkK,WAAY,IAGhBqB,OAASnI,EAAQ,CACbpC,aAAc,KAiCA,SAATmI,QAAW,aAAAxF,mBAAAA,IAAA0I,kBAAuB,gBACzCtL,GAAsB,OAAAoJ,EAAYC,IAAKrJ,GAAQsI,MAAOgD,QAI/CN,WAAiBtB,GAA6B,gBACrD1J,GACE,IAAMoI,EAASgB,EAAYC,IAAKrJ,GAChCoI,EAAOgC,WAAatL,EAAU4K,EAAOtB,EAAOgC,cA4DpD,SAASW,EAAgBhM,EAAeE,EAAe4L,EAAiCf,EAAuBS,GAE3G,GAAIxL,EAAKG,eAAgBD,GAAQ,CAC7B,IAAMsM,EAAW7L,OAAOyD,yBAA0BpE,EAAME,GAEpDsM,EAASC,cAAgB,UAAWD,IACpCxM,EAAME,GAASsL,EACXY,EAAaN,EAAWrL,MAAO+L,EAAS/L,MAAOsK,GAC/CqB,EAAaI,EAAS/L,MAAOqL,EAAWrL,MAAOsK,SAKvDpK,OAAOqI,eAAgBhJ,EAAME,EAAM4L,GAI3C,SAASM,EAAapM,EAAMC,EAAQ8K,GAEhC,YAAa,IAAT/K,EAAyBC,EAGxB8K,QAAmB,IAAX9K,EAGN8K,EAAM/K,EAAMC,GAHqBD,EA5E5CiM,EAAWxL,MAAQ,SAAEoC,EAAGC,GAAO,OAAAD,GAE/BoJ,EAAWC,WAAa,SAAErJ,EAAGC,GAAO,OAAAD,GAGpCoJ,EAAW1C,MAAQ,SAAE1G,EAAGC,GAAO,OAAA/C,EAAU,GAAI8C,EAAGC,IAGhDmJ,EAAWS,KAAO,SAAE7J,EAAGC,GAAO,gBAChBhB,GACN,OAAOe,EAAE+D,KAAMpE,KAAMM,EAAE8D,KAAMpE,KAAMV,MAK3CmK,EAAWlM,SAAW,SAAE8C,EAAcC,GAAkB,kBAEhD,OAAO/C,EAAU8C,EAAEN,MAAOC,KAAMpC,WAAa0C,EAAEP,MAAOC,KAAMpC,cAKpE6L,EAAWU,WAAa,SAAE9J,EAAcC,GAAkB,kBAElDD,EAAEN,MAAOC,KAAMpC,WACf0C,EAAEP,MAAOC,KAAMpC,aAKvB6L,EAAWW,UAAY,SAAE/J,EAAcC,GAAkB,kBAEjDA,EAAEP,MAAOC,KAAMpC,WACfyC,EAAEN,MAAOC,KAAMpC,aAKvB6L,EAAWlL,MAAQ,SAAE8B,EAAcC,GAAiB,kBAE5C,OAAOD,EAAEN,MAAOC,KAAMpC,YAAe0C,EAAEP,MAAOC,KAAMpC,aAI5D6L,EAAW3K,KAAO,SAAEuB,EAAcC,GAAiB,kBAE3C,OAAOD,EAAEN,MAAOC,KAAMpC,YAAe0C,EAAEP,MAAOC,KAAMpC,aC/WpD,IAAA6G,GAAyD4F,EAAhDzH,GAAgD0H,EAA5CxH,GAA4CyH,EAAvC5K,GAAuC6K,EAAjCjH,GAAiCkH,EAAvBhH,GAAuBiH,EAAblH,GAAamH,EAE7DC,GAAW,EAEf,SAASC,KACL,MAAO,IAAMD,aA2CNE,YAAP,SAAgBtJ,EAAiEoF,OAA/DmE,gBAAaC,iBAAcC,eAEzC,GAAIF,GAAeC,EAAc,CAC7B,IAAME,EAAY,IAAIpJ,EAAU9B,KAAK3B,UAAU2M,cAE/CD,GAAeG,EAAUlI,aAAc+H,GACvCC,GAAgBE,EAAUnE,MAAOiE,GAEjChL,KAAK3B,UAAU2M,aAAeE,EAI9BD,GACA9M,OAAOgN,iBAAkBnL,KAAK3B,UAAWoB,EAAW,GAAiBwL,EAAYG,MAwBzFN,wBAAA,aAEAA,gBAAA,SAAInG,EAAwCrC,EAAWoB,GACnD,GAAsB,iBAAXiB,EAAsBF,GAAS7B,GAAI5C,KAAM2E,EAAQrC,EAAUoB,QACjE,IAAK,IAAIjC,KAAQkD,EAASF,GAAS7B,GAAI5C,KAAMyB,EAAMkD,EAAQlD,GAAQiC,GAAWpB,GAEnF,OAAOtC,MAGX8K,kBAAA,SAAMnG,EAAwCrC,EAAWoB,GACrD,GAAsB,iBAAXiB,EAAsBF,GAAS9E,GAAMK,KAAM2E,EAAQrC,EAAUoB,QACnE,IAAK,IAAInB,KAAQoC,EAASF,GAAS9E,GAAMK,KAAMuC,EAAMoC,EAAQpC,GAAQmB,GAAWpB,GAErF,OAAOtC,MAGX8K,iBAAA,SAAKnG,EAAyCrC,EAAWoB,GACrD,GAAKiB,EACA,GAAsB,iBAAXA,EAAsBF,GAAS3B,GAAK9C,KAAM2E,EAAQrC,EAAUoB,QACvE,IAAK,IAAIc,KAAQG,EAASF,GAAS3B,GAAK9C,KAAMwE,EAAMG,EAAQH,GAAQd,GAAWpB,QAFtEQ,GAAK9C,UAAM,EAAQsC,EAAUoB,GAI3C,OAAO1D,MAOX8K,qBAAA,SAAQpN,EAAe2C,EAAIC,EAAI8C,EAAIC,EAAIC,GAInC,YAHU,IAAND,QAAsB,IAANC,EAAeC,GAAUvD,KAAMtC,EAAM2C,EAAGC,EAAG8C,EAAGC,EAAGC,QACtD,IAANF,EAAeI,GAAUxD,KAAMtC,EAAM2C,EAAGC,EAAG8C,GAC/CK,GAAUzD,KAAMtC,EAAM2C,EAAGC,GACvBN,MAGX8K,sBAAA,SAAUrN,EAAoB4C,EAAmCC,GAM7D,OALI7C,IACA4N,GAAcrL,KAAMvC,GACpBA,EAAOmF,GAAIvC,EAAIC,GAAkB,iBAAND,EAAwBC,EAAPN,KAAUA,OAGnDA,MAGX8K,0BAAA,SAAcrN,EAAoB4C,EAAmCC,GAMjE,OALI7C,IACA4N,GAAcrL,KAAMvC,GACpBA,EAAOkC,KAAMU,EAAIC,GAAkB,iBAAND,EAAwBC,EAAPN,KAAUA,OAGrDA,MAGX8K,2BAAA,SAAeQ,EAAuBjL,EAAoCC,GAC9D,IAAAiL,EAAiBvL,kBACzB,GAAIuL,EAAc,CACd,IAAMC,IAAenL,GAAKC,GACpBmL,EAAUnL,GAAkB,iBAAND,EAAwBC,EAAPN,KAE7C,GAAIsL,EAAU,CACV,IAAM7N,EAAS8N,EAAcD,EAASI,KAClCjO,IACI+N,UAAmBD,EAAcD,EAASI,KAC9CjO,EAAOqF,IAAKzC,EAAGoL,EAAQzL,YAG1B,GAAgB,MAAZsL,EAAkB,CACvB,IAAK,IAAII,KAAOH,EAAeA,EAAcG,GAAM5I,IAAKzC,EAAGoL,EAAQzL,MAE/DwL,IAAcxL,KAAKuL,kBAAe,IAI9C,OAAOvL,MASX8K,qBAAA,WACQ9K,KAAK2L,YAET3L,KAAK4L,gBACL5L,KAAK8C,MAEL9C,KAAK2L,WAAY,IArIZb,MALZpD,EACAP,EAAY,CACT8D,WAAaxB,EAAW1C,MACxBgE,YAActB,EAAW1C,SAEhB+D,KAqCT,cAXA9K,kBAA4B,EAG5BA,uBAAiC,EAS7BA,KAAK0L,IAAMb,KACX7K,KAAK6L,WAAW9L,MAAOC,KAAMpC,eAqGxBkO,GAAiCvM,EAAMuL,GAAUzM,UAAW,cAAe,cAMxF,SAAS+M,GAAsB9L,GAC3B,GAAIA,EACA,MAAoB,mBAANA,EAAmB,CAAEwI,IAAmBxI,EAAG2K,cAAe,GAA8B3K,EAI9G,SAAS+L,GAAcU,EAAsBtO,IACnBsO,EAASR,eAAiBQ,EAASR,aAAepN,OAAO0C,OAAQ,QACzEpD,EAAOiO,MAASjO,EAAOiO,IAAMb,OAEpBpN,SCjMduO,GAAkC,oBAAZC,SAA2BA,QAAQC,KAAgC,eAAzBD,QAAQC,IAAIC,SACrFC,GAA0BJ,GACtB,CAAE,QAAS,QACX,CAAE,QAAS,OAAQ,QAAS,OAAQ,WAGhBvG,QAAAqF,IAIxBuB,0BAAA,SAAcC,EAAkBC,GAC5B,OAAOvM,KAAK4C,GAAI0J,EAAO,SAAEE,EAAOC,EAAKC,GACjC,IAAKH,GAAUA,EAAO3H,KAAM4H,GAAS,CACjC,IAAMG,EAAO,CAAE,WAAIH,eAAUC,IAE7B,IAAK,IAAIhL,KAAQiL,EACbC,EAAKnK,KAAM,cAAOf,OAASmL,GAAUF,EAAOjL,KAGhDoL,QAASP,GAAQvM,MAAO8M,QAASF,OAM7CN,qBAAA,SAASC,EAAkBC,GACvB,OAAOvM,KAAK4C,GAAI0J,EAAO,SAAEE,EAAOC,EAAKC,GACjC,IAAKH,GAAUA,EAAO3H,KAAM4H,GACxB,MAAM,IAAIM,MAAO,WAAIN,eAAUC,OAM3CJ,mBAAA,SAAOC,EAAkBC,GAAzB,WACI,OAAOvM,KAAK4C,GAAI0J,EAAO,SAAEE,EAAOC,EAAKC,GAC5BH,IAAUA,EAAO3H,KAAM4H,KACxBjD,EAAKwD,QAAST,IAAY/C,EAAKwD,QAAST,IAAW,GAAM,MAarED,gBAAA,SAAIhM,EAASC,GACT,OAAO0M,aAAMpK,aAAIvC,EAAGC,IA7Cf+L,MADZ3E,GACY2E,KAAb,qEACI9C,UAAgD,KAoDpD,IAAIqD,GAA6B,oBAAXK,OAClB,SAAAC,GACI,GAAIA,GAAkC,iBAAdA,EAAwB,CAE5C,IAAMjP,EAAQiP,EAAUC,iBAAmBD,EAGrCE,EAFQ9O,MAAMqK,QAAS1K,GAEN,qBAAeA,EAAMJ,aAAc,YAAMM,OAAOuC,KAAMzC,GAAQoP,KAAM,YAE3F,OAAOH,EAAUxO,YAAYhB,KAAO,IAAM0P,EAG9C,OAAOE,KAAKC,UAAWL,IAEzB,SAAA5N,GAAK,OAAAA,GAEEkO,GAAS,IAAInB,GAE1B,GAAuB,oBAAZQ,QACP,IAAkB,SAAAY,MAAApM,aAAAA,KAAW,CAAxB,IAAIsB,UACL6K,GAAOE,aAAc/K,QAIhBgL,GAAiB,IAAItB,GAClCsB,GAAeC,QAAS,SAAUA,QAAS,YAE9BC,GAA8BL,GAAOM,QAAQC,KAAMP,aCzChDQ,GAAiBnC,GAC7B,IAAIoC,EAASC,EAAQC,EAErB,SAASC,EAAOC,GACZF,EAAUE,EAGd,IAAMC,EAA2B,IAAIC,QAAS,SAAEC,EAAWC,GAGvD5C,EADAoC,EAAUO,EADVN,EAASO,EAEoBL,KAOjC,OAJAE,EAAQF,MAAQ,WACZD,EAAUA,EAASF,EAASC,GAAWA,EAAQ,IAAIpB,MAAO,iBAGvDwB,WAKKI,GAAS7J,EAAeyJ,EAA0BK,EAAqBC,GAyBnF,OAvBAC,GAAShK,GAETA,EAAKiK,WAAaR,EACbS,KAAM,SAAAC,GACHnK,EAAKiK,WAAa,KAElB,IAAM5P,EAAS0P,EAASA,EAAQI,GAASA,EAIzC,OAFAC,GAAkBpK,EAAM,OAAQA,EAAMmK,EAAML,GAErCzP,IAEVgQ,MAAO,SAAAC,GAMJ,MALAtK,EAAKiK,WAAa,KAGlBG,GAAkBpK,EAAM,QAASA,EAAMsK,EAAKR,GAEtCQ,IAGdtK,EAAKiK,WAAWV,MAAQE,EAAQF,MAEzBvJ,EAAKiK,oBAGAD,GAAShK,GACjBA,EAAKiK,YAAcjK,EAAKiK,WAAWV,QACnCvJ,EAAKiK,WAAWV,QAChBvJ,EAAKiK,WAAa,eAIVG,GAAkBG,OAAa,aAAA/N,mBAAAA,IAAAsL,oBAC3CyC,EAAYtB,QAAQ/N,MAAOqP,EAAazC,GAChC,IAAA0C,EAAeD,aACvBC,GAAcA,EAAWvB,QAAQ/N,MAAOsP,EAAY1C,GCxGxD,IAAM2C,GAAiB,gCAUnB,SAAaC,EAAoBC,gBAAAA,MAC7B,IAAMC,EAAOF,EACIG,MAAOJ,IACPvN,IAAK,SAAAlD,GACF,MAAY,MAARA,GAAuB,UAARA,EAAyB,aAE3B,MAAbA,EAAK,GAAqB,0BAAoBA,EAAI8Q,OAAQ,SAE9B,IAA5B9Q,EAAImH,QAAS,UAA0B,0BAAoBnH,EAAI8Q,OAAQ,SAEpE9Q,IAG3BmB,KAAK4P,KAAOJ,GAAaC,EAAKI,MAC9B7P,KAAK8P,OAASL,EAAK5R,OAEnBmC,KAAKiO,QAAgB,IAAI8B,SAAU,OAAQ,qCACvBN,EAAKO,+DAElBP,EAAK1N,IAAK,SAAAzC,GAAK,MAAA,uCACAA,uBACf+N,KAAK,sDAOJ4C,GAAkBC,EAAoBX,EAAoBY,GAMtE,IALA,IAAMV,EAAOF,EAAUG,MAAOJ,IACxBc,EAAOX,EAAK5R,OAAS,EAEvBgH,EAAOqL,EAEFpS,EAAI,EAAGA,EAAIsS,EAAMtS,IAAK,CAC3B,IAAMe,EAAM4Q,EAAM3R,GAClB,OAAQe,GACJ,IAAK,IAAMgG,EAAOA,EAAKwL,WAAY,MACnC,IAAK,IAAMxL,EAAOA,EAAKyL,WAAY,MACnC,QAAWzL,EAAOA,EAAKiD,IAAKjJ,GAIhC,IAAKgG,EAAO,OAGhB,OAAOsL,EAAQtL,EAAM4K,EAAMW,ICpD/B,QAgBIG,kBAAA,SAAMC,GACI,IAAEC,EAAkBzQ,WAAX0Q,EAAW1Q,YAI1B,IAAK,IAAMnB,KAFP4R,GAAQD,EAAUC,EAAO,MAEXC,EACdF,EAAUE,EAAQ7R,GAAOA,IAIjC0R,uBAAA,SAAWC,EAAwEvH,GAC/EjJ,KAAK2Q,KAAM,SAAE1S,EAAaY,GAClBZ,aAAiBsS,GACCtS,EAAO2S,UAAWJ,EAAUvH,EAAOnB,IAAKjJ,IAG1D2R,EAAUvS,EAAOY,EAAKoK,UAxBlC,YAAarK,GACToB,KAAKnC,OAASe,EAAIiS,gBAAiB7Q,KAAK0Q,OAAS,KAE7C1Q,KAAKyQ,MAAQ7R,EAAIkS,SAAUlS,KAC3BoB,KAAKnC,SCTjB,IAAIwH,GAAgB,SAAShC,EAAG/C,GAI5B,OAHA+E,GAAgBlH,OAAOmH,gBAClB,CAAEC,UAAW,cAAgBjH,OAAS,SAAU+E,EAAG/C,GAAK+C,EAAEkC,UAAYjF,IACvE,SAAU+C,EAAG/C,GAAK,IAAK,IAAIkF,KAAKlF,EAAOA,EAAE3C,eAAe6H,KAAInC,EAAEmC,GAAKlF,EAAEkF,MACpDnC,EAAG/C,IAGrB,SAASmF,GAAUpC,EAAG/C,GAEzB,SAASoF,IAAO1F,KAAKtB,YAAc2E,EADnCgC,GAAchC,EAAG/C,GAEjB+C,EAAEhF,UAAkB,OAANiC,EAAanC,OAAO0C,OAAOP,IAAMoF,EAAGrH,UAAYiC,EAAEjC,UAAW,IAAIqH,GAG5E,IAAIC,GAAW,WAQlB,OAPAA,GAAWxH,OAAOuB,QAAU,SAAkBkG,GAC1C,IAAK,IAAIC,EAAG/H,EAAI,EAAGgI,EAAIlI,UAAUC,OAAQC,EAAIgI,EAAGhI,IAE5C,IAAK,IAAI0H,KADTK,EAAIjI,UAAUE,GACOK,OAAOE,UAAUV,eAAeyG,KAAKyB,EAAGL,KAAII,EAAEJ,GAAKK,EAAEL,IAE9E,OAAOI,IAEK7F,MAAMC,KAAMpC,YCrB1BoB,GAAaV,MAAMD,UACnB8B,GAAchC,OAAOE,mBAEX0S,GAAS9S,GACrB,GAAIA,GAA0B,iBAAVA,EAChB,OAAQE,OAAOC,eAAgBH,IAC3B,KAAKe,GAAc,OAAOgS,GAC1B,KAAK7Q,GAAc,OAAO8Q,GAIlC,OAAOC,GAIX,IC2KiBC,GD3KXD,GAAwB,CAC1BE,eAAOnT,GAAS,OAAOA,GACvB8D,IAAA,SAAKsP,EAAqBtS,GAAO,MAAO,IACxCuS,gBAAQrT,GAAS,OAAOA,IAIfgT,GAAyB,CAElClP,IAAA,SAAKsP,EAAqBE,GAClB,IAAAC,EAAS,GACPvT,UAEN,IAAK,IAAIY,KAAOZ,EACZ,GAAIA,EAAMN,eAAgBkB,GAAO,CAC7B,IAAM4S,EAAUF,EAAUF,EAAKK,GAAI7S,GAAOA,QAC9B,IAAZ4S,GAAwBD,EAAOhP,KAAMiP,GAI7C,OAAOD,GAGXF,OAAA,SAAQrI,EAAapK,GAEjB,cADOoK,EAAQpK,GACRoK,GAIXmI,MAAA,SAAOnI,GACH,aAAYA,KAKP+H,GAAwB,CAEjCI,MAAA,SAAOO,GACH,OAAOA,EAAM5O,SAGjBuO,OAAA,SAAQK,EAAe7T,GAEnB,OADA6T,EAAMC,OAAQ9T,EAAG,GACV6T,GAIX5P,IAAA,SAAKsP,EAAqBE,GAItB,IAHA,IAAM1T,EAASwT,EAAKpT,MAAMJ,OACpB2T,EAASlT,MAAOT,GAEbC,EAAI,EAAG+T,EAAI,EAAG/T,EAAID,EAAQC,IAAK,CACpC,IAAMgU,EAAIP,EAAUF,EAAKK,GAAI5T,GAAKA,QAC5B,IAANgU,IAAkBN,EAAQK,KAAQC,GAKtC,OAFAN,EAAO3T,SAAWgU,IAAOL,EAAO3T,OAASgU,GAElCL,ICrEX,YAAoBvT,GAAA+B,WAAA/B,EALpB+B,gBAAc,YAQd7B,sBAAIgT,4BAAJ,WAAe,OAAOnR,KAAK/B,WAC3B,SAAaqB,GAASU,KAAK+R,IAAKzS,oCAGhCnB,sBAAcgT,iCAAd,WACI,OAAOnR,KAAK/B,uCAIhBkT,sBAAA,SAAUlO,GAAV,WACI,OAAO,IAAI+O,GAAiBhS,KAAM,SAAEV,GAChC2D,EAAS3D,GACTiK,EAAKwI,IAAKzS,MAKlB6R,kBAAA,SAAMlO,GAAN,WACI,OAAO,IAAI+O,GAAiBhS,KAAM,SAAAV,GAC9B,IAAMqE,EAAOV,EAAS3D,EAAGiK,EAAKtL,YACrB,IAAT0F,GAAmB4F,EAAKwI,IAAKpO,MASrCxF,sBAAIgT,0BAAJ,WAAA,WAII,MAA6B,kBAAfnR,KAAK/B,MAAsB,CACrCgU,QAAUjS,KAAK/B,MACfiU,SAAW,SAAA5O,GAAK,OAAAiG,EAAKwI,IAAKI,QAAS7O,EAAEZ,OAAOuP,YAC9C,CACEhU,MAAQ+B,KAAK/B,MACbiU,SAAW,SAAA5O,GAAK,OAAAiG,EAAKwI,IAAKzO,EAAEZ,OAAOzE,0CAK3CkT,oBAAA,SAAQ1R,EAAiC6D,GACrC,IAAMK,EAAOlE,EAAWO,KAAKoR,QAAS9N,QAC7B,IAATK,GAAmB3D,KAAK+R,IAAKpO,IAIjCwN,oBAAA,SAAQ1R,GAAR,WACI,OAAO,SAAA6D,GAAK,OAAAiG,EAAK6I,OAAQ3S,EAAW6D,KAGxC6N,oBAAA,SAAQkB,GACJ,OAAO,IAAIC,GAAiBtS,KAAMqS,IAGtClU,sBAAIgT,yBAAJ,WAAA,WACI,OAAO,WAAM,OAAA5H,EAAKwI,KAAK,qCAG3B5T,sBAAIgT,0BAAJ,WAAA,WACI,OAAO,WAAM,OAAA5H,EAAKwI,KAAK,qCAG3B5T,sBAAIgT,yBAAJ,WAAA,WACI,OAAO,WAAM,OAAA5H,EAAKwI,IAAK,wCAG3B5T,sBAAIgT,6BAAJ,WACI,QAAOnR,KAAK/B,YAAesU,mCAG/BpB,qBAAA,SAASqB,GACL,OAAO,IAAIC,GAAkBzS,KAAMwS,GAAgB,KAIvDrB,sBAAA,SAAiCM,GAC7B,OAAO,IAAIiB,GAAa1S,KAAMyR,IAIlCN,kBAAA,WACI,IAAMQ,EAAQX,GAAaI,MAAOpR,KAAK/B,OACvCK,MAAMD,UAAUmE,KAAKzC,MAAO4R,EAAO/T,WACnCoC,KAAK+R,IAAKJ,IAIdR,qBAAA,WACI,IAAMQ,EAAQX,GAAaI,MAAOpR,KAAK/B,OACvCK,MAAMD,UAAU2K,QAAQjJ,MAAO4R,EAAO/T,WACtCoC,KAAK+R,IAAKJ,IAKdR,oBAAA,WACI,IAAMQ,EAAQX,GAAaI,MAAOpR,KAAK/B,OACvCK,MAAMD,UAAUuT,OAAO7R,MAAO4R,EAAO/T,WACrCoC,KAAK+R,IAAKJ,IAMdR,iBAAA,SAAKI,GACD,OAAOR,GAAS/Q,KAAK/B,OAAQ8D,IAAK/B,KAAMuR,IAK5CJ,sBAAA,SAAUtS,GACE,IAAAZ,aACJ0U,EAAI5B,GAAS9S,GAEjB+B,KAAK+R,IAAKY,EAAErB,OAAQqB,EAAEvB,MAAOnT,GAASY,KAK1CsS,gBAAA,SAAItS,GACA,OAAO,IAAI+T,GAAe5S,KAAMnB,IAGpCsS,mBAAA,WACU,IAAAlT,aACN,OAAO8S,GAAS9S,GAAQmT,MAAOnT,IAOnCkT,kBAAA,WAGI,IAFA,IAAI0B,EAAQ,GAAInS,EAAO9C,UAAUC,OAASD,UAAYO,OAAOuC,KAAMV,KAAK/B,OAE/DH,EAAI,EAAGA,EAAI4C,EAAK7C,OAAQC,IAAK,CAClC,IAAMe,EAAe6B,EAAM5C,GAC3B+U,EAAOhU,GAAQ,IAAI+T,GAAe5S,KAAMnB,GAG5C,OAAOgU,GAOX1U,sBAAIgT,sBAAJ,WACI,IAAKnR,KAAK8S,QAAS,CACX,IAAAD,EAA2B7S,KAAK8S,QAAU,GACxC7U,aAEN,IAAK,IAAIY,KAAOZ,EACRA,EAAMN,eAAgBkB,KACtBgU,EAAOhU,GAAQ,IAAI+T,GAAe5S,KAAMnB,IAKpD,OAAOmB,KAAK8S,yCAQhB3B,mBAAA,SAAO4B,EAAiCtC,GAKpC,OAJKzQ,KAAKyQ,OAAUsC,EAAW/S,KAAK/B,SAChC+B,KAAKyQ,MAAQA,GAASsC,EAAUtC,OAASuC,IAGtChT,WAIEmR,GAAAA,WAAAA,oBAcb,SAA0BlT,EAAW8T,GACjC,OAAO,IAAIkB,GAAiBhV,EAAO8T,IAGvBZ,WAAhB,SAA2C+B,GACvC,OAAO,IAAID,GAAiBC,EAAO,SAAA5T,GAC/B,IAAK,IAAIT,KAAOS,EACRA,EAAE3B,eAAgBkB,KAClBqU,EAAOrU,GAAQS,EAAGT,OASlBsS,aAAhB,SAA6C0B,GACzC,OAAOM,GAAQN,EAAO,UAMV1B,aAAhB,SAA6C0B,GACzC,OAAOM,GAAQN,EAAO,UAMV1B,aAAhB,SAA6C0B,GACzC,IAAK,IAAIhU,KAAOgU,EACZ,GAAIA,EAAMlV,eAAgBkB,IAASgU,EAAOhU,GAAM4R,MAC5C,OAAO,EAIf,OAAO,GAMIU,aAAhB,SAA6C0B,EAAwBpV,GAChE,GAAIA,EACA,IAAK,IAAIoB,KAAOgU,EAAO,CACnB,IAAMO,EAAYC,GAAMxU,GACxB,GAAIpB,EAAOE,eAAgByV,GAAa,CACpC,IAAME,EAAY7V,EAAQ2V,QACZ,IAAdE,GAAwBT,EAAOhU,GAAMkT,IAAKuB,MAQ9D,WAAmCC,SAAApC,UAC/B8B,iBAAA,SAAK3T,SAEL,YAAarB,EAAW8T,GAAxB,MACI/E,aAAO/O,gBACPsL,EAAKwI,IAAMA,IAInB,WAAmCwB,SAAApC,UAC/Ba,iBAAA,SAAK1S,SAEL,YAAakU,EAAsBzB,GAAnC,MACI/E,aAAOwG,EAAOvV,aACdsL,EAAKwI,IAAMA,EAEH,IAAAtB,iBACJA,IAAQlH,EAAKkH,MAAQA,KAIjC,WAA8B8C,SAAApC,UAK1BmB,iBAAA,SAAKhT,GACDU,KAAKwT,OAAOzB,IAAKzS,EAAIU,KAAKqS,YAAc,WAL5C,YAAoBmB,EAA+BnB,GAAnD,MACIrF,aAAOwG,EAAOvV,QAAUoU,gBADR9I,SAAAiK,EAA+BjK,cAAA8I,IASvD,WAA+BkB,SAAApC,UAK3BsB,iBAAA,SAAKnT,GACDU,KAAKwT,OAAOzB,IAAKzS,EAAIU,KAAKwS,aAAe,WAL7C,YAAoBgB,EAA+BhB,GAAnD,MACIxF,aAAuB,MAAhBwG,EAAOvV,oBADEsL,SAAAiK,EAA+BjK,eAAAiJ,IASvD,WAA0Be,SAAApC,UAKtBuB,iBAAA,SAAKpT,GAAL,WACQqE,EAAOwO,QAAS7S,GAEpB,GAAIU,KAAK/B,QAAU0F,EAAM,CACrB,IAAI1E,EAAce,KAAKwT,OAAOvV,MAC1BwV,EAAYnU,EAAIL,EAAIgD,OAAQjC,KAAKyR,SAAYxS,EAAIsN,OAAQ,SAAAmH,GAAM,OAAAA,IAAOnK,EAAKkI,UAE/EzR,KAAKwT,OAAOzB,IAAK0B,SAXzB,YAAoBD,EAA+B/B,GAAnD,MACIzE,aAA0C,GAAnCwG,EAAOvV,MAAM+H,QAASyL,iBADblI,SAAAiK,EAA+BjK,UAAAkI,IAgBvD,OAAOuB,GAAe,oBAMqBO,SAAApC,UAKvCyB,oBAAA,WACI5S,KAAKwT,OAAOG,SAAe3T,KAAKnB,MAGpC+T,oBAAA,SAAQnT,EAAiC6D,GAC7B,IAAAzE,WAERmB,KAAKwT,OAAOpB,OAAQ,SAAAxT,GAChB,IAAMmF,EAAOnF,EAAKC,GACd8E,EAAOlE,EAAWsR,GAAShN,GAAOqN,MAAOrN,GAAQT,GAErD,QAAa,IAATK,EAEA,OADA/E,EAAKC,GAAQ8E,EACN/E,KAMnBgU,iBAAA,SAAKjP,GAOO,IAAA9E,WAERmB,KAAKwT,OAAOpB,OAAQ,SAAAxT,GAChB,GAAIA,EAAKC,KAAU8E,EAEf,OADA/E,EAAKC,GAAQ8E,EACN/E,SAnCnB,YAAqB4U,EAA+B3U,GAApD,MACImO,aAAOwG,EAAOvV,MAAOY,iBADJ0K,SAAAiK,EAA+BjK,MAAA1K,IA2CxD,SAASsU,GAAQN,EAAqBe,GAClC,IAAMC,EAAS,GAEf,IAAK,IAAIhV,KAAOgU,EACZ,GAAIA,EAAMlV,eAAgBkB,GAAO,CAC7B,IAAMZ,EAAQ4U,EAAOhU,GAAO+U,QACd,IAAV3V,IACA4V,EAAQR,GAAMxU,IAAUZ,GAKpC,OAAO4V,EAGX,SAASR,GAAMxU,GACX,MAAoB,MAAbA,EAAK,GAAcA,EAAIkE,MAAO,GAAMlE,ECxYvC,IAYIiV,GAZJtQ,GAAsBuQ,EAAZnR,GAAYoR,EAARlR,GAAQmR,GAYlBH,GAAAA,kBAAAA,yCAERA,yBACAA,gDAqBkBI,aAYlB,SAAiB/M,EAAuCP,GAChDO,EAAYgN,WAAWnU,KAAK3B,UAAU+V,UAAYjN,EAAYgN,UAClErJ,GAAU5D,SAAS9C,KAAMpE,KAAMmH,EAAaP,IAGzCsN,YAAP,SAAiBtN,GAETA,EAAU/F,SAAWb,KAAKa,SAC1Bb,KAAKa,OAASwT,GAAcxT,SAK7BqT,UAAP,SAA2D7T,EAAUC,GACjE,OAAO,IAAKN,KAAcK,EAAGC,IAWjC4T,qBAAA,WACQlU,KAAK2L,YAETkD,GAAS7O,MACTA,KAAKsU,YAAS,EACdtU,KAAKuU,eAAY,EACjBvU,KAAK8C,MACL9C,KAAK4L,gBACL5L,KAAK2L,WAAY,IAiCrBuI,uBAAA,SAAWjR,EAAoBP,GAC3BE,GAAI5C,KAAMA,KAAKwU,iBAAkBvR,EAASP,IAM9CwR,wBAAA,SAAYjR,EAAqBP,GAC7BI,GAAK9C,KAAMA,KAAKwU,iBAAkBvR,EAASP,IAM/CwR,6BAAA,SAAiBxR,EAAwBO,GACrCjD,KAAKyU,SAAU/R,EAAQA,EAAO8R,iBAAkBvR,IAWpDiR,yBAAA,SAAanV,EAA+B4P,GACxC,IAAM+F,EAASC,GAAeC,MAAO5U,MAC/BoS,EAASrT,EAAIqF,KAAMpE,KAAMA,MAC/BoS,GAAUpS,KAAK+R,IAAKK,GACpBsC,GAAUC,GAAeE,OAAQ7U,OAIrCkU,wBAAA,SAAY5I,GAAZ,WAEU7N,EAAS6N,aAAoB6F,SAAS7F,EAASrN,MAAQqN,EAc7D,OAXAtL,KAAK8U,YAAa,WACdvL,EAAKwI,IAAOtU,EAAe0P,iBAAmB1P,EAAQ,CAAEsJ,OAAQ,IAGxD,IAAAgO,EAAiBtX,eAErBsX,IACAxL,EAAKwL,aAAeA,KAIrB/U,MAIJkU,QAAP,SAAmEc,EAAYxT,gBAAAA,MAAE,IAAAyT,WAAWtG,MAAb,YACrE/P,EAAwBoB,KAAca,OAAQmU,SAAWrG,IAASnB,OAASyH,EAAStH,QAAiB,KAQ3G,OANIsH,GAAUrW,EAAIsW,iBACdtW,EAAIuW,oBAAqB,SAAE1E,EAAO5R,EAAKD,GACnC,MAAM,IAAIkO,MAAO,UAAIlO,EAAIwW,2BAAoBvW,eAAU4R,MAIxD7R,GAcXsV,mBAAA,SAAOmB,EAAY1G,GAAwC,OAAO0G,GAalEnB,qBAAA,SAAS3E,GACL,OAAOU,GAAkBjQ,KAAMuP,EAAW,SAAEtG,EAAQpK,GAAS,OAAAoK,EAAOnB,IAAMmB,EAAOnB,IAAKjJ,GAAQoK,EAAQpK,MAM1GqV,sBAAA,WACI,OAAOlU,KAAKsU,QAQhBJ,sBAAA,WACY,IAAAI,EAAWtU,YACnB,OAAOsU,EAAyBA,EAAOjE,WAAarQ,KAAKsV,eAgB7DpB,0BAAA,WAAmC,OAAOlU,KAAK8O,YAI/CoF,yBAAA,WACI,OAgNR,SAASqB,EAAkB1Q,GAEf,IAAAwK,EAAexK,aACvB,GAAIwK,EACA,OAAOkG,EAAkBlG,GAI7B,GAAIxK,EAAKyP,OAAQ,CACL,IAAAkB,EAAe3Q,EAAKyP,kBAC5B,OAAOkB,GAAcA,EAAY3Q,EAAK0P,YA1N/BgB,CAAkBvV,OAAUA,KAAKoU,WAY5CjW,sBAAI+V,oCAAJ,WACI,IAAMzD,EAAQzQ,KAAKyV,mBAAsBzV,KAAKyV,iBAAmB,IAAIlF,GAAiBvQ,OACtF,OAAOyQ,EAAM5S,OAAS4S,EAAQ,sCAQlCyD,sBAAA,SAAUtV,KAGVsV,gCAAA,SAAoBrV,GAChB,IAAI4R,EAAQzQ,KAAKkV,gBACjB,OAASrW,EAAM4R,GAASA,EAAMC,OAAQ7R,GAAQ4R,IAAW,MAI7DyD,iCAAA,SAAqB3E,GACjB,OAAOU,GAAkBjQ,KAAMuP,EAAW,SAAEtG,EAAQpK,GAAS,OAAAoK,EAAOyM,mBAAoB7W,MAI5FqV,iCAAA,SAAqB1D,GACT,IAAA0E,EAAoBlV,qBAC5BkV,GAAmBA,EAAgBtE,UAAWJ,EAAUxQ,OAI5DkU,qBAAA,SAASrV,GACL,OAAQmB,KAAK0V,mBAAoB7W,IAGrCqV,qBAAA,WAAqB,OAAOlU,KAAK0L,KACjCwI,sBAAA,WAAY,OAAOlU,KAAK0L,KAGxBwI,0BAAA,WACY,IAAAxW,EAAcsC,KAAKtB,iBAC3B,GAAa,aAAThB,EAAsB,OAAOA,GAnQnBwW,SALrBxM,EACAP,EAAY,CACTgN,SAAW1K,EAAWxL,QAEzB4I,EAAQiE,KACaoJ,KAgGlB,YAAaxI,GA5Cb1L,kBAAoB,GAIpBA,mBAAyB,EAIzBA,cAAiC,KAIjCA,iBAAiB,EAKjBA,oBAAqB,EAmJrBA,2BAAqC,EAvHjCA,KAAK0L,IAAM1L,KAAK2V,UAAYjK,MAiPvBiJ,GAAiB,CAG1BC,eAAO3L,GACH,OAAOA,EAAO2M,eAAyB3M,EAAO2M,cAAe,IAMjEC,qBAAa5M,EAAwB0F,GAEjC,IAAMmH,GAASnH,EAAQoH,OASvB,OARID,IAAQ7M,EAAO+M,SAAWrH,GAG9B1F,EAAO8L,aAAe,GAGtB9L,EAAOwM,sBAAmB,EAEnBK,GAMXjB,gBAAQ5L,EAAwBgN,GAC5B,IAAIC,EAAkBjN,EAAO+M,SAE7B,GAAIE,EAAiB,CAEjB,KAAOjN,EAAO+M,UAAU,CACpB,IAAMrH,EAAU1F,EAAO+M,SACvB/M,EAAO+M,SAAW,KAClBxS,GAAUyF,EAAQA,EAAOuL,iBAAkBvL,EAAQ0F,EAASsH,GAIhEhN,EAAO2M,cAAe,EAGd,IAAAtB,EAAWrL,SACfqL,GAAUA,IAAiB2B,GAC3B3B,EAAO6B,kBAAmBlN,EAAQiN,QAKtCjN,EAAO+M,SAAW,KAClB/M,EAAO2M,cAAe,GAU9BQ,gBAAQC,EAAeC,EAAuBzX,GAC1C,GAAIyX,EAAMhC,OAAS,MAAM,IAAIiC,eAAgB,oEAE7CD,EAAMhC,OAAS+B,EACfC,EAAM/B,UAAY1V,GAKtB2X,cAAMH,EAAeC,GACbD,IAAUC,EAAMhC,SAChBgC,EAAMhC,YAAS,EACfgC,EAAM/B,eAAY,KClctB,IAAQkC,GAA+C9B,SAAzB+B,GAAyB/B,eAAXE,GAAWF,UAEvDnR,GAAauQ,WA6CL4C,GAAcC,EAA8BlZ,EAAeO,GAEvE,IAAMyW,EAAUE,GAAOgC,GACjBjI,EAAU,GAGZiI,EAAOC,YAAanZ,GAAOoZ,SAAU7Y,EAAO2Y,EAAQjI,KAEpDkH,GAAae,EAAQjI,GACrBnL,GAAUoT,EAAQ,UAAYlZ,EAAMkZ,EAAQA,EAAOG,WAAYrZ,GAAQiR,IAI3E+F,GAAUG,GAAQ+B,GAGtB,SAAShC,GAAOgC,GACZ,QAAIH,GAAQG,KACRA,EAAOI,oBAAsB,IAAIJ,EAAOK,eAAgBL,EAAOG,cAC/DH,EAAOM,mBAAqB,OAOpC,SAASrB,GAAae,EAA8BjI,GAMhD,OAJIiI,EAAOM,qBACPN,EAAOM,mBAAqB,MAGzBR,GAAcE,EAAQjI,GAe1B,IAAMwI,GAAmB,CAE5BrC,qBAAyC/V,EAA8C4P,GACnF,IAAM+F,EAASE,GAAO5U,MACtBjB,EAAIqF,KAAMpE,KAAMA,MAChB0U,GAAUG,GAAQ7U,OAItBmW,2BAAmBG,EAAuB3H,GAC9B,IAAA4F,EAAc+B,YAChBc,EAAYpX,KAAK6W,YAAatC,GAE/B6C,IAA6DA,EAAUC,kBAAmBrX,KAAKsX,qBAAsB/C,EAAW5F,IAIzI2I,8BAAsBzY,EAAc8P,gBAAAA,MAEhC,IAAM+F,EAASE,GAAO5U,MAElB6V,GAAa7V,KAAM2O,IACnBnL,GAAUxD,KAAM,UAAYnB,EAAKmB,KAAMA,KAAK+W,WAAYlY,GAAO8P,GAGnE+F,GAAUG,GAAQ7U,OAGtBuX,4BAAgDC,EAAe7I,gBAAAA,MAC3D,IAMI8I,EANE/C,EAASE,GAAO5U,MACd0X,EAAqB,GACrBhH,EAA6B,GAC3BmG,EAAgB7W,iBAClB6T,EAASlF,EAAQgJ,MAAQ3X,KAAK2X,MAAOH,EAAU7I,GAAY6I,EAInE,GAAII,GAAkB5X,KAAM6T,EAAQlF,GAAW,CAC3C,IAAK,IAAIlN,KAAQoS,EAAQ,CACrB,IAAMxM,EAAOwP,EAAapV,GAEtB4F,EACIA,EAAKyP,SAAUjD,EAAQpS,GAAQzB,KAAM2O,EAAS+B,IAC9CgH,EAAQlV,KAAMf,IAILgW,EAAbA,GAAuB,IACfjV,KAAM,WAAKf,QAIvBgW,GACAI,GAAqB7X,KAAMyX,EAAS,CAAE5D,UAAUlF,GAIxD,GAAI+I,EAAQ7Z,QAAUgY,GAAa7V,KAAM2O,GACrC,OAAO,IAAImJ,GAAkB9X,KAAM0U,EAAQhE,EAAQgH,GAIvD,IAA+B,QAAAK,IAAA1W,WAAAA,IAAQ,MAChBwT,OAAQ7U,MAG/B0U,GAAUG,GAAQ7U,iBAIV6X,GAAqBjB,EAA8Ba,EAAoB/K,EAAOiC,GAC1FiI,EAAOoB,KAAM,OAAQ,sBAAuB,+BAAyBP,EAAQpK,KAAK,uBAAsBX,EAAOiC,EAAQnB,iBA+B3GoK,GAAkBhB,EAA8B/C,EAAiBlF,GAC7E,MAAiD,oBAA7CxQ,OAAOE,UAAUuO,SAASxI,KAAMyP,KAEpC+C,EAAOoB,KAAM,QAAS,uBAAwB,qCAAsC,CAAEnE,UAAUlF,EAAQnB,SACjG,GAKX,QAQIsK,oBAAA,SAAQ7B,GAIJ,IAHM,IAAEvF,EAA4B1Q,YAApBiJ,EAAoBjJ,YAAZ0X,EAAY1X,iBAGZiY,IAAA5W,WAAAA,SACRwT,OAAQ5L,GAMxB,IADQ,IAAA8N,EAAyB9N,aAAb+M,EAAa/M,eACjBiP,IAAAC,WAAAA,IAAS,CAApB,IAAItZ,OACL2E,GAAUyF,EAAQ,UAAYpK,EAAKoK,EAAQ8N,EAAYlY,GAAOmX,GAGlEhW,KAAK0U,QAAUG,GAAQ5L,EAAQgN,QArBnC,YAAoBhN,EACAyL,EACAhE,EACAgH,GAHA1X,YAAAiJ,EACAjJ,YAAA0U,EACA1U,YAAA0Q,EACA1Q,aAAA0X,MC/MhBtX,GAAoBgY,EAkCtBC,GAAoC,OAgBtCC,0BAAA,SAAcvU,EAAMJ,EAAMgL,KAK1B2J,uBAAA,SAAW3U,EAAYI,EAAYwU,EAA6B5J,GAAuC,OAAOhL,GAG9G2U,qBAAA,SAAS3U,EAAYI,EAAYwU,EAA6B5J,GAAuC,OAAOhL,GAK5G2U,uBAAA,SAAWjY,EAASC,GAChB,OAAOF,GAAUC,EAAGC,IAMxBgY,0BAAA,SAAc3U,EAAYI,EAAYwU,EAA6B5J,KAOnE2J,oBAAA,aAIAA,mBAAA,SAAOra,EAAa2Y,GAChB,OAAO3Y,GAGXqa,qBAAA,SAAS1B,EAA8B3Y,GACnC+B,KAAKwY,kBAAc,EAAQva,EAAO2Y,EAAQyB,KAG9CC,sBAAA,SAAU1B,EAA8B3Y,EAAaY,KAErDyZ,oBAAA,SAAQra,EAAOY,EAAK8P,GAChB,OAAO1Q,GAASA,EAAMwa,OAASxa,EAAMwa,OAAQ9J,GAAY1Q,GAG7Dqa,2BAAA,WACI,OAAOtY,KAAK0Y,MAAQ1Y,KAAK0Y,KAAKra,qBAAqB6V,IAGvDoE,sCAAA,WACU,IAAE5a,EAAkBsC,UAAZ2Y,EAAY3Y,aAE1B,GAAa,OAATtC,EACA,MAAO,CAEHqU,aAAK9T,GACD0Y,GAAc3W,KAAMtC,EAAMO,IAI9B6J,IACI6Q,EACI,WACI,OAAOA,EAAQvU,KAAMpE,KAAMA,KAAK+W,WAAYrZ,GAAQA,IAExD,WAAa,OAAOsC,KAAK+W,WAAYrZ,IAG7CuM,cAAe,IAY3BqO,wBAAA,SAAY5a,EAAeiR,KAI3B2J,oBAAA,SAAQra,EAAO2Y,EAA8BjI,GACzC,IAAMiK,OAAc,IAAV3a,EAAmB+B,KAAKwS,eAAiBvU,EAC/CqB,EAAIU,KAAKP,UAAWmZ,OAAG,EAAQhC,EAAQjI,GAG3C,OADA3O,KAAKwY,aAAclZ,OAAG,EAAQsX,EAAQjI,GAC/BrP,GAGXgZ,sBAAA,SAAUra,EAAO2Y,EAA8BjI,EAA8B+B,GACjE,IAAAhT,EAASsC,UACX+W,EAAeH,aACf7S,EAAOgT,EAAYrZ,GAEnBiG,EAAO3D,KAAKP,UAAWxB,EAAO8F,EAAM6S,EAAQjI,GAGlD,OAFAoI,EAAYrZ,GAASiG,IAEjB3D,KAAK6Y,UAAWlV,EAAMI,KAEtB/D,KAAKwY,aAAc7U,EAAMI,EAAM6S,EAAQjI,IAChC,IAQL2J,kBAAV,SAAgBhM,EAAkBwM,EAAeC,EAAe9a,EAAO2Y,EAA8BpJ,GACjGoJ,EAAOoB,KAAM1L,EAAOwM,EAAM,UAAGlC,EAAOxB,2BAAmBpV,KAAKtC,iBAAUqb,GAAS,CAC3EC,YAAc/a,EACdgb,cAAgBrC,EAAOG,WAAY/W,KAAKtC,OACzC8P,IAGP8K,0BAAA,WACI,OAAOtY,KAAK/B,WAGhB,YAAoBP,EAAewb,GAAflZ,UAAAtC,EAgFpBsC,aAA2C,KA9EvCA,KAAK2O,QAAUuK,EAGf,IAAMvK,KAA+BwK,SAAW,GAAIC,WAAa,GAAIC,eAAiB,IAAOH,GAC7FvK,EAAQwK,SAAWxK,EAAQwK,SAASpW,QACpC4L,EAAQyK,WAAazK,EAAQyK,WAAWrW,QACxC4L,EAAQ0K,eAAiB1K,EAAQ0K,eAAetW,QAGtC,IAAA9E,EAEA0Q,QAFO+J,EAEP/J,OAFagJ,EAEbhJ,QAFoB8J,EAEpB9J,SAF4B2K,EAE5B3K,eADAmC,EACAnC,WADUwK,EACVxK,WADoByK,EACpBzK,aADgC0K,EAChC1K,iBA2CV,GAxCA3O,KAAK/B,MAAQA,EACb+B,KAAK0Y,KAAQA,GAGR/J,EAAQ4K,kBAAoBb,EAC7B1Y,KAAKwS,aAAexS,KAAKa,OAEpB2Y,EAAmBvb,GAExB+B,KAAKwS,aAAe,IAAIzC,SAAU,iBAAWzC,KAAKC,UAAWtP,SAG7D+B,KAAKwS,aAAexS,KAAKwS,aAI7BxS,KAAKqX,kBAAoC,IAAjBiC,EAExBtZ,KAAKyY,YAAoB,IAAXA,EAAoBzY,KAAKyY,OAASA,EAEhDzY,KAAK8Q,SAAWA,GAAY9Q,KAAK8Q,SAE7BnC,EAAQ8K,aACRzZ,KAAK8Q,SAiEjB,SAAyBA,GACrB,OAAO,SAAU8F,EAA8B3Y,EAAaY,GACxD,OAAOZ,EAAQ6S,EAAS1M,KAAMpE,KAAM4W,EAAQ3Y,EAAOY,GAAQ,YAnEvC6a,CAAgB1Z,KAAK8Q,WAQzCsI,EAAWpQ,QAAShJ,KAAK2Z,SAGrB3Z,KAAK8H,KAAMqR,EAASnQ,QAAShJ,KAAK8H,KAGtC9H,KAAK6L,WAAWzH,KAAMpE,KAAM2O,GAGxBwK,EAAStb,OAAQ,CACjB,IAAM+b,EAAU5Z,KAAK2Y,QAAUQ,EAASU,OAAQC,IAExCC,EAAa/Z,cACrBA,KAAK8Q,SAAW,SAAU8F,EAA8B3Y,EAAaY,GACjE,OAAOkb,EAAS3V,KAAMpE,KAAM4W,EAAQgD,EAAQxV,KAAMwS,EAAQ3Y,EAAOY,GAAOA,IAIhFmB,KAAKP,UAAY2Z,EAAWvb,OAASub,EAAWS,OAAQG,IAAoBha,KAAKP,UAEjFO,KAAKwY,aAAea,EAAexb,OAASwb,EAAeQ,OAAQI,IAAwBja,KAAKwY,aAG1F,IAAE0B,EAAqBla,YAAb8W,EAAa9W,cAC7BA,KAAKka,OAASvC,EAAQ,SAAU1Z,EAAO2Y,EAA8BjI,GACjE,OAAOuL,EAAO9V,KAAMpE,KAAM2O,EAAQgJ,YAAmB,IAAV1Z,EAAmB0Z,EAAMvT,KAAMwS,EAAQ3Y,EAAO+B,KAAKtC,MAASO,EAAO2Y,EAAQjI,IACtHuL,EAEJla,KAAK8W,SAAWa,EAAQ,SAAU1Z,EAAO2Y,EAA8BjI,EAA8B+B,GACjG,OAAOoG,EAAS1S,KAAMpE,KAAM2O,EAAQgJ,YAAmB,IAAV1Z,EAAmB0Z,EAAMvT,KAAMwS,EAAQ3Y,EAAO+B,KAAKtC,MAASO,EAAO2Y,EAAQjI,EAAS+B,IACjIoG,EAQZ,SAASgD,GAAeK,EAAoBC,GACxC,OAAO,SAAUnc,EAAOP,GACpB,OAAO0c,EAAShW,KAAMpE,KAAMma,EAAS/V,KAAMpE,KAAM/B,EAAOP,GAAQA,IAIxE,SAASsc,GAAiBK,EAA2BC,GACjD,OAAO,SAAU3W,EAAMI,EAAM6S,EAAQjI,GACjC,OAAO2L,EAAclW,KAAMpE,KAAMqa,EAAcjW,KAAMpE,KAAM2D,EAAMI,EAAM6S,EAAQjI,GAAW5K,EAAM6S,EAAQjI,IAIhH,SAASsL,GAAqBM,EAA6BC,GACvD,OAAO,SAAU7W,EAAMI,EAAM6S,EAAQjI,GACjC4L,EAAYnW,KAAMpE,KAAM2D,EAAMI,EAAM6S,EAAQjI,GAC5C6L,EAAYpW,KAAMpE,KAAM2D,EAAMI,EAAM6S,EAAQjI,eCvQZlJ,QAAA6S,IAGpCmC,oBAAA,WACI,OAAO,IAAIza,KAAK0Y,MAGpB+B,qBAAA,SAAS9W,GACL,OAAe,MAARA,GAAgBA,aAAgB3D,KAAK0Y,KAAO/U,EAAO,IAAI3D,KAAK0Y,KAAM/U,IAG7E8W,oBAAA,SAAQxc,EAAOY,EAAe8P,GAC1B,OAAO1Q,GAASA,EAAMwa,OAASxa,EAAMwa,OAAQ9J,GAAY1Q,GAG7Dwc,mBAAA,SAAOxc,GACH,OAAO,IAAI+B,KAAK0Y,KAAM1Y,KAAKyY,OAAQxa,KAGvCwc,uBAAA,SAAWpa,EAAGC,GACV,OAAOD,IAAMC,OApBrB,0EA6BmCmF,QAAA6S,IAG/BoC,qBAAA,aACAA,oBAAA,WAAW,OAAO1a,KAAK0Y,QAEvBgC,oBAAA,SAAQzc,GAAU,OAAOA,GAEzByc,qBAAA,SAAS/W,GAAS,OAAe,MAARA,EAAeA,EAAO3D,KAAK0Y,KAAM/U,IAE1D+W,uBAAA,SAAWra,EAAGC,GAAM,OAAOD,IAAMC,GAEjCoa,mBAAA,SAAOzc,GAAU,OAAOA,GAExByc,oBAAA,SAAQzc,EAAO2Y,EAA8BjI,GACzC,OAAO3O,KAAKP,eAAqB,IAAVxB,EAAmB+B,KAAK/B,MAAQA,OAAO,EAAQ2Y,EAAQjI,IAGlF+L,sBAAA,SAAUzc,EAAO2Y,EAAQjI,EAAS+B,GACpB,IAAAhT,EAASsC,UACT+W,EAAeH,aACjB7S,EAAOgT,EAAYrZ,GAE3B,OAAOqG,KAAWgT,EAAYrZ,GAASsC,KAAKP,UAAWxB,EAAO8F,EAAM6S,EAAQjI,KAGhF+L,wBAAA,WACS1a,KAAK2O,QAAQ4K,mBACdvZ,KAAK/B,MAAQ+B,KAAK0Y,aA5B9B,0EAmCiCjT,QAAAiV,IAG7BC,oBAAA,WACI,OAAO,GAGXA,qBAAA,SAAShX,EAAMI,EAAO6S,EAASjI,GAC3B,IAAMiM,EAAc,MAARjX,EAAeA,EAAO3D,KAAK0Y,KAAM/U,GAM7C,OAJIiX,GAAQA,GACR5a,KAAKgY,KAAM,QAAS,uBAAwB,sDAAuDrU,EAAMiT,EAAQjI,EAAQnB,QAGtHoN,GAGXD,sBAAA,SAAUpC,EAAOta,EAAOP,GAEpB,GAAa,MAATO,IAAkB4c,SAAU5c,GAC5B,OAAOP,EAAO,4BApB1B,0EA6B+B+H,QAAA6S,IAC3BwC,oBAAA,SAAQ7c,GAAU,OAAOA,GACzB6c,qBAAA,aACAA,oBAAA,WAAU,MAAO,IAEjBA,qBAAA,SAASnX,EAAMI,EAAM6S,EAAQjI,GAEzB,OAAY,MAARhL,GAAgBrF,MAAMqK,QAAShF,GAAgBA,GAEnD3D,KAAKgY,KAAM,QAAS,sBAAuB,gDAAiDrU,EAAMiT,EAAQjI,EAAQnB,QAE3G,KAGXsN,mBAAA,SAAO7c,GACH,OAAOA,GAASA,EAAM8E,aAf9B,0EAmBgC0C,QAAA6S,IAC5ByC,oBAAA,WAAU,MAAO,IAEjBA,qBAAA,SAASpX,EAAMI,EAAM6S,EAAQjI,GACzB,OAAY,MAARhL,GAAgC,iBAATA,EAA2BA,GAEtD3D,KAAKgY,KAAM,QAAS,uBAAwB,qDAAsDrU,EAAMiT,EAAQjI,EAAQnB,QACjH,SAPf,wEAWgBwN,iBAEkBvV,QAAA6S,IAE9B2C,oBAAA,SAAQhd,KACRgd,oBAAA,WAAU,OAAOD,IACjBC,qBAAA,aAEAA,qBAAA,SAAStX,EAAMI,EAAM6S,EAAQjI,GAEzB,OAAY,MAARhL,GAAgC,mBAATA,EAA6BA,GAExD3D,KAAKgY,KAAM,QAAS,yBAA0B,sDAAuDrU,EAAMiT,EAAQjI,EAAQnB,QAEpHwN,KAIXC,mBAAA,SAAOhd,GAAS,OAAOA,OAhB3B,0EC/H8BwH,QAAA6S,IAC1B4C,oBAAA,WACI,OAAO,IAAIhb,MAGfgb,qBAAA,SAASvX,EAAYtD,EAAGuW,EAAQjI,GAC5B,GAAY,MAARhL,GAAgBA,aAAgBzD,KAAO,OAAOyD,EAElD,IAAMwX,EAAO,IAAIjb,KAAMyD,GACjByX,EAAYD,EAAKE,UAMvB,OAJID,GAAcA,GACdpb,KAAKgY,KAAM,QAAS,qBAAsB,4CAA6CrU,EAAMiT,EAAQjI,EAAQnB,QAG1G2N,GAGXD,sBAAA,SAAU3C,EAAOta,EAAOP,GACpB,GAAa,MAATO,EAAe,CACf,IAAMmd,EAAYnd,EAAMod,UACxB,GAAID,GAAcA,EAAY,OAAO1d,EAAO,qBAIpDwd,oBAAA,SAAQjd,GAAU,OAAOA,GAASA,EAAMqd,eAExCJ,uBAAA,SAAW7a,EAAGC,GAAM,OAASD,GAAKA,EAAEgb,cAAkB/a,GAAKA,EAAE+a,YAE7DH,oBAAA,SAAQjd,EAAO2Y,EAA8BjI,GAEzC,OAAO3O,KAAKP,eAAqB,IAAVxB,EAAmB+B,KAAKwS,eAAiBvU,OAAO,EAAQ2Y,EAAQjI,IAG3FuM,sBAAA,SAAUjd,EAAO2Y,EAAQjI,EAAS+B,GACpB,IAAAhT,EAASsC,UACT+W,EAAeH,aACjB7S,EAAOgT,EAAYrZ,GAG3B,OAAOsC,KAAK6Y,UAAW9U,EAAOgT,EAAYrZ,GAASsC,KAAKP,UAAWxB,EAAO8F,EAAM6S,EAAQjI,KAG5FuM,mBAAA,SAAOjd,GAAU,OAAOA,GAAS,IAAIiC,KAAMjC,EAAMod,YACjDH,qBAAA,iBA5CJ,+DAgDA,SAASK,GAAcJ,GACnB,OAAQK,MAAO,IAAMtb,KAAMib,GAASE,WAGnCE,GAAa,0BACbA,GAAa,2BACbA,GAAa,4BACbA,GAAa,6BACbA,GAAa,mCAEdL,GAAS7c,UAAUsb,QAAU,SAAU1b,GACnC,OAAgB,MAATA,GAAiBA,aAAiBiC,KAAOjC,EAAQ,IAAIiC,KAOpE,SAAwBib,GACpB,IAAIC,EAAWK,EAAgBC,EAAgB,EAE/C,GAAMD,EAASE,GAAeC,KAAMT,GAAU,CAE1C,IAAK,IAAWU,EAAP/d,EAAI,EAAQ+d,EAAIC,GAAahe,KAASA,EAC3C2d,EAAQI,IAAOJ,EAAQI,IAAO,EAIlCJ,EAAQ,KAAQA,EAAQ,IAAO,GAAK,EACpCA,EAAQ,IAAOA,EAAQ,IAAO,EAEV,MAAhBA,EAAQ,SAA+BlJ,IAAhBkJ,EAAQ,KAC/BC,EAA+B,GAAfD,EAAQ,IAAYA,EAAQ,IAExB,MAAhBA,EAAQ,KACRC,EAAgB,EAAIA,IAI5BN,EACIlb,KAAK6b,IAAKN,EAAQ,GAAKA,EAAQ,GAAKA,EAAQ,GAAKA,EAAQ,GAAKA,EAAQ,GAAMC,EAAeD,EAAQ,GAC3FA,EAAQ,SAGpBL,EAAYlb,KAAKyX,MAAOwD,GAG5B,OAAOC,EApC+DY,CAAe/d,MAIzF,IAAM6d,GAAiB,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,GAAI,IACtCH,GAAiB,qICvEf,OAAAnF,GAAiB7B,QAAXyB,GAAWzB,cAEWlP,QAAA6S,IAGhC2D,mBAAA,SAAOhe,GACH,OAAOA,EAAQA,EAAMmT,QAAUnT,GAGnCge,oBAAA,SAAQ3c,EAAGT,EAAc8P,GAAoB,OAAOrP,GAAKA,EAAEmZ,OAAQ9J,IAEnEsN,oBAAA,SAAQhe,EAAO2Y,EAA8BjI,GACzC,IAAMiK,EAAIjK,EAAQyC,MAAQpR,KAAKoR,MAAOnT,QACxB,IAAVA,EAAmB+B,KAAKwS,eAAiBvU,EAGvCqB,EAAIU,KAAKP,UAAWmZ,OAAG,EAAQhC,EAAQjI,GAE7C,OADA3O,KAAKwY,aAAclZ,OAAG,EAAQsX,EAAQjI,GAC/BrP,GAGX2c,sBAAA,SAAUhe,EAAO2Y,EAAQjI,EAAS+B,GACxB,IAEF0B,EAFEvT,EAAMmB,KAAKtC,KAAQqZ,EAAeH,aAClC7S,EAAOgT,EAAYlY,GAIzB,GAAIuT,EAASpS,KAAKkc,aAAcnY,EAAM9F,EAAO0Q,GAAY,CACrD,IAAMwN,EAAoBpY,EAAKwT,mBAAoBnF,EAAQzD,GAE3D,SAAIwN,IACIzL,EACAA,EAAOlO,KAAM2Z,GAGbA,EAAkBtH,OAAQ+B,IAG1B5W,KAAKqX,mBAMjB,IAAM1T,EAAO3D,KAAKP,UAAWxB,EAAO8F,EAAM6S,EAAQjI,GAGlD,OAFAoI,EAAYlY,GAAQ8E,IAEhB3D,KAAK6Y,UAAWlV,EAAMI,KAEtB/D,KAAKwY,aAAc7U,EAAMI,EAAM6S,EAAQjI,IAEhC,IAMfsN,0BAAA,SAAclY,EAAsBJ,EAAYgL,GAE5C,GAAI5K,GAAgB,MAARJ,EAAc,CACtB,KAAIA,aAAgB3D,KAAK0Y,MAKrB,OAAO/U,EAHP,GAAIgL,EAAQ5H,MAAQ,OAAOpD,EAAKwJ,kBAQ5C8O,qBAAA,SAAStY,EAAYI,EAAY6S,EAA8BjI,GAE3D,OAAY,MAARhL,EAAsBA,EAEtBA,aAAgB3D,KAAK0Y,OACjB/U,EAAKyY,SAAczY,EAAKyY,QAAUtI,gBAAcuI,YAChDrc,KAAKgY,KAAM,QAAS,2BAA4B,0EAA2ErU,EAAMiT,EAAQjI,EAAQnB,QAKjJmB,EAAQ5H,MAAepD,EAAKyN,QAE5BzN,EAAK2Q,QACLtU,KAAKgY,KAAM,OAAQ,sBAAuB,kGAAmGrU,EAAMiT,EAAQjI,EAAQnB,QAC5J7J,EAAKyN,SAGTzN,GAGF3D,KAAK0Y,KAAa7X,OAAQ8C,EAAMgL,IAG7CsN,qBAAA,SAAUrF,EAA8B3Y,GAChCA,GACA+B,KAAKwY,kBAAc,EAAQva,EAAO2Y,EAAQ,KAIlDqF,sBAAA,SAAUrF,EAA8B3Y,GACpC,IAAIwS,EAAQxS,GAASA,EAAMiX,gBAC3B,GAAIzE,EAAQ,OAAOA,GAGvBwL,oBAAA,WACI,OAAajc,KAAK0Y,KAAM7X,UAG5Bob,wBAAA,SAAYtN,GACRA,EAAQ0K,eAAerQ,QAAShJ,KAAKsc,gBAGzCL,2BAAA,SAAetY,EAAsBI,EAAsB6S,EAA8BjI,GACjF5K,IACAyS,GAAMI,EAAQ7S,GACd4K,EAAQ4N,OAASxY,EAAKyY,WAGtB7Y,GAAOyS,GAAQQ,EAAQjT,EAAM3D,KAAKtC,WArH9C,+DCDQ,OAAAkF,GAAYoR,EAARlR,GAAQmR,EACduC,GAAiB7B,QAAXyB,GAAWzB,UAUjB8H,GAAiB3I,gBAAc4I,OAAS5I,gBAAc6I,UAG5BlX,QAAA6S,IAG3BsE,oBAAA,SAAQ3e,EAAO2Y,EAA8BjI,GAC1C,IAAMiK,EAAIjK,EAAQyC,MAAQpR,KAAKoR,MAAOnT,EAAO2Y,QAC/B,IAAV3Y,EAAmB+B,KAAKwS,eAAiBvU,EAGvCqB,EAAIU,KAAKP,UAAWmZ,OAAG,EAAQhC,EAAQjI,GAE7C,OADA3O,KAAKwY,aAAclZ,OAAG,EAAQsX,EAAQjI,GAC/BrP,GAGXsd,sBAAA,SAAU3e,EAAO2Y,EAAQjI,EAAS+B,GACxB,IAEF0B,EAFEvT,EAAMmB,KAAKtC,KAAQqZ,EAAeH,aAClC7S,EAAOgT,EAAYlY,GAIzB,GAAIuT,EAASpS,KAAKkc,aAAcnY,EAAM9F,EAAO0Q,GAAY,CACrD,IAAMwN,EAAoBpY,EAAKwT,mBAAoBnF,EAAQzD,GAC3D,SAAIwN,IACIzL,EACAA,EAAOlO,KAAM2Z,GAGbA,EAAkBtH,OAAQ+B,IAG1B5W,KAAKqX,mBAMjB,IAAM1T,EAAO3D,KAAKP,UAAWxB,EAAO8F,EAAM6S,EAAQjI,GAGlD,OAFAoI,EAAYlY,GAAQ8E,IAEhB3D,KAAK6Y,UAAWlV,EAAMI,KAEtB/D,KAAKwY,aAAc7U,EAAMI,EAAM6S,EAAQjI,IAEhC,IAMfiO,mBAAA,SAAO3e,EAAuB2Y,GAE1B,IAAK3Y,GAASA,EAAMqW,SAAWsC,EAAS,OAAO3Y,EAG/C,IAAMmT,EAAQnT,EAAMmT,QAEpB,OADAgF,GAAQQ,EAAQxF,EAAOpR,KAAKtC,MACrB0T,GAIXwL,oBAAA,aAEAA,0BAAA,SAAc7Y,EAAsBJ,EAAYgL,GAE5C,GAAI5K,GAAgB,MAARJ,KAAmBA,aAAgB3D,KAAK0Y,MAChD,OAAO/U,GAIfiZ,qBAAA,SAASjZ,EAAYI,EAAY6S,EAA8BjI,GAC3D,GAAY,MAARhL,GAAgBA,aAAgB3D,KAAK0Y,KAAO,OAAO/U,EAGvD,IAAMkZ,EAAiB,IAAM7c,KAAK0Y,KAAe/U,EAAMgL,EAAS8N,IAKhE,OAFArG,GAAQQ,EAAQiG,EAAgB7c,KAAKtC,MAE9Bmf,GAIXD,sBAAA,SAAUrE,EAAOta,EAAOP,KAGxBkf,oBAAA,WACI,OAAO,MAIXA,2BAAA,SAAejZ,EAAsBI,EAAsB6S,EAA8BjI,GACjF5K,IAEIA,EAAKuQ,SAAWsC,GAChBJ,GAAMI,EAAQ7S,GACd4K,EAAQ4N,OAASxY,EAAKyY,WAGtB1Z,GAAKiB,EAAMA,EAAKyQ,iBAAkBxU,KAAK8c,UAAWlG,IAItDjT,GAEIA,EAAK2Q,SAAWsC,GAChBhU,GAAIe,EAAMA,EAAK6Q,iBAAkBxU,KAAK8c,UAAWlG,IAK7DgG,qBAAA,SAAShG,EAA8B3Y,GAC/BA,GACA+B,KAAKwY,kBAAc,EAAQva,EAAO2Y,EAAQ,KAMlDgG,wBAAA,SAAYjO,GAER,IAAMyI,EAAYpX,KAClBA,KAAK8c,UAAY9c,KAAKqX,iBAAmB,SAAUf,EAAO3H,EAASsH,GAC/DjW,OAASiW,GAAajW,KAAKsX,qBAAsBF,EAAU1Z,KAAMiR,IACjEzF,GAEJyF,EAAQ0K,eAAerQ,QAAShJ,KAAKsc,oBA5H7C,+DAgIA,SAASpT,MCpIT,IAAM6T,GAAwB,CAAEC,OAAQC,OAAQ9K,QAASjS,KAAM/B,OAAQG,MAAOyR,UACxEmN,GAAY,CAAExC,GAAeC,GAAaD,GAAeQ,GAAUH,GAAYD,GAAWG,aAEhFkC,GAAajV,GACzB,OAASA,EAAckV,WAU3B,SAA0BlV,GACtB,IAAMmV,EAAMN,GAAS/W,QAASkC,GAC9B,OAAOmV,EAAM,EAAI5C,GAAqByC,GAAWG,GAZbC,CAAiBpV,GAGzDoQ,GAAQzX,OAAS,SAAE8N,EAA4BjR,GAC3C,IAAMgb,EAAO/J,EAAQ+J,KAGrB,OAAO,IAFe/J,EAAQyO,YAAe1E,EAAOyE,GAAazE,GAAQJ,KAE/C5a,EAAMiR,ICb5B,IAAAjP,GAAW6d,MAuCfC,mBAAA,SAAOC,EAAwBhN,GAC3B,SAASK,EAAUyH,EAAOta,EAAOP,GAC7B,IAAK+f,EAAMrZ,KAAMmU,EAAOta,EAAOP,GAAQ,CACnC,IAAM+O,EAAMgE,GAASgN,EAAMhN,OAAS/S,EAAO,gBAC3C,MAAsB,mBAAR+O,EAAqBA,EAAIrI,KAAMmU,EAAO7a,GAAS+O,GAIrE,IAAM1I,EAAO/D,KAAK2O,QAAQmC,SAE1B,OAAO9Q,KAAK0d,SAAS,CACjB5M,SAAW/M,WACewU,EAAOta,EAAOP,GACpB,OAAOqG,EAAMwU,EAAOta,EAAOP,IAAUoT,EAAUyH,EAAOta,EAAOP,IAElEoT,KAIvB3S,sBAAIqf,uBAAJ,WACI,OAAOnV,EAAqB,aAAcrI,uCAG9C7B,sBAAIqf,+BAAJ,WACI,OAAOxd,KAAK2d,0CAGhBxf,sBAAIqf,6BAAJ,WACI,OAAOxd,KAAK0d,SAAS,CAAEjE,YAAa,qCAGxC+D,sBAAA,SAAUrJ,GACN,OAAOnU,KAAK0d,SAAS,CAAEvJ,cAG3BqJ,qBAAA,SAASI,GACL,OAAO5d,KAAK0d,SAAS,CAAEZ,UAAYc,KAIvCJ,mBAAA,SAAOze,GACH,OAAOiB,KAAK0d,SAAS,CAAE/F,MAAQ5Y,KAGnCye,oBAAA,SAAQze,GACJ,OAAOiB,KAAK0d,SAAS,CACjBjF,OAAwB,mBAAR1Z,EAAqBA,EAAQA,EAAM,SAAEO,EAAGuc,EAAGha,GAAO,OAAAvC,GAAKA,EAAEmZ,OAAQ5W,IAAMgc,MAI/F1f,sBAAIqf,6BAAJ,WACI,OAAOxd,KAAKyY,QAAQ,oCAGxBta,sBAAIqf,yBAAJ,WACI,OAAOxd,KAAK/B,MAAO,uCAIvBuf,iBAAA,SAAKze,GACD,OAAOiB,KAAK0d,SAAS,CACjBvE,SAAWnZ,KAAK2O,QAAQwK,SAASlX,OAAQlD,MAKjDye,iBAAA,SAAKze,GAUD,OAAOiB,KAAK0d,SAAS,CACjBtE,WAAapZ,KAAK2O,QAAQyK,WAAWnX,OAVzC,SAAwB0B,EAAMI,EAAM6S,EAA8BjI,GAC9D,GAAI3O,KAAK6Y,UAAWlV,EAAMI,GAAS,CAC/B,IAAM+Z,EAAU/e,EAAIqF,KAAMwS,EAAQjT,EAAM3D,KAAKtC,MAC7C,YAAmB,IAAZogB,EAAqB/Z,EAAO/D,KAAK2Z,QAASmE,EAAS/Z,EAAM6S,EAAQjI,GAG5E,OAAO5K,OAQfyZ,0BAAA,SAAc7Y,GACV,OAAO3E,KAAK0d,SAAS,CAAEpE,aAAe3U,KAI1C6Y,oBAAA,SAAQzb,GACJ,IAAMgc,EAAW,IAAIjc,EAAUC,GAQ/B,OAAO/B,KAAK0d,SAAS,CACjBrE,eAAiBrZ,KAAK2O,QAAQ0K,eAAepX,OAPjD,SAAmC0B,EAAMI,EAAM6S,GAC3C7S,GAAQA,EAAK+J,SAAWiQ,EAASC,YAAapH,EAAQ7S,GAEtDJ,GAAQA,EAAKmK,SAAWiQ,EAASE,UAAWrH,EAAQjT,QAS5DxF,sBAAIqf,wBAAJ,WACI,OAAOxd,sCAGXwd,sBAAA,SAAU7O,GACN,IAAMuP,EAAS,IAAIV,GAAwBxd,KAAK2O,SAEhD,OADAjP,GAAQwe,EAAOvP,QAASA,GACjBuP,GAGXV,mBAAA,SAAOle,GACH,OAAOU,KAAK0d,SAAS,CAAEzf,MAAQqB,EAAGia,kBAAmB,KAGlDiE,QAAP,SAAanW,GACT,OAAO,UA1HX,YAAasH,GAET3O,KAAK2O,QAAU,CAAEwK,SAAW,GAAIC,WAAa,GAAIC,eAAiB,IAC9D1K,GAAUjP,GAAQM,KAAK2O,QAASA,GA2H5C,SAASkP,eAEOnF,GAAuCyF,EAAsClgB,GACzF,GAAIkgB,aAAgBX,GAAyB,OAAOW,EAEpD,IAAMC,EAAU,IAAIZ,GAA0B,CAAE9E,KAAOyF,IACjD3L,EAAe2L,QAAkB,IAAVlgB,EAAmBkf,GAAagB,GAAO3L,aAAevU,EAEnF,YAAwB,IAAjBuU,EAA0B4L,EAAUA,EAAQngB,MAAOuU,YAG9C6L,GAAyC1W,GACrD,OAAO,IAAI6V,GAA0B,CACjCvf,MAAQ,KACRya,KAAO/Q,EACPyV,UAAYR,cAOJ3e,GAAuBqB,GACnC,IAAM6e,EAgBV,SAAoBlgB,GAChB,cAAeA,GACX,IAAK,SACD,OAAOgf,OACX,IAAK,SACD,OAAOD,OACX,IAAK,UACD,OAAO7K,QACX,IAAK,WACD,OAAOpC,SACX,IAAK,YACD,OACJ,IAAK,SACD,OAAO9R,EAAcA,EAAMS,iBAAc,GA7BpC4f,CAAWhf,GAKxB,OAHc6e,GAAQA,EAAK9f,qBAAqB6V,GAAgBmK,GAAQF,GAC1DzF,GAAMyF,IAELlgB,MAAOqB,OCnMb+P,GAAakP,OAAO,uBACpBb,GAAWa,OAAO,uBCmC/B,WAAmC9Y,QAAA0L,UAK/BqN,iBAAA,SAAKlf,GACDU,KAAKuY,MAAOvY,KAAKye,MAASnf,GAM9BnB,sBAAIqgB,+BAAJ,WACI,OAAOxe,KAAKuY,MAAM1B,YAAa7W,KAAKye,2CAZxC,YAAuBlG,EAAyBkG,EAAexgB,EAAiBygB,GAC5E,MAAA1R,aAAO/O,gBADYsL,QAAAgP,EAAyBhP,OAAAkV,EAAgClV,SAAAmV,aCjBpEC,GAAiBtX,EAAY3J,GACzC,OAAO4a,GAAQzX,OAAQ2c,GAAuBoB,KAAMvX,GAAOsH,QAASjR,YAIxDmhB,GAAuBC,EAA+BC,GAClE,IAAMC,EAAeC,EAAa,GAA4BH,EAAsBH,IAC9EO,EAAgBC,EAAY,GAA4BH,EAAcD,GAEtEK,WV2IyBC,GAC/B,IAAMC,EAAQnhB,OAAOuC,KAAM2e,GAErBpI,EAA6C,IAAIlH,SAAU,SAAU,oBACpEuP,EAAMvd,IAAK,SAAA0c,GAAO,MAAA,6BACTA,uBAAmBA,mBAC5BpR,KAAM,eAGb4J,EAAe5Y,UAAYF,OAAOE,UAElC,IAAMkhB,EAAqC,IAAIxP,SAAU,SAAU,SAAU,UAAW,gEAGjFuP,EAAMvd,IAAK,SAAA0c,GAAO,MAAA,6BACTA,uBAAmBA,6BAAyBA,sCACrDpR,KAAM,eAKb,OAFAkS,EAAWlhB,UAAYF,OAAOE,UAEvB,CAAEkhB,aAAYtI,kBUhKKuI,CAAmBN,GAE7C,kBACOE,IACHvI,YAAc,IAAIuI,EAAkBnI,eAAgBiI,GACpDO,iBAAmBthB,OAAOuC,KAAMwe,GAAgBnd,IAAK,SAAAlD,GAAO,OAAAqgB,EAAergB,KAC3EoM,WAAagU,EAAoC,GAAID,EAAc,SAAA1f,GAAK,OAAAA,EAAEogB,+BAUlF,SAA2BC,GACvB,IAAI3U,EAEJ,IAAK,IAAInM,KAAO8gB,EAAW,CACjB,IACA7C,EADY6C,EAAW9gB,GACC8P,kBAE1BmO,IACkB9R,EAAlBA,GAAiC,IAAI4U,GAExB1d,SAAU,UAAYrD,EACV,iBAAdie,EACH+C,GAAsB/C,EAAWje,GACjCihB,GAAahD,EAAWje,IAIxC,OAAOmM,EAAe,CAAEA,gBAAiB,GA1BlC+U,CAAkBf,KACrBxJ,WAAayJ,EAAa,GAAIC,EAAe,SAAAd,GAAW,OAAAA,EAAQzP,QAAQwF,aA4BhF,SAAS2L,GAAaE,EAASnhB,GAC3B,OAAO,SAAU+X,EAAQ3Y,GACrB+hB,EAAQ5b,KAAMwS,EAAQ3Y,EAAOY,IAIrC,SAASghB,GAAsBjC,EAAc/e,GACnC,IAAA2C,EAA2B,IAAIye,GAAmBrC,GAAK,GAArD9N,UAAO7B,YAAS2B,SACxB,OAAOE,EACH,SAAU8G,EAAQ3Y,GACd2Y,EAAQhH,GAAQ3R,EAAOY,IAE3B,SAAU+X,EAAQ3Y,GACdgQ,EAAS2I,GAAUhH,GAAQ3R,EAAOY,IDzB9CV,OAAOqI,eAAgBgY,GAAWngB,UAAW,eAAgB,CAAEJ,MAAQ,OACvEE,OAAOqI,eAAgBgY,GAAWngB,UAAW,QAAS,CAClDyJ,IAAM,WACF,OAAO9H,KAAKkgB,SAAYlgB,KAAKkgB,OAASlgB,KAAKuY,MAAM7C,mBAAoB1V,KAAKye,QAE9E1M,IAAM,SAAUzS,GACZU,KAAKkgB,OAAS5gB,KElDf,OAAM6gB,GAAe,CACxBC,cAAsBzR,GAAtB,wBAAsBA,MAClB,IAAMwF,EAAWnU,KAAKqgB,cAChBrL,EAAOhV,KAAKyY,UAAS6H,SAAW,QAAW3R,IAEjD,OAAOD,GACH1O,KACAA,KAAKugB,QACDpM,EAAStT,OAAQmU,EAAMrG,EAAS3O,MAChCmU,EAAS/B,OAAQpS,KAAKwgB,GAAIxL,EAAMrG,EAAS3O,MAC7C2O,EAEA,SAAAyD,GACI7I,EAAKwI,IAAKK,KACNuF,OAAQ,EACR2I,SAAW,QACR3R,OAMnB8R,eAAO9R,GAAP,WACI,oBADGA,MACID,GACH1O,KACAA,KAAKqgB,cAAcK,KAAM1gB,KAAKwgB,GAAI7R,EAAS3O,MAC3C2O,EAEA,SAAAqG,GAAQ,OAAAzL,EAAKwI,IAAKiD,KAAQ2C,OAAQ,EAAM2I,SAAW,SAAY3R,OAIvEgS,iBAAShS,GAAT,WACI,oBADKA,MACED,GACH1O,KACAA,KAAKqgB,cAAcM,QAAS3gB,KAAKwgB,GAAI7R,EAAS3O,MAC9C2O,EAEA,WACY,IAAAU,EAAe9F,aAQvB,OAPI8F,EACAA,EAAWiC,OAAQ/H,EAAMoF,GAGzBpF,EAAKiT,UAGFjT,MCrCf7J,GAAoB6d,EAAZ5e,GAAYiiB,EAWxBC,GAAuB,MAgCApb,QAAAyO,IAAd4M,YAKT,SAAiB1f,EAAYwF,KAEtBka,cAAP,SAAqDrC,EAA8BsC,gBAAAA,MACvE,IAAA/f,EAAYggB,EACpB,OAAOD,EACH,SAAE1gB,EAAGC,GAAO,OAAAU,EAASX,EAAGoe,GAAQne,EAAGme,KACnC,SAAEpe,EAAGC,GAAO,OAACU,EAASX,EAAGoe,GAAQne,EAAGme,MAU5CtgB,sBAAW2iB,cAAX,WAAA,WACI,OAAOpI,GAAM1Y,MACRyY,OAAQ,SAAAnZ,GAAK,OAAAA,EAAIA,EAAEkhB,GAAK,OACxB7I,MAAO,SAAArY,SACJ,aAAWiK,EAAKlL,UAAU4iB,aAAgB3hB,uCAI/CwhB,eAAP,SAAwExB,GACpE,OAAOtf,KAAKzC,SAAU+hB,IAGnBwB,YAAP,SAAiBxB,GACb,OAAOtf,KAAKkhB,OAAO,CAAEnK,WAAauI,KAYtCnhB,sBAAI2iB,sBAAJ,WACI,OAAO9gB,KAAKmhB,eAAkBnhB,KAAKmhB,aAAe,IAAInhB,KAAKohB,cAAephB,wCAY9E8gB,gCAAA,WAAsB,OAAO,IAAI9gB,KAAKiX,eAAgBjX,KAAKgX,sBAI3D7Y,sBAAI2iB,oCAAJ,WAAuB,OAAO9gB,KAAK+W,4CAEnC5Y,sBAAI2iB,4BAAJ,WACI,IAAIhD,EAAU9d,KAAKkX,mBAEnB,IAAK4G,EAAS,CACV,IAAM/Z,EAAO/D,KAAKgX,oBAClB8G,EAAU,GAIV,IAFQ,IAAA/G,EAAe/W,oBAENwB,EAAAxB,KAAKyf,iBAALpe,WAAAA,IAAuB,CAAnC,IAAIod,OACC5f,EAAM4f,EAAK/gB,KACbO,EAAQ8Y,EAAYlY,GAEpB4f,EAAK5F,UAAW5a,EAAO8F,EAAMlF,MAC7Bif,EAASjf,GAAQZ,GAIzB+B,KAAKkX,mBAAqB4G,EAG9B,OAAOA,mCAGXgD,+BAAA,SAAmBO,GACf,IAAKA,EAAO,QAAOrhB,KAAKshB,mBAAoBthB,KAAK8d,SAEjD,IAAIyD,EAAKzD,GAAyB,EAC9B0D,EAAexhB,KAAK4V,aAAe5V,KAAKgX,oBAAsBhX,KAAK+W,WACnE4I,EAAe3f,KAAK6W,YAExB,IAAK,IAAI4H,KAAQ4C,EACR1B,EAAWlB,GAAO5F,UAAW2I,EAAK/C,GAAU8C,EAAMF,EAAM5C,OAChDX,EAAZA,GAAsB,IAAMW,GAAS8C,GAG1C,OAAOzD,GAGXgD,wBAAA,SAAYjiB,GACA,IAAAmY,EAAwBhX,yBAChC,QAAKgX,IAEEnY,EACCmB,KAAK6W,YAAahY,GAAMga,UAAW7Y,KAAK+W,WAAYlY,GAAOmY,EAAqBnY,KAC/EF,GAASqB,KAAK8d,WAG3BgD,sBAAA,SAAUjiB,GACN,GAAIA,EAAK,CACG,IAAAmY,EAAwBhX,yBAChC,GAAIgX,EAAsB,OAAOA,EAAqBnY,GAG1D,OAAO,MAGXiiB,mBAAA,WACI,OAAkB,MAAX9gB,KAAKwgB,IAGhBM,iBAAA,SAAKjiB,GACD,OAAsB,MAAfmB,KAAMnB,IAKjBiiB,mBAAA,SAAOjiB,EAAc8P,SACX1Q,EAAQ+B,KAAMnB,GAEpB,OADAmB,KAAK+R,YAAQlT,QAAQ,QAAY0d,OAAQ,GAAS5N,IAC3C1Q,GAIX6iB,mBAAA,SAAOnS,GAAP,WACU8S,EAAU9S,GAAWA,EAAQ8S,QAMnC,OAJAzhB,KAAK8U,YAAa,WACdvL,EAAKmY,QAAS,SAAEzjB,EAAOY,GAAS,OAAA0K,EAAM1K,GAAQ4iB,EAAU,UAAO,KAChE9S,GAEI3O,MAIX8gB,sBAAA,WACI,IAAMzK,EAAcrW,KAAKsU,OAIzB,OAAOtU,KAAKuU,UAAY8B,EAAQA,GAASA,EAAM/B,QAWnDnW,sBAAI2iB,uBAAJ,WAAoB,OAAO9gB,KAAK+W,WAAY/W,KAAKihB,kBACjD,SAAQ3hB,GAAcqX,GAAc3W,KAAMA,KAAKihB,YAAa3hB,oCAkB5DwhB,sBAAA,SAAUjN,gBAAAA,MAIN,IAHM,IAAAtW,EAAW,OAGAokB,EAFU3hB,sBAEVqB,WAAAA,IAAkB,CAA9B,IAAIod,OACC5f,EAAM4f,EAAK/gB,KACjBO,EAAQ4V,EAAQhV,GAEhBtB,EAAUsB,QAAkB,IAAVZ,EAAmBwgB,EAAKjM,eAAiBvU,EAG/D,OAAOV,GAwBXujB,wBAAA,SAAYjN,EAAyBlF,KAGrCmS,mBAAA,SAAOnS,gBAAAA,MACH,IAAMiT,EAAc,IAAU5hB,KAAKtB,YAAcsB,KAAK+W,WAAY,CAAE3F,OAAQ,IAI5E,OAFIzC,EAAQkT,WAAWD,EAAKtM,cAAgBtV,KAAKqQ,YAE1CuR,GAIXd,6BAAA,SAAiBgB,GAKb,IAJA,IAAIjkB,EAAY,EAERkZ,EAAe/W,oBAEDwB,EAAAxB,KAAKyf,iBAALpe,WAAAA,IAAuB,CAAxC,IAAI+V,OACG3V,EAAS2V,OACb3G,EAAQ2G,EAAUtG,SAAU9Q,KAAM+W,EAAYtV,GAAQA,GAEtDgP,IACAqR,EAAQrgB,GAASgP,EACjB5S,KAIR,OAAOA,GAIXijB,iBAAA,SAAKjiB,GACD,OAAOmB,KAAMnB,IAIjBiiB,iBAAA,SAAKjN,EAAclF,GACf,GAAIkF,EAAQ,CACR,IAAMiB,EAAc9U,KAAKuX,mBAAoB1D,EAAQlF,GACrDmG,GAAeA,EAAYD,SAG/B,OAAO7U,MAQX8gB,oBAAA,SAAQnS,GAIJ,IAHM,IAAAqG,EAAO,GACP+B,EAAe/W,oBAECwB,EAAAxB,KAAKyf,iBAALpe,WAAAA,IAAuB,CAAxC,IAAI+V,OACG7U,EAAS6U,OACbnZ,EAAQ8Y,EAAYxU,GAExB,QAAc,IAAVtE,EAAkB,CAElB,IAAM8jB,EAAS3K,EAAUqB,OAAOrU,KAAMpE,KAAM/B,EAAOsE,EAAMoM,QAG1C,IAAXoT,IAAoB/M,EAAMzS,GAASwf,IAI/C,OAAO/M,GAIX8L,mBAAA,SAAOzL,EAAM1G,GACT,OAAO0G,GAMXyL,qBAAA,SAASpjB,EAAeO,EAAa0Q,GAArC,WA8CI,OA5CA3O,KAAK8U,YAAa,WAQd,UAPMrF,EAAQ/R,EAAKyE,MAAO,KACtB6f,EAAQvS,EAAK5R,OAAS,EACtB4gB,EAAQhP,EAAMuS,GAEdzJ,EAAQhP,EAGHzL,EAAI,EAAGA,EAAIkkB,EAAGlkB,IAAK,CACxB,IAAMe,EAAM4Q,EAAM3R,GAGd6F,EAAU4U,EAAMzQ,IAAMyQ,EAAMzQ,IAAKjJ,GAAQ0Z,EAAO1Z,GAGpD,IAAK8E,EAAM,CACP,IAAMgc,EAAYpH,EAAM1B,YACxB,IAAI8I,EAYC,OAVD,IAAIsC,EAAWtC,EAAW9gB,GAAMgC,SAG5B8N,GAAWA,EAAQ8S,SAAWQ,EAASpL,aACvCoL,EAASC,MAAOvT,GAGpB4J,EAAO1Z,GAAQ8E,EAAOse,EAM9B1J,EAAQ5U,EAIR4U,EAAMxG,IACNwG,EAAMxG,YAAQ0M,GAASxgB,KAAS0Q,GAGhC4J,EAAOkG,GAASxgB,IAIjB+B,MAIX7B,sBAAI2iB,+BAAJ,WACI,OAAO9gB,KAAKuU,UAAY,KAAOvU,KAAKsU,wCAIxCwM,qBAAA,WACI,IAAI9gB,KAAK2L,UAAT,CAIA,IAFQ,IAAAoL,EAAe/W,oBAENwB,EAAAxB,KAAKyf,iBAALpe,WAAAA,IAAuB,CAAnC,IAAIod,OACLA,EAAKjC,QAASxc,KAAM+W,EAAY0H,EAAK/gB,OAGzCsP,aAAMwP,qBAIVsE,kBAAA,SAAMxU,EAAkBE,EAAeuM,EAAerM,EAAgByV,IAChEA,GAAY3U,IAASM,QAASxB,EAAOE,EAAOxM,KAAKoV,eAAiB,IAAM2D,SACnErM,IACHoU,MAAU9gB,KACVoiB,wBAA0BpiB,KAAK6W,gBAIvCiK,0BAAA,WACI,OAAO9T,aAAMoI,yBAAkB,SAInC0L,gCAAA,SAAoBjN,EAAiBlF,KAYrCmS,qBAAA,SAAStQ,EAAoD9M,GACnD,IAAA3E,OAAkB,IAAZ2E,EAAqB,SAAEkV,EAAGiD,GAAO,OAAArL,EAASpM,KAAMV,EAASkV,EAAGiD,IAAMrL,EACxEuG,EAAe/W,gBAErB,IAAK,IAAMnB,KAAOmB,KAAK+W,WAAY,CAC/B,IAAM9Y,EAAQ8Y,EAAYlY,QACZ,IAAVZ,GAAmBc,EAAKd,EAAOY,KAI3CiiB,uBAAA,SAAWuB,EAA+B3e,GACtC,IAAM3E,OAAkB,IAAZ2E,EAAqB2e,EAAQA,EAAMtU,KAAMrK,GACrD,OAAO4e,EAAiB,GAAItiB,KAAK+W,WAAYhY,IAGjD+hB,aAAEvC,OAAOhN,UAAT,WACI,OAAO,IAAIgR,GAAsBviB,OAGrC8gB,qBAAA,WACI,OAAO,IAAIyB,GAAsBviB,OAIrC8gB,kBAAA,WACI,IAAMpgB,EAAkB,GAIxB,OAFAV,KAAK0hB,QAAS,SAAEzjB,EAAOY,GAAS,OAAA6B,EAAK8B,KAAM3D,KAEpC6B,GAlaJogB,aAAY7E,GAgBZ6E,MAAKpI,GAAMsE,QAAS/e,MAAO,MAlBzB6iB,MAjBZpZ,EAAO,CAEJiO,UAAY,IAGZnB,iBAAmB,SAGnByM,YAAc,OAEjB9Z,EAAY,CACT5J,SAAWkM,EAAW1C,MACtBgQ,WAAatN,EAAW1C,MACxBsI,WAAa5F,EAAW1C,MACxByb,WAAa/Y,EAAWxL,MACxBgjB,YAAcxX,EAAWC,cAEhBoX,KA2MT,YAAatJ,EAAiB0B,GAC1B,MAAAlM,aAAO6T,YApKXtX,oBAAwB,EAqKpBA,EAAKwN,WAAa,GAElB,IAAMpI,EAAUuK,GAAa,GACvBrF,GAAWlF,EAAQgJ,MAAQpO,EAAKoO,MAAOH,EAAU7I,GAAa6I,IAAc,UAElFxL,IAwPR,SAAoB4K,EAAgB/C,EAAiBlF,GACjD,GAAIiJ,GAAkBhB,EAAQ/C,EAAQlF,GAAW,CACrC,IAAAkI,EAAgBD,cACpBa,SAEJ,IAAK,IAAIjT,KAAQqP,EACRgD,EAAarS,KACDiT,EAAbA,GAAuB,IACfjV,KAAM,WAAKgC,QAIvBiT,GACAI,GAAqBjB,EAAQa,EAAS,CAAE5D,UAAUlF,IArQtC8T,CAAWlZ,EAAMsK,EAAQlF,GAEzCpF,EAAKyN,oBAAsBzN,EAAKwN,WAAa,IAAIxN,EAAKgW,WAAYhW,EAAMsK,EAAQlF,GAEhFpF,EAAKsC,WAAY2L,EAAU0B,GAEvB3P,EAAKyB,cAAezB,EAAKyB,aAAaiT,UAAW1U,EAAMA,QAoN3DuX,GAAMziB,UAAW8Y,GAAkBgJ,IASvC,YAAavJ,EAAgBtX,EAAsBqP,GAC/C3O,KAAKwgB,GAAKlhB,EAAEkhB,GAIpBM,GAAMziB,UAAUkhB,WAAamD,GAKzB,YAAapjB,GACTU,KAAKwgB,GAAKlhB,EAAEkhB,GAIpBM,GAAMziB,UAAU4Y,eAAiB0L,GAEjC,IAAMC,GAActK,GAAQzX,OAAO,CAAE5C,WAAQ,GAAU,MACvD6iB,GAAMziB,UAAUwY,YAAc,CAAE2J,GAAKoC,IACrC9B,GAAMziB,UAAUohB,iBAAmB,CAAEmD,IAoBrC,QAKIL,kBAAA,WACY,IAAA3L,EAAW5W,YACf6iB,EAAWjM,EAAO6I,iBAAkBzf,KAAKqd,OAE7C,MAAO,CACHyF,MAAQD,EACR5kB,MAAQ4kB,EAAW,CAAEA,EAASnlB,KAAMkZ,EAAQiM,EAASnlB,YAAW,QARxE,YAA8BkZ,GAAA5W,YAAA4W,EAFtB5W,SAAM,ECphBV,IAAAN,GAAqB6d,EAAbhgB,GAAawlB,WAMbhM,SAAY,aAAA1V,mBAAAA,IAAA2hB,kBACxB,MAAMC,WLWoCzhB,OAAE2W,EAACuF,GAAYwF,OAAIC,EAAC9T,GAAc+T,OAASrM,MAA3C,uDAC1C,UACIA,aACA1H,WAAa+T,GACVF,GKfMG,CAA+BL,EAAQA,EAAOnlB,OAAS,IAChEylB,EAAwB,EAAhBN,EAAOnlB,OAAamlB,EAAQ,GAAM,KAC1CO,EAAwB,EAAhBP,EAAOnlB,OAAamlB,EAAOjgB,MAAO,EAAGigB,EAAOnlB,OAAS,GAAM,QAEtC4H,MAAE6d,GAASxC,OAAxC,4DAMJ,OAHIyC,GAAS1c,EAAQ0c,EAAR1c,CAAgB2c,GACzB9b,EAAQub,EAARvb,CAAgB8b,GAEbA,EAGX1C,GAAM9Y,SAAW,SAA+BpB,GAC5CsN,GAAclM,SAAS5D,KAAMpE,KAAM4G,GAGnC,MAAMnI,EAAQuB,QAE6ByF,MAAAmB,EAAU4b,YAC1CiB,QAAQhlB,EADFglB,KAAhBhc,GAAgBgc,IAAN,4DAIXzjB,KAAKyjB,kBAAoBA,EAIrBhlB,EAAM+jB,aAAe5b,EAAU4b,aAC/BxiB,KAAKwiB,WAAaiB,IAI1B3C,GAAM5Z,SAAW,SAAU9F,EAA8BwF,GACrD,IAAM+C,EAAoB/C,EAAUvI,UAG9BmD,EAAgDqd,GAAuB7e,KAAK+W,WAoBtF,SAAuBvV,OAAEjE,aAAUwZ,eAAYkK,gBACrC7f,EAAa2V,GAAcxZ,GAAY,IAGzC0jB,GAAkBA,KAAe7f,IACjCA,EAAY6f,QAAgB,GAGhC,OAAO7f,EA5BwFsiB,CAAetiB,GAAcuI,EAAUkN,aAA9H5L,eAAYD,iBAAiB2Y,MAA/B,+BACNjkB,GAAQM,KAAK3B,UAAWslB,GAExBviB,EAAW6J,WAAa1N,GAAU6D,EAAW6J,YAAc,GAAIA,GAC/D7J,EAAW4J,aAAeA,EAE1BkJ,GAAchN,SAAS9C,KAAMpE,KAAMoB,EAAYwF,GAG/C5G,KAAKyjB,kBAAkB/b,OAAQtG,EAAWiO,YAAc,IAGxDrP,KAAKwiB,WAAaphB,EAAWohB,WAC7BxiB,KAAKwiB,WAAWnkB,UAAUka,MAAQvY,KAE9BoB,EAAW+S,WAAWnU,KAAKwiB,WAAWnkB,UAAU+V,UAAYhT,EAAW+S,mBJnE5C1V,GACvB,IAAAJ,EAAcI,YACdghB,EAAqBphB,mBAEvBulB,EAAgB,IAAI7T,SAAS,QAAS,kDAErC0P,EAAiB1d,IAAK,SAACP,OAAE9D,SAAW,MAAA,gBAASA,mBAAmB2P,KAAM,iBAG7EuW,EAAcvlB,UAAUwlB,eAAiBrF,GAEzC,IAAiB,QAAAmD,IAAAtgB,WAAAA,IAAkB,CAA9B,IAAIod,OACGhd,EAASgd,OAEjBtgB,OAAOqI,eAAgBod,EAAcvlB,UAAWoD,EAAM,CAClDqG,IAAM,IAAIiI,SAAU0O,EAAKqF,gBAAkB,+CAClBriB,wDACKA,6KAIZA,uDAAiDA,wCAC/D,+CACqBA,gFAE2BA,sDAClCA,uDAAiDA,4BAAsBA,4BAKjGpD,EAAU+iB,cAAgBwC,EIsC1BG,CAAmB/jB,OCpEf,IAAAyD,GAAgCugB,EAAtBxgB,GAAsBuQ,EAAZnR,GAAYoR,EAARlR,GAAQmR,EAChCY,GAAWF,UACbsP,GAAUtP,GAAeyB,OAAQ8N,GAAQvP,GAAe6B,cA+C9C2N,GAAkB9U,EAA6BiQ,EAAoB3Q,GACvE,IAEJiI,EAFI2B,EAAUlJ,QAIdA,EAAW+M,SACXxF,EAAS0I,aAAiB/G,EAAQ+G,EAAe/G,EAAM1X,OAAQye,EAAO3Q,GAElEU,EAAW+M,QAAUtI,gBAAc4I,QACnC9Z,GAAIgU,EAAQA,EAAOpC,iBAAkBnF,EAAW8G,kBAAmB9G,KAIvEuH,EAAS0I,aAAiB/G,EAAU5J,EAAQ5H,MAAQuY,EAAMlO,QAAUkO,EAAiB/G,EAAM1X,OAAQye,EAAO3Q,IAE/F2F,OACHsC,EAAOtC,SAAWjF,IAClB4U,GAAS5U,EAAYuH,EAAOxF,UACb/B,EAAW+U,oBAAuB/U,EAAW+U,kBAAoB,KACzE5hB,KAAMoU,IAIjBqN,GAAS5U,EAAYuH,GAKrB,IAAAyN,EAAgBhV,cAGxB,OAFAgV,GAAeA,EAAYpG,UAAW5O,EAAYuH,GAE3CA,WAIKJ,GAAMH,EAAwBC,EAAeiG,GACrDlG,EAAM+F,QACF/F,EAAM+F,QAAUtI,gBAAc4I,QAC9B5Z,GAAKwT,EAAOA,EAAM9B,iBAAkB6B,EAAMF,kBAAmBE,IAIjE6N,GAAO7N,EAAOC,GACdiG,GAASjG,EAAMkG,WAGX,IAAA6H,EAAgBhO,cACxBgO,GAAeA,EAAYrG,YAAa3H,EAAOC,YAgBnCgO,GAAcjV,EAA6BV,GACjD,IAAA4V,EAAgBlV,cACtB,SAAIkV,IAAgC,IAAjB5V,EAAQ6V,QACvBnV,EAAW2T,OAAOwB,KAAMD,IACjB,YAeCE,GAAUC,EAAiBnM,GAEvC,IAAIiI,GADJkE,EAAOnM,EAAM7M,KAAQ6M,GACMiI,IAEvBA,GAAwB,IAAhBA,IACRkE,EAAOlE,GAAOjI,YAKNoM,GAAaD,EAAiBnM,UACnCmM,EAAOnM,EAAM7M,KACpB,IAAI8U,EAAKjI,EAAMiI,IACXA,GAAwB,IAAhBA,UACDkE,EAAOlE,YAINoE,GAAaF,EAAiBnM,UACnCmM,EAAOnM,EAAMsM,SAAUtM,EAAM0I,cAE5B,IAAAT,EAAOjI,KACT,MAANiI,IAAgBkE,EAAOlE,GAAOjI,GAkBlC,QAUIuM,oBAAA,SAAQ7O,GAKJ,IAJM,IAAEvF,EAAmB1Q,YAAXiJ,EAAWjJ,YACnBgW,EAAa/M,eAGG8O,IAAA1W,WAAAA,KAAfyT,QACOD,OAAQ5L,GAGpBA,EAAOmb,mBACPW,GAAqB9b,EAAQ+M,GAKjC,IAAwB,QAAAiC,IAAAE,WAAAA,IAAQ,CAA3B,IAAIrD,OACLrR,GAAUwF,EAAQ,SAAU6L,EAAY7L,OAAQ+M,GAOpD,IAHM,IAAEgP,EAAmBhlB,WAAZilB,EAAYjlB,iBAGRklB,IAAAC,WAAAA,IAAO,CAArB,IAAIvO,OACLpT,GAAUoT,EAAQ,MAAOA,EAAQ3N,EAAQ+M,GACzCxS,GAAUyF,EAAQ,MAAO2N,EAAQ3N,EAAQ+M,GAI7C,IAAmB,QAAAoP,IAAAC,WAAAA,IAAVzO,OACLpT,GAAUoT,EAAQ,SAAUA,EAAQ3N,EAAQ+M,GAC5CxS,GAAUyF,EAAQ,SAAU2N,EAAQ3N,EAAQ+M,GAG5ChW,KAAKslB,QACL7hB,GAAUwF,EAAQ,OAAQA,EAAQ+M,IAGlCgP,EAAMnnB,QAAUonB,EAAQpnB,SACxB4F,GAAUwF,EAAQ,SAAUA,EAAQ+M,GAGxChW,KAAK0U,QAAUG,GAAQ5L,EAAQgN,QAlDnC,YAAuBhN,EACAyL,EACAsQ,EACAC,EACAvU,EACA4U,GALAtlB,YAAAiJ,EACAjJ,YAAA0U,EACA1U,WAAAglB,EACAhlB,aAAAilB,EACAjlB,YAAA0Q,EACA1Q,YAAAslB,WAiDXP,GAAqB1V,EAA6BV,GAC9DU,EAAW2I,KAAM,OAAQ,sBAAuB,4GAA6G3I,EAAW+U,kBAAmBzV,EAAQnB,QACnM6B,EAAW+U,uBAAoB,ECtO3B,IAAAxP,GAA+BD,SAAxBE,GAAwBF,UAAhBkB,GAAgBlB,wBAOvB4Q,GAAgBlW,EAA6BmW,EAAe7W,EAAsB5H,GAC9F,IAAM2N,EAASE,GAAOvF,GAChBqB,EAAwB,GAE1BsU,EAoDR,SAAyB3V,EAA6BoW,EAAiB/U,EAAwBwI,EAAwBwM,GAOnH,IANM,IAAAC,EAAkBtW,QAAX2T,EAAW3T,SACpBtI,GAAgB2e,GAAcxM,EAAUnS,SAAYsI,EAAW+M,QAE/D6E,GADc/H,EAAUvB,MACVtI,EAAWkJ,MAAMla,UAAU4iB,aACzC2E,EAAa5C,EAAOnlB,WAELgoB,IAAAxkB,WAAAA,IAAS,CAAvB,IAAMykB,OACHvN,EAAQuN,EAAOH,EAAOG,EAAM7E,KAAmB0E,EAAOG,EAAKpa,KAAQ,KAEvE,GAAI6M,GACA,GAAIxR,GAAS+e,IAASvN,EAAO,CACzB,IAAI+G,EAAQwG,EAAK/O,YAAc+O,EACzBhR,EAAcyD,EAAMhB,mBAAoB+H,EAAOpG,GACrDpE,GAAepE,EAAOlO,KAAMsS,GAExByD,EAAM+I,WAAYL,IAClB2D,GAAae,EAAOpN,SAK5BA,EAAQ4L,GAAkB9U,EAAYyW,EAAM5M,GAC5C8J,EAAOxgB,KAAM+V,GACbkM,GAAUkB,EAAOpN,GAIzB,OAAOyK,EAAOjgB,MAAO6iB,GAhFTG,CAAgB1W,EAAYmW,EAAO9U,EAAQ/B,EAAS5H,GAEhE,GAAIie,EAAMnnB,QAAU6S,EAAO7S,OAAQ,CAC/B,IAAImoB,EAcZ,SAA6B3W,EAA6B2V,EAAiBrW,GACvE,IAAI+C,EAAK/C,EAAQ+C,GAGjB,GAAU,MAANA,EAeJ,OAAO4S,GAAcjV,EAAYV,GAb7B,IAAMsX,EAAS5W,EAAW2T,OAAOnlB,OAASmnB,EAAMnnB,QAGhD6T,EAAKuL,OAAQvL,IACJ,IAAIA,GAAe,EAATuU,GACfvU,EAAK,IAAIA,EAAK,GACTuU,EAALvU,IAAcA,EAAKuU,GAIvB,OAOR,SAAuBxoB,EAAgBiU,EAAasT,GAChD,IAAK,IAAInT,EAAIpU,EAAOI,OAAS,EAAGC,EAAI+T,EAAImT,EAAMnnB,OAAa6T,GAAL5T,EAASA,IAAK+T,IAChEpU,EAAQoU,GAAMpU,EAAQK,GAG1B,IAAKA,EAAI,EAAG+T,EAAIH,EAAI5T,EAAIknB,EAAMnnB,OAAQC,IAAK+T,IACvCpU,EAAQoU,GAAMmT,EAAOlnB,GAdrBooB,CAAc7W,EAAW2T,OAAQtR,EAAIsT,IAC9B,EA9BQmB,CAAoB9W,EAAY2V,EAAOrW,GACtD,GAAIkH,GAAaxG,EAAYV,GACzB,OAAO,IAAImW,GAAuBzV,EAAYqF,EAAQsQ,EAAO,GAAItU,EAAQsV,GAGzE3W,EAAW+U,mBAAoBW,GAAqB1V,EAAYV,GAIxE+F,GAAUG,GAAQxF,GCpBtB,QASI+W,iBAAA,SAAQC,EAA6C3iB,GAMjD,IALQ,IAAAsf,EAAWhjB,YACbnC,EAAWmlB,SACbsD,EAAMhoB,MAAOT,GACbkB,EAAM2E,EAAU2iB,EAAUtY,KAAMrK,GAAY2iB,EAEvCvoB,EAAI,EAAG+T,EAAI,EAAG/T,EAAID,EAAQC,IAAK,CACpC,IAAMyjB,EAAMxiB,EAAKikB,EAAQllB,GAAKA,QACtB,IAARyjB,IAAoB+E,EAAKzU,KAAQ0P,GAOrC,OAJIzjB,IAAM+T,IACNyU,EAAIzoB,OAASgU,GAGVyU,GAOXF,kBAAA,SAASrnB,EAAyC2E,GAK9C,IAJQ,IAAAsf,EAAWhjB,YACbnC,EAAWmlB,SACbxS,EAAW9M,EAAU3E,EAAIgP,KAAMrK,GAAY3E,EAEtCjB,EAAI,EAAGA,EAAID,EAAQC,IACxB0S,EAAUwS,EAAQllB,GAAKA,IAW/BsoB,wBAAA,SAAeG,EAA2C7iB,GAKtD,IAJQ,IAAAsf,EAAWhjB,YACbnC,EAAWmlB,SACbxS,EAAW9M,EAAU6iB,EAAQxY,KAAMrK,GAAY6iB,EAE1CzoB,EAAI,EAAGA,EAAID,EAAQC,IAAK,CAC7B,IAAMwoB,EAAM9V,EAAUwS,EAAQllB,GAAKA,GACnC,QAAY,IAARwoB,EAAiB,OAAOA,IAUpCF,oBAAA,SAAW5V,EAAmFgW,GAC1F,YAAgB,IAATA,EAAkBxmB,KAAKgjB,OAAOnJ,OAAQrJ,GAAaxQ,KAAKgjB,OAAOnJ,OAAQrJ,EAAUgW,IAI5FJ,mBAAA,SAAOxR,EAAiB6R,GACpB,OAAOzmB,KAAKgjB,OAAOjgB,MAAO6R,EAAO6R,IAGrCL,qBAAA,SAASM,GACL,OAAO1mB,KAAKgjB,OAAOhd,QAAShG,KAAK8H,IAAK4e,KAG1CN,sBAAA,SAAUO,GACN,OAAOxU,QAASnS,KAAK8H,IAAK6e,KAG9BP,oBAAA,SAAQ5V,EAAyB9M,GAC7B,IAAM3E,EAAM6nB,GAAqBpW,GACjC,OAAOxQ,KAAK+B,IAAK,SAAA8kB,GAAK,OAAA9nB,EAAK8nB,GAAMA,OAAI,GAAQnjB,IAGjD0iB,kBAAA,SAAM5V,EAAyB9M,GAC3B,IAAM3E,EAAM6nB,GAAqBpW,GACjC,OAAOxQ,KAAK8mB,WAAY,SAAAD,GAAK,OAAA9nB,EAAK8nB,GAAMA,OAAI,GAAQnjB,IAGxD0iB,kBAAA,SAAM5V,EAAyB9M,GAC3B,OAAOyO,QAASnS,KAAK+mB,KAAMvW,EAAU9M,KAGzC0iB,qBAAA,SAAS5V,EAA+C9M,GACpD1D,KAAK2Q,KAAMH,EAAU9M,IAGzB0iB,oBAAA,WACI,OAAOpmB,KAAKgjB,OAAOnP,UAGvBuS,qBAAA,WACI,OAAOpmB,KAAKgjB,OAAOgE,WAGvBZ,mBAAA,SAAO5V,EAAyB9M,GAC5B,IAAM3E,EAAM6nB,GAAqBpW,GACjC,YAAsE,IAA/DxQ,KAAK8mB,WAAY,SAAAD,GAAK,QAAA9nB,EAAK8nB,SAAM,GAAgBnjB,IAG5D0iB,mBAAA,SAA0BvnB,GACtB,OAAOmB,KAAK+B,IAAK,SAAAwW,GAAS,OAAAA,EAAO1Z,MAGrCunB,mBAAA,WAAc,OAAOpmB,KAAKgjB,OAAQ,IAElCoD,kBAAA,WAAa,OAAOpmB,KAAKgjB,OAAQhjB,KAAKgjB,OAAOnlB,OAAS,IAEtDuoB,gBAAA,SAAIa,GACA,IAAMvC,EAAQuC,EAAU,EAAIA,EAAUjnB,KAAKgjB,OAAOnlB,OAASopB,EAC3D,OAAOjnB,KAAKgjB,OAAQ0B,IAQxB0B,qBAAA,SACI3H,EACAyI,GAUA,IARA,IAAMnlB,EAA4B,iBAAT0c,EACrB,SAAAnf,GAAK,OAAAA,EAAGmf,IACRA,EAEE0I,EAAUD,GAAaE,GAEvBC,EAAU,OAEE7lB,EAAAxB,KAAKgjB,OAAL3hB,WAAAA,IAAa,CAA1B,IAAIkX,OACC1Z,EAAMkD,EAAKwW,GACN,MAAP1Z,IACAwoB,EAASxoB,GAAQsoB,EAASE,EAASxoB,GAAO0Z,EAAO1Z,IAIzD,OAAOwoB,OAtJf,eA0JA,IAAMD,GAAkB,SAAEE,EAAUhoB,GAAO,oBAAjBgoB,MAAmBA,EAAI9kB,KAAMlD,GAAKgoB,GAEtDC,GAAO,SAAAjoB,GAAK,OAAAA,GAElB,SAASsnB,GAAwBpW,GAC7B,GAAgB,MAAZA,EAAmB,OAAO+W,GAE9B,cAAe/W,GACX,IAAK,WAAa,OAAOA,EACzB,IAAK,SACD,IAAMgX,EAAOrpB,OAAOuC,KAAM8P,GAE1B,OAAO,SAAAlR,GACH,IAAgB,QAAAmoB,EAAAD,EAAAnmB,WAAAA,IAAM,CAAjB,IAAIxC,OACL,GAAI2R,EAAU3R,KAAUS,EAAGT,GACvB,OAAO,EAGf,OAAO,GAEf,QAAU,MAAM,IAAIiO,MAAO,qBCtK3B,IAAArJ,GAAuBugB,EAAbxgB,GAAauQ,EACzB8B,GAA+BlB,eAAlBC,GAAkBD,SAAXE,GAAWF,mBAyCrB+S,GAAYrY,EAA6BsY,EAAkBhZ,GACvE,IAAMsW,EAqBV,SAA2B5V,EAAYsY,EAAUpL,GAI7C,IAHA,IAAI0I,EAAU3mB,MAAOqpB,EAAS9pB,QAC1B8nB,EAAUtW,EAAWsW,MAEhB7nB,EAAI,EAAG+T,EAAI,EAAG/T,EAAI6pB,EAAS9pB,OAAQC,IAAK,CAC7C,IAAIya,EAAQlJ,EAAWvH,IAAK6f,EAAU7pB,IAClCya,IACA0M,EAASpT,KAAQ0G,EACjBoM,GAAagB,EAAOpN,GACpB/B,GAAMnH,EAAYkJ,EAAOgE,IAMjC,OAFA0I,EAAQpnB,OAASgU,EAEVoT,EApCS2C,CAAkBvY,EAAYsY,EAAUhZ,EAAQ4N,OAChE,GAAI0I,EAAQpnB,OAAQ,CAChB,IAAM6W,EAASE,GAAOvF,GAItB,GAmCR,SAAsBA,EAAY4V,GAK9B,IAJA,IAAIlhB,EAASsL,EAAW2T,OACpBA,EAAS3T,EAAW2T,OAAS1kB,MAAOyF,EAAKlG,OAASonB,GAClDU,EAAQtW,EAAWsW,MAEd7nB,EAAI,EAAG+T,EAAI,EAAG/T,EAAIiG,EAAKlG,OAAQC,IAAK,CACzC,IAAIya,EAAQxU,EAAMjG,GAEd6nB,EAAOpN,EAAM7M,OACbsX,EAAQnR,KAAQ0G,GAIxByK,EAAOnlB,OAASgU,EAlDZgW,CAAaxY,EAAY4V,EAAQpnB,QAE7BgY,GAAaxG,EAAYV,GACL,IAAImW,GAAuBzV,EAAYqF,EAAQ,GAAIuQ,EAAS,IAAI,GACxEpQ,cAIZH,GAAUG,GAAQxF,GAI1B,OAAO4V,ECtEH,IAAArQ,GAA+BD,SAAxBE,GAAwBF,UAAhBkB,GAAgBlB,eAGjCmT,GAAgB,CAAE/R,QAAS,YAGjBgS,GAAqB1Y,EAA6BmW,EAAkB7W,EAA6BoH,GAC7G,IAAMrB,EAASE,GAAOvF,GAEhB2V,EAsHV,SAA2BngB,EAAMpH,EAAQkR,GAMrC,IALA,IAAIqZ,EAAcvqB,EAASA,EAAOI,OAAS,EACvCmlB,EAAc1kB,MAAO0pB,GACrBrC,EAAkB,GAClB1E,EAAcpc,EAAK0T,MAAMla,UAAU4iB,YAE9BnjB,EAAI,EAAG+T,EAAI,EAAG/T,EAAIkqB,EAAKlqB,IAAK,CACjC,IAAImqB,EAAMxqB,EAAQK,GAElB,IAAImqB,IAAStC,EAAOsC,EAAKhH,MAAmB0E,EAAOsC,EAAIvc,KAAvD,CAIA,IAAI6M,EAAQ4L,GAAkBtf,EAAMojB,EAAKtZ,GACzCqU,EAAQnR,KAAQ0G,EAChBkM,GAAUkB,EAAOpN,IAMrB,OAHAyK,EAAOnlB,OAASgU,EAChBhN,EAAK8gB,MAAWA,EAET9gB,EAAKme,OAASA,EA3IPkF,CAAkB7Y,EAAYmW,EAAO7W,GAEnD,GAAIqW,EAAMnnB,OAAQ,CACd,IAAMmoB,EAAW1B,GAAcjV,EAAYV,GAE3C,GAAIkH,GAAaxG,EAAY0G,EAAS+R,GAAgBnZ,GAElD,OAAO,IAAImW,GAAuBzV,EAAYqF,EAAQsQ,EAAMjiB,QAAS,GAAI,GAAIijB,GAG7E3W,EAAW+U,mBAAoBW,GAAqB1V,EAAYV,GAIxE+F,GAAUG,GAAQxF,YAIN8Y,GAAgB9Y,EAAYmW,EAAO7W,GAC/C,IAAM+F,EAASE,GAAOvF,GAChBqB,EAAS,GAEXmU,EAAWxV,EAAW2T,OACtBgC,EA2CR,SAAsB3V,EAA6B5R,EAAgBiT,EAAwB/B,GAWvF,IAVA,IAAIqU,EAAc1kB,MAAOb,EAAOI,QAC5B8nB,EAAkB,GAClB5e,GAAiC,MAAjB4H,EAAQ5H,OAAuB4H,EAAQ5H,SAAYsI,EAAW+M,QAC9EgM,EAAc/Y,EAAWsW,MACzB0C,EAAchZ,EAAW2T,OACzB/B,EAAc5R,EAAWkJ,MAAMla,UAAU4iB,YACzCqH,EAAc,GACdC,GAAc,EAGTzqB,EAAI,EAAG+T,EAAI,EAAG/T,EAAIL,EAAOI,OAAQC,IAAK,CAC3C,IAAIgoB,EAAQroB,EAAQK,GAChBya,EAAgB,KAEpB,GAAIuN,EAAM,CACN,IAAItF,EAAMsF,EAAM7E,GACZvV,EAAMoa,EAAKpa,IAEf,GAAIia,EAAOnF,IAAQmF,EAAOja,GAAQ,SAElC6M,EAAQ6P,EAAW5H,IAAQ4H,EAAW1c,GAG1C,GAAI6M,GACA,GAAIxR,GAAS+e,IAASvN,EAAO,CACrBgQ,GAAaF,EAAYxW,KAAQ0G,IAAQgQ,GAAY,GAEzD,IAAIjJ,EAAQwG,EAAK/O,YAAc+O,EACzBhR,EAAcyD,EAAMhB,mBAAoB+H,EAAO3Q,GACrDmG,GAAepE,EAAOlO,KAAMsS,SAIhCyD,EAAQ4L,GAAkB9U,EAAYyW,EAAMnX,GAC5C2Z,EAAM9lB,KAAM+V,GAGhByK,EAAQnR,KAAQ0G,EAChBkM,GAAUkB,EAAOpN,GAGrByK,EAAOnlB,OAASgU,EAChBxC,EAAW2T,OAAWA,EACtB3T,EAAWsW,MAAWA,EAEjB4C,IAAY5Z,EAAQ2W,QAAS,GAElC,OAAOgD,EA3FQT,CAAaxY,EAAYmW,EAAO9U,EAAQ/B,GAEjD6Z,EAAcnZ,EAAW2T,OAAOnlB,OAASmnB,EAAMnnB,OAC/ConB,EAAUuD,EAAc3D,EAAShnB,OACnB2qB,EAsBxB,SAA0BnZ,EAA6BwV,GAKnD,IAJQ,IAAAc,EAAWtW,QACb4V,EAAU,OAGGwD,IAAApnB,WAAAA,IAAU,CAAxB,IAAIuV,OACA+O,EAAO/O,EAAOlL,OACfuZ,EAAQziB,KAAMoU,GACdJ,GAAMnH,EAAYuH,IAI1B,OAAOqO,EAlC2ByD,CAAiBrZ,EAAYwV,YJiE1CxV,EAA6BsZ,GAClD,IAAkB,QAAAC,IAAAvnB,WAAAA,IAAU,CACxBmV,GAAMnH,QAGV,OAAOsZ,EIrE6BE,CAASxZ,EAAYwV,GACrC,GAEdiE,EAAiBpY,EAAO7S,QAAUmnB,EAAMnnB,OAExCynB,EAAWhB,GAAcjV,EAAYV,IAAama,GAAoB9D,EAAMnnB,QAAU8Q,EAAQ2W,OAEpG,GAAIwD,GAAkB7D,EAAQpnB,QAAUynB,EAAQ,CAC5C,GAAIzP,GAAaxG,EAAYV,GACzB,OAAO,IAAImW,GAAuBzV,EAAYqF,EAAQsQ,EAAOC,EAASvU,EAAQ4U,GAG9EjW,EAAW+U,mBAAoBW,GAAqB1V,EAAYV,GAGxE+F,GAAUG,GAAQxF,GC7Cd,OAAA5L,GAAaugB,EACfpP,GAA+BD,SAAxBE,GAAwBF,UAAhBkB,GAAgBlB,eAEjCoU,GAAS,MAeoBtjB,QAAAmX,IACtBoM,gBAAe,OAD1B,6EAyB0DvjB,QAAAyO,QAA7CsO,OAeT,SAAmCta,GAC/B,MAAuB,mBAATA,EACVA,EAAKsa,WACLzL,GAAY7O,GAAOsa,YAUpBA,UAAP,SAAuCta,GACnC,OAAOA,EAAKsa,WAAWyG,MAW3BzG,0BAAA,SAAcQ,EAAyBrU,GACnC,MAAM,IAAI4H,eAAgB,gCAGvBiM,YAAP,SAAiB5b,GAEb,IAAMsB,EAAOlI,KAGb,SAASkpB,EAAgB7oB,EAAGC,EAAGoc,GAC3BxU,EAAK9D,KAAMpE,KAAMK,EAAGC,EAAGwT,gBAAc6I,OAAUD,EAAS5I,gBAAc4I,OAAS,IAHnF1c,KAAKmpB,UAAY,KAMjB1iB,EAAQI,OAAOkB,SAAUmhB,GACzBA,EAAeroB,OAASuoB,GAAWvoB,OAEnCqoB,EAAe7qB,UAAY2B,KAAK3B,UAChC6qB,EAAe9L,UAAY4L,GAE3BhpB,KAAKipB,KAAOjpB,KAAKqpB,OAAcH,EAE/BhV,GAAclM,SAAS5D,KAAMpE,KAAM4G,IAGhC4b,YAAP,SAAiBphB,EAAmCwF,GAChD,GAAIxF,EAAWkoB,WAAY,CACvB,IAAMpe,EAAY,IAAIpJ,EAAU8E,EAAUvI,UAAUgmB,aACpDnZ,EAAUlI,aAAc5B,EAAWkoB,YACnCtpB,KAAK3B,UAAUgmB,YAAcnZ,OAGH,IAA1B9J,EAAWmoB,aAAwBvpB,KAAK3B,UAAUkrB,WAAanoB,EAAWmoB,YAE9ErV,GAAchN,SAAS9C,KAAMpE,KAAMoB,IAcvCjD,sBAAIqkB,oCAAJ,WAAuB,OAAOxiB,KAAKgjB,wCAMnC7kB,sBAAIqkB,+BAoCJ,WAAkB,OAAOxiB,KAAKukB,iBApC9B,SAAgBjlB,GAAhB,WAEI,cAAeA,GACX,IAAK,SACDU,KAAKukB,YAAc,SAAElkB,EAAGC,GACpB,IAAMkpB,EAAKnpB,EAAWf,GAAKmqB,EAAKnpB,EAAWhB,GAC3C,OAAIkqB,IAAOC,EAAY,EAChBD,EAAKC,GAAM,EAAI,GAE1B,MACJ,IAAK,WACgB,IAAbnqB,EAAEzB,OACFmC,KAAKukB,YAAc,SAAElkB,EAAGC,GACpB,IAAMkpB,EAAWlqB,EAAG8E,KAAMmF,EAAMlJ,GAAKopB,EAAWnqB,EAAG8E,KAAMmF,EAAMjJ,GAC/D,OAAIkpB,IAAOC,EAAY,EAChBD,EAAKC,GAAM,EAAI,GAI1BzpB,KAAKukB,YAAc,SAAElkB,EAAGC,GAAO,OAAMhB,EAAG8E,KAAMmF,EAAMlJ,EAAGC,IAE3D,MAEJ,QACIN,KAAKukB,YAAc,uCAK/B/B,sBAAA,WACI,OAAOxiB,KAAK0pB,SAAY1pB,KAAK0pB,OAAS1pB,KAAKsU,OAAStU,KAAKsU,OAAOjE,WAAarQ,KAAKsV,gBAYtFkN,+BAAA,SAAmB5L,EAAYjI,EAAmCsH,GAE9D,gBAF2BtH,MAEvBsH,IAAcjW,KAAlB,CAEQ,IAAAihB,EAAgBjhB,iBAEpB4W,EAAO0K,WAAYL,IACnB2D,GAAa5kB,KAAK2lB,MAAO/O,GAG7B,IAAMlC,EAASE,GAAO5U,MAElB6V,GAAa7V,KAAM2O,IAEnBlL,GAAUzD,KAAM,SAAU4W,EAAQjI,GAGtC+F,GAAUG,GAAQ7U,QAGtBwiB,iBAAA,SAAKmH,GACD,GAAe,MAAXA,EAAJ,CAEA,GAAuB,iBAAZA,EAKP,OAAO3pB,KAAK2lB,MAAOgE,GAJnB,IAAMnJ,EAAKmJ,EAAS3pB,KAAKihB,aACzB,YAAgB,IAAPT,GAAiBxgB,KAAK2lB,MAAOnF,IAAUxgB,KAAK2lB,MAAOgE,EAAQje,OAO5E8W,aAAEjE,OAAOhN,UAAT,WACI,OAAOvR,KAAKgjB,OAAQzE,OAAOhN,aAK/BiR,wBAAA,SAAYhS,GACR,IAAMkE,EAASC,GAAeC,MAAO5U,MACrCA,KAAK2Q,KAAMH,GACXkE,GAAUC,GAAeE,OAAQ7U,OAIrCwiB,6BAAA,SAAiBV,GAEb,GAAI9hB,KAAKoc,QAAU,OAAO,EAE1B,IAAIwN,EAAQ,EAUZ,OARA5pB,KAAK2Q,KAAM,SAAAiG,GACP,IAAMnG,EAAQmG,EAAO1B,gBACjBzE,IACAqR,EAAQlL,EAAOlL,KAAQ+E,EACvBmZ,OAIDA,GAyCXpH,wBAAA,aAGAA,mBAAA,SAAO7T,gBAAAA,MACH,IAAMqU,EAAShjB,KAAKoc,QAAUtI,gBAAc6I,MAAQ3c,KAAKgjB,OAAShjB,KAAK+B,IAAK,SAAAwW,GAAS,OAAAA,EAAMnH,UACrFwQ,EAAc,IAAU5hB,KAAKtB,YAAcskB,EAAQ,CAAEzK,MAAQvY,KAAKuY,MAAOgR,WAAavpB,KAAKupB,YAAcvpB,KAAKoc,SAIpH,OAFIzN,EAAQkT,WAAWD,EAAKtM,cAAgBtV,KAAKqQ,YAE1CuR,GAGXY,oBAAA,SAAQ7T,GACJ,OAAO3O,KAAK+B,IAAK,SAAAwW,GAAS,OAAAA,EAAME,OAAQ9J,MAI5C6T,iBAAA,SAAKqH,EAAgClb,GAMjC,gBANCkb,mBAAgClb,WACN,IAAjBA,EAASmb,KACf9pB,KAAKgY,KAAM,OAAQ,uBAAwB,oFAAqFrJ,GAIhIA,EAAQob,MACR/pB,KAAK+pB,MAAOF,EAAUlb,OAEtB,CACA,IAAMmG,EAAc9U,KAAKuX,mBAAoBsS,EAAUlb,GACvDmG,GAAeA,EAAYD,SAG/B,OAAO7U,MAUXwiB,yBAAA,SAAawH,GAAb,WACI,GAAIA,EACA,OAAOhqB,KAAKiqB,sBAAuBD,GAAUjb,KAAM,WAAM,OAAAxF,IAGrDvJ,KAAKkqB,eACLlqB,KAAKqgB,cAAcrC,YAAahe,KAAKkqB,aAAclqB,MACnDA,KAAKkqB,aAAe,OAWhC1H,mCAAA,SAAuBwH,GAAvB,WACIhqB,KAAKmqB,aAAa,GAElB,IAAM5d,EAA4B,mBAAZyd,EAAyBA,EAAU,WAAM,OAAA,GAU/D,OARAhqB,KAAKkqB,aAAe,CAChBE,QAAU,SAAApV,GACNzI,EAAQyI,IAAUzL,EAAKugB,IAAK9U,EAAM,CAAE2C,OAAQ,EAAM5Q,OAAQ,KAG9Dke,QAAU,SAAAzE,GAAM,OAAAjX,EAAK+H,OAAQkP,KAG1BxgB,KAAKqgB,cAAcpC,UAAWje,KAAKkqB,aAAclqB,OAG5DwiB,mBAAA,SAAOtJ,GAAP,wBAAOA,MACH,IAAMvK,KAAYgJ,OAAQ,GAASuB,GAC/B/E,EAAWnU,KAAKqgB,cA0BpB,OAAO3R,GACH1O,KAzBY2O,EAAQwb,YACpBnc,GAAiB,SAAEC,EAASC,EAAQC,GAChC,IAAIpE,EACEsgB,EAAe9gB,EAAK0gB,sBAAuBtb,EAAQwb,aAEzDE,EACKtb,KAAM,WAEH,OADAhF,EAAOoK,EAASpK,KAAM4E,EAASpF,KAGlCwF,KAAMd,EAAS,SAAAwC,GACZlH,EAAK4gB,aAAa,GAClBjc,EAAQuC,KAGhBtC,EAAS,SAAEF,EAASC,GAChBnE,GAAQA,EAAKqE,OAASrE,EAAKqE,QAC3Bic,EAAajc,OAASic,EAAajc,QACnC7E,EAAK4gB,aAAa,GAClBjc,EAAQ,IAAIpB,MAAO,oBAG3BqH,EAASpK,KAAM4E,EAAS3O,MAKxB2O,EAEA,SAAAqG,GAAQ,OAAAzL,EAAKwI,IAAKiD,EAAMrP,GAAEgS,OAAQ,EAAM2I,SAAW,SAAY3R,OAIvE6T,qBAAA,WACI,IAAIxiB,KAAK2L,UAAT,CAIA,IAFA,IAAM2e,GAActqB,KAAKoc,YAEN5a,EAAAxB,KAAKgjB,OAAL3hB,WAAAA,IAAa,CAA3B,IAAIuV,OACLJ,GAAMxW,KAAM4W,GAER0T,GAAa1T,EAAO4F,UAG5Bxc,KAAKmqB,aAAa,GAElBnd,aAAMwP,qBAGVgG,mBAAA,SAAO+H,EAA8B5b,gBAAAA,MACjC,IAAM+F,EAASE,GAAO5U,MAChBwqB,EAAiBxqB,KAAKgjB,OAGxBuH,EACAxC,GAAqB/nB,KAAMyqB,GAAYzqB,KAAMuqB,EAAY5b,GAAWA,GAAS,IAG7E3O,KAAK2lB,MAAQ,GACb3lB,KAAKgjB,OAAS,IAGlBnN,GAAa7V,KAAM2O,GAEnBA,EAAQoH,QAAUtS,GAAUzD,KAAM,QAASA,QAAQwqB,kBAAmB7b,IAKtE,IAFQ,IAAAgX,EAAU3lB,eAEI0qB,IAAArpB,WAAAA,IAAgB,CAAjC,IAAIspB,OACLhF,EAAOgF,EAAUjf,MAAS8K,GAAMxW,KAAM2qB,GAI1C,OADAjW,GAAUG,GAAQ7U,MACXA,KAAKgjB,QAIhBR,iBAAA,SAAK+H,EAA8B5b,gBAAAA,MAC/B,IAAMkb,EAAWY,GAAYzqB,KAAMuqB,EAAY5b,GACzCmG,EAAc9U,KAAKgjB,OAAOnlB,OACpB0nB,GAAgBvlB,KAAM6pB,EAAUlb,GAChCoZ,GAAqB/nB,KAAM6pB,EAAUlb,GAEjD,GAAImG,EAEA,OADAA,EAAYD,SACLC,EAAYkQ,OAK3BxC,oBAAA,SAAQoI,EAAoBjc,GACxB,oBADwBA,MACpBic,EACOtsB,MAAMqK,QAASiiB,GACVlD,GAAY1nB,KAAM4qB,EAAcjc,YF3b7BU,EAA6BqE,EAA0B/E,GAC9E,IAAI4J,EAAgBlJ,EAAWvH,IAAK4L,GAEpC,GAAI6E,EAAO,CACP,IAAM7D,EAASE,GAAOvF,GAChB2T,EAAS3T,EAAW2T,OAG1BA,EAAOpR,OAAQoR,EAAOhd,QAASuS,GAAS,GACxCoM,GAAatV,EAAWsW,MAAOpN,GAG/B,IAAMsS,EAAShV,GAAaxG,EAAYV,GAexC,OAZIkc,IACArnB,GAAU+U,EAAO,SAAUA,EAAOlJ,EAAYV,GAC9CnL,GAAU6L,EAAY,SAAUkJ,EAAOlJ,EAAYV,IAGvD6H,GAAMnH,EAAYkJ,EAAO5J,EAAQ4N,OAEjCsO,GAAUpnB,GAAU4L,EAAY,SAAUA,EAAYV,GAGtD+F,GAAUG,GAAQxF,GAEXkJ,GEiaSuS,CAAW9qB,KAAM4qB,EAAcjc,GAGxC,IAGX6T,uBAAA,SAAWmE,GACP,OAAO,IAAIoE,GAAgB/qB,KAAM2mB,IAMrCnE,gCAAA,SAAoB+H,EAA6B5b,gBAAAA,MAC7C,IAAMkb,EAAWY,GAAYzqB,KAAMuqB,EAAY5b,GAE/C,OAAI3O,KAAKgjB,OAAOnlB,QACc,IAAnB8Q,EAAQ2C,OACHiU,GAAgBvlB,KAAM6pB,EAAUlb,GAAS,GACzCwZ,GAAgBnoB,KAAM6pB,EAAUlb,GAGrCoZ,GAAqB/nB,KAAM6pB,EAAUlb,IAWpD6T,kBAAA,SAAM7T,GACF,gBADEA,MACE2V,GAActkB,KAAM2O,GAAW,CAC/B,IAAM+F,EAASE,GAAO5U,MAElB6V,GAAa7V,KAAM2O,IACnBlL,GAAUzD,KAAM,OAAQA,KAAM2O,GAGlC+F,GAAUG,GAAQ7U,MAGtB,OAAOA,MAIXwiB,mBAAA,SAAOkE,EAAwB/X,GAC3B,IAAM1Q,EAAQ+B,KAAK8H,IAAK4e,GAExB,OADA1mB,KAAKsR,OAAQoV,KAAanK,OAAQ,GAAS5N,IACpC1Q,GAGXukB,qBAAA,SAASlD,GACL,OAAOA,EAAOtf,KAAKuY,MAAMla,UAAU4iB,cAIvCuB,oBAAA,SAAQjK,EAAWyS,GACf,IAAIjnB,EAAOoO,QAASnS,KAAK8H,IAAKyQ,IAC1B5U,OAAkB,IAAXqnB,GAAqBjnB,EAAOoO,QAAS6Y,GAWhD,OATIjnB,IAASJ,IACLI,EACA/D,KAAKsR,OAAQiH,GAGbvY,KAAK8pB,IAAKvR,IAIX5U,GAIX6e,kBAAA,SAAMlW,EAAkBE,EAAgBuM,EAAe9a,EAAgBkkB,IACjEA,GAAY3U,IAASM,QAASxB,EAAOE,EAAO,UAAIxM,KAAKuY,MAAMla,UAAU+W,2BAAoBpV,KAAKoV,qBAAsB2D,EAAM,CACxHkS,SAAWhtB,EACXitB,kBAAoBlrB,KAAKuY,MAAMla,UAAUwY,eAIjD2L,0BAAA,WACI,OAAOxV,aAAMoI,yBAAkB,cAOnCjX,sBAAIqkB,2BAAJ,WAAwB,OAAOxiB,KAAKgjB,OAAOnlB,wCAG3C2kB,kBAAA,SAAKjK,EAAwB5J,GACzB,OAAO3O,KAAK8pB,IAAIvR,KAAS7G,GAAI1R,KAAKnC,QAAW8Q,KAIjD6T,iBAAA,SAAK7T,GACD,IAAI4J,EAAQvY,KAAK0R,GAAG1R,KAAKnC,OAAS,GAElC,OADAmC,KAAKsR,OAAOiH,KAASgE,OAAQ,GAAS5N,IAC/B4J,GAIXiK,qBAAA,SAAQjK,EAAwB5J,GAC5B,OAAO3O,KAAK8pB,IAAIvR,KAAS7G,GAAI,GAAM/C,KAIvC6T,mBAAA,SAAO7T,GACH,IAAM4J,EAAQvY,KAAK0R,GAAG,GAEtB,OADA1R,KAAKsR,OAAQiH,KAASgE,OAAQ,GAAS5N,IAChC4J,GAxeJiK,UAASnE,GAiZTmE,aAAYvG,GApbVuG,SAbZ9a,EAAO,CAEJiO,UAAY,IACZ4C,MAAQuI,GACRtM,iBAAmB,UACnB4P,kBAAoB,OAEvBvd,EAAQuf,IACRjf,EAAY,CACToiB,WAAa9f,EAAWxL,MACxBsa,MAAQ9O,EAAWC,WACnB4f,WAAa7f,EAAW1C,SAEfyb,KA0MT,YAAa2I,EAA2Bxc,EAAkC0P,gBAAlC1P,MACpC,MAAA3B,aAAO+b,YACPxf,EAAKyZ,OAAS,GACdzZ,EAAKoc,MAAQ,GAEbpc,EAAKggB,WAAchgB,EAAKggB,gBAEG,IAAvB5a,EAAQ4a,aACRhgB,EAAKggB,WAAa5a,EAAQ4a,WAC1B5a,EAAQ4a,gBAAa,GAGzBhgB,EAAKgP,MAAchP,EAAKgP,MAEpB5J,EAAQ4J,QACRhP,EAAKgP,MAAQ5J,EAAQ4J,MACrB5J,EAAQ4J,WAAQ,GAGpBhP,EAAK0X,YAAc1X,EAAKgP,MAAMla,UAAU4iB,YAExC1X,EAAK6S,QAAUiC,GAAU,EAErB8M,GAEApD,GAAqBxe,EADJkhB,GAAYlhB,EAAM4hB,EAASxc,GACPA,GAAS,UAGlDpF,EAAKsC,WAAW9L,MAAOwJ,EAAM3L,WAEzB2L,EAAKyB,cAAezB,EAAKyB,aAAaiT,UAAW1U,EAAMA,KA+SnE,SAASkhB,GAA6Bpb,EAA4Bwa,EAA2Blb,GACzF,IAAMyc,EAASzc,EAAQgJ,MAAQtI,EAAWsI,MAAOkS,EAAUlb,GAAYkb,EACvE,OAAOvrB,MAAMqK,QAASyiB,GAAWA,EAAS,CAAEA,GAGhDtK,GAAM0B,WAAaA,GAEnB,WAA6B/c,QAAA0L,UAOzB4Z,iBAAA,SAAKzrB,GACDU,KAAKqP,WAAWgc,OAAQrrB,KAAKuY,YAPjC,YACYlJ,EACAkJ,GACJ,MAAAvL,aAAOqC,EAAWvH,IAAKyQ,iBAFnBhP,aAAA8F,EACA9F,QAAAgP,aChlBA+S,GAAgBC,GAC5B,cAAeA,GACX,IAAK,WACD,OAAO,SAAArb,GAAQ,OAAMqb,EAAennB,KAAM8L,IAC9C,IAAK,SACD,OAAO,WAAM,OAAYqb,GAC7B,IAAK,SAED,OADoB,IAAItL,GAA2BsL,YCG/D,WAA2B9lB,QAAA6S,IAEvBkT,oBAAA,SAAQvtB,GACJ,OAAOA,GAA0B,iBAAVA,EAAqBA,EAAMuiB,GAAKviB,GAI3DutB,mBAAA,SAAOvtB,GACH,OAAOA,GAA0B,iBAAVA,EAAqBA,EAAMuiB,GAAKviB,GAI3DutB,uBAAA,SAAWnrB,EAAmBC,GAI1B,OAHUD,IAAwB,MAATA,EAAGmgB,GAAangB,EAAYA,EAAGmgB,QAC9ClgB,IAAwB,MAATA,EAAGkgB,GAAalgB,EAAYA,EAAGkgB,MAM5DgL,sBAAA,SAAUjT,EAAOta,EAAOP,SApB5B,+DAuBA,SAAS+tB,GAAkDC,EAAwCC,GAC/F,IAAMC,EAAsBN,GAAgBI,GAO5C,OALiB,IAAIlO,GAA0B,CAC3Cvf,MAAQ,KACRmf,UAAYoO,KAIX1jB,IAAK,SAAU6hB,EAAyBjsB,GACrC,GAAuB,iBAAZisB,EAAuB,OAAOA,EAGzC,IAAMta,EAAauc,EAAqB5rB,MAClC4W,EAAiB,KAYvB,OATIvH,GAAcA,EAAWxR,SAEzB+Y,EAASvH,EAAWvH,IAAK6hB,IAAa,MACtC3pB,KAAK+W,WAAYrZ,GAASkZ,IAGhB5W,KAAK6W,YAAanZ,GAAO8a,aAAc5B,EAAQ,KAAM5W,KAAM,KAGlE4W,aCxDHiV,GAA4EH,EAAwCC,GAChI,IAAMG,EAAkBH,GAAKnJ,GAEzBuJ,EAAWD,EAAgB3C,YAAe2C,EAAgB3C,UAiClE,SAAiC2C,GACrB,kBAQJ,WAAalB,EAAejc,GACxB,MAAA3B,YAAO,GAAI2B,EAASqd,iBAPxBziB,eAA4B,KAQxBA,EAAK0iB,KAAOC,GAAStB,KAyH7B,OAnIyCnlB,OAMrCtH,sBAAIguB,mCAAJ,WAAuB,OAAOnsB,KAAKisB,MAAQjsB,KAAKgjB,wCAQhDmJ,gBAAA,SAAK5B,EAAY5b,gBAAAA,MACL,IAAAyd,EAAiBpsB,kBACjBsoB,EAAQ4D,GAAS3B,GAEzB,GAAI6B,EAEA,OAAOpf,YAAM8c,cAAKuC,GAAaD,EAAc9D,GAAS3Z,GAItD,GAAI2Z,EAAMzqB,OAAQ,CACd,IAAM6W,EAASC,GAAeC,MAAO5U,MAGrCA,KAAKisB,KAAOjsB,KAAKisB,KAAOjsB,KAAKisB,KAAKhqB,OAAQqmB,GAAUA,EAAMvlB,QAE1D4R,GAAekB,YAAa7V,KAAM2O,GAGlC+F,GAAUC,GAAeE,OAAQ7U,QAK7CmsB,kBAAA,SAAO5B,EAAa5b,gBAAAA,MACR,IAAAyd,EAAiBpsB,kBACrB6pB,EAAWqC,GAAS3B,GAExB,OAAO6B,EAEHpf,YAAM+c,gBAAOsC,GAAaD,EAAcvC,GAAYlb,GAEpD2d,GAAUtsB,KAAM6pB,EAAUlb,IAAoB,IAGtDwd,+BAAA,SAAoB5B,EAAY5b,GACpB,IAAAyd,EAAiBpsB,kBACrB6pB,EAAWqC,GAAS3B,GAExB,OAAO6B,EAEHpf,YAAMuK,6BAAoB8U,GAAaD,EAAcvC,GAAYlb,GAEjE2d,GAAUtsB,KAAM6pB,EAAUlb,IAIlCwd,mBAAA,WACI,OAAOnsB,KAAKisB,KACRjsB,KAAKisB,KAAKlqB,IAAK,SAAA4nB,GAAW,OAAAA,EAAQnJ,IAAMmJ,IACxC3pB,KAAKgjB,OAAOjhB,IAAK,SAAAwW,GAAS,OAAAA,EAAMiI,MAIxC2L,4BAAA,WAAmB,OAAO,GAE1BhuB,sBAAIguB,0BAAJ,WACI,OAAOnsB,KAAKgjB,OAAOnlB,SAAYmC,KAAKisB,KAAOjsB,KAAKisB,KAAKpuB,OAAS,oCAIlEsuB,kBAAA,SAAO9V,GACH,IACIuL,EAAO,IADM5hB,KAAMtB,YACF,GAAI,CACjB6Z,MAAQvY,KAAKuY,MACbgR,WAAavpB,KAAKupB,aAa1B,OAVIvpB,KAAKosB,cAELxK,EAAKwK,aAAepsB,KAAKosB,aACzBxK,EAAKqK,KAAO,KACZrK,EAAKmI,MAAO/pB,KAAKgjB,OAAQ,CAAEjN,QAAS,KAGpC6L,EAAKqK,KAAOjsB,KAAKisB,KAAKlpB,QAGnB6e,GAIXuK,kBAAA,SAAOI,GACH,OAAOA,GAGXJ,oBAAA,SAAS9c,GAUL,OATIA,GAAcA,EAAWxR,SACzBmC,KAAKosB,aAAe/c,EAEhBrP,KAAKisB,OACLjsB,KAAK+pB,MAAO/pB,KAAKisB,KAAM,CAAElW,QAAS,IAClC/V,KAAKisB,KAAO,OAIbjsB,MAGXmsB,wBAAA,WAA4B,OAAOnsB,KAAKyY,UAExC0T,mBAAA,SAAQzF,EAAiBnF,GACrB,OAAOvU,YAAMqe,iBAAQrrB,KAAKosB,aAAatkB,IAAK4e,GAAanF,IAG7D4K,mBAAA,WACI,GAAInsB,KAAKosB,aAEL,OADApsB,KAAK+R,IAAK/R,KAAKosB,aAAapJ,QACrBhjB,KAAKgjB,OAGhB,MAAM,IAAIlW,MAAO,0EAGrBqf,sBAAA,WACI,OAAOnsB,KAAKnC,OAASmC,KAAK+pB,QAAU/pB,KAAKwsB,UAjInCL,KAAbzkB,GAAaykB,IAA2BL,GAwIzC,OAFAK,EAAmB9tB,UAAUgmB,iBAAc,EAEpC8H,EA1KmEM,CAAwBX,IAC9FF,EAAsBN,GAAgBI,GAE1C,OAAOhT,GAAMqT,GAAWjkB,IACpB,SAAUmkB,GAEN,OADCA,GAAQA,EAAKG,cAAgBH,EAAKhe,QAAS2d,EAAqB5rB,OAC1DisB,ID2DjBnL,GAAe4L,SAAWjB,GC7C1BjJ,GAAoBqJ,SAAWA,GAGjCrJ,GAAWnkB,UAAUsuB,aAAe,SAAiD3J,EAAcrU,GAC/F,IACMie,EAAW,IADAf,GAAU7rB,KAAMA,KAAKtB,aAAqBiQ,QAAQ+J,MACpCsK,EAAQrU,GAGvC,OADAie,EAAO3e,QAASjO,MACT4sB,GAGX,IAAMZ,GAAmBlY,gBAAc6I,MAAQ7I,gBAAcuI,WA0J7D,SAASgQ,GAAaQ,EAAQhD,GAG1B,IAFA,IAAMsB,EAAU,OAED2B,IAAAzrB,WAAAA,IAAU,CAApB,IAAIqS,OACCkD,EAASiW,EAAO/kB,IAAK4L,GACvBkD,GAASuU,EAAQ3oB,KAAMoU,GAG/B,OAAOuU,EAGX,SAASmB,GAAUjd,EAAYwa,EAAUlb,GACrC,GAAIyJ,EAAgB/I,EAAW4c,KAAMpC,GAAY,CAC7C,IAAMnV,EAASC,GAAeC,MAAOvF,GAGrCA,EAAW4c,KAAOpC,EAAS9mB,QAE3B4R,GAAekB,YAAaxG,EAAYV,GAGxC+F,GAAUC,GAAeE,OAAQxF,IAIzC,SAAS6c,GAASrC,GACd,OAAOA,EACHvrB,MAAMqK,QAASkhB,GAAaA,EAAW,CAAEA,GACzC,GC/NR,UAAIH,GAAiB,SAEMjkB,QAAAqb,IACvBiM,sBAAA,WAAqB,OAAO/sB,MAG5B+sB,iBAAA,SAAKrvB,GAED,IAAIoS,EAAQ9P,KAAMtC,GAGlB,OAAIoS,GAAS9P,OAASA,KAAKsV,cAAuBxF,EAG3C9P,KAAKsU,OAAStU,KAAKsU,OAAOxM,IAAKpK,GAASsC,KAAKsV,cAAcxN,IAAKpK,IAG3ES,sBAAW4uB,iBAAX,WAAqB,OAAOrD,QAC5B,SAAmBsD,GACXtD,IACFA,GAAOlN,UAGTtI,GAAc7V,UAAUiX,cAAgBoU,GAASsD,uCArBzD,+DAyBAD,GAAME,OAAS,IAAIF,GC7BG,oBAAXxO,QACPpgB,OAAOqI,eAAgByG,OAAQ,SAAU,CAAEhP,MAAQ,CAAEsT,SAAW,mBAAqBtH,cAAe,QAuBzFrH,IAAFpB,GAAyEsK,OAAnEhJ,UAAKgL,cAASnO,WAAM8U,eAAU7I,oBAAeshB,4BAmBhDxU,GAAS9S,GACrB,OAAOtH,MAAMqK,QAAS/C,GAClBunB,GAAOC,GAAUxnB,EAAG,IAAM4c,YAC1B2K,GAAOC,GAAUxnB,IAGR,SAAXwnB,GAAWxnB,GACb,OAAK,MAALA,GAAazH,OAAOC,eAAgBwH,KAAQzH,OAAOE,UAC/C0Y,GAAYnR,GACZA,EAER4X,GAAuBoB,KAAO,SAAEvX,GAE5B,OAAIA,GAAQA,aAAgBmW,GACjBnW,EAGS,mBAATA,EAA6BqR,GAAMrR,GAE1C/I,MAAMqK,QAAStB,GACK,IAAhBA,EAAKxJ,SACJwJ,EAAM,IACkB,mBAAdA,EAAM,IACblJ,OAAOC,eAAgBiJ,EAAM,MAAUlJ,OAAOE,WAGlDwP,GAAK,QAAS,0BAA2B,yJAClC5P,GAAOoJ,IAGXqR,GAAMrR,GAGbA,GAAwB,iBAATA,EACXlJ,OAAOC,eAAgBiJ,KAAWlJ,OAAOE,WACzCwP,GAAK,QAAS,0BAA2B,wIAClC5P,GAAOoJ,IAGd1I,EAAS0I,IACTwG,GAAK,QAAS,0BAA2B,yIAClC5P,GAAOoJ,IAGXqR,GAAMrR,GAGVpJ,GAAOoJ,wZXAInJ,EAAOmvB,GACzB,GAAuB,oBAAZ/mB,SAA2BA,QAAQgnB,YAAa,CACvD,IAAID,EAGA,CACA,IAAME,EAAQrvB,EACd,OAAO,SAAEA,EAAgBmvB,GACrB3U,GAAMpS,QAAQgnB,YAAa,cAAepvB,EAAOmvB,IAAapvB,MAAOsvB,GAAQC,GAAItvB,EAAOmvB,IAL5F3U,GAAMpS,QAAQgnB,YAAa,cAAepvB,EAAOmvB,IAAaG,GAAItvB,EAAOmvB,QAU7EnvB,EAAM8Z,KAAM,QAAS,uBAAwB,sHdvEzB,6INFZzC,EAAkB1Q,GAEtB,IAAAwK,EAAexK,aACvB,GAAIwK,EACA,OAAOkG,EAAkBlG,GAI7B,GAAIxK,EAAKyP,OAAQ,CACL,IAAAkB,EAAe3Q,EAAKyP,kBAC5B,OAAOkB,GAAcA,EAAY3Q,EAAK0P,mOH6FPkZ,GACnC,OAAO,SAAkBvvB,EAAOR,IACfQ,EAAMP,eAAgB8vB,GAC/BvvB,EAAOuvB,GAAcvvB,EAAOuvB,IAAcvvB,EAAOuvB,IAAc,IAAI1qB,SAElEP,KAAK9E,+HkC/GiCgwB,GAC/C,OAAY,eAAA,IACJxuB,kBADcmC,mBAAAA,IAAAsL,kBAOlB,OAJA3M,KAAK8U,YAAa,WACd5V,EAASwuB,EAAO3tB,MAAOwJ,EAAMoD,KAG1BzN,+FzBJa"} \ No newline at end of file diff --git a/models/lib/collection/index.js b/models/lib/collection/index.js index 805b3a51..589ef1bd 100644 --- a/models/lib/collection/index.js +++ b/models/lib/collection/index.js @@ -1,7 +1,7 @@ import { __assign, __decorate, __extends } from "tslib"; import { Linked } from '@linked/value'; import { define, definitions, EventMap, eventsApi, logger, Mixable, mixinRules, mixins } from '@type-r/mixture'; -import { startIO } from '../io-tools'; +import { createIOPromise, startIO } from '../io-tools'; import { AggregatedType, Model, SharedType, shared, attributes } from '../model'; import { ItemsBehavior, Transactional, transactionApi } from '../transactions'; import { addTransaction } from './add'; @@ -199,15 +199,7 @@ var Collection = (function (_super) { Collection.prototype.liveUpdates = function (enabled) { var _this = this; if (enabled) { - this.liveUpdates(false); - var filter_1 = typeof enabled === 'function' ? enabled : function () { return true; }; - this._liveUpdates = { - updated: function (json) { - filter_1(json) && _this.add(json, { parse: true, merge: true }); - }, - removed: function (id) { return _this.remove(id); } - }; - return this.getEndpoint().subscribe(this._liveUpdates, this).then(function () { return _this; }); + return this._subscribeLiveUpdates(enabled).then(function () { return _this; }); } else { if (this._liveUpdates) { @@ -216,17 +208,44 @@ var Collection = (function (_super) { } } }; + Collection.prototype._subscribeLiveUpdates = function (enabled) { + var _this = this; + this.liveUpdates(false); + var filter = typeof enabled === 'function' ? enabled : function () { return true; }; + this._liveUpdates = { + updated: function (json) { + filter(json) && _this.add(json, { parse: true, merge: true }); + }, + removed: function (id) { return _this.remove(id); } + }; + return this.getEndpoint().subscribe(this._liveUpdates, this); + }; Collection.prototype.fetch = function (a_options) { var _this = this; if (a_options === void 0) { a_options = {}; } var options = __assign({ parse: true }, a_options), endpoint = this.getEndpoint(); - return startIO(this, endpoint.list(options, this), options, function (json) { - var result = _this.set(json, __assign({ parse: true, ioMethod: 'fetch' }, options)); - if (options.liveUpdates) { - result = _this.liveUpdates(options.liveUpdates); - } - return result; - }); + var promise = options.liveUpdates ? + createIOPromise(function (resolve, reject, onAbort) { + var list; + var subscription = _this._subscribeLiveUpdates(options.liveUpdates); + subscription + .then(function () { + list = endpoint.list(options, _this); + return list; + }) + .then(resolve, function (error) { + _this.liveUpdates(false); + reject(error); + }); + onAbort(function (resolve, reject) { + list && list.abort && list.abort(); + subscription.abort && subscription.abort(); + _this.liveUpdates(false); + reject(new Error('I/O Aborted')); + }); + }) : + endpoint.list(options, this); + return startIO(this, promise, options, function (json) { return _this.set(json, __assign({ parse: true, ioMethod: 'fetch' }, options)); }); }; Collection.prototype.dispose = function () { if (this._disposed) diff --git a/models/lib/collection/index.js.map b/models/lib/collection/index.js.map index 94b651e8..6436f0ea 100644 --- a/models/lib/collection/index.js.map +++ b/models/lib/collection/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collection/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/collection/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/models/src/collection/index.ts b/models/src/collection/index.ts index 029ae451..696129ac 100644 --- a/models/src/collection/index.ts +++ b/models/src/collection/index.ts @@ -1,6 +1,6 @@ import { Linked } from '@linked/value'; import { define, definitions, EventMap, eventsApi, EventsDefinition, Logger, logger, LogLevel, Mixable, mixinRules, mixins, TheType } from '@type-r/mixture'; -import { IOPromise, startIO } from '../io-tools'; +import { createIOPromise, IOPromise, startIO } from '../io-tools'; import { AggregatedType, Model, SharedType, shared, AnonymousModelConstructor, attributes } from '../model'; import { CloneOptions, ItemsBehavior, Transactional, TransactionalDefinition, transactionApi, TransactionOptions } from '../transactions'; import { AddOptions, addTransaction } from './add'; @@ -330,19 +330,7 @@ export class Collection< R extends Model = Model> extends Transactional implemen */ liveUpdates( enabled : LiveUpdatesOption ) : IOPromise { if( enabled ){ - this.liveUpdates( false ); - - const filter = typeof enabled === 'function' ? enabled : () => true; - - this._liveUpdates = { - updated : json => { - filter( json ) && this.add( json, { parse : true, merge : true } ); - }, - - removed : id => this.remove( id ) - }; - - return this.getEndpoint().subscribe( this._liveUpdates, this ).then( () => this ); + return this._subscribeLiveUpdates( enabled ).then( () => this ); } else{ if( this._liveUpdates ){ @@ -357,24 +345,57 @@ export class Collection< R extends Model = Model> extends Transactional implemen /** @internal */ _liveUpdates : object + /** @internal */ + _subscribeLiveUpdates( enabled : LiveUpdatesOption ) : IOPromise { + this.liveUpdates( false ); + + const filter = typeof enabled === 'function' ? enabled : () => true; + + this._liveUpdates = { + updated : json => { + filter( json ) && this.add( json, { parse : true, merge : true } ); + }, + + removed : id => this.remove( id ) + }; + + return this.getEndpoint().subscribe( this._liveUpdates, this ); + } + fetch( a_options : { liveUpdates? : LiveUpdatesOption } & TransactionOptions & { [ key : string ] : any } = {} ) : IOPromise { const options = { parse : true, ...a_options }, endpoint = this.getEndpoint(); + const promise = options.liveUpdates ? + createIOPromise( ( resolve, reject, onAbort ) => { + let list : IOPromise; + const subscription = this._subscribeLiveUpdates( options.liveUpdates ); + + subscription + .then( () => { + list = endpoint.list( options, this ); + return list; + }) + .then( resolve, error => { + this.liveUpdates( false ); + reject( error ); + }); + + onAbort( ( resolve, reject ) => { + list && list.abort && list.abort(); + subscription.abort && subscription.abort(); + this.liveUpdates( false ); + reject( new Error( 'I/O Aborted' ) ); + }); + }) : + endpoint.list( options, this ); + return startIO( this, - endpoint.list( options, this ), + promise, options, - json => { - let result : any = this.set( json, { parse : true, ioMethod : 'fetch', ...options } as TransactionOptions ); - - if( options.liveUpdates ){ - result = this.liveUpdates( options.liveUpdates ); - } - - return result; - } + json => this.set( json, { parse : true, ioMethod : 'fetch', ...options } as TransactionOptions ) ); }