@nlabs/gothamjs
Version:
Platform
157 lines (156 loc) • 17.8 kB
JavaScript
import { jsx as _jsx } from "react/jsx-runtime";
/**
* Copyright (c) 2024-Present, Nitrogen Labs, Inc.
* Copyrights licensed under the MIT License. See the accompanying LICENSE file for terms.
*/ import { Logger, LoggerDebugLevel } from '@nlabs/arkhamjs-middleware-logger';
import { BrowserStorage } from '@nlabs/arkhamjs-storage-browser';
import { useFlux } from '@nlabs/arkhamjs-utils-react';
import { merge } from '@nlabs/utils';
import i18n from 'i18next';
import { useEffect, useMemo, useState } from 'react';
import { I18nextProvider, initReactI18next } from 'react-i18next';
import { createBrowserRouter, RouterProvider } from 'react-router';
import { GothamActions } from '../../actions/GothamActions.js';
import { Config } from '../../config/appConfig.js';
import { GothamConstants } from '../../constants/GothamConstants.js';
import { gothamApp } from '../../stores/GothamAppStore.js';
import { GothamContext } from '../../utils/GothamContext.js';
import { parseRoutes } from '../../utils/routeUtils.js';
import { GothamRoot } from './GothamRoot.js';
export const defaultGothamConfig = {
app: {
name: 'gotham',
title: 'GothamJS'
},
baseUrl: '',
isAuth: ()=>false,
middleware: [],
routes: [],
storageType: 'session',
stores: [],
theme: {},
translations: {
translation: {}
}
};
export const init = (config)=>()=>{
const { onInit } = config;
GothamActions.init();
if (onInit) {
onInit();
}
};
export const signOut = (flux)=>async ()=>{
await flux.clearAppData();
await GothamActions.loading(false);
GothamActions.navGoto('/signIn');
};
export const GothamProvider = ({ children, config: appConfig })=>{
const flux = useFlux();
const config = merge(defaultGothamConfig, appConfig);
const { isAuth, middleware, routes = [], storageType, stores, i18n: providedI18n, translations } = config;
const name = config?.app?.name;
const [session, setSession] = useState({});
const router = useMemo(()=>{
return createBrowserRouter([
{
Component: GothamRoot,
children: parseRoutes(routes),
index: false,
path: '/'
}
]);
}, [
routes
]);
// Initialize i18next if translations are provided but no i18n instance is given
const i18nInstance = useMemo(()=>{
if (providedI18n) {
return providedI18n;
}
if (translations && Object.keys(translations).length > 0) {
// Create a new i18next instance and initialize it
const newI18n = i18n.createInstance();
newI18n.use(initReactI18next).init({
resources: translations,
lng: 'en',
fallbackLng: 'en',
interpolation: {
escapeValue: false
}
});
return newI18n;
}
return null;
}, [
providedI18n,
translations
]);
useEffect(()=>{
Config.set(config);
if (flux) {
const env = Config.get('environment');
const logger = new Logger({
debugLevel: env === 'development' ? LoggerDebugLevel.DISPATCH : LoggerDebugLevel.DISABLED
});
const storage = new BrowserStorage({
type: storageType
});
flux.init({
middleware: [
logger,
...middleware || []
],
name,
// state: {app: {title}},
storage,
stores: [
gothamApp,
...stores || []
]
});
flux.on(GothamConstants.SIGN_OUT, signOut(flux));
flux.on(GothamConstants.UPDATE_SESSION, ({ session })=>{
setSession(session);
});
}
init(config);
}, [
flux,
config,
middleware,
name,
storageType,
stores
]);
if (i18nInstance) {
return /*#__PURE__*/ _jsx(I18nextProvider, {
i18n: i18nInstance,
children: /*#__PURE__*/ _jsx(GothamContext.Provider, {
value: {
Flux: flux,
isAuth,
session
},
children: /*#__PURE__*/ _jsx("div", {
children: /*#__PURE__*/ _jsx(RouterProvider, {
router: router
})
})
})
});
}
return /*#__PURE__*/ _jsx(GothamContext.Provider, {
value: {
Flux: flux,
isAuth,
session
},
children: /*#__PURE__*/ _jsx("div", {
children: /*#__PURE__*/ _jsx(RouterProvider, {
router: router
})
})
});
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9uaXRyb2c3L0RldmVsb3BtZW50L2dvdGhhbWpzL3NyYy92aWV3cy9Hb3RoYW0vR290aGFtUHJvdmlkZXIudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIi8qKlxuICogQ29weXJpZ2h0IChjKSAyMDI0LVByZXNlbnQsIE5pdHJvZ2VuIExhYnMsIEluYy5cbiAqIENvcHlyaWdodHMgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgdGhlIGFjY29tcGFueWluZyBMSUNFTlNFIGZpbGUgZm9yIHRlcm1zLlxuICovXG5pbXBvcnQge0xvZ2dlciwgTG9nZ2VyRGVidWdMZXZlbH0gZnJvbSAnQG5sYWJzL2Fya2hhbWpzLW1pZGRsZXdhcmUtbG9nZ2VyJztcbmltcG9ydCB7QnJvd3NlclN0b3JhZ2V9IGZyb20gJ0BubGFicy9hcmtoYW1qcy1zdG9yYWdlLWJyb3dzZXInO1xuaW1wb3J0IHt1c2VGbHV4fSBmcm9tICdAbmxhYnMvYXJraGFtanMtdXRpbHMtcmVhY3QnO1xuaW1wb3J0IHttZXJnZX0gZnJvbSAnQG5sYWJzL3V0aWxzJztcbmltcG9ydCBpMThuIGZyb20gJ2kxOG5leHQnO1xuaW1wb3J0IHt1c2VFZmZlY3QsIHVzZU1lbW8sIHVzZVN0YXRlfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQge0kxOG5leHRQcm92aWRlciwgaW5pdFJlYWN0STE4bmV4dH0gZnJvbSAncmVhY3QtaTE4bmV4dCc7XG5pbXBvcnQge2NyZWF0ZUJyb3dzZXJSb3V0ZXIsIFJvdXRlclByb3ZpZGVyfSBmcm9tICdyZWFjdC1yb3V0ZXInO1xuXG5pbXBvcnQge0dvdGhhbUFjdGlvbnN9IGZyb20gJy4uLy4uL2FjdGlvbnMvR290aGFtQWN0aW9ucy5qcyc7XG5pbXBvcnQge0NvbmZpZ30gZnJvbSAnLi4vLi4vY29uZmlnL2FwcENvbmZpZy5qcyc7XG5pbXBvcnQge0dvdGhhbUNvbnN0YW50c30gZnJvbSAnLi4vLi4vY29uc3RhbnRzL0dvdGhhbUNvbnN0YW50cy5qcyc7XG5pbXBvcnQge2dvdGhhbUFwcH0gZnJvbSAnLi4vLi4vc3RvcmVzL0dvdGhhbUFwcFN0b3JlLmpzJztcbmltcG9ydCB7R290aGFtQ29udGV4dH0gZnJvbSAnLi4vLi4vdXRpbHMvR290aGFtQ29udGV4dC5qcyc7XG5pbXBvcnQge3BhcnNlUm91dGVzfSBmcm9tICcuLi8uLi91dGlscy9yb3V0ZVV0aWxzLmpzJztcbmltcG9ydCB7R290aGFtUm9vdH0gZnJvbSAnLi9Hb3RoYW1Sb290LmpzJztcblxuaW1wb3J0IHR5cGUge0ZsdXhGcmFtZXdvcmssIEZsdXhNaWRkbGV3YXJlVHlwZSwgRmx1eE9wdGlvbnN9IGZyb20gJ0BubGFicy9hcmtoYW1qcyc7XG5pbXBvcnQgdHlwZSB7RkMsIFJlYWN0Tm9kZX0gZnJvbSAncmVhY3QnO1xuaW1wb3J0IHR5cGUge0dvdGhhbVJvdXRlRGF0YX0gZnJvbSAnLi4vLi4vdHlwZXMvZ290aGFtLmpzJztcbmltcG9ydCB0eXBlIHtDdXN0b21Sb3V0ZVByb3BzfSBmcm9tICcuLi8uLi91dGlscy9yb3V0ZVV0aWxzLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBHb3RoYW1Qcm92aWRlclByb3BzIHtcbiAgcmVhZG9ubHkgY2hpbGRyZW4/OiBSZWFjdE5vZGU7XG4gIHJlYWRvbmx5IGNvbmZpZzogR290aGFtQ29uZmlndXJhdGlvbjtcbiAgcmVhZG9ubHkgc2Vzc2lvbj86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xufVxuXG5leHBvcnQgdHlwZSBHb3RoYW1Qb3NpdGlvbiA9ICd0JyB8ICd0YycgfCAndGwnIHwgJ3RyJyB8ICdiJyB8ICdiYycgfCAnYnInIHwgJ2JsJztcbmV4cG9ydCB0eXBlIEdvdGhhbVN0YXR1cyA9ICdkZWZhdWx0JyB8ICdlcnJvcicgfCAnaW5mbycgfCAnc3VjY2VzcycgfCAnd2FybmluZycgfCBudW1iZXI7XG5leHBvcnQgdHlwZSBUaGVtZURpc3BsYXlNb2RlID0gJ2F1dG8nIHwgJ2RhcmsnIHwgJ2xpZ2h0JztcblxuZXhwb3J0IGludGVyZmFjZSBHb3RoYW1Db25maWd1cmF0aW9uIHtcbiAgcmVhZG9ubHkgYXBwPzoge1xuICAgIHJlYWRvbmx5IGxvZ28/OiBzdHJpbmc7XG4gICAgcmVhZG9ubHkgbmFtZT86IHN0cmluZztcbiAgICByZWFkb25seSB0aXRsZT86IHN0cmluZztcbiAgICByZWFkb25seSB0aXRsZUJhclNlcGFyYXRvcj86IHN0cmluZztcbiAgfTtcbiAgcmVhZG9ubHkgYmFzZVVybD86IHN0cmluZztcbiAgcmVhZG9ubHkgY29uZmlnPzogRmx1eE9wdGlvbnM7XG4gIHJlYWRvbmx5IGRpc3BsYXlNb2RlPzogVGhlbWVEaXNwbGF5TW9kZTtcbiAgcmVhZG9ubHkgZmx1eD86IEZsdXhGcmFtZXdvcms7XG4gIHJlYWRvbmx5IGlzQXV0aD86ICgpID0+IGJvb2xlYW47XG4gIHJlYWRvbmx5IG1pZGRsZXdhcmU/OiBGbHV4TWlkZGxld2FyZVR5cGVbXTtcbiAgcmVhZG9ubHkgb25Jbml0PzogKCkgPT4gdm9pZDtcbiAgcmVhZG9ubHkgcm91dGVzPzogR290aGFtUm91dGVEYXRhW107XG4gIHJlYWRvbmx5IHN0b3JhZ2VUeXBlPzogJ2xvY2FsJyB8ICdzZXNzaW9uJztcbiAgcmVhZG9ubHkgc3RvcmVzPzogdW5rbm93bltdO1xuICByZWFkb25seSB0aGVtZT86IFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuICByZWFkb25seSB0cmFuc2xhdGlvbnM/OiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcbiAgcmVhZG9ubHkgaTE4bj86IHR5cGVvZiBpMThuO1xufVxuXG5leHBvcnQgY29uc3QgZGVmYXVsdEdvdGhhbUNvbmZpZzogR290aGFtQ29uZmlndXJhdGlvbiA9IHtcbiAgYXBwOiB7XG4gICAgbmFtZTogJ2dvdGhhbScsXG4gICAgdGl0bGU6ICdHb3RoYW1KUydcbiAgfSxcbiAgYmFzZVVybDogJycsXG4gIGlzQXV0aDogKCkgPT4gZmFsc2UsXG4gIG1pZGRsZXdhcmU6IFtdLFxuICByb3V0ZXM6IFtdLFxuICBzdG9yYWdlVHlwZTogJ3Nlc3Npb24nLFxuICBzdG9yZXM6IFtdLFxuICB0aGVtZToge30sXG4gIHRyYW5zbGF0aW9uczoge3RyYW5zbGF0aW9uOiB7fX1cbn07XG5cbmV4cG9ydCBjb25zdCBpbml0ID0gKGNvbmZpZzogR290aGFtQ29uZmlndXJhdGlvbikgPT4gKCk6IHZvaWQgPT4ge1xuICBjb25zdCB7b25Jbml0fSA9IGNvbmZpZztcbiAgR290aGFtQWN0aW9ucy5pbml0KCk7XG5cbiAgaWYob25Jbml0KSB7XG4gICAgb25Jbml0KCk7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCBzaWduT3V0ID0gKGZsdXg6IEZsdXhGcmFtZXdvcmspID0+IGFzeW5jICgpID0+IHtcbiAgYXdhaXQgZmx1eC5jbGVhckFwcERhdGEoKTtcbiAgYXdhaXQgR290aGFtQWN0aW9ucy5sb2FkaW5nKGZhbHNlKTtcbiAgR290aGFtQWN0aW9ucy5uYXZHb3RvKCcvc2lnbkluJyk7XG59O1xuXG5leHBvcnQgY29uc3QgR290aGFtUHJvdmlkZXI6IEZDPEdvdGhhbVByb3ZpZGVyUHJvcHM+ID0gKHtjaGlsZHJlbiwgY29uZmlnOiBhcHBDb25maWd9KSA9PiB7XG4gIGNvbnN0IGZsdXggPSB1c2VGbHV4KCk7XG4gIGNvbnN0IGNvbmZpZzogR290aGFtQ29uZmlndXJhdGlvbiA9IG1lcmdlKGRlZmF1bHRHb3RoYW1Db25maWcsIGFwcENvbmZpZyk7XG4gIGNvbnN0IHtcbiAgICBpc0F1dGgsXG4gICAgbWlkZGxld2FyZSxcbiAgICByb3V0ZXMgPSBbXSxcbiAgICBzdG9yYWdlVHlwZSxcbiAgICBzdG9yZXMsXG4gICAgaTE4bjogcHJvdmlkZWRJMThuLFxuICAgIHRyYW5zbGF0aW9uc1xuICB9ID0gY29uZmlnO1xuICBjb25zdCBuYW1lID0gY29uZmlnPy5hcHA/Lm5hbWU7XG4gIGNvbnN0IFtzZXNzaW9uLCBzZXRTZXNzaW9uXSA9IHVzZVN0YXRlKHt9KTtcbiAgY29uc3Qgcm91dGVyID0gdXNlTWVtbygoKSA9PiB7XG4gICAgcmV0dXJuIGNyZWF0ZUJyb3dzZXJSb3V0ZXIoXG4gICAgICBbXG4gICAgICAgIHtcbiAgICAgICAgICBDb21wb25lbnQ6IEdvdGhhbVJvb3QsXG4gICAgICAgICAgY2hpbGRyZW46IHBhcnNlUm91dGVzKHJvdXRlcyBhcyB1bmtub3duIGFzIEN1c3RvbVJvdXRlUHJvcHNbXSksXG4gICAgICAgICAgaW5kZXg6IGZhbHNlLFxuICAgICAgICAgIHBhdGg6ICcvJ1xuICAgICAgICB9XG4gICAgICBdXG4gICAgKTtcbiAgfSwgW3JvdXRlc10pO1xuXG4gICAgLy8gSW5pdGlhbGl6ZSBpMThuZXh0IGlmIHRyYW5zbGF0aW9ucyBhcmUgcHJvdmlkZWQgYnV0IG5vIGkxOG4gaW5zdGFuY2UgaXMgZ2l2ZW5cbiAgY29uc3QgaTE4bkluc3RhbmNlID0gdXNlTWVtbygoKSA9PiB7XG4gICAgaWYgKHByb3ZpZGVkSTE4bikge1xuICAgICAgcmV0dXJuIHByb3ZpZGVkSTE4bjtcbiAgICB9XG5cbiAgICBpZiAodHJhbnNsYXRpb25zICYmIE9iamVjdC5rZXlzKHRyYW5zbGF0aW9ucykubGVuZ3RoID4gMCkge1xuICAgICAgLy8gQ3JlYXRlIGEgbmV3IGkxOG5leHQgaW5zdGFuY2UgYW5kIGluaXRpYWxpemUgaXRcbiAgICAgIGNvbnN0IG5ld0kxOG4gPSBpMThuLmNyZWF0ZUluc3RhbmNlKCk7XG5cbiAgICAgIG5ld0kxOG5cbiAgICAgICAgLnVzZShpbml0UmVhY3RJMThuZXh0KVxuICAgICAgICAuaW5pdCh7XG4gICAgICAgICAgcmVzb3VyY2VzOiB0cmFuc2xhdGlvbnMgYXMgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgUmVjb3JkPHN0cmluZywgc3RyaW5nPj4+LFxuICAgICAgICAgIGxuZzogJ2VuJywgLy8gZGVmYXVsdCBsYW5ndWFnZVxuICAgICAgICAgIGZhbGxiYWNrTG5nOiAnZW4nLFxuICAgICAgICAgIGludGVycG9sYXRpb246IHtcbiAgICAgICAgICAgIGVzY2FwZVZhbHVlOiBmYWxzZSwgLy8gUmVhY3QgYWxyZWFkeSBlc2NhcGVzIHZhbHVlc1xuICAgICAgICAgIH0sXG4gICAgICAgIH0pO1xuXG4gICAgICByZXR1cm4gbmV3STE4bjtcbiAgICB9XG5cbiAgICByZXR1cm4gbnVsbDtcbiAgfSwgW3Byb3ZpZGVkSTE4biwgdHJhbnNsYXRpb25zXSk7XG5cbiAgdXNlRWZmZWN0KCgpID0+IHtcbiAgICBDb25maWcuc2V0KGNvbmZpZyBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik7XG5cbiAgICBpZihmbHV4KSB7XG4gICAgICBjb25zdCBlbnY6IHN0cmluZyA9IENvbmZpZy5nZXQoJ2Vudmlyb25tZW50JykgYXMgc3RyaW5nO1xuICAgICAgY29uc3QgbG9nZ2VyOiBMb2dnZXIgPSBuZXcgTG9nZ2VyKHtcbiAgICAgICAgZGVidWdMZXZlbDogZW52ID09PSAnZGV2ZWxvcG1lbnQnID8gTG9nZ2VyRGVidWdMZXZlbC5ESVNQQVRDSCA6IExvZ2dlckRlYnVnTGV2ZWwuRElTQUJMRURcbiAgICAgIH0pO1xuICAgICAgY29uc3Qgc3RvcmFnZTogQnJvd3NlclN0b3JhZ2UgPSBuZXcgQnJvd3NlclN0b3JhZ2Uoe3R5cGU6IHN0b3JhZ2VUeXBlfSk7XG5cbiAgICAgIGZsdXguaW5pdCh7XG4gICAgICAgIG1pZGRsZXdhcmU6IFtsb2dnZXIsIC4uLihtaWRkbGV3YXJlIHx8IFtdKV0sXG4gICAgICAgIG5hbWUsXG4gICAgICAgIC8vIHN0YXRlOiB7YXBwOiB7dGl0bGV9fSxcbiAgICAgICAgc3RvcmFnZSxcbiAgICAgICAgc3RvcmVzOiBbZ290aGFtQXBwLCAuLi4oc3RvcmVzIHx8IFtdKV1cbiAgICAgIH0pO1xuXG4gICAgICBmbHV4Lm9uKEdvdGhhbUNvbnN0YW50cy5TSUdOX09VVCwgc2lnbk91dChmbHV4KSk7XG4gICAgICBmbHV4Lm9uKEdvdGhhbUNvbnN0YW50cy5VUERBVEVfU0VTU0lPTiwgKHtzZXNzaW9ufSkgPT4ge1xuICAgICAgICBzZXRTZXNzaW9uKHNlc3Npb24pO1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgaW5pdChjb25maWcpO1xuICB9LCBbZmx1eCwgY29uZmlnLCBtaWRkbGV3YXJlLCBuYW1lLCBzdG9yYWdlVHlwZSwgc3RvcmVzXSk7XG5cbiAgaWYoaTE4bkluc3RhbmNlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIDxJMThuZXh0UHJvdmlkZXIgaTE4bj17aTE4bkluc3RhbmNlfT5cbiAgICAgICAgPEdvdGhhbUNvbnRleHQuUHJvdmlkZXIgdmFsdWU9e3tGbHV4OiBmbHV4LCBpc0F1dGgsIHNlc3Npb259fT5cbiAgICAgICAgICA8ZGl2PlxuICAgICAgICAgICAgPFJvdXRlclByb3ZpZGVyIHJvdXRlcj17cm91dGVyfS8+XG4gICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvR290aGFtQ29udGV4dC5Qcm92aWRlcj5cbiAgICAgIDwvSTE4bmV4dFByb3ZpZGVyPlxuICAgICk7XG4gIH1cblxuICByZXR1cm4gKFxuICAgIDxHb3RoYW1Db250ZXh0LlByb3ZpZGVyIHZhbHVlPXt7Rmx1eDogZmx1eCwgaXNBdXRoLCBzZXNzaW9ufX0+XG4gICAgICA8ZGl2PlxuICAgICAgICA8Um91dGVyUHJvdmlkZXIgcm91dGVyPXtyb3V0ZXJ9Lz5cbiAgICAgIDwvZGl2PlxuICAgIDwvR290aGFtQ29udGV4dC5Qcm92aWRlcj5cbiAgKTtcbn07Il0sIm5hbWVzIjpbIkxvZ2dlciIsIkxvZ2dlckRlYnVnTGV2ZWwiLCJCcm93c2VyU3RvcmFnZSIsInVzZUZsdXgiLCJtZXJnZSIsImkxOG4iLCJ1c2VFZmZlY3QiLCJ1c2VNZW1vIiwidXNlU3RhdGUiLCJJMThuZXh0UHJvdmlkZXIiLCJpbml0UmVhY3RJMThuZXh0IiwiY3JlYXRlQnJvd3NlclJvdXRlciIsIlJvdXRlclByb3ZpZGVyIiwiR290aGFtQWN0aW9ucyIsIkNvbmZpZyIsIkdvdGhhbUNvbnN0YW50cyIsImdvdGhhbUFwcCIsIkdvdGhhbUNvbnRleHQiLCJwYXJzZVJvdXRlcyIsIkdvdGhhbVJvb3QiLCJkZWZhdWx0R290aGFtQ29uZmlnIiwiYXBwIiwibmFtZSIsInRpdGxlIiwiYmFzZVVybCIsImlzQXV0aCIsIm1pZGRsZXdhcmUiLCJyb3V0ZXMiLCJzdG9yYWdlVHlwZSIsInN0b3JlcyIsInRoZW1lIiwidHJhbnNsYXRpb25zIiwidHJhbnNsYXRpb24iLCJpbml0IiwiY29uZmlnIiwib25Jbml0Iiwic2lnbk91dCIsImZsdXgiLCJjbGVhckFwcERhdGEiLCJsb2FkaW5nIiwibmF2R290byIsIkdvdGhhbVByb3ZpZGVyIiwiY2hpbGRyZW4iLCJhcHBDb25maWciLCJwcm92aWRlZEkxOG4iLCJzZXNzaW9uIiwic2V0U2Vzc2lvbiIsInJvdXRlciIsIkNvbXBvbmVudCIsImluZGV4IiwicGF0aCIsImkxOG5JbnN0YW5jZSIsIk9iamVjdCIsImtleXMiLCJsZW5ndGgiLCJuZXdJMThuIiwiY3JlYXRlSW5zdGFuY2UiLCJ1c2UiLCJyZXNvdXJjZXMiLCJsbmciLCJmYWxsYmFja0xuZyIsImludGVycG9sYXRpb24iLCJlc2NhcGVWYWx1ZSIsInNldCIsImVudiIsImdldCIsImxvZ2dlciIsImRlYnVnTGV2ZWwiLCJESVNQQVRDSCIsIkRJU0FCTEVEIiwic3RvcmFnZSIsInR5cGUiLCJvbiIsIlNJR05fT1VUIiwiVVBEQVRFX1NFU1NJT04iLCJQcm92aWRlciIsInZhbHVlIiwiRmx1eCIsImRpdiJdLCJtYXBwaW5ncyI6IjtBQUFBOzs7Q0FHQyxHQUNELFNBQVFBLE1BQU0sRUFBRUMsZ0JBQWdCLFFBQU8sb0NBQW9DO0FBQzNFLFNBQVFDLGNBQWMsUUFBTyxrQ0FBa0M7QUFDL0QsU0FBUUMsT0FBTyxRQUFPLDhCQUE4QjtBQUNwRCxTQUFRQyxLQUFLLFFBQU8sZUFBZTtBQUNuQyxPQUFPQyxVQUFVLFVBQVU7QUFDM0IsU0FBUUMsU0FBUyxFQUFFQyxPQUFPLEVBQUVDLFFBQVEsUUFBTyxRQUFRO0FBQ25ELFNBQVFDLGVBQWUsRUFBRUMsZ0JBQWdCLFFBQU8sZ0JBQWdCO0FBQ2hFLFNBQVFDLG1CQUFtQixFQUFFQyxjQUFjLFFBQU8sZUFBZTtBQUVq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