UNPKG

@data-client/test

Version:
124 lines (119 loc) 17 kB
import { actionTypes } from '@data-client/react'; import { collapseFixture } from './collapseFixture.js'; import { createFixtureMap } from './createFixtureMap.js'; export function MockController(Base, { fixtures = [], getInitialInterceptorData = () => ({}) }) { const [fixtureMap, interceptors] = createFixtureMap(fixtures); // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore return class MockedController extends Base { // legacy compatibility (re-declaration) // TODO: drop when drop support for destructuring (0.14 and below) fixtureMap = (() => fixtureMap)(); interceptors = (() => interceptors)(); interceptorData = (() => getInitialInterceptorData())(); constructor(...args) { super(...args); // legacy compatibility // TODO: drop when drop support for destructuring (0.14 and below) if (!this._dispatch) { this._dispatch = args[0].dispatch; } } // legacy compatibility - we need this to work with 0.14 and below as they do not have this setter // TODO: drop when drop support for destructuring (0.14 and below) // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore set dispatch(dispatch) { this._dispatch = dispatch; } get dispatch() { return action => { // support legacy that has _TYPE suffix if (action.type === (actionTypes.FETCH ?? actionTypes.FETCH_TYPE)) { // eslint-disable-next-line prefer-const let { key, args } = action; let fixture; if (this.fixtureMap.has(key)) { fixture = this.fixtureMap.get(key); if (!args) args = fixture.args; // exact matches take priority; now test ComputedFixture } else { for (const cfix of this.interceptors) { if (cfix.endpoint.testKey(key)) { fixture = cfix; break; } } } // we have a match if (fixture !== undefined) { const replacedAction = { ...action }; const delayMs = typeof fixture.delay === 'function' ? fixture.delay(...args) : fixture.delay ?? 0; if ('fetchResponse' in fixture) { const { fetchResponse } = fixture; fixture = { endpoint: fixture.endpoint, response(...args) { const endpoint = action.endpoint.extend({ fetchResponse: (input, init) => { const ret = fetchResponse.call(this, input, init); return Promise.resolve(new Response(JSON.stringify(ret), { status: 200, headers: new Headers({ 'Content-Type': 'application/json' }) })); } }); return endpoint(...args); } }; } const fetch = async () => { if (!fixture) { throw new Error('No fixture found'); } // delayCollapse determines when the fixture function is 'collapsed' (aka 'run') // collapsed: https://en.wikipedia.org/wiki/Copenhagen_interpretation if (fixture.delayCollapse) { await new Promise(resolve => setTimeout(resolve, delayMs)); } const result = await collapseFixture(fixture, args, this.interceptorData); if (!fixture.delayCollapse && delayMs) { await new Promise(resolve => setTimeout(resolve, delayMs)); } if (result.error) { throw result.response; } return result.response; }; if (typeof replacedAction.endpoint.extend === 'function') { replacedAction.endpoint = replacedAction.endpoint.extend({ fetch }); } else { // TODO: full testing of this replacedAction.endpoint = fetch; replacedAction.endpoint.__proto__ = action.endpoint; } // TODO: make super.dispatch (once we drop support for destructuring) return this._dispatch(replacedAction); } } // TODO: make super.dispatch (once we drop support for destructuring) return this._dispatch(action); }; } }; } //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJhY3Rpb25UeXBlcyIsImNvbGxhcHNlRml4dHVyZSIsImNyZWF0ZUZpeHR1cmVNYXAiLCJNb2NrQ29udHJvbGxlciIsIkJhc2UiLCJmaXh0dXJlcyIsImdldEluaXRpYWxJbnRlcmNlcHRvckRhdGEiLCJmaXh0dXJlTWFwIiwiaW50ZXJjZXB0b3JzIiwiTW9ja2VkQ29udHJvbGxlciIsImludGVyY2VwdG9yRGF0YSIsImNvbnN0cnVjdG9yIiwiYXJncyIsIl9kaXNwYXRjaCIsImRpc3BhdGNoIiwiYWN0aW9uIiwidHlwZSIsIkZFVENIIiwiRkVUQ0hfVFlQRSIsImtleSIsImZpeHR1cmUiLCJoYXMiLCJnZXQiLCJjZml4IiwiZW5kcG9pbnQiLCJ0ZXN0S2V5IiwidW5kZWZpbmVkIiwicmVwbGFjZWRBY3Rpb24iLCJkZWxheU1zIiwiZGVsYXkiLCJmZXRjaFJlc3BvbnNlIiwicmVzcG9uc2UiLCJleHRlbmQiLCJpbnB1dCIsImluaXQiLCJyZXQiLCJjYWxsIiwiUHJvbWlzZSIsInJlc29sdmUiLCJSZXNwb25zZSIsIkpTT04iLCJzdHJpbmdpZnkiLCJzdGF0dXMiLCJoZWFkZXJzIiwiSGVhZGVycyIsImZldGNoIiwiRXJyb3IiLCJkZWxheUNvbGxhcHNlIiwic2V0VGltZW91dCIsInJlc3VsdCIsImVycm9yIiwiX19wcm90b19fIl0sInNvdXJjZXMiOlsiLi4vc3JjL01vY2tDb250cm9sbGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gIGFjdGlvblR5cGVzLFxuICBDb250cm9sbGVyLFxuICBEYXRhQ2xpZW50RGlzcGF0Y2gsXG4gIEdlbmVyaWNEaXNwYXRjaCxcbn0gZnJvbSAnQGRhdGEtY2xpZW50L3JlYWN0JztcblxuaW1wb3J0IHsgY29sbGFwc2VGaXh0dXJlIH0gZnJvbSAnLi9jb2xsYXBzZUZpeHR1cmUuanMnO1xuaW1wb3J0IHsgY3JlYXRlRml4dHVyZU1hcCB9IGZyb20gJy4vY3JlYXRlRml4dHVyZU1hcC5qcyc7XG5pbXBvcnQgdHlwZSB7IEZpeHR1cmUsIEludGVyY2VwdG9yIH0gZnJvbSAnLi9maXh0dXJlVHlwZXMuanMnO1xuaW1wb3J0IHsgTW9ja1Byb3BzIH0gZnJvbSAnLi9tb2NrVHlwZXMuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gTW9ja0NvbnRyb2xsZXI8VEJhc2UgZXh0ZW5kcyB0eXBlb2YgQ29udHJvbGxlciwgVD4oXG4gIEJhc2U6IFRCYXNlLFxuICB7XG4gICAgZml4dHVyZXMgPSBbXSxcbiAgICBnZXRJbml0aWFsSW50ZXJjZXB0b3JEYXRhID0gKCkgPT4gKHt9KSBhcyBhbnksXG4gIH06IE1vY2tQcm9wczxUPixcbik6IFRCYXNlIHtcbiAgY29uc3QgW2ZpeHR1cmVNYXAsIGludGVyY2VwdG9yc10gPSBjcmVhdGVGaXh0dXJlTWFwKGZpeHR1cmVzKTtcblxuICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L2Jhbi10cy1jb21tZW50XG4gIC8vIEB0cy1pZ25vcmVcbiAgcmV0dXJuIGNsYXNzIE1vY2tlZENvbnRyb2xsZXI8XG4gICAgRCBleHRlbmRzIEdlbmVyaWNEaXNwYXRjaCA9IERhdGFDbGllbnREaXNwYXRjaCxcbiAgPiBleHRlbmRzIEJhc2U8RD4ge1xuICAgIC8vIGxlZ2FjeSBjb21wYXRpYmlsaXR5IChyZS1kZWNsYXJhdGlvbilcbiAgICAvLyBUT0RPOiBkcm9wIHdoZW4gZHJvcCBzdXBwb3J0IGZvciBkZXN0cnVjdHVyaW5nICgwLjE0IGFuZCBiZWxvdylcbiAgICBkZWNsYXJlIHByb3RlY3RlZCBfZGlzcGF0Y2g6IEQ7XG5cbiAgICBmaXh0dXJlTWFwOiBNYXA8c3RyaW5nLCBGaXh0dXJlPiA9IGZpeHR1cmVNYXA7XG4gICAgaW50ZXJjZXB0b3JzOiBJbnRlcmNlcHRvcjxhbnk+W10gPSBpbnRlcmNlcHRvcnM7XG4gICAgaW50ZXJjZXB0b3JEYXRhOiBUID0gZ2V0SW5pdGlhbEludGVyY2VwdG9yRGF0YSgpO1xuXG4gICAgY29uc3RydWN0b3IoLi4uYXJnczogYW55W10pIHtcbiAgICAgIHN1cGVyKC4uLmFyZ3MpO1xuXG4gICAgICAvLyBsZWdhY3kgY29tcGF0aWJpbGl0eVxuICAgICAgLy8gVE9ETzogZHJvcCB3aGVuIGRyb3Agc3VwcG9ydCBmb3IgZGVzdHJ1Y3R1cmluZyAoMC4xNCBhbmQgYmVsb3cpXG4gICAgICBpZiAoIXRoaXMuX2Rpc3BhdGNoKSB7XG4gICAgICAgIHRoaXMuX2Rpc3BhdGNoID0gKGFyZ3NbMF0gYXMgYW55KS5kaXNwYXRjaDtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBsZWdhY3kgY29tcGF0aWJpbGl0eSAtIHdlIG5lZWQgdGhpcyB0byB3b3JrIHdpdGggMC4xNCBhbmQgYmVsb3cgYXMgdGhleSBkbyBub3QgaGF2ZSB0aGlzIHNldHRlclxuICAgIC8vIFRPRE86IGRyb3Agd2hlbiBkcm9wIHN1cHBvcnQgZm9yIGRlc3RydWN0dXJpbmcgKDAuMTQgYW5kIGJlbG93KVxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvYmFuLXRzLWNvbW1lbnRcbiAgICAvLyBAdHMtaWdub3JlXG4gICAgc2V0IGRpc3BhdGNoKGRpc3BhdGNoOiBEKSB7XG4gICAgICB0aGlzLl9kaXNwYXRjaCA9IGRpc3BhdGNoO1xuICAgIH1cblxuICAgIGdldCBkaXNwYXRjaCgpOiBEIHtcbiAgICAgIHJldHVybiAoKGFjdGlvbjogUGFyYW1ldGVyczxEPlswXSk6IFByb21pc2U8dm9pZD4gPT4ge1xuICAgICAgICAvLyBzdXBwb3J0IGxlZ2FjeSB0aGF0IGhhcyBfVFlQRSBzdWZmaXhcbiAgICAgICAgaWYgKGFjdGlvbi50eXBlID09PSAoYWN0aW9uVHlwZXMuRkVUQ0ggPz8gYWN0aW9uVHlwZXMuRkVUQ0hfVFlQRSkpIHtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgcHJlZmVyLWNvbnN0XG4gICAgICAgICAgbGV0IHsga2V5LCBhcmdzIH0gPSBhY3Rpb247XG4gICAgICAgICAgbGV0IGZpeHR1cmU6IEZpeHR1cmUgfCBJbnRlcmNlcHRvciB8IHVuZGVmaW5lZDtcbiAgICAgICAgICBpZiAodGhpcy5maXh0dXJlTWFwLmhhcyhrZXkpKSB7XG4gICAgICAgICAgICBmaXh0dXJlID0gdGhpcy5maXh0dXJlTWFwLmdldChrZXkpIGFzIEZpeHR1cmU7XG4gICAgICAgICAgICBpZiAoIWFyZ3MpIGFyZ3MgPSBmaXh0dXJlLmFyZ3M7XG4gICAgICAgICAgICAvLyBleGFjdCBtYXRjaGVzIHRha2UgcHJpb3JpdHk7IG5vdyB0ZXN0IENvbXB1dGVkRml4dHVyZVxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGNvbnN0IGNmaXggb2YgdGhpcy5pbnRlcmNlcHRvcnMpIHtcbiAgICAgICAgICAgICAgaWYgKGNmaXguZW5kcG9pbnQudGVzdEtleShrZXkpKSB7XG4gICAgICAgICAgICAgICAgZml4dHVyZSA9IGNmaXg7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gd2UgaGF2ZSBhIG1hdGNoXG4gICAgICAgICAgaWYgKGZpeHR1cmUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgY29uc3QgcmVwbGFjZWRBY3Rpb246IHR5cGVvZiBhY3Rpb24gPSB7XG4gICAgICAgICAgICAgIC4uLmFjdGlvbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjb25zdCBkZWxheU1zID1cbiAgICAgICAgICAgICAgdHlwZW9mIGZpeHR1cmUuZGVsYXkgPT09ICdmdW5jdGlvbicgP1xuICAgICAgICAgICAgICAgIGZpeHR1cmUuZGVsYXkoLi4uKGFyZ3MgYXMgYW55KSlcbiAgICAgICAgICAgICAgOiAoZml4dHVyZS5kZWxheSA/PyAwKTtcblxuICAgICAgICAgICAgaWYgKCdmZXRjaFJlc3BvbnNlJyBpbiBmaXh0dXJlKSB7XG4gICAgICAgICAgICAgIGNvbnN0IHsgZmV0Y2hSZXNwb25zZSB9ID0gZml4dHVyZTtcbiAgICAgICAgICAgICAgZml4dHVyZSA9IHtcbiAgICAgICAgICAgICAgICBlbmRwb2ludDogZml4dHVyZS5lbmRwb2ludCxcbiAgICAgICAgICAgICAgICByZXNwb25zZSguLi5hcmdzKSB7XG4gICAgICAgICAgICAgICAgICBjb25zdCBlbmRwb2ludCA9IChhY3Rpb24uZW5kcG9pbnQgYXMgYW55KS5leHRlbmQoe1xuICAgICAgICAgICAgICAgICAgICBmZXRjaFJlc3BvbnNlOiAoaW5wdXQ6IFJlcXVlc3RJbmZvLCBpbml0OiBSZXF1ZXN0SW5pdCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJldCA9IGZldGNoUmVzcG9uc2UuY2FsbCh0aGlzLCBpbnB1dCwgaW5pdCk7XG4gICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShcbiAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBSZXNwb25zZShKU09OLnN0cmluZ2lmeShyZXQpLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czogMjAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBoZWFkZXJzOiBuZXcgSGVhZGVycyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0NvbnRlbnQtVHlwZSc6ICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSxcbiAgICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICByZXR1cm4gKGVuZHBvaW50IGFzIGFueSkoLi4uYXJncyk7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGZldGNoID0gYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgICBpZiAoIWZpeHR1cmUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ05vIGZpeHR1cmUgZm91bmQnKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBkZWxheUNvbGxhcHNlIGRldGVybWluZXMgd2hlbiB0aGUgZml4dHVyZSBmdW5jdGlvbiBpcyAnY29sbGFwc2VkJyAoYWthICdydW4nKVxuICAgICAgICAgICAgICAvLyBjb2xsYXBzZWQ6IGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0NvcGVuaGFnZW5faW50ZXJwcmV0YXRpb25cbiAgICAgICAgICAgICAgaWYgKGZpeHR1cmUuZGVsYXlDb2xsYXBzZSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IG5ldyBQcm9taXNlKHJlc29sdmUgPT4gc2V0VGltZW91dChyZXNvbHZlLCBkZWxheU1zKSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgY29sbGFwc2VGaXh0dXJlKFxuICAgICAgICAgICAgICAgIGZpeHR1cmUgYXMgYW55LFxuICAgICAgICAgICAgICAgIGFyZ3MgYXMgYW55LFxuICAgICAgICAgICAgICAgIHRoaXMuaW50ZXJjZXB0b3JEYXRhLFxuICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICBpZiAoIWZpeHR1cmUuZGVsYXlDb2xsYXBzZSAmJiBkZWxheU1zKSB7XG4gICAgICAgICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UocmVzb2x2ZSA9PiBzZXRUaW1lb3V0KHJlc29sdmUsIGRlbGF5TXMpKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAocmVzdWx0LmVycm9yKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgcmVzdWx0LnJlc3BvbnNlO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiByZXN1bHQucmVzcG9uc2U7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHR5cGVvZiAocmVwbGFjZWRBY3Rpb24uZW5kcG9pbnQgYXMgYW55KS5leHRlbmQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgcmVwbGFjZWRBY3Rpb24uZW5kcG9pbnQgPSAocmVwbGFjZWRBY3Rpb24uZW5kcG9pbnQgYXMgYW55KS5leHRlbmQoXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgZmV0Y2gsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIC8vIFRPRE86IGZ1bGwgdGVzdGluZyBvZiB0aGlzXG4gICAgICAgICAgICAgIHJlcGxhY2VkQWN0aW9uLmVuZHBvaW50ID0gZmV0Y2ggYXMgYW55O1xuICAgICAgICAgICAgICAocmVwbGFjZWRBY3Rpb24uZW5kcG9pbnQgYXMgYW55KS5fX3Byb3RvX18gPSBhY3Rpb24uZW5kcG9pbnQ7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFRPRE86IG1ha2Ugc3VwZXIuZGlzcGF0Y2ggKG9uY2Ugd2UgZHJvcCBzdXBwb3J0IGZvciBkZXN0cnVjdHVyaW5nKVxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2Rpc3BhdGNoKHJlcGxhY2VkQWN0aW9uKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gVE9ETzogbWFrZSBzdXBlci5kaXNwYXRjaCAob25jZSB3ZSBkcm9wIHN1cHBvcnQgZm9yIGRlc3RydWN0dXJpbmcpXG4gICAgICAgIHJldHVybiB0aGlzLl9kaXNwYXRjaChhY3Rpb24pO1xuICAgICAgfSkgYXMgYW55O1xuICAgIH1cbiAgfTtcbn1cbiJdLCJtYXBwaW5ncyI6IkFBQUEsU0FDRUEsV0FBVyxRQUlOLG9CQUFvQjtBQUUzQixTQUFTQyxlQUFlLFFBQVEsc0JBQXNCO0FBQ3RELFNBQVNDLGdCQUFnQixRQUFRLHVCQUF1QjtBQUl4RCxPQUFPLFNBQVNDLGNBQWNBLENBQzVCQyxJ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QUNYQyxPQUFPLEVBQUUsSUFBSUMsT0FBTyxDQUFDOzBCQUNuQixjQUFjLEVBQUU7d0JBQ2xCLENBQUM7c0JBQ0gsQ0FBQyxDQUNILENBQUM7b0JBQ0g7a0JBQ0YsQ0FBQyxDQUFDO2tCQUNGLE9BQVFwQixRQUFRLENBQVMsR0FBR1osSUFBSSxDQUFDO2dCQUNuQztjQUNGLENBQUM7WUFDSDtZQUNBLE1BQU1pQyxLQUFLLEdBQUcsTUFBQUEsQ0FBQSxLQUFZO2NBQ3hCLElBQUksQ0FBQ3pCLE9BQU8sRUFBRTtnQkFDWixNQUFNLElBQUkwQixLQUFLLENBQUMsa0JBQWtCLENBQUM7Y0FDckM7Y0FDQTtjQUNBO2NBQ0EsSUFBSTFCLE9BQU8sQ0FBQzJCLGFBQWEsRUFBRTtnQkFDekIsTUFBTSxJQUFJVixPQUFPLENBQUNDLE9BQU8sSUFBSVUsVUFBVSxDQUFDVixPQUFPLEVBQUVWLE9BQU8sQ0FBQyxDQUFDO2NBQzVEO2NBQ0EsTUFBTXFCLE1BQU0sR0FBRyxNQUFNaEQsZUFBZSxDQUNsQ21CLE9BQU8sRUFDUFIsSUFBSSxFQUNKLElBQUksQ0FBQ0YsZUFDUCxDQUFDO2NBQ0QsSUFBSSxDQUFDVSxPQUFPLENBQUMyQixhQUFhLElBQUluQixPQUFPLEVBQUU7Z0JBQ3JDLE1BQU0sSUFBSVMsT0FBTyxDQUFDQyxPQUFPLElBQUlVLFVBQVUsQ0FBQ1YsT0FBTyxFQUFFVixPQUFPLENBQUMsQ0FBQztjQUM1RDtjQUNBLElBQUlxQixNQUFNLENBQUNDLEtBQUssRUFBRTtnQkFDaEIsTUFBTUQsTUFBTSxDQUFDbEIsUUFBUTtjQUN2QjtjQUNBLE9BQU9rQixNQUFNLENBQUNsQixRQUFRO1lBQ3hCLENBQUM7WUFDRCxJQUFJLE9BQVFKLGNBQWMsQ0FBQ0gsUUFBUSxDQUFTUSxNQUFNLEtBQUssVUFBVSxFQUFFO2NBQ2pFTCxjQUFjLENBQUNILFFBQVEsR0FBSUcsY0FBYyxDQUFDSCxRQUFRLENBQVNRLE1BQU0sQ0FDL0Q7Z0JBQ0VhO2NBQ0YsQ0FDRixDQUFDO1lBQ0gsQ0FBQyxNQUFNO2NBQ0w7Y0FDQWxCLGNBQWMsQ0FBQ0gsUUFBUSxHQUFHcUIsS0FBWTtjQUNyQ2xCLGNBQWMsQ0FBQ0gsUUFBUSxDQUFTMkIsU0FBUyxHQUFHcEMsTUFBTSxDQUFDUyxRQUFRO1lBQzlEOztZQUVBO1lBQ0EsT0FBTyxJQUFJLENBQUNYLFNBQVMsQ0FBQ2MsY0FBYyxDQUFDO1VBQ3ZDO1FBQ0Y7UUFDQTtRQUNBLE9BQU8sSUFBSSxDQUFDZCxTQUFTLENBQUNFLE1BQU0sQ0FBQztNQUMvQixDQUFDO0lBQ0g7RUFDRixDQUFDO0FBQ0giLCJpZ25vcmVMaXN0IjpbXX0=