├── diagrams
├── 01
│ ├── .gitkeep
│ └── diagrams.xml
├── 02
│ ├── .gitkeep
│ └── diagrams.xml
├── 03
│ ├── .gitkeep
│ └── diagrams.xml
├── 04
│ ├── .gitkeep
│ └── diagrams.xml
├── 05
│ ├── .gitkeep
│ └── diagrams.xml
├── 06
│ ├── .gitkeep
│ └── diagrams.xml
├── 07
│ ├── .gitkeep
│ └── diagrams.xml
└── README.md
├── api
├── .gitignore
├── middlewares
│ └── requireLogin.js
├── models
│ └── User.js
├── config
│ ├── prod.js
│ └── keys.js
├── package.json
├── routes
│ ├── authRoutes.js
│ └── userRoutes.js
├── services
│ └── passport.js
└── index.js
├── server
├── .gitignore
├── src
│ ├── client
│ │ ├── pages
│ │ │ ├── NotFoundPage.js
│ │ │ ├── HomePage.js
│ │ │ ├── AdminsListPage.js
│ │ │ └── UsersListPage.js
│ │ ├── reducers
│ │ │ ├── usersReducer.js
│ │ │ ├── adminsReducer.js
│ │ │ ├── authReducer.js
│ │ │ └── index.js
│ │ ├── App.js
│ │ ├── Routes.js
│ │ ├── components
│ │ │ ├── hocs
│ │ │ │ └── requireAuth.js
│ │ │ └── Header.js
│ │ ├── actions
│ │ │ └── index.js
│ │ └── client.js
│ ├── helpers
│ │ ├── createStore.js
│ │ └── renderer.js
│ └── index.js
├── webpack.base.js
├── webpack.client.js
├── webpack.server.js
├── package.json
└── build
│ └── bundle.js
├── .gitignore
└── README.md
/diagrams/01/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/diagrams/02/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/diagrams/03/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/diagrams/04/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/diagrams/05/.gitkeep:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/diagrams/06/.gitkeep:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/diagrams/07/.gitkeep:
--------------------------------------------------------------------------------
1 |
2 |
--------------------------------------------------------------------------------
/api/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | node_modules
3 |
--------------------------------------------------------------------------------
/server/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .DS_Store
3 | build
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules
2 | .DS_Store
3 | bundle.js
4 | dev.js
5 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # ReactSSRCasts
2 |
3 | Companion repo for a course hosted on Udemy.com
4 |
--------------------------------------------------------------------------------
/api/middlewares/requireLogin.js:
--------------------------------------------------------------------------------
1 | module.exports = (req, res, next) => {
2 | if (!req.user) {
3 | return res.status(401).send({ error: 'You must log in!' });
4 | }
5 |
6 | next();
7 | };
8 |
--------------------------------------------------------------------------------
/api/models/User.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 | const { Schema } = mongoose;
3 |
4 | const userSchema = new Schema({
5 | googleId: String
6 | });
7 |
8 | mongoose.model('users', userSchema);
9 |
--------------------------------------------------------------------------------
/api/config/prod.js:
--------------------------------------------------------------------------------
1 | // prod.js - production keys here!!
2 | module.exports = {
3 | googleClientID: process.env.GOOGLE_CLIENT_ID,
4 | googleClientSecret: process.env.GOOGLE_CLIENT_SECRET,
5 | mongoURI: process.env.MONGO_URI,
6 | cookieKey: process.env.COOKIE_KEY
7 | };
8 |
--------------------------------------------------------------------------------
/server/src/client/pages/NotFoundPage.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const NotFoundPage = ({ staticContext = {} }) => {
4 | staticContext.notFound = true;
5 | return
Ooops, route not found.
;
6 | };
7 |
8 | export default {
9 | component: NotFoundPage
10 | };
11 |
--------------------------------------------------------------------------------
/server/src/client/reducers/usersReducer.js:
--------------------------------------------------------------------------------
1 | import { FETCH_USERS } from '../actions';
2 |
3 | export default (state = [], action) => {
4 | switch (action.type) {
5 | case FETCH_USERS:
6 | return action.payload.data;
7 | default:
8 | return state;
9 | }
10 | };
11 |
--------------------------------------------------------------------------------
/server/src/client/reducers/adminsReducer.js:
--------------------------------------------------------------------------------
1 | import { FETCH_ADMINS } from '../actions';
2 |
3 | export default (state = [], action) => {
4 | switch (action.type) {
5 | case FETCH_ADMINS:
6 | return action.payload.data;
7 | default:
8 | return state;
9 | }
10 | };
11 |
--------------------------------------------------------------------------------
/server/src/client/reducers/authReducer.js:
--------------------------------------------------------------------------------
1 | import { FETCH_CURRENT_USER } from '../actions';
2 |
3 | export default function(state = null, action) {
4 | switch (action.type) {
5 | case FETCH_CURRENT_USER:
6 | return action.payload.data || false;
7 | default:
8 | return state;
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/api/config/keys.js:
--------------------------------------------------------------------------------
1 | // keys.js - figure out what set of credentials to return
2 | if (process.env.NODE_ENV === 'production') {
3 | // we are in production - return the prod set of keys
4 | module.exports = require('./prod');
5 | } else {
6 | // we are in development - return the dev keys!!!
7 | module.exports = require('./dev');
8 | }
9 |
--------------------------------------------------------------------------------
/server/src/client/pages/HomePage.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 |
3 | const Home = () => {
4 | return (
5 |
6 |
Welcome
7 |
Check out these awesome features
8 |
9 | );
10 | };
11 |
12 | export default {
13 | component: Home
14 | };
15 |
--------------------------------------------------------------------------------
/server/src/client/reducers/index.js:
--------------------------------------------------------------------------------
1 | import { combineReducers } from 'redux';
2 | import usersReducer from './usersReducer';
3 | import authReducer from './authReducer';
4 | import adminsReducer from './adminsReducer';
5 |
6 | export default combineReducers({
7 | users: usersReducer,
8 | auth: authReducer,
9 | admins: adminsReducer
10 | });
11 |
--------------------------------------------------------------------------------
/server/src/client/App.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { renderRoutes } from 'react-router-config';
3 | import Header from './components/Header';
4 | import { fetchCurrentUser } from './actions';
5 |
6 | const App = ({ route }) => {
7 | return (
8 |
9 |
10 | {renderRoutes(route.routes)}
11 |
12 | );
13 | };
14 |
15 | export default {
16 | component: App,
17 | loadData: ({ dispatch }) => dispatch(fetchCurrentUser())
18 | };
19 |
--------------------------------------------------------------------------------
/server/webpack.base.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | // Tell webpack to run babel on every file it runs through
3 | module: {
4 | rules: [
5 | {
6 | test: /\.js?$/,
7 | loader: 'babel-loader',
8 | exclude: /node_modules/,
9 | options: {
10 | presets: [
11 | 'react',
12 | 'stage-0',
13 | ['env', { targets: { browsers: ['last 2 versions'] } }]
14 | ]
15 | }
16 | }
17 | ]
18 | }
19 | };
20 |
--------------------------------------------------------------------------------
/server/webpack.client.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const merge = require('webpack-merge');
3 | const baseConfig = require('./webpack.base.js');
4 |
5 | const config = {
6 | // Tell webpack the root file of our
7 | // server application
8 | entry: './src/client/client.js',
9 |
10 | // Tell webpack where to put the output file
11 | // that is generated
12 | output: {
13 | filename: 'bundle.js',
14 | path: path.resolve(__dirname, 'public')
15 | }
16 | };
17 |
18 | module.exports = merge(baseConfig, config);
19 |
--------------------------------------------------------------------------------
/diagrams/README.md:
--------------------------------------------------------------------------------
1 | All diagrams are authored using https://www.draw.io/
2 |
3 | ## You can edit diagrams on your own!
4 | - Go to https://github.com/StephenGrider/ReactSSRCasts/new/master/diagrams
5 | - Open the folder containing the set of diagrams you want to edit
6 | - Click on the ‘.xml’ file
7 | - Click the ‘raw’ button
8 | - Copy the URL
9 | - Go to https://www.draw.io/
10 | - On the ‘Save Diagrams To…’ window click ‘Decide later’ at the bottom
11 | - Click ‘File’ -> ‘Import From’ -> ‘URL’
12 | - Paste the link to the XML file
13 | - Tada!
14 |
--------------------------------------------------------------------------------
/server/src/helpers/createStore.js:
--------------------------------------------------------------------------------
1 | import { createStore, applyMiddleware } from 'redux';
2 | import thunk from 'redux-thunk';
3 | import axios from 'axios';
4 | import reducers from '../client/reducers';
5 |
6 | export default req => {
7 | const axiosInstance = axios.create({
8 | baseURL: 'http://react-ssr-api.herokuapp.com',
9 | headers: { cookie: req.get('cookie') || '' }
10 | });
11 |
12 | const store = createStore(
13 | reducers,
14 | {},
15 | applyMiddleware(thunk.withExtraArgument(axiosInstance))
16 | );
17 |
18 | return store;
19 | };
20 |
--------------------------------------------------------------------------------
/server/src/client/Routes.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import App from './App';
3 | import HomePage from './pages/HomePage';
4 | import UsersListPage from './pages/UsersListPage';
5 | import NotFoundPage from './pages/NotFoundPage';
6 | import AdminsListPage from './pages/AdminsListPage';
7 |
8 | export default [
9 | {
10 | ...App,
11 | routes: [
12 | {
13 | ...HomePage,
14 | path: '/',
15 | exact: true
16 | },
17 | {
18 | ...AdminsListPage,
19 | path: '/admins'
20 | },
21 | {
22 | ...UsersListPage,
23 | path: '/users'
24 | },
25 | {
26 | ...NotFoundPage
27 | }
28 | ]
29 | }
30 | ];
31 |
--------------------------------------------------------------------------------
/api/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "server",
3 | "version": "1.0.0",
4 | "description": "",
5 | "main": "index.js",
6 | "engines": {
7 | "node": "8.1.1",
8 | "npm": "5.0.3"
9 | },
10 | "scripts": {
11 | "start": "forever index.js",
12 | "server": "nodemon index.js",
13 | "dev": "npm run server"
14 | },
15 | "author": "",
16 | "license": "ISC",
17 | "dependencies": {
18 | "body-parser": "^1.17.2",
19 | "cookie-session": "^2.0.0-beta.2",
20 | "cors": "^2.8.4",
21 | "express": "^4.15.3",
22 | "forever": "^0.15.3",
23 | "mongoose": "^4.11.1",
24 | "nodemon": "^1.11.0",
25 | "passport": "^0.3.2",
26 | "passport-google-oauth20": "^1.0.0"
27 | }
28 | }
29 |
--------------------------------------------------------------------------------
/server/src/client/components/hocs/requireAuth.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import { connect } from 'react-redux';
3 | import { Redirect } from 'react-router-dom';
4 |
5 | export default ChildComponent => {
6 | class RequireAuth extends Component {
7 | render() {
8 | switch (this.props.auth) {
9 | case false:
10 | return ;
11 | case null:
12 | return Loading...
;
13 | default:
14 | return ;
15 | }
16 | }
17 | }
18 |
19 | function mapStateToProps({ auth }) {
20 | return { auth };
21 | }
22 |
23 | return connect(mapStateToProps)(RequireAuth);
24 | };
25 |
--------------------------------------------------------------------------------
/server/webpack.server.js:
--------------------------------------------------------------------------------
1 | const path = require('path');
2 | const merge = require('webpack-merge');
3 | const baseConfig = require('./webpack.base.js');
4 | const webpackNodeExternals = require('webpack-node-externals');
5 |
6 | const config = {
7 | // Inform webpack that we're building a bundle
8 | // for nodeJS, rather than for the browser
9 | target: 'node',
10 |
11 | // Tell webpack the root file of our
12 | // server application
13 | entry: './src/index.js',
14 |
15 | // Tell webpack where to put the output file
16 | // that is generated
17 | output: {
18 | filename: 'bundle.js',
19 | path: path.resolve(__dirname, 'build')
20 | },
21 |
22 | externals: [webpackNodeExternals()]
23 | };
24 |
25 | module.exports = merge(baseConfig, config);
26 |
--------------------------------------------------------------------------------
/api/routes/authRoutes.js:
--------------------------------------------------------------------------------
1 | const passport = require('passport');
2 |
3 | module.exports = app => {
4 | app.get(
5 | '/auth/google',
6 | passport.authenticate('google', {
7 | scope: ['profile', 'email']
8 | })
9 | );
10 |
11 | app.get(
12 | '/auth/google/callback',
13 | passport.authenticate('google'),
14 | (req, res) => {
15 | res.redirect('/');
16 | }
17 | );
18 |
19 | app.get(
20 | '/api/auth/google/callback',
21 | passport.authenticate('google'),
22 | (req, res) => {
23 | res.redirect('/');
24 | }
25 | );
26 |
27 | app.get('/logout', (req, res) => {
28 | req.logout();
29 | res.redirect('/');
30 | });
31 |
32 | app.get('/current_user', (req, res) => {
33 | res.send(req.user);
34 | });
35 | };
36 |
--------------------------------------------------------------------------------
/server/src/client/actions/index.js:
--------------------------------------------------------------------------------
1 | export const FETCH_USERS = 'fetch_users';
2 | export const fetchUsers = () => async (dispatch, getState, api) => {
3 | const res = await api.get('/users');
4 |
5 | dispatch({
6 | type: FETCH_USERS,
7 | payload: res
8 | });
9 | };
10 |
11 | export const FETCH_CURRENT_USER = 'fetch_current_user';
12 | export const fetchCurrentUser = () => async (dispatch, getState, api) => {
13 | const res = await api.get('/current_user');
14 |
15 | dispatch({
16 | type: FETCH_CURRENT_USER,
17 | payload: res
18 | });
19 | };
20 |
21 | export const FETCH_ADMINS = 'fetch_admins';
22 | export const fetchAdmins = () => async (dispatch, getState, api) => {
23 | const res = await api.get('/admins');
24 |
25 | dispatch({
26 | type: FETCH_ADMINS,
27 | payload: res
28 | });
29 | };
30 |
--------------------------------------------------------------------------------
/server/src/client/components/Header.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { Link } from 'react-router-dom';
3 | import { connect } from 'react-redux';
4 |
5 | const Header = ({ auth }) => {
6 | const authButton = auth ? (
7 | Logout
8 | ) : (
9 | Login
10 | );
11 |
12 | return (
13 |
29 | );
30 | };
31 |
32 | function mapStateToProps({ auth }) {
33 | return { auth };
34 | }
35 |
36 | export default connect(mapStateToProps)(Header);
37 |
--------------------------------------------------------------------------------
/server/src/client/client.js:
--------------------------------------------------------------------------------
1 | // Startup point for the client side application
2 | import 'babel-polyfill';
3 | import React from 'react';
4 | import ReactDOM from 'react-dom';
5 | import { BrowserRouter } from 'react-router-dom';
6 | import { createStore, applyMiddleware } from 'redux';
7 | import thunk from 'redux-thunk';
8 | import { Provider } from 'react-redux';
9 | import { renderRoutes } from 'react-router-config';
10 | import axios from 'axios';
11 | import Routes from './Routes';
12 | import reducers from './reducers';
13 |
14 | const axiosInstance = axios.create({
15 | baseURL: '/api'
16 | });
17 |
18 | const store = createStore(
19 | reducers,
20 | window.INITIAL_STATE,
21 | applyMiddleware(thunk.withExtraArgument(axiosInstance))
22 | );
23 |
24 | ReactDOM.hydrate(
25 |
26 |
27 | {renderRoutes(Routes)}
28 |
29 | ,
30 | document.querySelector('#root')
31 | );
32 |
--------------------------------------------------------------------------------
/server/src/client/pages/AdminsListPage.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import { connect } from 'react-redux';
3 | import { fetchAdmins } from '../actions';
4 | import requireAuth from '../components/hocs/requireAuth';
5 |
6 | class AdminsListPage extends Component {
7 | componentDidMount() {
8 | this.props.fetchAdmins();
9 | }
10 |
11 | renderAdmins() {
12 | return this.props.admins.map(admin => {
13 | return {admin.name};
14 | });
15 | }
16 |
17 | render() {
18 | return (
19 |
20 |
Protected list of admins
21 |
22 |
23 | );
24 | }
25 | }
26 |
27 | function mapStateToProps({ admins }) {
28 | return { admins };
29 | }
30 |
31 | export default {
32 | component: connect(mapStateToProps, { fetchAdmins })(
33 | requireAuth(AdminsListPage)
34 | ),
35 | loadData: ({ dispatch }) => dispatch(fetchAdmins())
36 | };
37 |
--------------------------------------------------------------------------------
/api/services/passport.js:
--------------------------------------------------------------------------------
1 | const passport = require('passport');
2 | const GoogleStrategy = require('passport-google-oauth20').Strategy;
3 | const mongoose = require('mongoose');
4 | const keys = require('../config/keys');
5 |
6 | const User = mongoose.model('users');
7 |
8 | passport.serializeUser((user, done) => {
9 | done(null, user.id);
10 | });
11 |
12 | passport.deserializeUser((id, done) => {
13 | User.findById(id).then(user => {
14 | done(null, user);
15 | });
16 | });
17 |
18 | passport.use(
19 | new GoogleStrategy(
20 | {
21 | clientID: keys.googleClientID,
22 | clientSecret: keys.googleClientSecret,
23 | callbackURL: '/api/auth/google/callback',
24 | proxy: true
25 | },
26 | async (accessToken, refreshToken, profile, done) => {
27 | const existingUser = await User.findOne({ googleId: profile.id });
28 |
29 | if (existingUser) {
30 | return done(null, existingUser);
31 | }
32 |
33 | const user = await new User({ googleId: profile.id }).save();
34 | done(null, user);
35 | }
36 | )
37 | );
38 |
--------------------------------------------------------------------------------
/api/routes/userRoutes.js:
--------------------------------------------------------------------------------
1 | const mongoose = require('mongoose');
2 | const requireLogin = require('../middlewares/requireLogin');
3 |
4 | module.exports = app => {
5 | app.get('/users', (req, res) => {
6 | res.send(users);
7 | });
8 |
9 | app.get('/users/xss', (req, res) => {
10 | res.send(usersXss);
11 | });
12 |
13 | app.get('/admins', requireLogin, (req, res) => {
14 | res.send(admins);
15 | });
16 | };
17 |
18 | const users = [
19 | { id: 1, name: 'Leanne Graham' },
20 | { id: 2, name: 'Ervin Howell' },
21 | { id: 3, name: 'Clementine Bauch' },
22 | { id: 4, name: 'Patricia Lebsack' },
23 | { id: 5, name: 'Chelsey Dietrich' }
24 | ];
25 |
26 | const usersXss = [
27 | { id: 1, name: '' },
28 | { id: 2, name: 'Ervin Howell' },
29 | { id: 3, name: 'Clementine Bauch' },
30 | { id: 4, name: 'Patricia Lebsack' },
31 | { id: 5, name: 'Chelsey Dietrich' }
32 | ];
33 |
34 | const admins = [
35 | { id: 1, name: 'Kurtis Weissnat' },
36 | { id: 2, name: 'Nicholas Runolfsdottir' },
37 | { id: 3, name: 'Gelann Reichert' },
38 | { id: 4, name: 'Moriah Stanton' },
39 | { id: 5, name: 'Rey Padberg' }
40 | ];
41 |
--------------------------------------------------------------------------------
/server/src/client/pages/UsersListPage.js:
--------------------------------------------------------------------------------
1 | import React, { Component } from 'react';
2 | import { connect } from 'react-redux';
3 | import { fetchUsers } from '../actions';
4 | import { Helmet } from 'react-helmet';
5 |
6 | class UsersList extends Component {
7 | componentDidMount() {
8 | this.props.fetchUsers();
9 | }
10 |
11 | renderUsers() {
12 | return this.props.users.map(user => {
13 | return {user.name};
14 | });
15 | }
16 |
17 | head() {
18 | return (
19 |
20 | {`${this.props.users.length} Users Loaded`}
21 |
22 |
23 | );
24 | }
25 |
26 | render() {
27 | return (
28 |
29 | {this.head()}
30 | Here's a big list of users:
31 |
32 |
33 | );
34 | }
35 | }
36 |
37 | function mapStateToProps(state) {
38 | return { users: state.users };
39 | }
40 |
41 | function loadData(store) {
42 | return store.dispatch(fetchUsers());
43 | }
44 |
45 | export default {
46 | loadData,
47 | component: connect(mapStateToProps, { fetchUsers })(UsersList)
48 | };
49 |
--------------------------------------------------------------------------------
/server/src/helpers/renderer.js:
--------------------------------------------------------------------------------
1 | import React from 'react';
2 | import { renderToString } from 'react-dom/server';
3 | import { StaticRouter } from 'react-router-dom';
4 | import { Provider } from 'react-redux';
5 | import { renderRoutes } from 'react-router-config';
6 | import serialize from 'serialize-javascript';
7 | import { Helmet } from 'react-helmet';
8 | import Routes from '../client/Routes';
9 |
10 | export default (req, store, context) => {
11 | const content = renderToString(
12 |
13 |
14 | {renderRoutes(Routes)}
15 |
16 |
17 | );
18 |
19 | const helmet = Helmet.renderStatic();
20 |
21 | return `
22 |
23 |
24 | ${helmet.title.toString()}
25 | ${helmet.meta.toString()}
26 |
27 |
28 |
29 | ${content}
30 |
33 |
34 |
35 |
36 | `;
37 | };
38 |
--------------------------------------------------------------------------------
/server/src/index.js:
--------------------------------------------------------------------------------
1 | import 'babel-polyfill';
2 | import express from 'express';
3 | import { matchRoutes } from 'react-router-config';
4 | import proxy from 'express-http-proxy';
5 | import Routes from './client/Routes';
6 | import renderer from './helpers/renderer';
7 | import createStore from './helpers/createStore';
8 |
9 | const app = express();
10 |
11 | app.use(
12 | '/api',
13 | proxy('http://react-ssr-api.herokuapp.com', {
14 | proxyReqOptDecorator(opts) {
15 | opts.headers['x-forwarded-host'] = 'localhost:3000';
16 | return opts;
17 | }
18 | })
19 | );
20 | app.use(express.static('public'));
21 | app.get('*', (req, res) => {
22 | const store = createStore(req);
23 |
24 | const promises = matchRoutes(Routes, req.path)
25 | .map(({ route }) => {
26 | return route.loadData ? route.loadData(store) : null;
27 | })
28 | .map(promise => {
29 | if (promise) {
30 | return new Promise((resolve, reject) => {
31 | promise.then(resolve).catch(resolve);
32 | });
33 | }
34 | });
35 |
36 | Promise.all(promises).then(() => {
37 | const context = {};
38 | const content = renderer(req, store, context);
39 |
40 | if (context.url) {
41 | return res.redirect(301, context.url);
42 | }
43 | if (context.notFound) {
44 | res.status(404);
45 | }
46 |
47 | res.send(content);
48 | });
49 | });
50 |
51 | app.listen(3000, () => {
52 | console.log('Listening on prot 3000');
53 | });
54 |
--------------------------------------------------------------------------------
/server/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "react-ssr",
3 | "version": "1.0.0",
4 | "description": "Server side rendering project",
5 | "main": "index.js",
6 | "scripts": {
7 | "dev": "npm-run-all --parallel dev:*",
8 | "dev:server": "nodemon --watch build --exec \"node build/bundle.js\"",
9 | "dev:build-server": "webpack --config webpack.server.js --watch",
10 | "dev:build-client": "webpack --config webpack.client.js --watch"
11 | },
12 | "author": "",
13 | "license": "ISC",
14 | "dependencies": {
15 | "axios": "0.16.2",
16 | "babel-cli": "6.26.0",
17 | "babel-core": "6.26.0",
18 | "babel-loader": "7.1.2",
19 | "babel-preset-env": "1.6.0",
20 | "babel-preset-es2015": "6.24.1",
21 | "babel-preset-es2017": "6.24.1",
22 | "babel-preset-react": "6.24.1",
23 | "babel-preset-stage-0": "6.24.1",
24 | "compression": "1.7.0",
25 | "concurrently": "3.5.0",
26 | "express": "4.15.4",
27 | "express-http-proxy": "1.0.6",
28 | "lodash": "4.17.4",
29 | "nodemon": "1.12.0",
30 | "npm-run-all": "4.1.1",
31 | "react": "16.0.0",
32 | "react-dom": "16.0.0",
33 | "react-helmet": "5.2.0",
34 | "react-redux": "5.0.6",
35 | "react-router-config": "1.0.0-beta.4",
36 | "react-router-dom": "4.2.2",
37 | "redux": "3.7.2",
38 | "redux-thunk": "2.2.0",
39 | "serialize-javascript": "1.4.0",
40 | "webpack": "3.5.6",
41 | "webpack-dev-server": "2.8.2",
42 | "webpack-merge": "4.1.0",
43 | "webpack-node-externals": "1.6.0"
44 | }
45 | }
46 |
--------------------------------------------------------------------------------
/api/index.js:
--------------------------------------------------------------------------------
1 | const express = require('express');
2 | const mongoose = require('mongoose');
3 | const cookieSession = require('cookie-session');
4 | const passport = require('passport');
5 | const bodyParser = require('body-parser');
6 | const cors = require('cors');
7 | const keys = require('./config/keys');
8 | require('./models/User');
9 | require('./services/passport');
10 |
11 | mongoose.Promise = global.Promise;
12 | mongoose.connect(keys.mongoURI);
13 |
14 | const app = express();
15 |
16 | app.use(cors());
17 | app.use(bodyParser.json());
18 | app.use(
19 | cookieSession({
20 | maxAge: 30 * 24 * 60 * 60 * 1000,
21 | keys: [keys.cookieKey]
22 | })
23 | );
24 | app.use(passport.initialize());
25 | app.use(passport.session());
26 |
27 | require('./routes/authRoutes')(app);
28 | require('./routes/userRoutes')(app);
29 | app.get('/', (req, res) => {
30 | let adminContent = `
31 |
36 | `;
37 | if (req.user) {
38 | adminContent = `
39 |
43 | `;
44 | }
45 | res.send(`
46 |
47 |
Hi! Welcome to the React SSR API
48 |
51 | ${adminContent}
52 |
53 | `);
54 | });
55 |
56 | const PORT = process.env.PORT || 5000;
57 | app.listen(PORT);
58 |
--------------------------------------------------------------------------------
/diagrams/07/diagrams.xml:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/diagrams/06/diagrams.xml:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/diagrams/04/diagrams.xml:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/diagrams/02/diagrams.xml:
--------------------------------------------------------------------------------
1 | 7VjJbtswEP0aI7dCFqPYPqZuFhTtJS7Q5siIY4kNJQoU5aVfX1IeaolsN3XU+FDZgC0+jrjMm/e0jMg82dwpmsVfJQMx8j22GZFPI98f+2Rq/iyy3SGBAyLFGQbVwIL/AgQ9RAvOIG8FaimF5lkbDGWaQqhbGFVKrtthSynas2Y0gg6wCKnoot850zGiY8+rO+6BRzFOPQ2w44mGz5GSRYrzjXyyLD+77oS6sTA+jymT6wZEbkZkrqTUu6NkMwdhc+vStjvv9kBvtW4FqX7NCf4VrkNv3d6BmVRgUyody0imVNzU6Mdyf2BH8Ewr1okwh2NzCBuuf1j4Q4CtR9eTarVtdNnmIw6Qa6r0tWXNAKlMwWG3XAiMgZS5iFDQPOfhDsQQO8VP0HqLpUQLLQ1UL/+LlBnG5VrJZ5hLIVW5YeKVn6rHEU4MspSpxiHHU2zvO7ObdmQil4UKXVEFWMlUReDCJjvMJr1xIpJ1BzIBkykToEBQzVft+qRY5lEVV1NtDpDtA6WCq1lRUeCocwVUg8EsB2btPMkElCpLMgOZrb2slXYlrGOuYZHRcsNr4wzt6qhq3cYK+gTiY6UWl9SK/pccTe23w5FvOTEl0IhEubW48/0j3FHBo9TWldkgqGNkrkBp2BylCXuJM4qtoxmHWNdu4s8wJm4YifORtzDrT95H0/+Nbid7dDs7m24nHd1eM2aXDMoUaKlbBuXMhlDF08heliCmK262Pwj4NAH7weX7CXg87VD8uci1LcHYMntxb8a8OGrMZpv6BXktRpCmZuoRctkUsLQj2JRxc2N0jXDCGSsNY1+ttKvpL8rltVSXcbhLvwear7yg7dPBpEvzeA/Nk6AHn54OPt2rT8+6Pu3izuDTswM+/QA0tFp+kIW1q8GRT3Nk4h4p/+TIl1c9SHU2SLVPqVYP9U2pknNJtSrGWqrf1kCfDbRYPNhf0EU2KPVEpV76r3z46UOpxOvwNCj1LUole5QanE2p5OBFlRWbQaEnKjRwt8Hvci3tvnga3LZHLqf/7r7INOtX02Vf4/0/ufkN7VhNT+MwEP01EbcqH21oj7S0cAAJbZHYPZpkmnhx4shxSbq/fseN8+kC3aUIDgQJ2c/jsT3vecZgeYukvBIki295CMxy7bC0vEvLdWczG38rYFcBY08DkaBhBTktsKZ/QIO12ZaGkPcMJedM0qwPBjxNIZA9jAjBi77ZhrP+qhmJwADWAWEm+kBDGWvUse124BpoFOulpxM98EiCp0jwbarXs1xvs/+q4YTUvrR9HpOQFx3IW1reQnAuq1ZSLoCp0NZhq+atXhht9i0glcdMcKsJz4Rt9dGXZSYgzxFcg3gGofcpd3Vs9qcDNd+2vHkRUwnrjARqtEAxIBbLhGHPwWZzPmXLyCOweROhBWdc4FDKU1CmUvAnqEEMnD1VP81ITQTGaL6hjHUsdYgR56nUanKmut/1uP8QJ4xGKWIBhgmP6M3NuOlQYgQklB1Ix/EKeAJS7NBEj577mlOteWes+0VHQTXvcUc8DQtEqzZqfLfMYUOTd5jIsUGkQVw/jAY7IcnjhlYjQH1OM+UyKSN1+UcJD5622QjvoiQ0BZGPHtUNBPFA0737udCc2K9QZ9Dv7z8cSdDrPZRVtBbKHQRbkdNn+AF567ivy9e1dqxOTiALx3tbFmP7oCzs98tiYsjiTqU+13Y+UR4kDWIV6h4N5yYNjQLq5Rhs5EFWxv/KyvCuuuZVdQ5x4r+fEt+gJJZS1bUL5cJdFUUxCgUpRpR/BY56d/fT+BreIt+8RO7kgwibGjRAiK8F3eVCxjziKWHLFh0ko07koaTyp4ZV+5dqj/CeqgxIhLxQr5duUURsRdXeqilpWFsEjOQ5DSpQm6gVfoOUO80S2UqOULvHG86zWgNGva2zXl9l3inypYrYqzwLYERiSu8/5Q6wpqfecYpLNPqYDPThOYPkiXGMQOpZ3QfRwJE/e8NRzrciAMPRXkTNeY7SVZ10PlJYk708cEtqyBnZtlMDWnjjWQ3cgaC4e5UqLu2hHFuxdRXp9BWpNdvK0f6qcqxIrKBZBVUC6aWn04n22FQzM2rD1fIegTOcePb9Ej+2uJ8Pqrs/MarF7ECx8E/w4KrTRe8h7pNEscFUMbxGn5Z62q0aPKqKpH19f3vzTfJ/kuxOzSfBiUjGbvsXeZXo2/96eMu/7VZNc5swEP013PmwXftYO2lyqKczdWZ6VmANmggtI4vY7q/vSiwYgtOmGScnwwwjvV1J6L0nliBZlYc7I6pijRmoIA6zQ5DcBHE8ixb0dMCxAeIZA7mRWQNFJ2AjfwODIaO1zGA3SLSIyspqCKaoNaR2gAljcD9M26IarlqJHEbAJhVqjP6SmS0YjcLwFLgHmRe89HzKgUeRPuUGa83rBXGy9VcTLkU7F+fvCpHhvgclt0GyMoi2aZWHFShHbUtbM+7bK9HuvQ1o+5YBcTPgWaiat/4TRGpvfqz5/eyx5cTvCty4MEiW+0Ja2FQiddE9mYCwwpaKehE1u325XCUeQS07Zlao0FBIowaXag0+QQsSYeHc3V2kFYC4WW6lUr1MppZw1JZdFM2535/RX4QLJXNNWEr0AAWXY76YwmcwFg49iPm7AyzBmiOlcDT+wlqy16NW233PORPGip5pojmDgt2ad3OfFKMGi3ZewGQkIG0lo71d5XubfJPonfItLqDe5BX1HnBjjdT5VcV3qthVks9QcTpScWVAWCpglKN3VujUt3HrFnJVotZp0QIplhWJoK1LEVQ4qEyQQr5rCyh97eOB/rscaiq3I2cQUfaF/ANNWei+eAy1eijYuhkc6ZJK4VeGS5llbpGzbhv68T8M1zfL5C9m8Xm8y/gCRpnOXhz3ZDo2yuKMUWYXMMrsTLV1x333T1840sgHsoTOJJXBrG6MJbwVmg9GiLXtvOZXJxPR08Cuph8on3L/sP5+NdBlDNQd/w8wEHVPv4I+1vvdTm7/AA==7ZlNc9owEIZ/Sw9cM7aFKTkWmqSHdqYzHNIehb3YCsLLyHKA/vrKeGVjTDIkdWEmIzhgvVp9WO8+QpgBm662D4qv0x8YgxwEXrwdsK+DIPADNjYfpbKrlNAKiRIxBTXCTPwBEj1SCxFD3grUiFKLdVuMMMsg0i2NK4WbdtgCZXvUNU+gI8wiLrvqo4h1SqrveU3FNxBJSkOPQ6qY82iZKCwyGm8QsMX+VVWvuO2L4vOUx7g5kNjdgE0Voq6uVtspyHJt7bJV7e5fqK3nrSDTZzUY0jz0zt47xGYpqIhKp5hgxuVdo0729wdlD54ppXolzaVvLmEr9K9Svgmp9Jtqcs2V/lI6Y4QMM7DavZCSOoIsthGR5HkuokqkkLKbJ9B6R+nCC41Gaqb4HXFdD6dwCVOUqPY3xbz9q66xpjKjLDDT1KU/pvKplt2lpdXOsVARLV5AycpVAjaKwsp1PWhHfjwArkCrnQlQILkWz+0U5JTJSR3XuGkuyNDT5tJknrksqFNhfNvePOUd09uWblKhYbbm+7vaGMTbNtdJW8ZKPgc5qdPerlzt8bER4/LdMSIoF974fBBJ3JxvEJciycrkMQaBes2xZ1Aatq+aQbXD27BqQhtZDe7mYFuwWnqwI4y8f/fvs2OzTzZZl83gWmiyDpop8BiUY/N8NtmozWb97XwJNm8dm32yOewbRGr6E4UZtU6ZMHxhO7ddVJsDtTrKhnoaZyXIsEP4wpzqHOFvITz0jwj3L0j42BHeJ+HhhyM87BA+L7TGzBH+hvP1sG3X+IKA283EEd4P4aMPR/ioQ7iCuIjcl/hbEB/5V0ScOcT7RNw+y2o937raj2g7mwM+H2FumFt+cnS+8wEXu+QR2x85PHvF89Tj594P3me7233+PClZcmy+l01bvgibp37eZLEEd/Z5v4PD/3j4McXmf8PqsNv8Ocvu/gI=7ZhNc9owEIZ/ja8Zf/B5LJQkh/ZSDilHYS+2EmExsgymv76SvfJHRDNMmJpDTGYy0rtrWd53H5HYCZb74kmQQ/KTR8Ac340KJ/ju+P587qrfWjhXwihAIRY0qiSvEdb0D6Bo0nIaQdZJlJwzSQ9dMeRpCqHsaEQIfuqm7Tjr3vVAYrCEdUiYrb7QSCaoeq7bBJ6BxgneejbGwJaEb7HgeYr3c/xgV36q8J6YtTA/S0jETy0pWDnBUnAuq9G+WALTpTVlq657/Ee03reAVF5zwRi3Ic/m0SFSlcApFzLhMU8JWzXqonw80Au4apbIPVNDTw2hoPK3lh/GONtgJJNEyG/aGCWkPAWjPVLGcCFII5MRMpJlNKxETNHLvIKUZ+wWkkuupGaLPzg/1LcT/A2WnHFRPlTglp86YjwNlLLjqcQl/RHOL11pVxaLnfFchFg8H3uViBgwa1RJuqyty9CNJ+B7kOKsEgQwIumx24AE+ziu8xov1QDtvGwt7uVIWI6LvsD2oPrTsrxr6CmhEtYqUUdPCu+uyXXH6lxGtsAWdc+butUOv7dhpn8sG3xdduVyKxOhud4ewmic6tZR9oD4yK8jCAnFh15gdGxwx1PMn+L81DoTDMlJ6ziYuLfb53mWTwOaN6A5stE03zb9szmy2FxokgYyP0lmMO6RzFk/YKrqiHMrpKcbXOCrQDuxofXvxezEYpYqS4uH12zA9pPYevMesZ0P2PaF7dTGdnIvbKcWts9qkYHaG6j1+vwz2LX826oSs8HBGxysX8f04mDwPw5eM97UJ+1XOVy9Cy8Z7vefjNlNi89feaqElEdQdpiqgtpsQgdcr8U16BFXNW3eNpax1hvdYPUX7ZhLc9owEMc/DVfGD8zjmFDSdKa9lEPbo2IvtoIsMbJ49dN3Za+NjZwOaSmXYmYY6a+VLO9vdxEehPP88FGzTfZFJSAGgZccBuGHQRBMpgF+W+FYCWE0q4RU86SS/JOw5D+BRI/ULU+g6BgapYThm64YKykhNh2Naa32XbOVEt27blgKjrCMmXDVbzwxGam+550GnoGnGd16GtHAC4vXqVZbSfcbBOGqvKrhnNVrkX2RsUTtW1K4GIRzrZSpWvlhDsK6tnZbNe/pjdFm3xqkuWTCtJqwY2JLj24ykLQ3c6z9AQm6h7pKm0ylSjKxOKmP5TODXdXDXmZygU0fm3Dg5nur/cOaDCPsFYZp82BpoSSVhFp74kLQQiCT2iIWrCh4XIlkYhd9BWOOFEJsaxRKpy1+VmpDdoXRag1zJZQuHyr0yqsZqUGHqKyUNLSkP6V+38zKUdY7b/qfpEJtdUxWEUU00ymQ1aRhjykFKgejj2iiQTDDd93VGQV32tidAGODGPfzjhzeDusuyX3GDSw3rNz7HpO9S7eJX2sr2AuIxyYDaoc1aM/9P7Ufx/+B9TfibVlSCl3OhQmeShsziAF0A2oH2sDh96hcCPWEETmPappf5/y+VSFmpGWt4tCIfwMucMBxpHQYvhZ3gJcCnHodgEEUuQCDHoDjK/Ab/YuaWtXRuqr6/3NNDd2aGtyopoZOaj7jIvfM/PPM9Mc3zMyxg+/TygYgx5OQxoayPWwXYE+SXOC51B4ybS/OmEwhGQ6HDmp0hjnj2YFE5No0SHIcbF3L8Wz6QAM5T5KyPvQFUDfE3hFD70vP6+L2en5J+3AHV8Bd/8W4H3lvWZ4nbnme3ag8TxzeX0FvpQ03eMHkWd/L9IV5OwrODlD+Dcv0rAdjmTqWHeidrdV3jhdxHI9uxxG7p7cZ5VjrjVG4+AU=7Zhdb5swFIZ/DerVJoJDk1w2WT80rVO1dNpuHTgBq8aOjGnS/fodg/k01dIq28WURCLw+gP8PofDIR5ZZYdbRXfpvYyBe4EfHzzyyQuCeRDi1ggvlUDCRSUkisWVNGmFNfsFVvStWrAY8l5HLSXXbNcXIykERLqnUaXkvt9tK3n/rDuagCOsI8pd9QeLdWrVie+3DXfAktSeeh7ahg2NnhIlC2HP5wVkW36q5ozWc9n+eUpjue9I5NojKyWlrvaywwq4sba2rRp380prc90KhD5mQFANeKa8sEv/vP6JghTG8hTMJYJ6BmUvV7/UFpWLBDON75HlPmUa1jsamdY9xgRqqc44Hk1wt1mm6cvpBviyMWoluVTYJKQA01Ur+QS1iP75c/NtWmoeaNVyyzjv9LROoy6FtkEVTO1xd8bygzrlLBGoRegWLpEsXfuso+iAhkNHsnbegsxAqxfsYluDuUVrQ38ys8f7TiAtrJZ2YqjWqI3dpJm65Yc7FuE4TuLg/ArIyNw9ZlMoUd402Q69Fjo3I0XZdPd4/+WM+J2Im+N/gXjqIH5QcsMhc/DhavSAUc94S6PrsJUc04w3DNPjlW3IWByb04wGRT9s3hAXxzI9AUISDu7SwEU4HSEYnIBg6BBcS15oZnLuGeHRCC+HCCehexcGIwzJCRheOgwddiDiK1OKtOa8irHrTD8FklN4CnGv2nEd7TgWjhhWawo41ey5XyONuWjP8CDx6dJJm7MBsHAAIpeFisCO6hYtg4kW/h8m0lQloJ2JSqjNso/iPDtzfjPn6aKPhwwfe8dyHk40GWbf03GeO5y/FaZW2sMGM+NTXRHTcpDcmk2hOsWxn+MLS1lbmZ9VVTybEXCAqNDQVNMK8gLfY0RiXhYwf2IUnT7pc9jq/zHlh8GwtnZTPrkciezZCVL+wgmR73nL9UIBjfSHWGIddlNFxQXKnG0UVQzyqgs6rB7lWisMANO8LURkHvwfz0Hw7iDAl++/FgR42L6LV2ml/b+DXP8G7ZdNc5swEIZ/DXdA/uqxdtOkneZS0ulZhjVoIiRGyMbur+8KFgyGZPrhZnqwPWPQq5WE9nktCY9t8uO94UX2qBOQXugnR4998MJwyWb464RTI7D5u0ZIjUgaKTgLkfgBJPqk7kUC5SDQai2tKIZirJWC2A40boyuhmE7LYejFjyFkRDFXI7V7yKxGamB758rHkCkGQ29mlPFlsfPqdF7ReN5IdvVn6Y6521fFF9mPNFVT2J3HtsYrW1zlx83IF1q27Q17T6+UNs9twFlf6VB2DQ4cLmnqUdgDmBQixABXr6CSsAIldID21ObpHqa4DryPbauMmEhKnjsait0BWqZzSWWArztJupiJd+CXHep2mipDVYprcCFWqOfoRUxg/7Kfbualggma70TUvYiKdeoa2XJVuGMyv0e6w/qXIpUoRZjvnDWbE35AGPh+GJOg44U/gFA52DNCUOoQbgkuGT+YEblqmelNibruajVOLk37bo+E8QbgjgNlI2AflMCp1NyF/WZH3gZG1HYG80/pInDvR3N2Yjmp1Ln2hSZiG84r4GThW+Icz7CeQ8KDLduoX14evyCF63cZpc5paSl+AItTt5e8BtAIVL97JPUJlTCzvXgEilw03tPci6SxA0yaZehoX7DMT3aweoV2nUczTK8AunZ4nIZZiPS3T7cJ72Y/z3pxYj0U4OU51CfW+q91exVOY3c53iCaMWtO9DcjHAtI4RswgjsHxlheTPCf2uEqbUfX1WuYgQsnk/xdV3vTYnd/QQ=7VhbT9swFP4te6j2VuXSlvJIC+zKmOgktkeTnCZenThyHFL263ec2LnggMrIxKQRpGIf28fO+b7v2M7EXyf7d4Jk8QUPgU08J9xP/NOJ57mu4+I/ZbmrLXN/WRsiQUPdqTVs6C/QRkdbCxpC3usoOWeSZn1jwNMUAtmzESF42e+25aw/a0YisAybgDDbek1DGTfv5bQN74FGsZ56OdcNNyTYRYIXqZ5v4vnb6qmbE2J86f55TEJedkz+2cRfC85lXUr2a2AqtiZs9bjzB1qbdQtI5SEDvHrALWEFmBVX65J3Jha5FHzXhMGd+Ktm0Q5WQpLHEOoKYTRKsRzg9CDQEMuEtaMy5TLZR4o004QHuyKbIoSS0BREPr1RwIG4pmnlfiU0MZTnLWVszRkX1aJMUNFrtbpOy6J6sCVBr99gX4dhrdxBUIic3sIV5K3jCqzmBRi5AbZqQDR+U56CWgSuVa/JXep6Z2qnetCugwpCwv5BYNwGbpQR8ASkuMMuZsByXg/RCnJnul62fJwZucQdKnpLbSRaA1Hju+UBFjQVhmnhW7T4qhTjGV2/CD1IGsQq1D0YjmwYGgaY6Rhs5aGoeI+isnD6oHgWJu4gJovnQzKzIImlVOnwRLnwzsuynIaClFPK/wWMetp9Mbxcvw+Ywa8DmDf/S4AtLMDWjAY7NF3AGwuifhoqYyphk5FAtZYYawuHFr3HU5aVH52l+mtaDCm8R3LsoWnPos4ICN4D0B1AsNmVuwjORsiCRwOb44IpauYZSbEcqfKHt4maB+vO5Se1CpyoOpokGUKAb6nH4GzdYRYDZLVX9WDuYWf2oA5I2mTFXUWc4mnmRDckNAzVNIO86jPvCdQadTd8Ggv8AR37QzoegQVziwVfuEiI6nIFBA+fnnOSZShtIilP/x9Yq376Pd0RTjze4t6Jx7VPPJ45BY0Nstm1O8BBiFcCXeVCxjziKWFnrfVeiDsIw57K78o8nevajwZ7IuSJuqF0UzTazqlaW+UI0tD0CBjJcxrURt1FufkJUt5pkEghOZraJX7mPBukWhe9fvb3nyxnFZ3HgcZg8kIEupe+/+GrRqB7HQ/TQQBDJd32vT8H26UlYKPbj5uJIs9Kpe5C4O+6TdpYDuF1mz5QvIvZvQw9cF1xlwMZ+ngM8dqX1lfxjineY1u87gN8GF29xwPqReBE94iVV9+H8Of08uJVsodKdt7fb5v9tyvZocvR0XwEyboWrBtQWbfIFD9v6xQckxQPOCJ/xfQPMfWPBq5LI2GK1fY7ZdXW+Rjsn/0G7VhNT+MwEP01FbfKSdpQjtvSwgEktEVi92iSaeLFiSvHJen++h0nzqcLlFURHAgSsp/HY3ve83hg5C2S4krSbXwrQuAjl4TFyLscue5s5uBvDewrYOKRCogkCyvIaYE1+wsGrM12LISsZ6iE4Ipt+2Ag0hQC1cOolCLvm20E76+6pRFYwDqg3EYfWKhigzqEtAPXwKLYLD2bmoFHGjxFUuxSs97I9TblVw0ntPZl7LOYhiLvQN5y5C2kEKpqJcUCuA5tHbZq3uqF0WbfElJ1zISLasIz5Ttz9GWxlZBlCK5BPoM0+1T7Ojbl6UDPJyNvnsdMwXpLAz2aoxgQi1XCsedgszmftuX0Efi8idBCcCFxKBUpaFMlxRPUIAaOzPRPM1ITgTGabxjnHUsTYsRFqoyanJnpdz2WH+KUsyhFLMAw4RG9uQkDSAXFi6F0GoJQ9yASUHKPJmbCuW84NZp3JqafdxRU8x53xONqpFSuUW3U+G6Zw4Yh7wXmicWkxVw/jhY9Ic3ihlcrQn1St9plUkT69o8TETzttmO8jIqyFGQ2ftRXEOQDS0v3c2lIIa9wZ/Hvlx+OJOj1HooqXAvtDoKdzNgz/ISsddwX5utiO1YoJ9CF472tiwk5qAtyAl04li7udPJzifOJ+qBpEOtY93g4t3loJFAvx2GjjqaFvMrL8Lq69m11DrHin4AU1yIlVkq/bT+0D3eV5/lY7DB4OmrJVyCqd4M/j7ThZfLtu+ROP4o1zyICQiwbTFdIFYtIpJQvW3SQlDqxh4KpXwbW7d+6PXanZSakUv3QZUz3dURsxfTmqilpWFsEnGYZCyrQmOgV/oBSe8MT3SmBULvHGyG2tQqsh7fOfn2dee/Omzo8782aEjhVmNr7Nd0B2szUO8HQYyOQ6UAgnjNIohjHCJSZ1a2MBo78izccZXhBA7AclSpqznOcsCYfL6xpKQ/ckh5yxoQ4NWCEN7mogTuQDHevk8UlGcqxFVtXkU5fkUazrRzJ15RjRaGBphVW6aNfVJ1Stkdnm6n1Rlwt7xE4w5ln31X5kdWXfz545v2p9WJcHHgw/FPUXv6BmtyniWaD6xfxGn2OdJW3avCoeinJ9f3tzTfJ/0myO7PLghORjN32r/Mq17f/AfGW/wA=zZfLcpswFIafpQu2HUDg0GXsxOminenUnWm7lOEY1AjkCuFLn76SkLhYTmxPnDbOTAb96Hq+X0fCQ7Ny98DxuvjMMqBe6Gc7D915YZgkgfyvhH0rRMhvhZyTrJWCXliQP2BEW60hGdSjioIxKsh6LKasqiAVIw1zzrbjaitGx6OucQ6OsEgxddXvJBOFUQPf7198BJIXZugkNi+WOH3MOWsqM54XopX+ta9LbPsy9esCZ2w7kNC9h2acMdE+lbsZUBVaG7a23fyJt928OVTinAZh22CDaQN2xnpeYm9jAVV2q0IqSynFdU1SD00LUVIpBPKxFpw9woxRxnUD5Otf98YGEEllxSphaKu16vKg5XwexP6d1NtJQOZQ6tcVdNGSJgRWguB7WWXb47JMigEoq3GgWJDNuHtsXJN33XUjfGFEDhz6xuDIGsH4O/yAxl3UrOEpmFbD+J/oaIIOOhKY5yCcjuTDYNm9pPEeR41csjK+C1NkXBQsZxWm97061U4G1YE/hg47In4o+X1sSj87O2AurGEqVoHV5kRNTXd01FJSNFVUN79AiL2xCm4Ek1I/xU+MrV/mviC63H0tU5PQTFLSdIy1zvbo2eYb0X4GbeTs4qnKgcD1YL8bqEVts96hCcaItwURsFhjvc6tzO0He92mK1WX4iXQaZfwbCQ75odgEvXngNFpQHIf1DQZ8ySwDjWmJK+UmWTk5aItwQ1wAbtLM4jdmeiJLT7IMN15NUwxkf9yoLEDdCaXDjpzbEhNlvQ/gkzCJZpMzgGZxZBk0RsDGd/8Q5ATB+Q3Urrs5OrEc6eqQTEMr5GciKlYEXmTuTUvSpJlOpcfc8TYMxeY4lygup5ZZ3AFmB2UZ3ZldIRleAWWN6fvSjKCa/WYNpzup1xGT50OpzZjT+Ht5djuULRGo7ASes5CnmFMKUHiX2enxvEYLkIu3GOXOvl58XK6iUP3gWFVgcm7u79YfNXfIOoOTypSqoDJckHUuSrkln73CnvahPpt7egrcJ4cXHojFDqcA3QsI8cXc5bF/muqvTX3X6zo/i8=7ZhNc5swEIZ/DdcOIH8eYzdtL73Eh55lWIMmAjGyXNv99V3B8hXhjNvByQV7xoPeXSG0z2pl4bFtdvmueZH+VDFIL/Tji8e+emG4ZGv8tcK1EtichESLuJKCVtiJP0CiT+pJxHDsORqlpBFFX4xUnkNkehrXWp37bgcl+6MWPAFH2EVcuuovEZuU1MD3W8MPEElKQ6/mZNjz6DXR6pTTeF7IDuWnMme8vhf5H1Meq3NHYs8e22qlTHWVXbYgbWjrsFX9vt2wNs+tITf3dJhXHX5zeYL6icvnMtc6FuVswPr7HtucU2FgV/DIWs8IH7XUZBJbAV4287G+ku9BbpqIbJVUGk25ysG6Gq1eoRYxUP7KfhtLHXiMyeYgpOx4UkhRV7mh7AlW1O7esfygzqVIctQiDAugcUPTBm3gcjN0QQME8xxUBkZf0YU6sDpZKccDRu1zmzFsQVraSZaghs8pS5Pm3i0pvCBYw+CYA24HGueD2hZX40TxXorLNxQXLsUGWJfiYgSIMwfiC3AsZ6H/VBQTwjsRztafiHDhINxghBGZHZAFDkScpnlDqhd+YtKNM0lO6GzQBO5ZT2TIRGwHHk6NfvL8Q3Z0yGK+3iZb+tE8gxGoNhRrqssBqrMBqrMRqC6nbXGsbTEc4Pa4bXE9VdQxKirrM2T+B1bUOn9ulFR3JU4l9T9LarNUP6KkBoGD9eWU24NdKo7lUc7+a/WVldRJ01kK8vjLA4BLOJjPwP3uSu7iDkfAvVi92UHnA7jXA7hXY+AOHdy7VBQt7329pjGMZRqo0maVvT3A26PMxH0M7uH6cdyx2b6sKG2dF0Ls+S8=7Vhdb5swFP01eenDBDiE9LHJ2nXSJk3Kw7ZHFxxw6+DIOA3Zr981XD6dLrTJ0mlKKyE4NteXe865AY/IfJV/UnSdfJUREyPPifIR+TjyvIBcw9EAuxIgPgKx4lEJuQ2w4L8Ygg6iGx6xrDNRSyk0X3fBUKYpC3UHo0rJbXfaUoruqmsaMwtYhFTY6Hce6QRR13GagXvG4wSXnvo48EDDp1jJTYrrjTyyLP7K4RWtYuH8LKGR3LYgcjsicyWlLs9W+ZwJU9qqbOV9dy+M1nkrluohN3jlDc9UbPDRF0w9M4XZ6V1VEc1yCDhL9EoA4MJpppV8YnMppAIklSnMnC25ED2ICh6ncBlCShCYzCC85lDrGxxY8Sgyy8y2CddssaahWXMLwgKsqCUz2Tpmzapc5kLQByZmdcH7mchUo7DcKV5XU4AVp/ir5uFzYvlMgix/saJuzRPIn8kV02oHU/CGcYDUovRrqreNkKYIJS0JEcQoSjeuIzf0wQkyuJ9NYrE5M1640Pl2OieBf5DO4C/RObbotHhkaXRj+l1TqBcpbVepHKlaG3lFfcsMWGT1z4MFbRXM31OwClNMUM2fu+H3VRFX+CY5LNzw5XbtN3Z7RGRyo0KGd7U744FAXj+Qpipm2gpUkFo/9iCefYtnDibJPzxmFt9d/+xzWJv/4faypTI1/5ZUvF5TaH7fhkvI6iCn6LqTLlvEt21a/3q3ZTc+gU8D25bgj6oLSaUTGcuUitsG7TXCFmks5/qHgT/4ePWztjNVuuf2ArvjJrUiUKsfhIJmGQ9LEKeYMI9M6x3yRDdaAtSk+EXK9T/QPaCYhU3RivgGWBiuZRlbDYObx1BqJ5Y17yHIxZlvd2b98nMOZ04t+kLBIfELga94A3rP1np9aa3HtdZ2H63eYNqNdDpYDifvrVU6l+Z6Mm+etbm6rsXfyJsI813J4SQ2J5/hWQvmzAYOHK5kKnZXRk2bFI7SHHTCDNu471AGgLXrGJYajv94VWUl3uHbdXzQwkcJgji9Zj32bUH86fPrKEHYu0lHCOKh2ro4iyIEW/6XggiC8wkCLpudy/I7uNkdJre/AQ==7Vnbbts4EP0aIUAfFrpYjv0Ye9PtQwssmgLdPtLSROKGEgWK8mW/fjkUKcmm03qNWFugch4iDm9DnnOGQ8mL1sX+D0Gq/BNPgXmhn+696HcvDIPAX6h/aDm0ljgyhkzQ1DTqDU/0HzBG31gbmkJ91FByziStjo0JL0tI5JGNCMF3x82eOTuetSIZOIanhDDX+pWmMu/W5fcVH4BmuZl6EZuKDUleMsGb0sznhdGz/rXVBbFjmfZ1TlK+G5iiRy9aC85l+1Ts18Bwb+22tf3ev1Lb+S2glJd0CNsOW8IasB5rv+TB7gWU6QNuqSoljNQ1TbxolcuCKUOgHmsp+AusOeNCd4h8/etq7AZGyvLMS2nQDmamfK5n6wSkDkr9uoJutxQLgRcgxUE12fVwWUzyAVDWJoARSbfHwxPDmqwbrpvhT07VxKFvGB7ZcQy/A4unHaLmjUjA9Bru/w8GmgcnA0kiMpDOQOphsOzepOE9D3XkQP2FFuDALWEvvwdwyUtA5ChjJybCaFYiSxRGoOyrLQhJlageTEVB0xSnWe1yKuGpIgnOuVMhRNm0aAB91dSxusACIxtgq05Zp55cyCndzqzTAI4Owv6/Usx0CJevcGBAwdkZCp5SZci2I3i/g2UQuDJVYrHL40LmPOMlYY+99WSHBwDDnsq/0PxbbErfOuiJkFb9Zr+17T1F3/RAZ+ODMpomOMzfIOXBYEQayZWpd/Ej59VPEErUZmrNGuDMoaPVZ0LHeTZcHEkuxXbm6PShqvRECj2h8At9XqJvOaDTIBSLsXup9hUXgZr2U7rVtq7dnYSiUp7CnRfOSYGKKzd11W3QgEnHPDmn1WFwuFyoLroL/HPQDU/CS3+GXo66E4veQPDR4seCP6v4OH4DxZ85mG+heLUX4jCowuI3G5R/1WgQu9FgPlI0iJ1o8LmPA0QHhhp0RqHl34q9UVGhxmwUM2GMDpPCr1P4MhpR4dF0pt9UxXNXxfcjqXjuqHhlpWnOdZTrhy+fPuJtlTI4OeQTAaCK69aCFYyTFPskjLby3ygiMDedn6R+mdTDeTyi1GfTYf6/hYF7NwwsRgoD904YWJ/K199wLlHYTTVp+UotR/Zt4yhajqdj+6Z6Xbh6XY6k14Wj168o0YKUDWHs0B3e3UH9GUgiu8Sc6OQ84SXm6lK/bLPX9Lb5u5oU8M5e1ye1X6X2WTDmNXw+qf2mal+6ag/883x4c7kvHblbPfc5unK10/cgQ+/S8Jqm0CbqRMs+4QWuuO5alrDrU30dC3Y50TGDCSApLkwRodY5wOD9XcqTpgDzEWAKE1eEicWYd3n/VSrdSfKi6cDV8u46fDXmtMy8oxe9mmdIpg0t9XUPti3NcoLpIjISa0EmEy+u5EUc3+7ip4r9p9z2k13/vTx6/Bc=7ZpNk6MgEIZ/jXcRTcxxk52Pw84cJrW1Z0Y7Sg1KipBJsr9+UdFokalyYi1eSA6RtxuUfgCxo4c3xflJkH3+wlNgXuCnZw//9IIAIR+pn0q5NEqE40bIBE2101XY0r+gRV+rR5rCYeAoOWeS7odiwssSEjnQiBD8NHTbcTY8655kYAjbhDBT/UNTmXf98q+GZ6BZrk8dR9rwTpKPTPBjqc/nBXhXfxpzQdq2tP8hJyk/9ST84OGN4Fw2R8V5A6yKbRu2pt7jF9buugWUckyFoKnwSdhRd/0NiApo4L/xowShr1Je2sjUfYOqtu/h9SmnErZ7klTWkxoLSstlwVQJqcOud5UvI+/A1l18NpxxoUwlL6FylYJ/QCuqsPlx9e0sLQYVofWOMtbz1AFWOi+lHkso1uV+i/VH6YTRrFRaooKkuojXZtR0ID9BSDj3JB3FJ+AFSHFRLtqKY01Uj3i00OVTb/y01PPe0AkjPWz1kM26pq/Y1IEmd5sivkExPZ4dvJHwFosZ4YU34SUgDo7fSH5LNOQX+JE9fpHB70ciKS+VthFAJHcg7waJQ4sTcfHVvdDBGwUPzbmKLg14z0BSt4EZTS+Ycw2NTXqqEcfuXnaRxZm3Mtj9PqjNyy96cEvn3QBXFidfe+7+DiYtaOkITiBodeeCkEGwnoOO3th953LGBRSZSZh6/jl8d+Ozunya2ZcdyCR3M/BbCBfRcP2MbSI0czA1QjcNJzEMsc1V1MzD1Clsh28svjCc8QkQmdkX9wj4HXirOXcwZvbF3f0m0bO6gTGzL+7GNwmf3Yc/MwHzyuVj/R+0A3gnQJu7z8DMvziAU9Mv/xGgKl5f0Khtvbdg8MM/
--------------------------------------------------------------------------------
/diagrams/01/diagrams.xml:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/diagrams/05/diagrams.xml:
--------------------------------------------------------------------------------
1 | 7ZZLj5swEMc/DdcKTJJmj0k2u63USpVyaHv0wgS8a5jIDHn009eG4RVolVVXPS2RIvs/48fMb2zwwk12fjTykH7FGLQn/PjshfeeEIvgzv474VILYsFCYlRcS0En7NQvYNFntVQxFANHQtSkDkMxwjyHiAaaNAZPQ7c96uGqB5nASNhFUo/V7yqmlNXA9zvDJ1BJyksv52x4ktFLYrDMeT1PhPvqqc2ZbOZi/yKVMZ56Urj1wo1BpLqVnTegXWqbtNXjHv5gbfdtIKdbBix4G3RpQofYZoK7aCjFBHOpt526rsIDN4Fveyll2jYD24Szoh9O/jDn3k+2FCQNrRwYK+SYQ6M9KK15IsjjxiPSsihUVIvs4qZ5BqILV4ssCa3UbfEL4qFdzuALbFCjqYIK/eppLQ3T0Cp7zImnDObcnxo5ziwnu8DSRJw8wbUqTQLsFdaSS2tvGNN4BMyAzMU6GNCS1HFYgJLrOGn9Opa2wTin0fJejlKXPOnaHQwwI+RDoKdUEewOsorpZI/3EHJbsc5XyyfQ67bmm7y1hK8xLN1vhEG4tFvKPU8+NLfjkVoluSsdi8eGyAM5xoljwdIRDMH5r2DYOrvjI8tXWjDj/ql3QTTHOu3dDQv/31mGI5arb5/fOb4FR/HxP3JcjjmWdlHhb2yURto32TVTGxVdgRvQYET9tLPUZFLD3s3gMqTsG27FcqbiuLrOp+pkWEmvKJVbMfepijegOl9cURVjqrMJqOL1UG23ez9Xtt43ULj9DQ==7ZdNc5swEIZ/DdcOIOPaR9t10sy0Jx/aHhVYQI1gGSF/9ddXghWGQDvJxJNcjGc80qvVCu2zK8Bjm+J0r3iVf8cEpBf6ycljX7wwXISR+bfCuRVYtGyFTImklYKLsBN/gESf1L1IoB4YakSpRTUUYyxLiPVA40rhcWiWohyuWvEMRsIu5nKs/hCJzkkNfP8y8BVEltPSi4gGHnn8lCncl7SeF7K0udrhgjtfZF/nPMFjT2Jbj20Uom5bxWkD0obWha2dd/eP0e6+FZT6JROIU63PbuuQmEhQF5XOMcOSy+1FXTfbA+vAN71cF9I0A9OEk9A/rfwpot4vGqk1V3plwRihxBKcdiekJEdQJs4ilryuRdyKZGLd/Aatz5QtfK/RSJdb/IZYdcspfIINSlTNppjfXN2IY8qMkmKpyWUQUX9q5jiyFOwa9yqm4IWUq1xlQFaslWxYe9OIxj1gAVqdjYECybU4DBOQUx5nnd2FpWkQzmm0dC8HLvfkdG0LA9QI+RDoMRcadhVv9nQ05T2E3GWstZX8EeS6y3kXt47wcwwL+xthCG3YDeWeJRXNy/FwKbLSpo7BY7ZIE2mPE2VB0gGUhtN/wdDozJUsHWlL6h5754MzyXtHw9x/O0p3LN7K9DplysZlOvuoMmWjMt2BOtyq9DpV2j1o36NMZyOUq0rcOF6DI4vekePnEUcvnEuzwNrQnGe28ZCYvYn0LMrMWD6UKToT47yzGrE3u9fPAA+oEco+HpJcxCWk1oONpDDvqyuSC5Ekzak/lU/DjHtFSr350H0F8OUQeDAfA19O8J5d4/Ea3IB/OPCpF6orATfdyxdVM9b7amXbvw==7Vhdb5swFP010d4isBuSPiZZvx4mVeukbY8u3IAVg5kxJdmvn20MAUzT9Evtw6hU4WP7Gs4599pkgtfp7kqQPPnGI2AT5EW7Cf46QWiBZuq/BvY1gGfnNRALGtWQfwDu6F+woGfRkkZQ9AZKzpmkeR8MeZZBKHsYEYJX/WEbzvqr5iQGB7gLCXPRnzSSiUV9zzt0XAONE7v0YmY77km4jQUvM7veBOGNuerulDSx7PgiIRGvOhC+mOC14FzWd+luDUxT29BWz7t8pLd9bgGZPGUCqic8EFbaV1/e3thHk/uGDvNCoKd4E7yqEirhLieh7q2U/gpLZMpUy1e37SvpsYzcA1u1pKw540J1ZTwDPVQKvoUGVFx5C/3X9jTcK1pWG8pYZ6RlVeE8k9ZACNl2N6K5FE4YjTOFhYoZEM1E+44jvFnoAYSEXQeyPF4BT0GKvRqyG3jAet4PbLvqOKjRPemYBzWuIta1cRv7oJy6seKNC4kdIR0V+5w6UkWkSFqNHbb6Auc6ZLqLdfJPUx5uy3yqclESmoEopvc6A0H8pJkJvxJWIO+Ijo4XAnOpnlRF/QG7mq21DgdhKQr6AN+hOATum/S48Tqm8WdHTPMGtkAn2AIv3ssWZ44tbnXpQ57/gfYgWZhwMZBh7srQOqBZjsFGjqqCn6tKMBAFuanqj2kSvF6SmSNJIqXe15Y6BLqsqmrKS0Wd5iz9DDL10vfDJPNxX7ORPGpz7a01C56urpBFS33y0HQzUhQ0HPDt7HVNkekrip9RnhSZYv/LKmMav3VjimbHapckIoaGnBqCqHcecjXokDzGcYMJYESqwtw/kI0Qb1e45VQ93CErBxK358EmRKESIwQ7q3usGQSanz8RqObACWR80L72SdaYO9a4Bs3YjWYNzEPJRO1BcWLudO3lpJS6lQseQlE4VpJms3vcPM0m1tlJLeQkvE4vqs61S9uR0ijSy4we4vo76DPOcaf6tXvkQm+wtwbz4d4auHX8bMSvePH6mrD4pDVhR2VbEtR9XRHmRytCnVafsSIMExkPD0WnVoQAo36g96sI544xrgQQqc+umiMBXwq9rvl85VsKhkxTEMqM/inBdERgyoWepgIrweiGgp6352UdiUhJQj2LmhrDNWSeQ33tMl6VuWFfxSvk/xLz8hIzOL5jPPJVN3Z8f0GJUc3Dl39tvMOvK/jiHw==7Vhdb5swFP01eY3ABEIfm7Tr9jCpaidte3ThFqwYHBmnSffrdw2GYEy/NrpOW1Opss+1r+17Dtcfs2BdHC4k3eafRQp8Rrz0MAvOZoTEJMT/GrhvgCA8aYBMsrSB/CNwzX6AAT2D7lgKldVQCcEV29pgIsoSEmVhVEqxt5vdCm6PuqUZOMB1QrmLfmWpyg3qe97R8BFYlpuh49AYbmiyyaTYlWa8GQlu619jLmjry7SvcpqKfQ8KzmfBWgqhmlJxWAPXoW3D1vT78IC1m7eEUj2nA2k63FG+M0u/gjIFidg1yDtdqKep7tvQ1IsD3d2bBat9zhRcb2mirXvUAmK5KjjWfCx2y9NtOb0BvuoCtBZcSDSVogTdVEmxgRbEuHmx/ussLQ8YotUt47zX0kQYcVEqIyZCTL3vsf4hTjnLSsQSjBIu0XQ0axyJoYEwHAoOPcjE9AJEAUreYxNjjU4Mv63+40VT3x/V1DbJezryo9iI2Ag461wfScSC4fEBEYQOqaeXn94ZnZTRLlU9yag3AaNLh1G6ZXOxQ3q280QUDqe4KjUgzmLDUNQPu4GcSOoYMUyNp8ZQsDTVw4wqxdbSC8TSIxr1+zDRfV6DCXhdDnmNI4dX3x8hNpjiSz1xeH3ndHpOF2Hocuq9Eqftzt7j1GHSzn9OWk1plXfxdrizk/FWuywOmT6GzQuRbHZaPKWirARZzW/0WQjkV1bW7lfS8OE9knOdvB3VP7QU6PVLrUKE19odJDtZsTu4guro2BbMszXyaIKfQBY+GXzqAXFkESzGZOGFE+jCd3RxqU+hxPPfUB+0THIhB9/q0uWhk0A7HIdbNUpLp//nb602Lb7LymgCJtEEpLjn3yc21jegxvpm344mP7B5itwDEAlfi6fF00kV7y2n+uqnA85pVbHksc2yn1tsToMXZCU4MPVN+5979cFW179rqua4tTfVS5AM16v5P3s0kVWougRsdiC17qkuN73gj8W+xSRwqjBNWwOOEWJGuBQMZ9dRH4aDzHkyONQ2cze9+tfNgSPnFD10pKjMQDmOan10y36eZNxb0F8nmYUlmWVE/mHNLKLFNJpxHE2omdjRzKo5QOkHKHnPyqx+idKDJwlU1UwHPeI6xd5gIdOF4QbSmHHoroV+kZLa9Gud1zXx+rGpm1uFStaTSYTYMKgcof8XVwcywRlxEQ8SFHF3OT8e+Woi8vu7XOBeHV4uv/1+/8fl5/hJhRahVwrVs/bdvAv2lQTb1V9BsFg9vkw36fX4+h+c/wQ=7Vldb9owFP01aG9VYhMIjy3b2j5MqtZJ2x7d5JJYdWLmOAX262c7TogxpfSDwqRSqYqv7evknOPjGxjgabG8FGSef+MpsAEK0uUAfx4gFKNI/deBVRPA0aQJZIKmTShcB27pX7DBwEZrmkLlDJScM0nnbjDhZQmJdGJECL5wh804c1edkwy8wG1CmB/9SVOZ22gYBOuOK6BZbpeOI9txR5L7TPC6tOsNEJ6ZT9NdkDaXHV/lJOWLXgh/GeCp4Fw2V8VyCkxD28LWzPv6SG933wJKuc8E1Ex4IKy2j/4dyhSEit2CeNAX5jblqoXGPBzo6cEAXyxyKuF2ThLdu1BaULFcFky1QnXZPZ4ey8gdsIsOoClnXKiukpegh0rB76ENKtyCWP91PS0PCqKLGWWsN9IirOK8lFZMCNl2P6P5qDhhNCtVLFEoqUe0E+0zbsHQhhQcEpa9kMX0EngBUqzUENsbjSy/Vv9hFDftxVpNEzsk7+kItQIjVsBZl3pNorqwPG7nFHuceiS6kHpMpaTKO4o9sFx+5zplscy0D5wVPLmv52dqW0pCSxDV2Z3ejCB+0tKkvxCWn2AHjZ4URuajegqV9QcsG7SmOh0ktajoA3yHap3Y1ehu3fU0E0Y7NPMGqujso1WFeqZNVaDxoWQx9GRxo10QBeER5UHKJOdig4axT0OngHY5BjO5lRX8XFY2tyryOAnDbZyMXk9JdEo7taPC2aJHoyXELi8tTf29Eh2Il9HTvKhT8lwXGhpuRqqKJht4e8dZayQuo/gZFqTAFKtflhnT+K0bZyja5U+SiAxacJoQpE7543PQA3kbxm1MACNSma9bf20B3q5ww6m6uY5iPHYpRkHspqh4LRKws/pVzEaiCD+RqMHAS2R00D32XtIYe9K4Ao3YtUYNzE3JXJ0zWW6utL9yUkvdmgueQFV5UpLmQHtcPO1B1Tstbcjb8Hp7UVXGntuOgqapXmZrneaeks8o1fbVa7+qQm9wfg6983Poe/Vwi15x/Lg09/WE+EQ9YUllZwnqunGE8U5HaLbVKTqCt5EnL3QEPEZOInw4R5h4wrgUQKSuTzVGAj5Vel3ztsrvKRgwjSHUJf1Tg+lIwdiFnqYSK8LojIKet+J1k4lISRI9ixqP4Tpk7kO93DK+qOcGfZWvkh8W82KLwRNXgBj5L27h6EAW05aZPSmd31x/vIq/itF4eMRX8TD0GD2NU+PVlWSr1RM5OEbRG5WScfhupWT7pvlRSx7B6EfxEWvJcI+v6P7HYvLETMHbyy+tJkfRu1WTof813Uc5+f+6zPj9yknVXP9u1Chv/dsc/vIP7Vtbb6M6EP410T6dCGwg5LFJ93IejlRtjrS7jy5MAyrgyDhNcn79sYO52SSlKemm3aRShcdmHM/3zXg8kBGep9uvjKyif2gIyQhZ4XaEb0cI+cgV/6VgVwiwOy0ESxaHhciuBYv4P1BCS0nXcQh5ayCnNOHxqi0MaJZBwFsywhjdtIc90KQ964oswRAsApKY0h9xyCMltS2r7vgG8TJSU/uu6rgnweOS0XWm5hsh/LD/FN0pKXWp8XlEQrppiPDnEZ4zSnlxlW7nkEjTlmYr7vtyoLf63gwy3ucG7BR3PJFkrdb+t2hmAKE0pdTFKBcm3rcZ5HTNAhihuWhFINpqVEDpYwwSpohwuS6yk11xKvvXPArVcvmuNDGHrfiGs4iniRDY4jLnjD7CnCaUCUlGMzFy9hAniSYiSbzMRDMQawQhnz0B47EA70Z1pHEYymlmmyjmsFiRQM65EUwVsj04IJdvyTlL+8tGQu4hmVUI6t+EZlwx1XZUuxwiYLb2n3KcWicy8VAQye8M24ZI4fMVaAqc7cQQ1ev5iivKl5yJcq5Ng5kIF7KoQUq3dAjlDMtKdU0IcaE4cYAfBj0MIAvYSjexdaOGJI8qcxvQNeGPyEqqTLdLGVPGKQ0e16uxcHFO4gxYPr6Xjg3sR5zt1c+YgsPSeFI7nU4q0ePtP6InFVr/3ZPwVvJZqINgzfL4Cb5DXitu86U/RdwjFBmAFVUoUqywxZp0VqCJZbLCcZzX08KMGncyoiLL/o30IFkQSVO3YJiYMFQMKKdL4IF3ooJfioqngYJMT7U7MEHe6yFxL8lTKyhaLvrbYLFxG5cSpqavuGfCpcS7AczNndxjF8DECgyQ2vGmawdrI9F3+zICoeXLv6qnpAU6EkwbCCJ0JL4Z5GnuiR05youjn29rjub6BqLTruDnogEQ7eFqHxLFAYBzjW3LdEW7yxXtqf965NAfCtzQ7tcLRb/T/6wB/G9iZh+MbndXLE/Ccvo8ll2htDrCvgpK/3mPhCy8kUd6aYSE5HkcHDs2Nm3XRgO/wOrCnGz3Uwj/ssaW45SSX5IeY7sW3AGLxaIlMLdHE3tO2BJKyxUiCFs1CBOgBgBdEbGUMUgIF6eW1nxdoKgZ7mic8Rp/PGnjbyQ9xZFf3dUsJWiKnOcUFTYwFO05Ui27H22mF04bq80YjNxDjIFtzH82rtUNrqfavRmmKjMXyDBHizBYjxx9GaZT1VA0HMOqOPr+GXaQMRdCD72+hdDkNHroh4IzBqA+meQ7oUcVgMaWbbeCkP/SEHQhhPJtWwsT9mmE0plpKBqQUEfr8JyOijK6QbJrFb1nmuvoR5apijINTnaVS4fIcjtqcwuhRS4JWE4zBXR+RXoIpL2yUnAE6ap6PjjUngH1N2DwSWK7E2FnZD4qE20G+YpmNQE2m81YDCYrWVRNr1Q4lQrYd9sB3MFvSAWzTPGLrj8xUB4uI/uhx6hXwE8DfKJFeYzNuvD5AP9TihkXkufpx0HHm56W5zlTT1Ok1ZoHzPOulYtLpZNe1HY9fBqddF4aioajU/lcs0Gn74I+8rGitU8w92/wFI/mSRZed5uzphdVoestdhtsVqj0TLMA/oruMOi6E/MNm/Oh+3EKTJce973JVNv9T60/Wrqis9UfcY/38t4JPT5i/VHb/ycnJhI6Mw1FAxLKLFHNyzpFIi7krrKktD6yNraZ+q3g61ZzaslKA/pNEwmzTjFCXiKRy1ckE9dLeV3lleV7a8UQob056kNxAPXlwCDvYWAtmUTma97OMBQQzfoXBkWwqH/FgT//Dw==7Zdtb9owEMc/Deq7KQ/A0peF0U7TJk1lUruXbnwkXk3MHAfCPv3OziUkJKugQ5omFSRk/+9sx/e7c8wonK/LO8026RfFQY4Cj5ej8MMoCKJggr9W2FdCOLmuhEQLXkn+QViKX0CiR2ohOOQdR6OUNGLTFWOVZRCbjsa0Vruu20rJ7qoblkBPWMZM9tUHwU1Kqu95B8NHEElKS0cTMjyx+DnRqshovVEQrtynMq9ZPRf55ynjateSwsUonGulTNVal3OQNrR12Kpxt3+wNs+tITOnDIjoMcy+3jpwjAR1lTapSlTG5OKgztz2wE7gYS81a4lNH5tQCvPYan+3Lu8wF7CbGb1/pCGu0zLmhmlzY7GhlqkMau1WSNmM4bVHLFmei7gSycUu+QOM2VMuscIolA4b+KzUhvxyo9UzzJVU2m059NynsdTEQ1RWKjM0pYXj+kMj+3EnFLkqdEyhpaLAnSVAXtNKskFvDSNWd6DWgKFCBw2SGbHtpiejLE8avwNpbBDsYfD0LFsmC5p0ZssGdC8hurh3qTCw3DC3px0WfzcFmny2vpI9gZw1FVHHrSF8jCGy3x4GF3ak3PKkkjodD5MiyWzqIB7cIg2kPQ4UDUlb0AbKF8GQNbimgqYDz68PhF3n+Ki0tHVyNCfB38Cc9mDeY2mAfqP5OprT6b+k6fsDOH8WkBv3GsSfK5yiwFrNr/5Xvv74HL4XQDo+Rvp+AGkwgHR6CaJBj+inh29v7F7JDpfrsYsG0I0vgS7softqL484q9TAuH1MqZjFFuBk3j3worQ3X4jdFRZnsmWbAfDcvcfpQoDjzcuVjMExR8g7HAluGxhJPQY21AJvtzdkWAvO3VVuKMe6WXhGmp2aIpd43U6jbjX7A9U8mQwc0OenBHYP93Fna/3nCRe/AQ==7Zffb9sgEMf/mqhvlWPsNnlss7R92KRpfVj3yOyrzUpMhEmT7K/fAecfxF7VH6mmSXWkCL4cYO5zB3jCFqvdtebr8ovKQU7iKN9N2KdJHM/iFP+tsPcCS+deKLTIvTTthFvxG0iMSN2IHOrA0CgljViHYqaqCjITaFxrtQ3N7pUMZ13zAgbCbcblUP0uclOSOo2iruEGRFHS1LOUGn7y7KHQalPRfJOY3bvHN694MxbZ1yXP1bYnseWELbRSxpdWuwVI69rGbb7f1V9a2/fWUJnndIjpNcy+WTrk6AmqKm1KVaiKy2WnXrrlgR0gwlppVhKLUyzCTpi7XvmHNTnFWMBqZfT+jrq4Sq+xNlybC4sNtUpV0GhXQsq2T95YZJLXtci8SCZ2yl9gzJ5iiW+MQqlbwGel1mRXG60eYKGk0m7JLHJP29IQZ6jcq8rQkBaOq4/1HPqdUNRqozNyLaNI5roAskq8ZJ3e60asrkGtAF2FBhokN+IxDE9OUV60dh1pLBDscfD0Lo9cbmjQS5s2oAcBEeLelsLA7Zq7NW0x+cMQaOPZ2kr+E+RlmxGN31rChxhm9jfA4NyOlHuWlFLPx8OlKCobOogHl0gdaY0jSUPSI2gDuyfBUGt8RglNG960qW+D7cNrZW/naHeCt8BMBjC/YWqA/qD5Oppn7F/STAc0r23m4+kB/sgzdmU4h/07wdFO/lfK0+QllI8ANkkOwM5GwMYjYM+OwHU24LrcrfH2ghu7qgYIcUXmgFPgfCLS9zJJA8dZ/wi83FxQw0rkuTvJxwIjDJ0XxEY/e5/ieuxkTdI0ZBoNmc5HkCZHQDr/uD697/XpeBcj6vpVCbd5djv9aRJ1zzQIJRYnp+fz3pOG4/vLHQ3Zv2UfzMLO3zKLvy8OZnGx2XriWeHaHFm9LegGbwkntXOkuzHkzdfRx5HyuiOl3Wve4UjBavdp6Pl3n99s+Qc=7VnbbqMwEP0a1LcKMKTJY5vetNqVVtuV2n10wQW3Do6M0yT79TuG4eJA0zabRooEkVJ8PLYZnzPjoXHIdLa6UXSe/pAxE47vxiuHXDq+P/ZD+DbAugRIOCmBRPG4hLwGuON/GYIuogses9wy1FIKzec2GMksY5G2MKqUXNpmT1LYq85pwjrAXURFF73nsU4R9Vy36bhlPElx6XGIHY80ekmUXGS4nuOTp+Iqu2e0mgvt85TGctmCyJVDpkpKXd7NVlMmzNZW21aOu36jt35uxTL9kQE+PoZeV66zGHYCm1LpVCYyo+KqQS8K95iZwIVWqmcCbj24ZSuuH1r3f4zJKWgBmplW6wccUjRanbmmSp8b2gDLZMYq7JoLUY+JK4tI0DznUQmiiVnymWm9Ri3RhZYANQ58l3KOdrlW8oVNpZCqcJm4xVX3VIwTQJ5kpnFKQ07R7hvZ3XekwmxnC0AWbpicMdgEMFBMUM1fbeFR1G9S29VDf0oOS/guhho5QyVhpNUhVE2Ry4WKGI5qK2FjohF5ZyIgJGG6MxHctPxpoEJo/aIj5cSvVCzQ7QsTskx1xGhLbZlyze7mNDK9S0g8tvzqWDK2gj4ycVFHY8VZra5NCYzNpyOBgnJQWMsSw/nj0qCCJ5mRLUgDXMSB6GNPwCL0ypRmq63SwV5/ZDPnVe2llbpKLG1lLX/svi03i98tZAYdMn9BWDI1sLkbm5txeFg2ww6bNyY3wcnFyuNWsyJpUPN1ArOdHCvLXvAZlvdAbBBsEDvpIdbvITbYA6+jnigFJ/W6Qx94ozc4sjYe2WjvMEKdTTN7w6GoOseOGY/jooLoE4Utm0/ooh252zjdd6AGYWjz6XX5nHwRnWdD2XbcZRtk+dPAbS7Prr1Gk9OzSesKd6vpoDj8j1X2V/CNO9nnPqX6JDfPAq7An2/3vx1yPZwlO54lfnjAs2QyJJ/jTj6b74wk3NM7Y2ei/aWQ6nBt5ZBbeMkocsjM7MnzUg/pY8f0QcgB04fnDfnjuPPH9uIlcIMDFC/vrbLHzOO/nXmweqnfi4f8s1v+GYdfln+g2fw7vaS/+cmCXP0D7Vtbb6s4EP410T5tBOYSeGzSc1tppep0pdN9dMENVgFnjdMk++vXBkPAJi0JJE27pFKKx2YI/j6PZ8b2xFok228UrqI/SYjiCTDC7cS6nQBgAsvj/4RkV0icUrCkOJSN9oJ7/C+SQkNK1zhEWaMhIyRmeNUUBiRNUcAaMkgp2TSbPZG4+dQVXCJNcB/AWJf+wiGLpNQ0jH3Fd4SXkXy058iKRxg8LylZp/J5E2A95Z+iOoGlLtk+i2BINjWR9WViLSghrLhKtgsUi74tu6247+uB2up3U5SyLjeA4oYXGK/lq//gxRShUPSkUEUJ4z2clynKyJoGaAIWvBQhXpatAkKeMRIoRZCJ14I7UYUTUb9mUSjflu3KHmZoy3/gPGJJzAUmv8wYJc9oQWJCuSQlKW85f8JxrIhgjJcpLwb8FRGXz18QZZhjdyMrEhyG4jHzTYQZul/BQDxzw5nKZTk2SLy9IZ5Zdr8oxPARxfMKQPWXkJRJopq2LJdNOMpG/inbyfcEOhwSIfGb0bYmkvB8QyRBjO54E1nrepIqciiZrixvasQEViGLapx0yvEgx8KyUr3nA7+QlGinh6XRQwOygK0cJabaqSHMoqq7Nejq8EdwJVQm26WwKdOEBM/r1ZSPcAZximg2fRTjGtFfOM3Vz6mEw1B4sh9zKql4jZt/eE3Ctf6Vk/BW8JmrQ8GaZvgF/UTZXnGTL90p4rxCkQFYUVmiihWuxgowM3RW2Lbdnxa2Ros7YVCBYb4jPWAaRKKrGzDMdBgqBpSPi9ETa0XFOhYVVwEF6CPVbMEEuP0hca5ppFZQNIbou8FiWk1cWiwocM6EC/A1YL6SOCab9YpLb/64ecgn1n/WKGMaYk3j0zadNWHpOpdpVtHwxF9VU3IEvGJZu86HGpOGANRpAgpmLSMNtCBq2t4A1s/UIP2RYoZhXHqW3ONELIhGPE/E0/Y7wmkN4OO4Gpo3d8IJvkeUv8FHxRCAYzCsO60tMcTR7olnKjOh42mI+m3eiQP6Azp7eyr8lCAOgJujuZUtwUbbVGn6AxhW738K3NCjrxOKXuvwM/qjqDs8d5RsdyOUJ0GpRP+WpxvSKhZs+K5gAChLK/7aiERpeCMybqIXYphlOHgtrVPvvCYc1hHdzvuT7h648Hdjath2Kflb8GNq7gV3iGL+0gKZ21cDbwbpEpW5vEKEwkaKUEeohkCbRSxlFMWQ4ZdmYrENFPmEO4JTtieANVNcXTUoKVJy8q56pk9RZL+lqOgDTVHOkeq1u9FGd5CvizZGkzEWcA4xBm0xe6hdyxscV5Y7M0xmTq+QYbavmBjVcnRlmEpVTdGADAOfhmEHGXMl9FDzz5V/fSw91JjgnAaoQ976g9CjMkBTwzQbRsg71gRdCaG8cnqozIR5GqFUZmqKBiRUh9Dk/R0hhVRuPz/IvyrWqJOL7fon+kG+qyjyzsYaPRS6LtYcb4YEz5pmaOY7fXyh62KZGjk7rjWML6QpGo5lQA/SfnJWidSlkYhcdL6MX6SlYRpO2lfuFVqOy/MdA3TLcxpAm55U8WaAPkB8DvRA6zvH9jcB7o4ztQJ+RHcYdKuk9UXQHYOciwU5M19xCk4NcgxV0dmCnC6bcz4IPT5jkKPM/7MTHQmVmZqiAQmlb+tZlPv6Yn4hZpUlIWG1/a82zey3Bo5TzWlTjes3gQbeJaeatu1DbiyQy1Yw5ddLcV35leXaeNGEa6+3+lQcAF05MMhqj3Mgg1rjgH0uCujL5gdigw+ycNd3F0t/ZxHoezIdR0fPHGKbmZ6gGtHrZ38viJ6lx3Ejer3GXpUevAR6uiM+otdr7FU52Uugp897nY7AfCIf511TKjbouqNlACfH0qfJ8bzTdfFDXdWzjZnOj7Odd9JXbMYQ+N1CYMe3L2cabH0ZZcylD2r4fTUldsEEhw00dMschpHA59ywV6dwDEb4V3EKgKT86xFFMH4SJfElzyGO3l3XrIZ6LM7XffPW4x3u8cDz4v7wdJED3Z9Qt778Bw==7VlbT9swFP41fQTFcdPLI+uAITEJDU1jj25iEg83zhz3tl8/O7Fzs9cVGoq6USRkHx/fzne+k5OTAZwtNtccZclnFmE68L1oM4AfB74/nXryvxJsS8EQakHMSVSKQC24J7+wFhq1JYlw3lIUjFFBsrYwZGmKQ9GSIc7Zuq32yGh71wzF2BLch4ja0m8kEomWAs+rBz5hEid660mgB+YofIo5W6Z6v4EPH4tfObxAZi2tnycoYuuGCF4O4IwzJsrWYjPDVJnWmK2cd/WH0ercHKdirwl6Ri625u44kqbQXcZFwmKWInpZSz8U98NqBU/2ErGgsglkE2+IeGi0vyuV80D1UsG3D3pG0anHcoG4uFCoSVHKUmxkV4TSakpkNEKK8pyEpVCrqA1/YCG22pXQUjApqo9/y1im9XLB2ROeMcp4cWHoFb9qxAAOpeSRpUIvCaa675ppm93YlS15qA3ra0dGPMZaKyhFyuSNaRqqa8wWWFpKKnBMkSCrtnci7eRxpVcDLRsaazfu+iwrRJd6UY5/LnEuLHdog71OiMD3GSrutJbcbztA5c5Kl6I5ph8qQhi7VQh3YZioPwsGX5ldotzQ1IxqweMPd8CDKIlT5ToSHsx34bXCXODNTizMqAlpOsTJGFD2142AYWieNGLFyDscPvgarPXOx0GDuKBFWz1mmAtOhrc7HeOlvPXfireBxdt3wu5JWOh1CGv6DcL6EwdhfdgDY0cWcDcpEQQpnTuVjfjeLUORhaa8nOhA1sJBg9M0uBZZNlSmIjLHudADCxJFRWRw+Ujbi57hJvtCXOjpezrSlmfDOzIm3gEvCBzwjntAd2yh+0UGOcyl3X3vHvOVavwvyPbB1WGbq2Ds4Krn4moPYE4sMO8422xPNdDuTFxfJdCCoM1EYIM3DWzs+gizU8fzcUQVzyKyks1YNR+xCJOvOea5lKCFQiqd51lx+1JZbtPQdyxxEQrCUrnTjGMkpFn3nWhEc96V9Dj1NB31+BmB33FUV5TxHZ4K+ggzYPgaSbz96n0aafrhr9cmyjTzdADfKlE3p2lEIrQhLD9Vch79KTL02ylAlRI08znoSAGCPrgJLfQu7m5OFbujB9bJuIMdPGJtBNjvyCFjTwSfKnxHp95o0n6VgqORBd/YlXwHPaA3eY2noi5CuytbJ1rYAgcXtsDI8cTsvSRdTJW2QtuGQsZIKvLGyndK0KiudiLIcNz5jtHRH5sTuPVlozxB7YPVVfZzS7t+8x5UDqqXw6H9THBW3/oIKnZ9Rr62heIsz/kZysh5gqUJlyjLzkO2kKsty5fDf6hi87Jo8YxnBvh7ulbVzQ+s2Mhu/YW0JHP9FRpe/gY=7VnbjtowEP0aXqtcSAiPC122lVpp1VXV9tEkJnHXxKnjcOnXd5zY5OJsF7pZKlpAQs6Z8SVzZsZjM3Ln690dR1nykUWYjhwr2o3ctyPHCRwPfiWwrwDXm1ZAzElUQXYNPJCfWIGWQgsS4bylKBijgmRtMGRpikPRwhDnbNtWWzHanjVDMTaAhxBRE/1CIpEo1LasWvAOkzhRUweeEixR+BhzVqRqvpHjrspPJV4jPZbSzxMUsW0Dcm9H7pwzJqrWejfHVJpWm63qt3hCelg3x6k4qoNf9dggWmC95HJhYq+NUb4Olh2skTvbJkTghwyFUroF9gFLxJrCkw3NwwtJXYqWmM4OJpkzyjiIUpZiqSo4e8QaBEtZgfweJNryYJTZilDa0FQ2BZylQrmPM1bPzRHLD+CIkjgFLAS7YBDOTEMp220wF3jXgJTh7jBbY8H3oKKknvZW7eSust224TKa6KThLbavQKTcND6MXVMFDcXWE8xNDOY+YeCJw+t1GYQXEh2aWrZXhDSNrCDDbtI8BALlRgnWJIrkNL1+0facE1zjWFqHYNHrsGiZLI57SHQG4PCQBWqqcASJSD0yLhIWsxTR2xrtGLXBKd4R8bXR/iZV3ngl24iLG5kXm9EH2ILItZUDge9ojZCiPCdhBSoVOeh3LMRe0YIKwQCql/iBsazXuZp8tQPbHYLpnBU81Gk7UHsF4jHWaopOadjf+gPHFAmyae8AL4rQwIjQe852+0tNsPb03AnW6YTmpCfBWj2xGXgvZ8+7box/ytu0m1EtgzYneK190SxoFoxSti0yQD/hHwXORf7/7JClnnrPnurwZG7dznZ52MOa5Po95I4HiMlpT0z6VBIXkQ00Y9lcYREmn3PMgWUfraWV02Wela5dKcM0Df2eIW5CQVgKM805RgJsemxHDS15Fxmw6zULHeWptu2101Cfp+o030pDQ5R29vRa2g1a2ulrgGZpF/y10k57Y52J0I4wc1+5kOA8e2nndM/OUzM4bbdnG/GGiE3HYO/m/v2lcnf2xDrxO9zpcvu5e49Brj1cg7uQsUeCL5W+s4feuHOqGtsmfX0FnDNAAWebp6qZvK293lmdlj2toF2ET8zs+Wp3VubWdw3Ak9jz/W4A+mcLQH2L0TpCLVBG4Leozkz/UBzarxyHY+v5KmbqDBKH8Fj/K1TKGv+8ube/AA==7VlNc5swEP01vnYAQRwfEzdpD+1MZnxoe1RABjWC9Qhh4/76SrB8WSQlU8e+YM94pKeVhPbtW6/sBVmn5RdJd8l3iJhYeE5ULsjnhectA6I/DXCsARKsaiCWPKohtwM2/A9D0EG04BHLB4YKQCi+G4IhZBkL1QCjUsJhaLYFMdx1R2NmAZuQChv9wSOVIOo6TjfwlfE4wa1vAxx4puFLLKHIcL+FR7bVqx5OabMW2ucJjeDQg8jDgqwlgKpbablmwri2cVs97/GV0fa5JcvUlAm3+Bjq2BydRdoT2AWpEogho+KhQ++r4zGzgKN7iUqFbrq6yUqufvbav4zJp0D3ckWlujPEaCiDjDXYIxcCF2JZ1FiEguY5D2sQTcyiv5lSR4wWWijQUPeI3wB2aJcrCS9sDQJkdSjiVK92pOGUaGQLmcIlXR/7YzNrRxnvvOpqhHIoZIhWHgYvlTFDq2VLs1YPg5QpedQmkgmq+H64OsU4jlu7jkvdQDrHqcWt91QUuOhaMqqYkU2RK0h1467kkFshMCT4kHDFNjtaHemg5T4kvY1gYyvoMxP3rQYaP7aMn9Jya94WLZ6hQbPes0QRTaeLCh5nJpQ0O0y2/O2ZVKx8m0GbG5zgNSrHrOYS7B96OaJRdtJLDzfO/9NJLDpt6XYKQo/3ebqiJmyP9jwWjDiswSaLAnd4Aq437ghzh4R55ISIWqo4q58mTxZa+v9YqBa4tVBFanvsSTz7Fs8bJnXYWmzrOFZvUYwh0BcSQpY2jCq4/va7w4GUR1GV6se0P8wO75D/1Kiq7PCc7jlkexoFji1bfyQIvTOo9sZOwoIzDJKZzXOw6V+OzWbruVz6oHJpaZdLqwuVS0tLqU/aq9XFo9ouKkrTSYrsZS6YJmrV965YMK3s1NuUvbQuex26p1wzIExNzDMDhIqDaYSmVAb7S3dmepzpYHVFpl3X4mlOy+9Ky/0c7I7cWV1/ckCcPTE3zzNfZD/sIustL6lWMqv1jGr1R9QaXFGt9v11rqPOXUddVq/BXEhdr5D6SKp1t/unof6pqvs3hzz8BQ==7VdLj9owEP41ua5CvAF6LCzbPWylqqhq9+hNhsS7Jka2w6O/vuNkHBICFdoKLiVIyPPNw/Z8M6MkYNPl9ovmq/yrSkEGUZhuA/YQRNEoZvjvgF0NsPhTDWRapDU02ANz8RsIDAktRQqmY2iVklasumCiigIS28G41mrTNVso2d11xTPoAfOEyz76U6Q2J3QQhnvFE4gsp63HMSleefKeaVUWtF8QsUX11Ool97HI3uQ8VZsWxGYBm2qlbL1abqcgXWp92mq/xxPa5twaCnuOwz0dw+781SHFTJCotM1VpgouZ3t0Ul0PXIAQpdwuJS4HuIStsL8cfBeT9OI1hdW7lsqJLxTAWK7tZ0caAoUqwGOPQkqygSL1FonkxoikBsnEbfEG1u6oknhpFUL74z8rtSI7Y7V6h6mSSlcXZmH1NBrPN0NkoQpLIQdjko951kl0mTtJA0FGlTohq4gKm+sMyIo1JYCdBWoJmCc00SC5FetudE41njV2e55xQVQfp522XnNZgi/UocRDTF5xkblFIgUe/u7NeA3GbJToi0lwtXXghRdOQYM+6XdQbd1a2uTCwnzFqwxtcLJ066tpFmcr+SvISdNunpamgA5ZHrtfj+XIsYpF1LKkfj2ffS5FVrjKxHyBbm65Bm1h+/eC6FNNDvd+oOz86IlredMaR36I5K1JNAz/vTpGlxkK0eFU+G87n/U7P75S548vw+3oNvE/xvvwSryz3sT/rkoLphrUt6H8oaEcXXMoxz0CnzDIN/cie+PvPP5Y1OWPRUf4G16Iv2GPvx8GtHkWxjoSb314Po8xux6PKO6/xipd64uXzf4A7VhLj5swEP41XFeAE5IcN2m2e9hKVaOq3aMXJuBdByNj8uivrw1jHiGpou0mPRQiRfY3M37MNzM2OGSx2X+WNEu+iAi447vR3iGfHN+fuSP9b4BDBYyIWwGxZFEFeQ2wYr8AQatWsAjyjqISgiuWdcFQpCmEqoNRKcWuq7YWvDtrRmPoAauQ8j76g0UqQdRz3UbwCCxOcOrpGAUvNHyLpShSnM/xybp8KvGG2rFQP09oJHYtiCwdspBCqKq12S+AG9dat1V2D2ek9bolpOoSAx+XoQ526xBpT2BXSJWIWKSULxt0Xm4PzACu7iVqw3XT003YM/XTwHdj7D1bSarkoSUy3WccIFdUqntDmgZSkYLFHhjnqANpZDVCTvOchRWIKmaKV1DqgJFECyU01Cz/SYgM9XIlxRssBBey3DBxy6eWWL6JRtYiVTikN8X+KcvKicZzZ2lAKBeFDFGLYGBTGQNqBXUI6MwCsQHtJ60igVPFtt3RKcZ4XOs1POsGUn2adpx6S3kBNlADrhcxf9GN2DRCzvTi715zK9Fj1kJtq51gYuvISm84AgnyrN1RtHVjaZcwBauMlh7a6crSja86WYwupy/A53W6WVrqADpmeWp+PZZ9w6oOopYm5uvl7FPO4tREpvYXyHqXW5AK9n8OiD7VaDCyBeVgS8+46u9a5cgWkaRViQL376PDVuFrV4X/NvODfubPbpT5QS/zv4lCQV4m7JCc70pO/5bJOekR+KgH+WouNAN/l/FH/HGHv5Hlqs1fcCX+pj3+vucg8yeWK0PikIeX8zgm/5BHz+vx9CGHpD/cnS84QWf9E3RyoxPUu9I702S4Hp0nd3ojcme96nyfZUNNfv/diHgnavIH3Y10t/lSUspaX6PI8jc=7VjRbpswFP0a1Lcp4JCkj03arA/dNK2a1j264IJXhxsZ0yT7+l3DhUCdTG2ysReIFNnnXht8zj2ywWOL1faj5uv0E8RCecEo3nrs2guC6XSC/xbYVQALLysg0TKuIH8P3MtfgsARoYWMRd5JNADKyHUXjCDLRGQ6GNcaNt20J1Ddu655IhzgPuLKRb/L2KSE+qPRPnArZJLSrWchBR559JxoKDK6nxewp/Kqwitez0X5ecpj2LQgduOxhQYwVWu1XQhlqa1pq8Ytj0Sb59YiM28ZEFQDXrgqaOm3sBL0bGZX81GuSNgxI4/NN6k04n7NIxvdYAEglpqVwp6PzWZNNlfxR6HmDSsLUKAxlEEmbKrR8CxqEMkazeyvidTkIy/zJ6lUK5NoRRwyQxUUBNRvz1heiHMlkwyxCKkRGJzT0oU2YnuUPr8RBWtdIDdG7zCFBoQz0pHq3K/7m1bVTAhLWwVTY5wKNWmm3ouFDdLrsHbM0e5bLnR+J3Pzxdb3IOJpIjbi9CHi2BHxM5ilZXnQ8AwN2bhHDWeOTCLG7YS6oE0KCWRc3ezReVfIlmhiK81Dq/3DpnwISyW4Nld2d2vrhthS2kcrJxJZXGdEiue5jCqQUuykP4UxO9KJFwYQ2j/iHcC6rh6nJGoBuyXB3iF9RZRl5886I5lQ6IiyQjoBcJ0I09q33GrQQnEjX7qznyNt6NjzAodcDL58oy9Z+B83yMt+fIlU6N1DY0DsDJ4NJq5nWU+enRz0bGHPRoNxTzVur4ei+jVw2FH/kTunrjvHPblz6rpzcOWpruz1mOv7jnRfoTDuSwquz7ySqMM7idEmmCCHM8uWjLi6osBKxnHp9kM10a2ad5TF+8x2loJj/9WBKHQVHB8QMPgbArpfew6+ZA76HddvMu5NP+zuPwSWsdbHVnbzGw==7ZhLU9swEMc/TYZTO37EeRwhkPZQOp3mUHoU9sYWyFJGVkjST19JXr9QYAwNYcokDGD9tdZjf6uVlEE4y7dfJFll1yIBNgi8ZDsILwdBMA19/dcIu1IYhl4ppJImpeQ3woL+ARQrszVNoOgYKiGYoquuGAvOIVYdjUgpNl2zpWDdXlckBUdYxIS56i+aqAxV3/Oaiq9A0wy7nkRYcUvi+1SKNcf+BkG4tJ+yOidVW2hfZCQRm5YUXg3CmRRClU/5dgbMuLZyW/ne/InaetwSuOrzwhCHoXbV1CHRnsCikCoTqeCEXTXqhZ0emAY8XcpUzvSjrx9hS9WNkT9HWPqNNYUiUp0bMFrggkOlzSlj2BDwpLKIGSkKGpcimphm7kCpHUYLWSuhpWaI34RY1d1JcQ8zwYS0kwo9+6lrKqahVpaCK2zSuN+W971ZOsp450lXo1SItYzRKsDgJTIFtAprzHr1gMhByZ02kcCIog/d1gnGcVrbNSz1A+Lcj3b6Fmj9FljEzPW4bmqGutDU/R/Y/dExsE+OhB27fiBsjY0ulO4h/inWCqQTE13im4wqWKyIncdGp/ZuFNTZytgycgvsos53lfNqzI9ZTMyPw8IuOY26ZYkJs//SJIym3MSPRqKnWEF7AKlg+zw2Fwi+MBxjhsYdzJ9iedPaD0aoZa2toNL+hWHoMPwu1Nx4+YfZuE4MX8cw9I/IcHRKv++260Zu+g2OlH4jZ+nqM6oOYXVatT1XbTDtkXmDN1q144+G79nDjYPPvohzDA7AMoq6LIPR0GG5LwEHB0A5+Wgoj74Sx947rkTfd/hdE3lv0noG5dW/hOmJ2zvzHYAZlh6V7pWbLUNvatLcuKEo7JnJE0u7S+Rg/0k3DGxzXdYdgEi1TQolx/nG7TQm7BwrcpokdoffF1zd8HtBfPVd5ode1c65anzEc5XvXnBmEogyWCFfqV07IpY2Bs4wVs5OyF+9KT++DkU9kQ8Pgdy9D50v7WVWn9+0HyXl6SCYmQDYkpxyqJNEi3wTFJ/0byKgMD0ozCSE8m7mCOenYHltsIwmj4LFn/QLlvHLg0UXm29LbV3rG+nw6i8=
--------------------------------------------------------------------------------
/diagrams/03/diagrams.xml:
--------------------------------------------------------------------------------
1 | 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
--------------------------------------------------------------------------------
/server/build/bundle.js:
--------------------------------------------------------------------------------
1 | /******/ (function(modules) { // webpackBootstrap
2 | /******/ // The module cache
3 | /******/ var installedModules = {};
4 | /******/
5 | /******/ // The require function
6 | /******/ function __webpack_require__(moduleId) {
7 | /******/
8 | /******/ // Check if module is in cache
9 | /******/ if(installedModules[moduleId]) {
10 | /******/ return installedModules[moduleId].exports;
11 | /******/ }
12 | /******/ // Create a new module (and put it into the cache)
13 | /******/ var module = installedModules[moduleId] = {
14 | /******/ i: moduleId,
15 | /******/ l: false,
16 | /******/ exports: {}
17 | /******/ };
18 | /******/
19 | /******/ // Execute the module function
20 | /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
21 | /******/
22 | /******/ // Flag the module as loaded
23 | /******/ module.l = true;
24 | /******/
25 | /******/ // Return the exports of the module
26 | /******/ return module.exports;
27 | /******/ }
28 | /******/
29 | /******/
30 | /******/ // expose the modules object (__webpack_modules__)
31 | /******/ __webpack_require__.m = modules;
32 | /******/
33 | /******/ // expose the module cache
34 | /******/ __webpack_require__.c = installedModules;
35 | /******/
36 | /******/ // define getter function for harmony exports
37 | /******/ __webpack_require__.d = function(exports, name, getter) {
38 | /******/ if(!__webpack_require__.o(exports, name)) {
39 | /******/ Object.defineProperty(exports, name, {
40 | /******/ configurable: false,
41 | /******/ enumerable: true,
42 | /******/ get: getter
43 | /******/ });
44 | /******/ }
45 | /******/ };
46 | /******/
47 | /******/ // getDefaultExport function for compatibility with non-harmony modules
48 | /******/ __webpack_require__.n = function(module) {
49 | /******/ var getter = module && module.__esModule ?
50 | /******/ function getDefault() { return module['default']; } :
51 | /******/ function getModuleExports() { return module; };
52 | /******/ __webpack_require__.d(getter, 'a', getter);
53 | /******/ return getter;
54 | /******/ };
55 | /******/
56 | /******/ // Object.prototype.hasOwnProperty.call
57 | /******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
58 | /******/
59 | /******/ // __webpack_public_path__
60 | /******/ __webpack_require__.p = "";
61 | /******/
62 | /******/ // Load entry module and return exports
63 | /******/ return __webpack_require__(__webpack_require__.s = 7);
64 | /******/ })
65 | /************************************************************************/
66 | /******/ ([
67 | /* 0 */
68 | /***/ (function(module, exports) {
69 |
70 | module.exports = require("react");
71 |
72 | /***/ }),
73 | /* 1 */
74 | /***/ (function(module, exports, __webpack_require__) {
75 |
76 | "use strict";
77 |
78 |
79 | Object.defineProperty(exports, "__esModule", {
80 | value: true
81 | });
82 |
83 | function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; }
84 |
85 | var FETCH_USERS = exports.FETCH_USERS = 'fetch_users';
86 | var fetchUsers = exports.fetchUsers = function fetchUsers() {
87 | return function () {
88 | var _ref = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee(dispatch, getState, api) {
89 | var res;
90 | return regeneratorRuntime.wrap(function _callee$(_context) {
91 | while (1) {
92 | switch (_context.prev = _context.next) {
93 | case 0:
94 | _context.next = 2;
95 | return api.get('/users');
96 |
97 | case 2:
98 | res = _context.sent;
99 |
100 |
101 | dispatch({
102 | type: FETCH_USERS,
103 | payload: res
104 | });
105 |
106 | case 4:
107 | case 'end':
108 | return _context.stop();
109 | }
110 | }
111 | }, _callee, undefined);
112 | }));
113 |
114 | return function (_x, _x2, _x3) {
115 | return _ref.apply(this, arguments);
116 | };
117 | }();
118 | };
119 |
120 | var FETCH_CURRENT_USER = exports.FETCH_CURRENT_USER = 'fetch_current_user';
121 | var fetchCurrentUser = exports.fetchCurrentUser = function fetchCurrentUser() {
122 | return function () {
123 | var _ref2 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee2(dispatch, getState, api) {
124 | var res;
125 | return regeneratorRuntime.wrap(function _callee2$(_context2) {
126 | while (1) {
127 | switch (_context2.prev = _context2.next) {
128 | case 0:
129 | _context2.next = 2;
130 | return api.get('/current_user');
131 |
132 | case 2:
133 | res = _context2.sent;
134 |
135 |
136 | dispatch({
137 | type: FETCH_CURRENT_USER,
138 | payload: res
139 | });
140 |
141 | case 4:
142 | case 'end':
143 | return _context2.stop();
144 | }
145 | }
146 | }, _callee2, undefined);
147 | }));
148 |
149 | return function (_x4, _x5, _x6) {
150 | return _ref2.apply(this, arguments);
151 | };
152 | }();
153 | };
154 |
155 | var FETCH_ADMINS = exports.FETCH_ADMINS = 'fetch_admins';
156 | var fetchAdmins = exports.fetchAdmins = function fetchAdmins() {
157 | return function () {
158 | var _ref3 = _asyncToGenerator( /*#__PURE__*/regeneratorRuntime.mark(function _callee3(dispatch, getState, api) {
159 | var res;
160 | return regeneratorRuntime.wrap(function _callee3$(_context3) {
161 | while (1) {
162 | switch (_context3.prev = _context3.next) {
163 | case 0:
164 | _context3.next = 2;
165 | return api.get('/admins');
166 |
167 | case 2:
168 | res = _context3.sent;
169 |
170 |
171 | dispatch({
172 | type: FETCH_ADMINS,
173 | payload: res
174 | });
175 |
176 | case 4:
177 | case 'end':
178 | return _context3.stop();
179 | }
180 | }
181 | }, _callee3, undefined);
182 | }));
183 |
184 | return function (_x7, _x8, _x9) {
185 | return _ref3.apply(this, arguments);
186 | };
187 | }();
188 | };
189 |
190 | /***/ }),
191 | /* 2 */
192 | /***/ (function(module, exports) {
193 |
194 | module.exports = require("react-redux");
195 |
196 | /***/ }),
197 | /* 3 */
198 | /***/ (function(module, exports) {
199 |
200 | module.exports = require("react-router-config");
201 |
202 | /***/ }),
203 | /* 4 */
204 | /***/ (function(module, exports) {
205 |
206 | module.exports = require("react-router-dom");
207 |
208 | /***/ }),
209 | /* 5 */
210 | /***/ (function(module, exports, __webpack_require__) {
211 |
212 | "use strict";
213 |
214 |
215 | Object.defineProperty(exports, "__esModule", {
216 | value: true
217 | });
218 |
219 | var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
220 |
221 | var _react = __webpack_require__(0);
222 |
223 | var _react2 = _interopRequireDefault(_react);
224 |
225 | var _App = __webpack_require__(11);
226 |
227 | var _App2 = _interopRequireDefault(_App);
228 |
229 | var _HomePage = __webpack_require__(13);
230 |
231 | var _HomePage2 = _interopRequireDefault(_HomePage);
232 |
233 | var _UsersListPage = __webpack_require__(14);
234 |
235 | var _UsersListPage2 = _interopRequireDefault(_UsersListPage);
236 |
237 | var _NotFoundPage = __webpack_require__(15);
238 |
239 | var _NotFoundPage2 = _interopRequireDefault(_NotFoundPage);
240 |
241 | var _AdminsListPage = __webpack_require__(16);
242 |
243 | var _AdminsListPage2 = _interopRequireDefault(_AdminsListPage);
244 |
245 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
246 |
247 | exports.default = [_extends({}, _App2.default, {
248 | routes: [_extends({}, _HomePage2.default, {
249 | path: '/',
250 | exact: true
251 | }), _extends({}, _AdminsListPage2.default, {
252 | path: '/admins'
253 | }), _extends({}, _UsersListPage2.default, {
254 | path: '/users'
255 | }), _extends({}, _NotFoundPage2.default)]
256 | })];
257 |
258 | /***/ }),
259 | /* 6 */
260 | /***/ (function(module, exports) {
261 |
262 | module.exports = require("redux");
263 |
264 | /***/ }),
265 | /* 7 */
266 | /***/ (function(module, exports, __webpack_require__) {
267 |
268 | "use strict";
269 |
270 |
271 | __webpack_require__(8);
272 |
273 | var _express = __webpack_require__(9);
274 |
275 | var _express2 = _interopRequireDefault(_express);
276 |
277 | var _reactRouterConfig = __webpack_require__(3);
278 |
279 | var _expressHttpProxy = __webpack_require__(10);
280 |
281 | var _expressHttpProxy2 = _interopRequireDefault(_expressHttpProxy);
282 |
283 | var _Routes = __webpack_require__(5);
284 |
285 | var _Routes2 = _interopRequireDefault(_Routes);
286 |
287 | var _renderer = __webpack_require__(18);
288 |
289 | var _renderer2 = _interopRequireDefault(_renderer);
290 |
291 | var _createStore = __webpack_require__(21);
292 |
293 | var _createStore2 = _interopRequireDefault(_createStore);
294 |
295 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
296 |
297 | var app = (0, _express2.default)();
298 |
299 | app.use('/api', (0, _expressHttpProxy2.default)('http://react-ssr-api.herokuapp.com', {
300 | proxyReqOptDecorator: function proxyReqOptDecorator(opts) {
301 | opts.headers['x-forwarded-host'] = 'localhost:3000';
302 | return opts;
303 | }
304 | }));
305 | app.use(_express2.default.static('public'));
306 | app.get('*', function (req, res) {
307 | var store = (0, _createStore2.default)(req);
308 |
309 | var promises = (0, _reactRouterConfig.matchRoutes)(_Routes2.default, req.path).map(function (_ref) {
310 | var route = _ref.route;
311 |
312 | return route.loadData ? route.loadData(store) : null;
313 | }).map(function (promise) {
314 | if (promise) {
315 | return new Promise(function (resolve, reject) {
316 | promise.then(resolve).catch(resolve);
317 | });
318 | }
319 | });
320 |
321 | Promise.all(promises).then(function () {
322 | var context = {};
323 | var content = (0, _renderer2.default)(req, store, context);
324 |
325 | if (context.url) {
326 | return res.redirect(301, context.url);
327 | }
328 | if (context.notFound) {
329 | res.status(404);
330 | }
331 |
332 | res.send(content);
333 | });
334 | });
335 |
336 | app.listen(3000, function () {
337 | console.log('Listening on prot 3000');
338 | });
339 |
340 | /***/ }),
341 | /* 8 */
342 | /***/ (function(module, exports) {
343 |
344 | module.exports = require("babel-polyfill");
345 |
346 | /***/ }),
347 | /* 9 */
348 | /***/ (function(module, exports) {
349 |
350 | module.exports = require("express");
351 |
352 | /***/ }),
353 | /* 10 */
354 | /***/ (function(module, exports) {
355 |
356 | module.exports = require("express-http-proxy");
357 |
358 | /***/ }),
359 | /* 11 */
360 | /***/ (function(module, exports, __webpack_require__) {
361 |
362 | "use strict";
363 |
364 |
365 | Object.defineProperty(exports, "__esModule", {
366 | value: true
367 | });
368 |
369 | var _react = __webpack_require__(0);
370 |
371 | var _react2 = _interopRequireDefault(_react);
372 |
373 | var _reactRouterConfig = __webpack_require__(3);
374 |
375 | var _Header = __webpack_require__(12);
376 |
377 | var _Header2 = _interopRequireDefault(_Header);
378 |
379 | var _actions = __webpack_require__(1);
380 |
381 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
382 |
383 | var App = function App(_ref) {
384 | var route = _ref.route;
385 |
386 | return _react2.default.createElement(
387 | 'div',
388 | null,
389 | _react2.default.createElement(_Header2.default, null),
390 | (0, _reactRouterConfig.renderRoutes)(route.routes)
391 | );
392 | };
393 |
394 | exports.default = {
395 | component: App,
396 | loadData: function loadData(_ref2) {
397 | var dispatch = _ref2.dispatch;
398 | return dispatch((0, _actions.fetchCurrentUser)());
399 | }
400 | };
401 |
402 | /***/ }),
403 | /* 12 */
404 | /***/ (function(module, exports, __webpack_require__) {
405 |
406 | "use strict";
407 |
408 |
409 | Object.defineProperty(exports, "__esModule", {
410 | value: true
411 | });
412 |
413 | var _react = __webpack_require__(0);
414 |
415 | var _react2 = _interopRequireDefault(_react);
416 |
417 | var _reactRouterDom = __webpack_require__(4);
418 |
419 | var _reactRedux = __webpack_require__(2);
420 |
421 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
422 |
423 | var Header = function Header(_ref) {
424 | var auth = _ref.auth;
425 |
426 | var authButton = auth ? _react2.default.createElement(
427 | 'a',
428 | { href: '/api/logout' },
429 | 'Logout'
430 | ) : _react2.default.createElement(
431 | 'a',
432 | { href: '/api/auth/google' },
433 | 'Login'
434 | );
435 |
436 | return _react2.default.createElement(
437 | 'nav',
438 | null,
439 | _react2.default.createElement(
440 | 'div',
441 | { className: 'nav-wrapper' },
442 | _react2.default.createElement(
443 | _reactRouterDom.Link,
444 | { to: '/', className: 'brand-logo' },
445 | 'React SSR'
446 | ),
447 | _react2.default.createElement(
448 | 'ul',
449 | { className: 'right' },
450 | _react2.default.createElement(
451 | 'li',
452 | null,
453 | _react2.default.createElement(
454 | _reactRouterDom.Link,
455 | { to: '/users' },
456 | 'Users'
457 | )
458 | ),
459 | _react2.default.createElement(
460 | 'li',
461 | null,
462 | _react2.default.createElement(
463 | _reactRouterDom.Link,
464 | { to: '/admins' },
465 | 'Admins'
466 | )
467 | ),
468 | _react2.default.createElement(
469 | 'li',
470 | null,
471 | authButton
472 | )
473 | )
474 | )
475 | );
476 | };
477 |
478 | function mapStateToProps(_ref2) {
479 | var auth = _ref2.auth;
480 |
481 | return { auth: auth };
482 | }
483 |
484 | exports.default = (0, _reactRedux.connect)(mapStateToProps)(Header);
485 |
486 | /***/ }),
487 | /* 13 */
488 | /***/ (function(module, exports, __webpack_require__) {
489 |
490 | "use strict";
491 |
492 |
493 | Object.defineProperty(exports, "__esModule", {
494 | value: true
495 | });
496 |
497 | var _react = __webpack_require__(0);
498 |
499 | var _react2 = _interopRequireDefault(_react);
500 |
501 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
502 |
503 | var Home = function Home() {
504 | return _react2.default.createElement(
505 | 'div',
506 | { className: 'center-align', style: { marginTop: '200px' } },
507 | _react2.default.createElement(
508 | 'h3',
509 | null,
510 | 'Welcome'
511 | ),
512 | _react2.default.createElement(
513 | 'p',
514 | null,
515 | 'Check out these awesome features'
516 | )
517 | );
518 | };
519 |
520 | exports.default = {
521 | component: Home
522 | };
523 |
524 | /***/ }),
525 | /* 14 */
526 | /***/ (function(module, exports, __webpack_require__) {
527 |
528 | "use strict";
529 |
530 |
531 | Object.defineProperty(exports, "__esModule", {
532 | value: true
533 | });
534 |
535 | var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
536 |
537 | var _react = __webpack_require__(0);
538 |
539 | var _react2 = _interopRequireDefault(_react);
540 |
541 | var _reactRedux = __webpack_require__(2);
542 |
543 | var _actions = __webpack_require__(1);
544 |
545 | var _reactHelmet = __webpack_require__(28);
546 |
547 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
548 |
549 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
550 |
551 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
552 |
553 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
554 |
555 | var UsersList = function (_Component) {
556 | _inherits(UsersList, _Component);
557 |
558 | function UsersList() {
559 | _classCallCheck(this, UsersList);
560 |
561 | return _possibleConstructorReturn(this, (UsersList.__proto__ || Object.getPrototypeOf(UsersList)).apply(this, arguments));
562 | }
563 |
564 | _createClass(UsersList, [{
565 | key: 'componentDidMount',
566 | value: function componentDidMount() {
567 | this.props.fetchUsers();
568 | }
569 | }, {
570 | key: 'renderUsers',
571 | value: function renderUsers() {
572 | return this.props.users.map(function (user) {
573 | return _react2.default.createElement(
574 | 'li',
575 | { key: user.id },
576 | user.name
577 | );
578 | });
579 | }
580 | }, {
581 | key: 'head',
582 | value: function head() {
583 | return _react2.default.createElement(
584 | _reactHelmet.Helmet,
585 | null,
586 | _react2.default.createElement(
587 | 'title',
588 | null,
589 | this.props.users.length + ' Users Loaded'
590 | ),
591 | _react2.default.createElement('meta', { property: 'og:title', content: 'Users App' })
592 | );
593 | }
594 | }, {
595 | key: 'render',
596 | value: function render() {
597 | return _react2.default.createElement(
598 | 'div',
599 | null,
600 | this.head(),
601 | 'Here\'s a big list of users:',
602 | _react2.default.createElement(
603 | 'ul',
604 | null,
605 | this.renderUsers()
606 | )
607 | );
608 | }
609 | }]);
610 |
611 | return UsersList;
612 | }(_react.Component);
613 |
614 | function mapStateToProps(state) {
615 | return { users: state.users };
616 | }
617 |
618 | function loadData(store) {
619 | return store.dispatch((0, _actions.fetchUsers)());
620 | }
621 |
622 | exports.default = {
623 | loadData: loadData,
624 | component: (0, _reactRedux.connect)(mapStateToProps, { fetchUsers: _actions.fetchUsers })(UsersList)
625 | };
626 |
627 | /***/ }),
628 | /* 15 */
629 | /***/ (function(module, exports, __webpack_require__) {
630 |
631 | "use strict";
632 |
633 |
634 | Object.defineProperty(exports, "__esModule", {
635 | value: true
636 | });
637 |
638 | var _react = __webpack_require__(0);
639 |
640 | var _react2 = _interopRequireDefault(_react);
641 |
642 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
643 |
644 | var NotFoundPage = function NotFoundPage(_ref) {
645 | var _ref$staticContext = _ref.staticContext,
646 | staticContext = _ref$staticContext === undefined ? {} : _ref$staticContext;
647 |
648 | staticContext.notFound = true;
649 | return _react2.default.createElement(
650 | 'h1',
651 | null,
652 | 'Ooops, route not found.'
653 | );
654 | };
655 |
656 | exports.default = {
657 | component: NotFoundPage
658 | };
659 |
660 | /***/ }),
661 | /* 16 */
662 | /***/ (function(module, exports, __webpack_require__) {
663 |
664 | "use strict";
665 |
666 |
667 | Object.defineProperty(exports, "__esModule", {
668 | value: true
669 | });
670 |
671 | var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
672 |
673 | var _react = __webpack_require__(0);
674 |
675 | var _react2 = _interopRequireDefault(_react);
676 |
677 | var _reactRedux = __webpack_require__(2);
678 |
679 | var _actions = __webpack_require__(1);
680 |
681 | var _requireAuth = __webpack_require__(17);
682 |
683 | var _requireAuth2 = _interopRequireDefault(_requireAuth);
684 |
685 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
686 |
687 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
688 |
689 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
690 |
691 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
692 |
693 | var AdminsListPage = function (_Component) {
694 | _inherits(AdminsListPage, _Component);
695 |
696 | function AdminsListPage() {
697 | _classCallCheck(this, AdminsListPage);
698 |
699 | return _possibleConstructorReturn(this, (AdminsListPage.__proto__ || Object.getPrototypeOf(AdminsListPage)).apply(this, arguments));
700 | }
701 |
702 | _createClass(AdminsListPage, [{
703 | key: 'componentDidMount',
704 | value: function componentDidMount() {
705 | this.props.fetchAdmins();
706 | }
707 | }, {
708 | key: 'renderAdmins',
709 | value: function renderAdmins() {
710 | return this.props.admins.map(function (admin) {
711 | return _react2.default.createElement(
712 | 'li',
713 | { key: admin.id },
714 | admin.name
715 | );
716 | });
717 | }
718 | }, {
719 | key: 'render',
720 | value: function render() {
721 | return _react2.default.createElement(
722 | 'div',
723 | null,
724 | _react2.default.createElement(
725 | 'h3',
726 | null,
727 | 'Protected list of admins'
728 | ),
729 | _react2.default.createElement(
730 | 'ul',
731 | null,
732 | this.renderAdmins()
733 | )
734 | );
735 | }
736 | }]);
737 |
738 | return AdminsListPage;
739 | }(_react.Component);
740 |
741 | function mapStateToProps(_ref) {
742 | var admins = _ref.admins;
743 |
744 | return { admins: admins };
745 | }
746 |
747 | exports.default = {
748 | component: (0, _reactRedux.connect)(mapStateToProps, { fetchAdmins: _actions.fetchAdmins })((0, _requireAuth2.default)(AdminsListPage)),
749 | loadData: function loadData(_ref2) {
750 | var dispatch = _ref2.dispatch;
751 | return dispatch((0, _actions.fetchAdmins)());
752 | }
753 | };
754 |
755 | /***/ }),
756 | /* 17 */
757 | /***/ (function(module, exports, __webpack_require__) {
758 |
759 | "use strict";
760 |
761 |
762 | Object.defineProperty(exports, "__esModule", {
763 | value: true
764 | });
765 |
766 | var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
767 |
768 | var _react = __webpack_require__(0);
769 |
770 | var _react2 = _interopRequireDefault(_react);
771 |
772 | var _reactRedux = __webpack_require__(2);
773 |
774 | var _reactRouterDom = __webpack_require__(4);
775 |
776 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
777 |
778 | function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
779 |
780 | function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
781 |
782 | function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
783 |
784 | exports.default = function (ChildComponent) {
785 | var RequireAuth = function (_Component) {
786 | _inherits(RequireAuth, _Component);
787 |
788 | function RequireAuth() {
789 | _classCallCheck(this, RequireAuth);
790 |
791 | return _possibleConstructorReturn(this, (RequireAuth.__proto__ || Object.getPrototypeOf(RequireAuth)).apply(this, arguments));
792 | }
793 |
794 | _createClass(RequireAuth, [{
795 | key: 'render',
796 | value: function render() {
797 | switch (this.props.auth) {
798 | case false:
799 | return _react2.default.createElement(_reactRouterDom.Redirect, { to: '/' });
800 | case null:
801 | return _react2.default.createElement(
802 | 'div',
803 | null,
804 | 'Loading...'
805 | );
806 | default:
807 | return _react2.default.createElement(ChildComponent, this.props);
808 | }
809 | }
810 | }]);
811 |
812 | return RequireAuth;
813 | }(_react.Component);
814 |
815 | function mapStateToProps(_ref) {
816 | var auth = _ref.auth;
817 |
818 | return { auth: auth };
819 | }
820 |
821 | return (0, _reactRedux.connect)(mapStateToProps)(RequireAuth);
822 | };
823 |
824 | /***/ }),
825 | /* 18 */
826 | /***/ (function(module, exports, __webpack_require__) {
827 |
828 | "use strict";
829 |
830 |
831 | Object.defineProperty(exports, "__esModule", {
832 | value: true
833 | });
834 |
835 | var _react = __webpack_require__(0);
836 |
837 | var _react2 = _interopRequireDefault(_react);
838 |
839 | var _server = __webpack_require__(19);
840 |
841 | var _reactRouterDom = __webpack_require__(4);
842 |
843 | var _reactRedux = __webpack_require__(2);
844 |
845 | var _reactRouterConfig = __webpack_require__(3);
846 |
847 | var _serializeJavascript = __webpack_require__(20);
848 |
849 | var _serializeJavascript2 = _interopRequireDefault(_serializeJavascript);
850 |
851 | var _reactHelmet = __webpack_require__(28);
852 |
853 | var _Routes = __webpack_require__(5);
854 |
855 | var _Routes2 = _interopRequireDefault(_Routes);
856 |
857 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
858 |
859 | exports.default = function (req, store, context) {
860 | var content = (0, _server.renderToString)(_react2.default.createElement(
861 | _reactRedux.Provider,
862 | { store: store },
863 | _react2.default.createElement(
864 | _reactRouterDom.StaticRouter,
865 | { location: req.path, context: context },
866 | _react2.default.createElement(
867 | 'div',
868 | null,
869 | (0, _reactRouterConfig.renderRoutes)(_Routes2.default)
870 | )
871 | )
872 | ));
873 |
874 | var helmet = _reactHelmet.Helmet.renderStatic();
875 |
876 | return '\n \n \n ' + helmet.title.toString() + '\n ' + helmet.meta.toString() + '\n \n \n \n ' + content + '
\n \n \n \n \n ';
877 | };
878 |
879 | /***/ }),
880 | /* 19 */
881 | /***/ (function(module, exports) {
882 |
883 | module.exports = require("react-dom/server");
884 |
885 | /***/ }),
886 | /* 20 */
887 | /***/ (function(module, exports) {
888 |
889 | module.exports = require("serialize-javascript");
890 |
891 | /***/ }),
892 | /* 21 */
893 | /***/ (function(module, exports, __webpack_require__) {
894 |
895 | "use strict";
896 |
897 |
898 | Object.defineProperty(exports, "__esModule", {
899 | value: true
900 | });
901 |
902 | var _redux = __webpack_require__(6);
903 |
904 | var _reduxThunk = __webpack_require__(22);
905 |
906 | var _reduxThunk2 = _interopRequireDefault(_reduxThunk);
907 |
908 | var _axios = __webpack_require__(23);
909 |
910 | var _axios2 = _interopRequireDefault(_axios);
911 |
912 | var _reducers = __webpack_require__(24);
913 |
914 | var _reducers2 = _interopRequireDefault(_reducers);
915 |
916 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
917 |
918 | exports.default = function (req) {
919 | var axiosInstance = _axios2.default.create({
920 | baseURL: 'http://react-ssr-api.herokuapp.com',
921 | headers: { cookie: req.get('cookie') || '' }
922 | });
923 |
924 | var store = (0, _redux.createStore)(_reducers2.default, {}, (0, _redux.applyMiddleware)(_reduxThunk2.default.withExtraArgument(axiosInstance)));
925 |
926 | return store;
927 | };
928 |
929 | /***/ }),
930 | /* 22 */
931 | /***/ (function(module, exports) {
932 |
933 | module.exports = require("redux-thunk");
934 |
935 | /***/ }),
936 | /* 23 */
937 | /***/ (function(module, exports) {
938 |
939 | module.exports = require("axios");
940 |
941 | /***/ }),
942 | /* 24 */
943 | /***/ (function(module, exports, __webpack_require__) {
944 |
945 | "use strict";
946 |
947 |
948 | Object.defineProperty(exports, "__esModule", {
949 | value: true
950 | });
951 |
952 | var _redux = __webpack_require__(6);
953 |
954 | var _usersReducer = __webpack_require__(25);
955 |
956 | var _usersReducer2 = _interopRequireDefault(_usersReducer);
957 |
958 | var _authReducer = __webpack_require__(26);
959 |
960 | var _authReducer2 = _interopRequireDefault(_authReducer);
961 |
962 | var _adminsReducer = __webpack_require__(27);
963 |
964 | var _adminsReducer2 = _interopRequireDefault(_adminsReducer);
965 |
966 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
967 |
968 | exports.default = (0, _redux.combineReducers)({
969 | users: _usersReducer2.default,
970 | auth: _authReducer2.default,
971 | admins: _adminsReducer2.default
972 | });
973 |
974 | /***/ }),
975 | /* 25 */
976 | /***/ (function(module, exports, __webpack_require__) {
977 |
978 | "use strict";
979 |
980 |
981 | Object.defineProperty(exports, "__esModule", {
982 | value: true
983 | });
984 |
985 | var _actions = __webpack_require__(1);
986 |
987 | exports.default = function () {
988 | var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
989 | var action = arguments[1];
990 |
991 | switch (action.type) {
992 | case _actions.FETCH_USERS:
993 | return action.payload.data;
994 | default:
995 | return state;
996 | }
997 | };
998 |
999 | /***/ }),
1000 | /* 26 */
1001 | /***/ (function(module, exports, __webpack_require__) {
1002 |
1003 | "use strict";
1004 |
1005 |
1006 | Object.defineProperty(exports, "__esModule", {
1007 | value: true
1008 | });
1009 |
1010 | exports.default = function () {
1011 | var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
1012 | var action = arguments[1];
1013 |
1014 | switch (action.type) {
1015 | case _actions.FETCH_CURRENT_USER:
1016 | return action.payload.data || false;
1017 | default:
1018 | return state;
1019 | }
1020 | };
1021 |
1022 | var _actions = __webpack_require__(1);
1023 |
1024 | /***/ }),
1025 | /* 27 */
1026 | /***/ (function(module, exports, __webpack_require__) {
1027 |
1028 | "use strict";
1029 |
1030 |
1031 | Object.defineProperty(exports, "__esModule", {
1032 | value: true
1033 | });
1034 |
1035 | var _actions = __webpack_require__(1);
1036 |
1037 | exports.default = function () {
1038 | var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];
1039 | var action = arguments[1];
1040 |
1041 | switch (action.type) {
1042 | case _actions.FETCH_ADMINS:
1043 | return action.payload.data;
1044 | default:
1045 | return state;
1046 | }
1047 | };
1048 |
1049 | /***/ }),
1050 | /* 28 */
1051 | /***/ (function(module, exports) {
1052 |
1053 | module.exports = require("react-helmet");
1054 |
1055 | /***/ })
1056 | /******/ ]);
--------------------------------------------------------------------------------