UNPKG

mosx

Version:

Multiview observable state management engine

398 lines 39.1 kB
"use strict"; var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); 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; return c > 3 && r && Object.defineProperty(target, key, r), r; }; Object.defineProperty(exports, "__esModule", { value: true }); const index_1 = require("../index"); const tester_1 = require("../src/tester"); let Public = class Public { constructor(params = {}) { this.name = ""; const that = this; Object.keys(params).forEach(key => { that[key] = params[key]; }); } get comp() { return this.pprop; } get pcomp() { return this.mobx; } }; __decorate([ index_1.mx ], Public.prototype, "prop", void 0); __decorate([ index_1.mx.private ], Public.prototype, "pprop", void 0); __decorate([ index_1.mx.computed ], Public.prototype, "comp", null); __decorate([ index_1.mx.computed.private ], Public.prototype, "pcomp", null); __decorate([ index_1.mx.observable ], Public.prototype, "mobx", void 0); Public = __decorate([ index_1.mx.Object ], Public); let Private = class Private extends Public { }; __decorate([ index_1.mx ], Private.prototype, "ext", void 0); Private = __decorate([ index_1.mx.Object.private ], Private); class State extends Public { } __decorate([ index_1.mx ], State.prototype, "prop1", void 0); __decorate([ index_1.mx.private ], State.prototype, "pprop1", void 0); const state = new State({ name: "state" }); index_1.Mosx.addTag(state, "123"); const stateTracker = index_1.Mosx.createTracker(state); const tester = new tester_1.MosxTester(stateTracker); tester.addListener("client1", "1"); tester.addListener("client2", ["2", "123"]); const c1 = (id, value) => id === "client2" ? undefined : value; const c2 = (id, value) => id === "client1" ? undefined : value; const unhandledTest = (unhandled) => { test("should not be unhandled patches", () => { unhandled.length && console.log(unhandled); expect(unhandled.length).toBe(0); }); }; describe("Replace public property", () => { const value = "test value"; tester .onAction(() => state.prop = value) .trigger(2, (id, change) => { test(`${id} should get replace change for property`, () => { expect(change).toEqual({ path: "/prop", op: "replace", value }); }); }).run(unhandledTest); }); describe("Replace public property with private object", () => { const oldValue = state.prop; const obj = { prop: "test", pprop: "test2", ext: "ext" }; const value = new Private(Object.assign(Object.assign({}, obj), { name: "prop" })); index_1.Mosx.setParent(value, state); tester .onAction(() => state.prop = value) .trigger(2, (id, change) => { test(`${id} should get replace change for property`, () => { expect(change).toMatchObject({ path: "/prop", op: "replace", value: c2(id, obj), oldValue }); }); }).run(unhandledTest); }); describe("Replace private property", () => { const value = "test value"; tester .onAction(() => { state.pprop = value; }) .trigger((id, change) => { test(`${id} should get replace change for computed property`, () => { expect(id).toBe("client1"); expect(change).toEqual({ path: "/comp", op: "replace", value }); }); }) .trigger((id, change) => { test(`${id} should get replace change for computed property`, () => { expect(id).toBe("client2"); expect(change).toEqual({ path: "/comp", op: "replace", value }); }); }) .trigger((id, change) => { test(`${id} should get replace change for private property`, () => { expect(id).toBe("client2"); expect(change).toEqual({ path: "/pprop", op: "replace", value }); }); }).run(unhandledTest); }); state.prop1 = []; describe("Add to public array", () => { const value = "test value"; tester .onAction(() => state.prop1.push(value)) .trigger(2, (id, change) => { test(`${id} should get add change for array property`, () => { expect(change).toEqual({ path: "/prop1/0", op: "add", value }); }); }).run(unhandledTest); }); describe("Update item in public array", () => { const oldValue = "test value"; const value = "test value 2"; tester .onAction(() => state.prop1[0] = value) .trigger(2, (id, change) => { test(`${id} should get remove change for array property`, () => { expect(change).toEqual({ path: "/prop1/0", op: "replace", value, oldValue }); }); }).run(unhandledTest); }); describe("Remove from public array", () => { const oldValue = state.prop1[0]; tester .onAction(() => state.prop1.pop()) .trigger(2, (id, change) => { test(`${id} should get remove change for array property`, () => { expect(change).toEqual({ path: "/prop1/0", op: "remove", oldValue }); }); }).run(unhandledTest); }); describe("Add private object to public array", () => { const obj = { prop: "test", pprop: "test2", ext: "ext" }; const value = new Private(Object.assign(Object.assign({}, obj), { name: "prop1/0" })); index_1.Mosx.setParent(value, state); tester .onAction(() => state.prop1.push(value)) .trigger(2, (id, change) => { test(`${id} should get add change for array property`, () => { expect(change).toMatchObject({ path: "/prop1/0", op: "add", value: c2(id, obj) }); }); }).run(unhandledTest); }); describe("Replace property in private object in public array", () => { const value = "test value"; const oldValue = state.prop1[0].prop; tester .onAction(() => state.prop1[0].prop = value) .trigger((id, change) => { test(`${id} should get replace change for private property`, () => { expect(id).toBe("client2"); expect(change).toEqual({ path: "/prop1/0/prop", op: "replace", value, oldValue }); }); }).run(unhandledTest); }); describe("Remove private object from public array", () => { const obj = { prop: "test value", pprop: "test2", ext: "ext" }; tester .onAction(() => state.prop1.pop()) .trigger(2, (id, change) => { test(`${id} should get remove change for array property`, () => { expect(change).toMatchObject({ path: "/prop1/0", op: "remove", oldValue: c2(id, obj) }); }); }).run(unhandledTest); }); describe("Set private property to array", () => { tester .onAction(() => { state.pprop1 = []; }) .trigger((id, change) => { test(`${id} should get replace change for array property`, () => { expect(id).toBe("client2"); expect(change).toEqual({ path: "/pprop1", op: "replace", value: [] }); }); }).run(unhandledTest); }); state.pprop1 = []; describe("Add to private array", () => { const value = "test value"; tester .onAction(() => state.pprop1.push(value)) .trigger((id, change) => { test(`${id} should get add change for array property`, () => { expect(id).toBe("client2"); expect(change).toEqual({ path: "/pprop1/0", op: "add", value }); }); }).run(unhandledTest); }); describe("Remove from private array", () => { const oldValue = state.pprop1[0]; tester .onAction(() => state.pprop1.pop()) .trigger((id, change) => { test(`${id} should get remove change for array property`, () => { expect(id).toBe("client2"); expect(change).toEqual({ path: "/pprop1/0", op: "remove", oldValue }); }); }).run(unhandledTest); }); state.prop1 = new Map(); describe("Add to public map", () => { const key = "12345"; const value = "test value"; tester .onAction(() => state.prop1.set(key, value)) .trigger(2, (id, change) => { test(`${id} should get add change for map property`, () => { expect(change).toEqual({ path: "/prop1/" + key, op: "add", value }); }); }).run(unhandledTest); }); describe("Replace item in public map", () => { const key = "12345"; const oldValue = state.prop1.get(key); const value = "test value 2"; tester .onAction(() => state.prop1.set(key, value)) .trigger(2, (id, change) => { test(`${id} should get replace change for map property`, () => { expect(change).toEqual({ path: "/prop1/" + key, op: "replace", value, oldValue }); }); }).run(unhandledTest); }); describe("Add private object to public map", () => { const key = "private"; const obj = { prop: "test", pprop: "test2", ext: "ext" }; const value = new Private(Object.assign(Object.assign({}, obj), { name: "prop1/private" })); index_1.Mosx.setParent(value, state); tester .onAction(() => state.prop1.set(key, value)) .trigger((id, change) => { test(`${id} should get add change for map property`, () => { expect(id).toBe("client2"); expect(change).toMatchObject({ path: "/prop1/" + key, op: "add", value: obj }); }); }).run(unhandledTest); }); state.pprop1 = new Map(); describe("Add to private map", () => { const key = "12345"; const value = "test value"; tester .onAction(() => state.pprop1.set(key, value)) .trigger((id, change) => { test(`${id} should get add change for map property`, () => { expect(id).toBe("client2"); expect(change).toEqual({ path: "/pprop1/" + key, op: "add", value }); }); }).run(unhandledTest); }); describe("Replace observable property to trigger computed property", () => { const value = "test value"; tester .onAction(() => state.mobx = value) .trigger((id, change) => { test(`${id} should get replace change for computed property`, () => { expect(id).toBe("client2"); expect(change).toEqual({ path: "/pcomp", op: "replace", value }); }); }).run(unhandledTest); }); const view1 = index_1.Mosx.getSnapshot(state, "1"); describe("Snapshot of state for client1", () => { test(`should not have private/observable properties`, () => { expect(view1).toMatchObject({ comp: "test value", prop1: { 12345: "test value 2" } }); expect(view1).not.toHaveProperty("pprop"); expect(view1).not.toHaveProperty("pcomp"); expect(view1).not.toHaveProperty("mobx"); }); test(`should have undefined value for private object`, () => { expect(view1.prop1.private).toBe(undefined); }); }); const view2 = index_1.Mosx.getSnapshot(state, "123"); describe("Snapshot of state for client2", () => { test(`should have private properties and not have observable properties`, () => { expect(view2).toMatchObject({ comp: "test value", prop1: { 12345: "test value 2" } }); expect(view2).toHaveProperty("pprop"); expect(view2).toHaveProperty("pcomp"); expect(view2).not.toHaveProperty("mobx"); }); test(`should have value for private object`, () => { expect(view2.prop1.private).toMatchObject({ prop: "test", pprop: "test2", ext: "ext" }); }); }); describe("Add tag of client1 to state", () => { tester .onAction(() => index_1.Mosx.addTag(state, "1")) .trigger((id, change) => { test(`${id} should get add change for private propery`, () => { expect(id).toBe("client1"); expect(change).toMatchObject({ path: "/pprop", op: "add", value: view2.pprop }); }); }) .trigger((id, change) => { test(`${id} should get add change for private computed property`, () => { expect(id).toBe("client1"); expect(change).toMatchObject({ path: "/pcomp", op: "add", value: view2.pcomp }); }); }) .trigger((id, change) => { test(`${id} should get add change for private property`, () => { expect(id).toBe("client1"); expect(change).toMatchObject({ path: "/pprop1", op: "add", value: view2.pprop1 }); }); }) .trigger((id, change) => { test(`${id} should get replace change for private object`, () => { expect(id).toBe("client1"); expect(change).toMatchObject({ path: "/prop", op: "replace", value: view2.prop }); }); }) .trigger((id, change) => { test(`${id} should get add change for private object of public map propery`, () => { expect(id).toBe("client1"); expect(change).toMatchObject({ path: "/prop1/private", op: "add", value: view2.prop1.private }); }); }).run(unhandledTest); }); describe("Remove tag of client1 to state", () => { tester .onAction(() => index_1.Mosx.deleteTag(state, "1")) .trigger((id, change) => { test(`${id} should get add change for private propery`, () => { expect(id).toBe("client1"); expect(change).toMatchObject({ path: "/pprop", op: "remove", oldValue: view2.pprop }); }); }) .trigger((id, change) => { test(`${id} should get add change for private computed property`, () => { expect(id).toBe("client1"); expect(change).toMatchObject({ path: "/pcomp", op: "remove", oldValue: view2.pcomp }); }); }) .trigger((id, change) => { test(`${id} should get add change for private property`, () => { expect(id).toBe("client1"); expect(change).toMatchObject({ path: "/pprop1", op: "remove", oldValue: view2.pprop1 }); }); }) .trigger((id, change) => { test(`${id} should get replace change for private object`, () => { expect(id).toBe("client1"); expect(change).toMatchObject({ path: "/prop", op: "replace", oldValue: view2.prop }); }); }) .trigger((id, change) => { test(`${id} should remove change for private object of public map propery`, () => { expect(id).toBe("client1"); expect(change).toMatchObject({ path: "/prop1/private", op: "remove", oldValue: view2.prop1.private }); }); }) .run(unhandledTest); }); // TODO: add/remove tag for private object const p = state.prop1.get("private"); describe("Add tag of client1 to private object in map", () => { tester .onAction(() => index_1.Mosx.addTag(p, "1")) .trigger((id, change) => { test(`${id} should get add change for private object of public map propery`, () => { expect(id).toBe("client1"); expect(change).toMatchObject({ path: "/prop1/private", op: "add", value: view2.prop1.private }); }); }).run(unhandledTest); }); describe("Stop tracking change", () => { const value = "test"; tester.disposers.client1(); tester .onAction(() => state.prop = value) .trigger((id, change) => { test(`${id} should get replace change for property`, () => { expect(change).toMatchObject({ path: "/prop", op: "replace", value }); }); }).run(unhandledTest); }); // TODO spy test //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9zeC50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vdGVzdHMvbW9zeC50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7O0FBQUEsb0NBQXlEO0FBQ3pELDBDQUEwQztBQUcxQyxJQUFNLE1BQU0sR0FBWixNQUFNLE1BQU07SUFTVixZQUFZLFNBQWMsRUFBRTtRQUZyQixTQUFJLEdBQVcsRUFBRSxDQUFBO1FBR3RCLE1BQU0sSUFBSSxHQUFHLElBQVcsQ0FBQTtRQUN4QixNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFBRTtZQUNoQyxJQUFJLENBQUMsR0FBRyxDQUFDLEdBQUcsTUFBTSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ3pCLENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQVhZLElBQUksSUFBSSxLQUFLLE9BQU8sSUFBSSxDQUFDLEtBQUssQ0FBQSxDQUFDLENBQUM7SUFDeEIsSUFBSSxLQUFLLEtBQUssT0FBTyxJQUFJLENBQUMsSUFBSSxDQUFBLENBQUMsQ0FBQztDQVd0RCxDQUFBO0FBZEs7SUFBSCxVQUFFO29DQUFpQjtBQUNSO0lBQVgsVUFBRSxDQUFDLE9BQU87cUNBQWtCO0FBQ2hCO0lBQVosVUFBRSxDQUFDLFFBQVE7a0NBQWlDO0FBQ3hCO0lBQXBCLFVBQUUsQ0FBQyxRQUFRLENBQUMsT0FBTzttQ0FBaUM7QUFDdEM7SUFBZCxVQUFFLENBQUMsVUFBVTtvQ0FBaUI7QUFMM0IsTUFBTTtJQURYLFVBQUUsQ0FBQyxNQUFNO0dBQ0osTUFBTSxDQWVYO0FBR0QsSUFBTSxPQUFPLEdBQWIsTUFBTSxPQUFRLFNBQVEsTUFBTTtDQUUzQixDQUFBO0FBREs7SUFBSCxVQUFFO29DQUFnQjtBQURmLE9BQU87SUFEWixVQUFFLENBQUMsTUFBTSxDQUFDLE9BQU87R0FDWixPQUFPLENBRVo7QUFFRCxNQUFNLEtBQU0sU0FBUSxNQUFNO0NBR3pCO0FB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cEQsSUFBSSxDQUFDLEdBQUcsRUFBRSxzREFBc0QsRUFBRSxHQUFHLEVBQUU7WUFDckUsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUNqRixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQztTQUNELE9BQU8sQ0FBQyxDQUFDLEVBQVUsRUFBRSxNQUE0QixFQUFFLEVBQUU7UUFDcEQsSUFBSSxDQUFDLEdBQUcsRUFBRSw2Q0FBNkMsRUFBRSxHQUFHLEVBQUU7WUFDNUQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQTtRQUNuRixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQztTQUNELE9BQU8sQ0FBQyxDQUFDLEVBQVUsRUFBRSxNQUE0QixFQUFFLEVBQUU7UUFDcEQsSUFBSSxDQUFDLEdBQUcsRUFBRSwrQ0FBK0MsRUFBRSxHQUFHLEVBQUU7WUFDOUQsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLE9BQU8sRUFBRSxFQUFFLEVBQUUsU0FBUyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtRQUNuRixDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQztTQUNELE9BQU8sQ0FBQyxDQUFDLEVBQVUsRUFBRSxNQUE0QixFQUFFLEVBQUU7UUFDcEQsSUFBSSxDQUFDLEdBQUcsRUFBRSxpRUFBaUUsRUFBRSxHQUFHLEVBQUU7WUFDaEYsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUNqRyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtBQUN2QixDQUFDLENBQUMsQ0FBQTtBQUVGLFFBQVEsQ0FBQyxnQ0FBZ0MsRUFBRSxHQUFHLEVBQUU7SUFDOUMsTUFBTTtTQUNMLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxZQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxHQUFHLENBQUMsQ0FBQztTQUMxQyxPQUFPLENBQUMsQ0FBQyxFQUFVLEVBQUUsTUFBNEIsRUFBRSxFQUFFO1FBQ3BELElBQUksQ0FBQyxHQUFHLEVBQUUsNENBQTRDLEVBQUUsR0FBRyxFQUFFO1lBQzNELE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDdkYsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUM7U0FDRCxPQUFPLENBQUMsQ0FBQyxFQUFVLEVBQUUsTUFBNEIsRUFBRSxFQUFFO1FBQ3BELElBQUksQ0FBQyxHQUFHLEVBQUUsc0RBQXNELEVBQUUsR0FBRyxFQUFFO1lBQ3JFLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUE7UUFDdkYsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUM7U0FDRCxPQUFPLENBQUMsQ0FBQyxFQUFVLEVBQUUsTUFBNEIsRUFBRSxFQUFFO1FBQ3BELElBQUksQ0FBQyxHQUFHLEVBQUUsNkNBQTZDLEVBQUUsR0FBRyxFQUFFO1lBQzVELE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsRUFBRSxFQUFFLFFBQVEsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDekYsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUM7U0FDRCxPQUFPLENBQUMsQ0FBQyxFQUFVLEVBQUUsTUFBNEIsRUFBRSxFQUFFO1FBQ3BELElBQUksQ0FBQyxHQUFHLEVBQUUsK0NBQStDLEVBQUUsR0FBRyxFQUFFO1lBQzlELE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxPQUFPLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxRQUFRLEVBQUUsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFDdEYsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUM7U0FDRCxPQUFPLENBQUMsQ0FBQyxFQUFVLEVBQUUsTUFBNEIsRUFBRSxFQUFFO1FBQ3BELElBQUksQ0FBQyxHQUFHLEVBQUUsZ0VBQWdFLEVBQUUsR0FBRyxFQUFFO1lBQy9FLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLENBQUE7WUFDMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLGFBQWEsQ0FBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxFQUFFLEVBQUUsUUFBUSxFQUFFLFFBQVEsRUFBRSxLQUFLLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDdkcsQ0FBQyxDQUFDLENBQUE7SUFDSixDQUFDLENBQUM7U0FDRCxHQUFHLENBQUMsYUFBYSxDQUFDLENBQUE7QUFDckIsQ0FBQyxDQUFDLENBQUE7QUFFRiwwQ0FBMEM7QUFDMUMsTUFBTSxDQUFDLEdBQVksS0FBSyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsU0FBUyxDQUFDLENBQUE7QUFFN0MsUUFBUSxDQUFDLDZDQUE2QyxFQUFFLEdBQUcsRUFBRTtJQUMzRCxNQUFNO1NBQ0wsUUFBUSxDQUFDLEdBQUcsRUFBRSxDQUFDLFlBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxDQUFDO1NBQ25DLE9BQU8sQ0FBQyxDQUFDLEVBQVUsRUFBRSxNQUE0QixFQUFFLEVBQUU7UUFDcEQsSUFBSSxDQUFDLEdBQUcsRUFBRSxpRUFBaUUsRUFBRSxHQUFHLEVBQUU7WUFDaEYsTUFBTSxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQTtZQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsYUFBYSxDQUFDLEVBQUUsSUFBSSxFQUFFLGdCQUFnQixFQUFFLEVBQUUsRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLEtBQUssQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUNqRyxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtBQUN2QixDQUFDLENBQUMsQ0FBQTtBQUVGLFFBQVEsQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLEVBQUU7SUFDcEMsTUFBTSxLQUFLLEdBQUcsTUFBTSxDQUFBO0lBQ3BCLE1BQU0sQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUE7SUFDMUIsTUFBTTtTQUNMLFFBQVEsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxHQUFHLEtBQUssQ0FBQztTQUNsQyxPQUFPLENBQUMsQ0FBQyxFQUFVLEVBQUUsTUFBNEIsRUFBRSxFQUFFO1FBQ3BELElBQUksQ0FBQyxHQUFHLEVBQUUseUNBQXlDLEVBQUUsR0FBRyxFQUFFO1lBQ3hELE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxhQUFhLENBQUMsRUFBRSxJQUFJLEVBQUUsT0FBTyxFQUFFLEVBQUUsRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FBQTtRQUN2RSxDQUFDLENBQUMsQ0FBQTtJQUNKLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsQ0FBQTtBQUN2QixDQUFDLENBQUMsQ0FBQTtBQUVGLGdCQUFnQiJ9