feat: add project skeleton

This commit is contained in:
Julian Lobbes 2023-05-10 17:19:38 +02:00
parent 93b1eebc95
commit 9f607de94c
149 changed files with 8534 additions and 121 deletions

18
.gitignore vendored
View File

@ -1,3 +1,19 @@
# Backend config file
/config.py
# Local environments
/.venv/
/node_modules/
# Cache files and directories
*.pyc
__pycache__/
/.parcel-cache/
# Bundled files
/dist/
# Latex compiled files
**/*.aux
**/*.bbl
**/*.bcf
@ -6,4 +22,4 @@
**/*.log
**/*.out
**/*.run.xml
proposal/*.pdf
docs/proposal/*.pdf

7
.postcssrc Normal file
View File

@ -0,0 +1,7 @@
{
  "plugins": {
    "postcss-import": {},
    "tailwindcss/nesting": {},
    "tailwindcss": {},
  }
}

View File

@ -1,3 +1,7 @@
# MEDWings
Mobile Early Deterioration Warning System.
# MEWS
The following vital signs need to be recorded for a MEWS calculation:
@ -32,7 +36,3 @@ Access to vitals data is available through the [Withings API](https://developer.
A detailed [API integration guide](https://developer.withings.com/developer-guide/v3/integration-guide/public-health-data-api/public-health-data-api-overview/),
as well as an [API reference guide](https://developer.withings.com/api-reference) are available online.
# Smart Home Lab
???

0
backend/__init__.py Normal file
View File

8
backend/main.py Normal file
View File

@ -0,0 +1,8 @@
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get("/hello/")
async def hello() -> str:
return "Hello World!"

38
development.Caddyfile Normal file
View File

@ -0,0 +1,38 @@
:3000 {
encode zstd gzip
@staticfiles {
method GET
path /static/*
}
handle @staticfiles {
file_server {
root /app/public/
}
}
handle_path /api/* {
reverse_proxy * backend:3001
}
@robots {
method GET
path /robots.txt
path /sitemap.xml
}
handle @robots {
file_server {
root /app/robots/
}
}
handle * {
reverse_proxy * parcel:1234
}
log {
output stderr
format console
}
}

View File

@ -0,0 +1,25 @@
# syntax=docker/dockerfile:1
FROM python:3
# Create non-root user
ARG CUSTOM_UID
ARG CUSTOM_GID
ENV CUSTOM_USERNAME=backend
ENV CUSTOM_GROUPNAME=backend
RUN groupadd --gid ${CUSTOM_GID:-1000} ${CUSTOM_GROUPNAME} && \
useradd --uid ${CUSTOM_UID:-1000} --gid ${CUSTOM_GID:-1000} --create-home --shell /bin/bash ${CUSTOM_USERNAME} && \
mkdir /app && chown ${CUSTOM_UID:-1000}:${CUSTOM_GID:-1000} /app
# Copy source files
WORKDIR /app
COPY --chown=${CUSTOM_USERNAME}:${CUSTOM_GROUPNAME} requirements.txt /app/
COPY --chown=${CUSTOM_USERNAME}:${CUSTOM_GROUPNAME} backend /app/backend/
# Install dependencies
RUN pip install -r requirements.txt
# Run ASGI server
EXPOSE 3001/tcp
USER ${CUSTOM_UID:-1000}:${CUSTOM_GID:-1000}
ENTRYPOINT ["uvicorn", "backend.main:app", "--root-path", "/api", "--host", "0.0.0.0", "--port", "3001", "--access-log", "--use-colors", "--log-level", "debug", "--reload"]

View File

@ -0,0 +1,54 @@
---
version: "3"
services:
frontend:
container_name: frontend
restart: unless-stopped
build:
context: .
dockerfile: ./development.frontend.Dockerfile
args:
CUSTOM_UID: 1000
CUSTOM_GID: 1000
environment:
TZ: Europe/Berlin
ports:
- "8000:3000"
volumes:
- ./public/:/app/public/:ro
- ./robots/:/app/robots/:ro
- ./Caddyfile:/app/Caddyfile:ro
parcel:
container_name: parcel
restart: unless-stopped
build:
context: .
dockerfile: ./development.parcel.Dockerfile
args:
CUSTOM_UID: 1000
CUSTOM_GID: 1000
volumes:
- ./frontend/:/app/frontend/:ro
- ./postcss.config.js:/app/postcss.config.js:ro
- ./.postcssrc:/app/.postcssrc:ro
- ./tailwind.config.js:/app/tailwind.config.js:ro
expose:
- "1234"
backend:
container_name: backend
restart: unless-stopped
build:
context: .
dockerfile: ./development.backend.Dockerfile
args:
CUSTOM_UID: 1000
CUSTOM_GID: 1000
expose:
- "3001"
volumes:
- ./backend/:/app/backend/:ro
- ./requirements.txt:/app/requirements.txt:ro
...

View File

@ -0,0 +1,33 @@
# syntax=docker/dockerfile:1
FROM debian:latest
# Install Caddy
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update && apt install -y curl && \
apt install -y debian-keyring debian-archive-keyring apt-transport-https && \
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg && \
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' > /etc/apt/sources.list.d/caddy-stable.list && \
apt update && apt install -y caddy && \
rm -rf /var/lib/apt/lists/*
# Create non-root user
ARG CUSTOM_UID
ARG CUSTOM_GID
ENV CUSTOM_USERNAME=webserver
ENV CUSTOM_GROUPNAME=webserver
RUN groupadd --gid ${CUSTOM_GID:-1000} ${CUSTOM_GROUPNAME} && \
useradd --uid ${CUSTOM_UID:-1000} --gid ${CUSTOM_GID:-1000} --create-home --shell /bin/bash ${CUSTOM_USERNAME} && \
mkdir /app && chown ${CUSTOM_UID:-1000}:${CUSTOM_GID:-1000} /app
# Copy source files
WORKDIR /app
COPY --chown=${CUSTOM_USERNAME}:${CUSTOM_GROUPNAME} development.Caddyfile /app/
COPY --chown=${CUSTOM_USERNAME}:${CUSTOM_GROUPNAME} public /app/public/
COPY --chown=${CUSTOM_USERNAME}:${CUSTOM_GROUPNAME} robots /app/robots/
# Install dependencies
USER ${CUSTOM_UID:-1000}:${CUSTOM_GID:-1000}
# Run Caddy in development mode
ENTRYPOINT ["caddy", "run", "--config", "/app/development.Caddyfile", "--adapter", "caddyfile", "--watch"]

View File

@ -0,0 +1,34 @@
# syntax=docker/dockerfile:1
FROM debian:latest
# Install packages
ENV DEBIAN_FRONTEND=noninteractive
RUN apt update && apt install -y curl && \
curl -fsSL https://deb.nodesource.com/setup_19.x | bash - && apt-get install -y nodejs && \
apt install -y debian-keyring debian-archive-keyring apt-transport-https && \
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg && \
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' > /etc/apt/sources.list.d/caddy-stable.list && \
apt update && apt install -y caddy && \
rm -rf /var/lib/apt/lists/*
# Create non-root user
ARG CUSTOM_UID
ARG CUSTOM_GID
ENV CUSTOM_USERNAME=webserver
ENV CUSTOM_GROUPNAME=webserver
RUN groupadd --gid ${CUSTOM_GID:-1000} ${CUSTOM_GROUPNAME} && \
useradd --uid ${CUSTOM_UID:-1000} --gid ${CUSTOM_GID:-1000} --create-home --shell /bin/bash ${CUSTOM_USERNAME} && \
mkdir /app && chown ${CUSTOM_UID:-1000}:${CUSTOM_GID:-1000} /app
# Copy source files
WORKDIR /app
COPY --chown=${CUSTOM_USERNAME}:${CUSTOM_GROUPNAME} package.json package-lock.json .postcssrc postcss.config.js tailwind.config.js /app/
COPY --chown=${CUSTOM_USERNAME}:${CUSTOM_GROUPNAME} frontend /app/frontend/
# Install dependencies
USER ${CUSTOM_UID:-1000}:${CUSTOM_GID:-1000}
RUN npm install
# Run the parcel file watcher
ENTRYPOINT ["npx", "parcel", "frontend/src/html/index.html"]

View File

@ -0,0 +1 @@
<mxfile host="Electron" modified="2023-05-10T10:31:45.622Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.7.4 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36" etag="PHVfaFFo1ibX0lGajEse" version="20.7.4" type="device"><diagram name="Page-1" id="fc2ac565-0d4e-3f0d-88b0-a54af1634ed7">5ZrLctsgFIafxst2JKHrsnHStItu6s5kTSQs02ChQfjWpy+SkG8HTzKTBOGxFx5xkAB95wA/iAmaLrePAteLX7wgbBJ4xXaC7idBkIVI/beGXW+IorA3lIIWvck/GGb0H9FGT1tXtCDNyY2ScyZpfWrMeVWRXPY2/SwWgm9Ob5tzdlprjUsCDLMcs8H6NTrYn2ghF9rux9kh4weh5UJXngZJn/GM85dS8FWla6x4RfqcJR6K0S1tFrjgmyMTepigqeBc9lfL7ZSwluvAbHhO7oaGTtDdQi6ZSvjqssv+fuFh/y0Pq/cSpDoBeqm8RCNaY7baY1Ppe9LQsgKVYdZa0T0jc1X8XSMFfyFTzrjo8tG0+502ac4rOdNFBLB9+o3WREiyPTLp9j4SviRS7NQtOjcMNUEdlv6Q3hy5ONa2xZF397Gl46rcF30ApC40IzOv1AO8gp7XmjBeL9vXUjWouFHBThpJq/I6IMY2IcKgQy3En5UkpcCSchV5qp4YL2v17v1/OxCRmvFdz/gamKYWmWYwMMMuMLHE3RjLmBpjO7JXgC7wbKKD4Ri16L5VmO0a2hhjkapYFbUgEl8P1MAiVN+DARm3VJ8ElZJUXUwua8quiJ/NiSYA9P7g5gVw6sEM4uacgveaOHj/GGczpuIkz7wwDLDnZXMUZV+CNAOYkjbIfpM1JRtzz8XF31Uj21mkuY6wszk1Q8SZDxB/CLYPIBV7Z8Fo6KBp+EmkQoBlQ4jqoB6U6LY7KeBi6KSJtQBK0kukYCBZJ5U4RQqOZpoUGp1U8oaB3x4pwzJMkwpHJ5X6TpGCw7cmFY1PKnWKFJRcmlQ8OqkscooUukQqGZ2U7wVOobooE1IHUGVOoYLLcI0qGx/VXnC7gSq+hGqYe8ZkFSCnWCUXWY2v1H3klFRPL0p1f3yt7iOnxHoG5QJA5Mq62LCD8GnrYgMpKBecJWXYsrdJCqoFV0mZduhtkoJiwVlShmHKJimoFZwlZXP/zkAKKgVnSY08osONqqAArDYLKsmsxnmb3ghcn2I51Q/tOYY5ZeyIZfyckmfVhrtS4IIqeENedxpDy43+1Ikftjv82jc5ab/NmbyDUObnub3N58CWR5Dha1u0uTWPnK/8DZ0ERfZcAnfebq6TZOeS3aCvLHYSKNmTm/NI9rqOs7aIQh5cGqBb84jvxa8LRmTPJXANcnOdBOyMmpSpxV4CFzvhrU3uYAfWJIH33wXf6ROVPBzg7fKOTkijh/8=</diagram></mxfile>

View File

@ -0,0 +1 @@
<mxfile host="Electron" modified="2023-05-10T10:32:34.710Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.7.4 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36" etag="COiyQg4zBvAdCB36jXXZ" version="20.7.4" type="device"><diagram name="Page-1" id="fc2ac565-0d4e-3f0d-88b0-a54af1634ed7">5ZrLctsgFIafxst2JKHrsnHStItu6s5kTSws0yChQfjWpy+SkG8HTzKTBOFxFo44SIC+c4AfxARNy+2jwPXyF88JmwRevp2g+0kQ+EEaqX+tZddbkkgbCkFzfdPBMKP/iDZ62rqiOWlObpScM0nrU+OcVxWZy96mn8VC8M3pbQvOTmutcUGAYTbHbLB+jQ72J5rLpbb7cXbI+EFosdSVp0HSZzzj+Ush+KrSNVa8In1OiYdidEubJc755siEHiZoKjiX/VW5nRLWgh2YDc/J3dDQCbpbypKphK8uu+zvFx723/Kwei9BqhOgl8pLNKI1Zqs9NpW+Jw0tKlAZZq0V3TOyUMXfNVLwFzLljIsuH027v9MmLXglZ7qIALZPv9GaCEm2Rybd3kfCSyLFTt2ic8NQE9Rh6Q/pzZGLY21bHnl3H1s6rop90QdA6kIzMvNKPcAr6HmtCeN12b6WqkHFjQp20khaFdcBMbYJEQYdaiH+rCQpBJaUq8hT9cS4rNW797/tQERqxnc942tgmlpkmsHADLvAxBJ3YyxjaoztyF4BusCziQ6GY9Si+1ZhtmtoY4xFqmJV1IJIfD1QA4tQfQ8GZNxSfRJUSlJ1MVnWlF0RP5sTTQDo/cHNC+DUgxnEzTkF7zVx8P4xzmZMxck888IwwJ6XLVCUfQnSDGBK2iD7TdaUbMw9F+d/V41sZ5HmOsLO5tQMEWc+QPwh2D6AVOydBaOhg6bhJ5EKAZYNIaqDelCi2+6kgIuhkybWAihJL5GCgWSdVOIUKTiaaVJodFLJGwZ+e6QMyzBNKhydVOo7RQoO35pUND6p1ClSUHJpUvHopLLIKVLoEqlkdFK+FziF6qJMSB1AlTmFCi7DNapsfFR7we0GqvgSqmHuGZNVgJxilVxkNb5S95FTUj29KNX98bW6j5wS6xmUCwCRK+tiww7Cp62LDaSgXHCWlGHL3iYpqBZcJWXaobdJCooFZ0kZhimbpKBWcJaUzf07AymoFJwlNfKIDjeqghyw2iypJLMaz9v0RuD6FMupfmjPMSwoY0cs4+eUPKs23BUC51TBG/K60xhabvSnTvyw3eHXvpmT9tucyTuthojv7G0+B7Y8ggxf26LNrXnkfOVv6CQosucSuPN2c50kO5fsBn1lsZNAyZ7cnEey13WctUUU8uDSAN2aR3wvfl0wInsugWuQm+skYGfUpEwt9hK42AlvbXIHO7AmCbz/LvhOn6jk4QBvl3d0RBo9/Ac=</diagram></mxfile>

View File

Before

Width:  |  Height:  |  Size: 94 KiB

After

Width:  |  Height:  |  Size: 94 KiB

View File

Before

Width:  |  Height:  |  Size: 129 KiB

After

Width:  |  Height:  |  Size: 129 KiB

View File

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 66 KiB

View File

@ -0,0 +1 @@
<mxfile host="Electron" modified="2023-05-10T10:32:30.891Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/20.7.4 Chrome/106.0.5249.199 Electron/21.3.3 Safari/537.36" etag="-VbW2lHYwfbZlyXhP3NS" version="20.7.4" type="device"><diagram name="Page-1" id="fc2ac565-0d4e-3f0d-88b0-a54af1634ed7">5ZrLctsgFIafxst2JKHrsnHStItu6s5kTSws0yChQfjWpy+SkG8HTzKTBOFxFo44SIC+c4AfxARNy+2jwPXyF88JmwRevp2g+0kQ+EEaqX+tZddbkkgbCkFzfdPBMKP/iDZ62rqiOWlObpScM0nrU+OcVxWZy96mn8VC8M3pbQvOTmutcUGAYTbHbLB+jQ72J5rLpbb7cXbI+EFosdSVp0HSZzzj+Ush+KrSNVa8In1OiYdidEubJc755siEHiZoKjiX/VW5nRLWgh2YDc/J3dDQCbpbypKphK8uu+zvFx723/Kwei9BqhOgl8pLNKI1Zqs9NpW+Jw0tKlAZZq0V3TOyUMXfNVLwFzLljIsuH027v9MmLXglZ7qIALZPv9GaCEm2Rybd3kfCSyLFTt2ic8NQE9Rh6Q/pzZGLY21bHnl3H1s6rop90QdA6kIzMvNKPcAr6HmtCeN12b6WqkHFjQp20khaFdcBMbYJEQYdaiH+rCQpBJaUq8hT9cS4rNW797/tQERqxnc942tgmlpkmsHADLvAxBJ3YyxjaoztyF4BusCziQ6GY9Si+1ZhtmtoY4xFqmJV1IJIfD1QA4tQfQ8GZNxSfRJUSlJ1MVnWlF0RP5sTTQDo/cHNC+DUgxnEzTkF7zVx8P4xzmZMxck888IwwJ6XLVCUfQnSDGBK2iD7TdaUbMw9F+d/V41sZ5HmOsLO5tQMEWc+QPwh2D6AVOydBaOhg6bhJ5EKAZYNIaqDelCi2+6kgIuhkybWAihJL5GCgWSdVOIUKTiaaVJodFLJGwZ+e6QMyzBNKhydVOo7RQoO35pUND6p1ClSUHJpUvHopLLIKVLoEqlkdFK+FziF6qJMSB1AlTmFCi7DNapsfFR7we0GqvgSqmHuGZNVgJxilVxkNb5S95FTUj29KNX98bW6j5wS6xmUCwCRK+tiww7Cp62LDaSgXHCWlGHL3iYpqBZcJWXaobdJCooFZ0kZhimbpKBWcJaUzf07AymoFJwlNfKIDjeqghyw2iypJLMaz9v0RuD6FMupfmjPMSwoY0cs4+eUPKs23BUC51TBG/K60xhabvSnTvyw3eHXvpmT9tucyTuthojv7G0+B7Y8ggxf26LNrXnkfOVv6CQosucSuPN2c50kO5fsBn1lsZNAyZ7cnEey13WctUUU8uDSAN2aR3wvfl0wInsugWuQm+skYGfUpEwt9hK42AlvbXIHO7AmCbz/LvhOn6jk4QBvl3d0RBo9/Ac=</diagram></mxfile>

BIN
docs/figures/gantt.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 267 KiB

View File

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

Before

Width:  |  Height:  |  Size: 2.2 KiB

After

Width:  |  Height:  |  Size: 2.2 KiB

View File

Before

Width:  |  Height:  |  Size: 657 B

After

Width:  |  Height:  |  Size: 657 B

View File

Before

Width:  |  Height:  |  Size: 613 B

After

Width:  |  Height:  |  Size: 613 B

View File

Before

Width:  |  Height:  |  Size: 398 B

After

Width:  |  Height:  |  Size: 398 B

View File

Before

Width:  |  Height:  |  Size: 2.1 KiB

After

Width:  |  Height:  |  Size: 2.1 KiB

View File

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

Before

Width:  |  Height:  |  Size: 1.3 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

Before

Width:  |  Height:  |  Size: 3.2 KiB

After

Width:  |  Height:  |  Size: 3.2 KiB

View File

Before

Width:  |  Height:  |  Size: 692 B

After

Width:  |  Height:  |  Size: 692 B

View File

Before

Width:  |  Height:  |  Size: 14 KiB

After

Width:  |  Height:  |  Size: 14 KiB

View File

Before

Width:  |  Height:  |  Size: 82 KiB

After

Width:  |  Height:  |  Size: 82 KiB

View File

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

View File

Before

Width:  |  Height:  |  Size: 1.1 MiB

After

Width:  |  Height:  |  Size: 1.1 MiB

View File

Before

Width:  |  Height:  |  Size: 3.6 KiB

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

Before

Width:  |  Height:  |  Size: 35 KiB

After

Width:  |  Height:  |  Size: 35 KiB

View File

Before

Width:  |  Height:  |  Size: 100 KiB

After

Width:  |  Height:  |  Size: 100 KiB

View File

@ -74,7 +74,8 @@ The individual scores are then added together to produce the final MEWS.
\end{table}
Traditionally, doctors and nursing staff perform collection and evaluation of the data manually, often inputting data into an EWS-calculator by hand.
Low frequency of scoring, miscalculations and practical integration are known setbacks of NEWS2 and other scores\cite{eisenkraft_developing_2023}.
However, as Eisenkraft et al. mentioned in 2023, ``some known setbacks of the NEWS and other scales are the frequency of scoring and
response, integration into practice, a miscalculation by healthcare providers [...]''\cite{eisenkraft_developing_2023}{(p.2)}.
Remote patient monitoring (RPM) can improve deterioration detection\cite{shaik_remote_2023} by greatly reducing the
amount of human interaction required to take measurements and perform EWS calculations.
@ -95,8 +96,9 @@ specialized equipment and technical expertise.
Furthermore, these systems are cumbersome for patients, as they involve connecting patient and sensor device with numerous electrodes
and cables, restricting patient mobility to the bed area, and physically tying the monitoring equipment
to a single location.
In contrast, battery-powered, wireless vitals monitoring devices, such as wearable arm- or wristbands, can incorporate multiple biosensors in a single device in a
smaller form-factor, and allow for a much higher degree of patient mobility, rapid deployment and scalability\cite{un_observational_2021}.
Conversely, battery-powered, wireless vitals monitoring devices, such as wearable armbands or smartwatches, can combine several
biometric sensors into one device, allowing for a much higher degree of patient mobility, faster deployment and better
scalability\cite{un_observational_2021}.
Therefore, utilizing such devices for RPM is a suitable approach.
While the application of EWS in ambulant care facilities and hospitals has been thoroughly investigated, very little research has been done to
@ -183,7 +185,7 @@ the web application and its alert system prompts the patient periodically to tak
Following the technical implementation of the described system, its day-to-day usability and effectiveness will be evaluated in
a case study.
Over the course of two weeks, a test subject, representing a patient recently dismissed from an accident and emergency hospital department
Over the course of a week, a test subject, representing a patient recently dismissed from an accident and emergency hospital department
(A\&E) will be using the system both at home and while out and about.
While awake, the patient will be prompted by the system via smartphone notifications to take new measurements every two hours.
The captured data and resulting MEWS records will be periodically reviewed by another person representing medical staff during

View File

@ -1,112 +0,0 @@
<mxfile host="Electron" modified="2023-05-01T22:16:34.541Z" agent="Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) draw.io/21.2.1 Chrome/112.0.5615.87 Electron/24.1.2 Safari/537.36" etag="1Wzcjv7OB8KUVon0POAM" version="21.2.1" type="device">
<diagram name="Page-1" id="fc2ac565-0d4e-3f0d-88b0-a54af1634ed7">
<mxGraphModel dx="1710" dy="991" grid="1" gridSize="10" guides="1" tooltips="1" connect="0" arrows="1" fold="1" page="1" pageScale="1.5" pageWidth="1169" pageHeight="827" background="none" math="0" shadow="0">
<root>
<mxCell id="0" style=";html=1;" />
<mxCell id="1" style=";html=1;" parent="0" />
<mxCell id="75" value="1. Design" style="align=left;strokeColor=#CCCCCC;html=1;fontStyle=2" parent="1" vertex="1">
<mxGeometry x="440" y="140" width="160" height="20" as="geometry" />
</mxCell>
<mxCell id="80" value="2. Development and testing" style="align=left;strokeColor=#CCCCCC;html=1;fontStyle=2" parent="1" vertex="1">
<mxGeometry x="440" y="160" width="160" height="20" as="geometry" />
</mxCell>
<mxCell id="85" value="3. Integration &amp;amp; deployment" style="align=left;strokeColor=#CCCCCC;html=1;fontStyle=2" parent="1" vertex="1">
<mxGeometry x="440" y="180" width="160" height="20" as="geometry" />
</mxCell>
<mxCell id="90" value="4. Data collection" style="align=left;strokeColor=#CCCCCC;html=1;fontStyle=2" parent="1" vertex="1">
<mxGeometry x="440" y="200" width="160" height="20" as="geometry" />
</mxCell>
<mxCell id="95" value="5. Analysis &amp;amp; interpretation" style="align=left;strokeColor=#CCCCCC;html=1;fontStyle=2" parent="1" vertex="1">
<mxGeometry x="440" y="220" width="160" height="20" as="geometry" />
</mxCell>
<mxCell id="100" value="6. Written compilation" style="align=left;strokeColor=#CCCCCC;html=1;fontStyle=2" parent="1" vertex="1">
<mxGeometry x="440" y="240" width="160" height="20" as="geometry" />
</mxCell>
<mxCell id="2" value="Task" style="strokeWidth=1;fontStyle=0;html=1;" parent="1" vertex="1">
<mxGeometry x="440" y="120" width="160" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-289" value="7. Reviews &amp;amp; adjustments" style="align=left;strokeColor=#CCCCCC;html=1;fontStyle=2" parent="1" vertex="1">
<mxGeometry x="440" y="260" width="160" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-291" value="" style="align=left;strokeColor=#CCCCCC;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="140" width="840" height="20" as="geometry" />
</mxCell>
<mxCell id="4" value="week 1" style="strokeWidth=1;fontStyle=0;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="120" width="70" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-278" value="week 2" style="strokeWidth=1;fontStyle=0;html=1;" parent="1" vertex="1">
<mxGeometry x="670" y="120" width="70" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-279" value="week 3" style="strokeWidth=1;fontStyle=0;html=1;" parent="1" vertex="1">
<mxGeometry x="740" y="120" width="70" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-280" value="week 4" style="strokeWidth=1;fontStyle=0;html=1;" parent="1" vertex="1">
<mxGeometry x="810" y="120" width="70" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-281" value="week 5" style="strokeWidth=1;fontStyle=0;html=1;" parent="1" vertex="1">
<mxGeometry x="880" y="120" width="70" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-282" value="week 6" style="strokeWidth=1;fontStyle=0;html=1;" parent="1" vertex="1">
<mxGeometry x="950" y="120" width="70" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-283" value="week 7" style="strokeWidth=1;fontStyle=0;html=1;" parent="1" vertex="1">
<mxGeometry x="1020" y="120" width="70" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-284" value="week 8" style="strokeWidth=1;fontStyle=0;html=1;" parent="1" vertex="1">
<mxGeometry x="1090" y="120" width="70" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-285" value="week 9" style="strokeWidth=1;fontStyle=0;html=1;" parent="1" vertex="1">
<mxGeometry x="1160" y="120" width="70" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-286" value="week 10" style="strokeWidth=1;fontStyle=0;html=1;" parent="1" vertex="1">
<mxGeometry x="1230" y="120" width="70" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-287" value="week 11" style="strokeWidth=1;fontStyle=0;html=1;" parent="1" vertex="1">
<mxGeometry x="1300" y="120" width="70" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-288" value="week 12" style="strokeWidth=1;fontStyle=0;html=1;" parent="1" vertex="1">
<mxGeometry x="1370" y="120" width="70" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-292" value="" style="align=left;strokeColor=#CCCCCC;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="160" width="840" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-293" value="" style="align=left;strokeColor=#CCCCCC;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="180" width="840" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-294" value="" style="align=left;strokeColor=#CCCCCC;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="200" width="840" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-295" value="" style="align=left;strokeColor=#CCCCCC;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="220" width="840" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-296" value="" style="align=left;strokeColor=#CCCCCC;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="240" width="840" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-297" value="" style="align=left;strokeColor=#CCCCCC;html=1;" parent="1" vertex="1">
<mxGeometry x="600" y="260" width="840" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-299" value="3 d" style="whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#6b8ebd;gradientColor=none;fontSize=14;align=center;strokeColor=#3391cc;" parent="1" vertex="1">
<mxGeometry x="600" y="140" width="30" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-300" value="4 w" style="whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#6b8ebd;gradientColor=none;fontSize=14;align=center;strokeColor=#3391cc;" parent="1" vertex="1">
<mxGeometry x="630" y="160" width="280" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-301" value="2d" style="whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#6b8ebd;gradientColor=none;fontSize=14;align=center;strokeColor=#3391cc;" parent="1" vertex="1">
<mxGeometry x="910" y="180" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-302" value="2 w" style="whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#6b8ebd;gradientColor=none;fontSize=14;align=center;strokeColor=#3391cc;" parent="1" vertex="1">
<mxGeometry x="930" y="200" width="140" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-303" value="2d" style="whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#6b8ebd;gradientColor=none;fontSize=14;align=center;strokeColor=#3391cc;" parent="1" vertex="1">
<mxGeometry x="1070" y="220" width="20" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-304" value="7d" style="whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#6b8ebd;gradientColor=none;fontSize=14;align=center;strokeColor=#3391cc;" parent="1" vertex="1">
<mxGeometry x="1090" y="240" width="70" height="20" as="geometry" />
</mxCell>
<mxCell id="67c90442a009f359-305" value="4w" style="whiteSpace=wrap;html=1;strokeWidth=2;fillColor=#6b8ebd;gradientColor=none;fontSize=14;align=center;strokeColor=#3391cc;" parent="1" vertex="1">
<mxGeometry x="1160" y="260" width="280" height="20" as="geometry" />
</mxCell>
</root>
</mxGraphModel>
</diagram>
</mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 27 KiB

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Some files were not shown because too many files have changed in this diff Show More