diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile
new file mode 100644
index 000000000..e44b86089
--- /dev/null
+++ b/.devcontainer/Dockerfile
@@ -0,0 +1,11 @@
+# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.162.0/containers/ubuntu/.devcontainer/base.Dockerfile
+
+# [Choice] Ubuntu version: bionic, focal
+ARG VARIANT="focal"
+FROM mcr.microsoft.com/vscode/devcontainers/base:0-${VARIANT}
+
+# [Optional] Uncomment this section to install additional OS packages.
+RUN apt-get update && export DEBIAN_FRONTEND=noninteractive \
+ && apt-get -y install python3-distutils python3-pip
+RUN pip3 install platformio meshtastic adafruit-nrfutil
+RUN wget https://github.com/protocolbuffers/protobuf/releases/download/v3.15.8/protoc-3.15.8-linux-x86_64.zip -O /tmp/protoc.zip && cd /tmp && unzip protoc.zip && chmod a+x bin/protoc && cp bin/protoc /usr/local/bin
diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json
new file mode 100644
index 000000000..e0a284e88
--- /dev/null
+++ b/.devcontainer/devcontainer.json
@@ -0,0 +1,32 @@
+// For format details, see https://aka.ms/devcontainer.json. For config options, see the README at:
+// https://github.com/microsoft/vscode-dev-containers/tree/v0.162.0/containers/ubuntu
+{
+ "name": "Ubuntu",
+ "build": {
+ "dockerfile": "Dockerfile",
+ // Update 'VARIANT' to pick an Ubuntu version: focal, bionic
+ "args": { "VARIANT": "focal" }
+ },
+
+ // Set *default* container specific settings.json values on container create.
+ "settings": {
+ "terminal.integrated.shell.linux": "/bin/bash"
+ },
+
+ // Add the IDs of extensions you want installed when the container is created.
+ "extensions": [
+ "platformio.platformio-ide",
+ "xaver.clang-format"
+ ],
+
+ // Use 'forwardPorts' to make a list of ports inside the container available locally.
+ // "forwardPorts": [],
+
+ // Use 'postCreateCommand' to run commands after the container is created.
+ // "postCreateCommand": "uname -a",
+
+ // Comment out connect as root instead. More info: https://aka.ms/vscode-remote/containers/non-root.
+ "remoteUser": "vscode",
+
+ "postCreateCommand": "git submodule update --init"
+}
\ No newline at end of file
diff --git a/.github/actions/initbuild/action.yml b/.github/actions/initbuild/action.yml
new file mode 100644
index 000000000..b852d0a6c
--- /dev/null
+++ b/.github/actions/initbuild/action.yml
@@ -0,0 +1,39 @@
+name: 'Common init'
+
+# WARNING due to https://github.com/actions/runner/issues/646
+# this code can't work - must copy and paste into workflows for now because 'uses' is not supported
+runs:
+ using: "composite"
+ steps:
+ - name: Setup Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3.x
+
+ - name: Cache python libs
+ uses: actions/cache@v1
+ id: cache-pip # needed in if test
+ with:
+ path: ~/.cache/pip
+ key: ${{ runner.os }}-pip
+
+ - name: Upgrade python tools
+ # We actually want to run this every time
+ # if: steps.cache-pip.outputs.cache-hit != 'true'
+ run: |
+ python -m pip install --upgrade pip
+ pip install -U platformio meshtastic adafruit-nrfutil
+
+ # Don't cache for now because I want to be lazy with portuino updates githashes
+ # - name: Cache platformio
+ # uses: actions/cache@v1
+ # id: cache-platformio # needed in if test
+ # with:
+ # path: ~/.platformio
+ # key: ${{ runner.os }}-platformio
+
+ - name: Upgrade platformio
+ run: |
+ pio upgrade
+
+
diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md
index 8b7b4592c..9ef8f77c6 100644
--- a/.github/pull_request_template.md
+++ b/.github/pull_request_template.md
@@ -7,7 +7,7 @@
is appreciated." This will allow other devs to potentially save you time by not accidentially duplicating work etc...
- Please do not check in files that don't have real changes
- Please do not reformat lines that you didn't have to change the code on
-- We recommend using the [Visual Studio Code](https://platformio.org/install/ide?install=vscode) editor,
+- We recommend using the [Visual Studio Code](https://platformio.org/install/ide?install=vscode) editor and the 'clang-format' extension,
because automatically follows our indentation rules and it's auto reformatting will not cause spurious changes to lines.
- If your PR fixes a bug, mention "fixes #bugnum" somewhere in your pull request description.
- If your other co-developers have comments on your PR please tweak as needed.
diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml
index 585775e48..9b1424419 100644
--- a/.github/workflows/main.yml
+++ b/.github/workflows/main.yml
@@ -1,36 +1,86 @@
name: Continuous Integration
on:
- - push
- - pull_request
+ # Triggers the workflow on push or pull request events but only for the master branch
+ push:
+ branches: [ master ]
+ pull_request:
+ branches: [ master ]
jobs:
- setup:
+ # setup:
+ # runs-on: ubuntu-latest
+ # steps:
+
+ # - name: Startup
+ # run: echo "No action setup currently needed, skipping..."
+
+ ci-build:
+ # needs: setup
runs-on: ubuntu-latest
steps:
- - name: Checkout code
- uses: actions/checkout@v2
- with:
- submodules: true
- - name: Setup Python
- uses: actions/setup-python@v2
- with:
- python-version: 3.x
- - name: Install Platform IO
- run: |
- python -m pip install --upgrade pip
- pip install -U platformio
- - name: Install extra python tools
- run: |
- pip install -U adafruit-nrfutil
- - name: Install libs needed for linux build
- run: |
- sudo apt install -y libpsocksxx-dev
- - name: Build for tbeam
- run: platformio run -e tbeam
- - name: Build for heltec
- run: platformio run -e heltec
- - name: Build for lora-relay-v1
- run: platformio run -e lora-relay-v1
- # Turn off linux for now
- name: Build for native
- run: platformio run -e native
+
+ - name: Checkout code
+ uses: actions/checkout@v2
+ with:
+ submodules: 'recursive'
+
+ - name: Setup Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3.x
+
+ - name: Cache python libs
+ uses: actions/cache@v1
+ id: cache-pip # needed in if test
+ with:
+ path: ~/.cache/pip
+ key: ${{ runner.os }}-pip
+
+ #- name: Install linux apt packages
+ # run: |
+ # sudo apt-get install -y libgpiod-dev
+
+ - name: Upgrade python tools
+ # We actually want to run this every time
+ # if: steps.cache-pip.outputs.cache-hit != 'true'
+ run: |
+ python -m pip install --upgrade pip
+ pip install -U platformio meshtastic adafruit-nrfutil
+
+ # - name: Cache platformio
+ # uses: actions/cache@v1
+ # id: cache-platformio # needed in if test
+ # with:
+ # path: ~/.platformio
+ # key: ${{ runner.os }}-platformio
+
+ - name: Upgrade platformio
+ run: |
+ pio upgrade
+
+ # We now run integration test before other build steps (to quickly see runtime failures)
+ - name: Build for native
+ run: platformio run -e native
+ - name: Integration test
+ run: |
+ .pio/build/native/program &
+ sleep 20 # 5 seconds was not enough
+ echo "Simulator started, launching python test..."
+ python3 -c 'from meshtastic.test import testSimulator; testSimulator()'
+
+ # - name: Build for tbeam
+ # run: platformio run -e tbeam
+ # - name: Build for heltec
+ # run: platformio run -e heltec
+ # - name: Build for wisblock RAK4631
+ # run: platformio run -e rak4631
+
+ - name: Build everything
+ run: bin/build-all.sh
+
+ - name: Store release zip as an artifact
+ uses: actions/upload-artifact@v2
+ with:
+ name: built
+ path: release/archive/firmware-*.zip
+ retention-days: 30
diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml
new file mode 100644
index 000000000..470614817
--- /dev/null
+++ b/.github/workflows/release.yml
@@ -0,0 +1,80 @@
+name: Make Release
+on:
+ # Can optionally take parameters from the github UI, more info here https://github.blog/changelog/2020-07-06-github-actions-manual-triggers-with-workflow_dispatch/#:~:text=You%20can%20now%20create%20workflows,the%20workflow%20is%20run%20on.
+ # workflow_dispatch:
+ # inputs:
+
+ # Only want to be run if a new tag starting with v is pushed.
+ push:
+ branches:
+ - "!*"
+ tags:
+ - "v1*"
+
+jobs:
+ release-build:
+ runs-on: ubuntu-latest
+ steps:
+
+ - name: Checkout code
+ uses: actions/checkout@v2
+ with:
+ submodules: 'recursive'
+
+ # get github branch and tag names as ${{ steps.branch_name.outputs.SOURCE_TAG }}
+ - name: Branch name
+ id: branch_name
+ run: |
+ echo ::set-output name=SOURCE_NAME::${GITHUB_REF#refs/*/}
+ echo ::set-output name=SOURCE_BRANCH::${GITHUB_REF#refs/heads/}
+ echo ::set-output name=SOURCE_TAG::${GITHUB_REF#refs/tags/}
+
+ - name: Setup Python
+ uses: actions/setup-python@v2
+ with:
+ python-version: 3.x
+
+ # Note: we don't use caches on release builds because we don't want to accidentally not have a virgin build machine
+
+ - name: Upgrade python tools
+ # We actually want to run this every time
+ # if: steps.cache-pip.outputs.cache-hit != 'true'
+ run: |
+ python -m pip install --upgrade pip
+ pip install -U platformio meshtastic adafruit-nrfutil
+
+ - name: Upgrade platformio
+ run: |
+ pio upgrade
+
+ # Will be available in steps.version.outputs.version
+ - name: Get version string
+ run: echo "::set-output name=version::$(./bin/buildinfo.py long)"
+ id: version
+
+ - name: Build everything
+ run: bin/build-all.sh
+
+ - name: Create release
+ uses: actions/create-release@v1
+ id: create_release
+ with:
+ draft: true
+ prerelease: true
+ release_name: ${{ steps.version.outputs.version }} alpha
+ tag_name: ${{ steps.branch_name.outputs.SOURCE_TAG }}
+ # was ${{ github.ref }}
+ body: |
+ Autogenerated by github action, developer should edit as required before publishing...
+ env:
+ GITHUB_TOKEN: ${{ github.token }}
+
+ - name: Add artifact to release
+ uses: actions/upload-release-asset@v1
+ env:
+ GITHUB_TOKEN: ${{ github.token }}
+ with:
+ upload_url: ${{ steps.create_release.outputs.upload_url }}
+ asset_path: release/archive/firmware-${{ steps.version.outputs.version }}.zip
+ asset_name: firmware-${{ steps.version.outputs.version }}.zip
+ asset_content_type: application/zip
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index d250737cb..eeb1bcb09 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,8 @@ main/credentials.h
!.vscode/extensions.json
*.code-workspace
+.idea/workspace.xml
+
.DS_Store
Thumbs.db
.autotools
@@ -19,4 +21,5 @@ Thumbs.db
nanopb*
flash.uf2
cmake-build*
+__pycache__
diff --git a/.idea/workspace.xml b/.idea/workspace.xml
deleted file mode 100644
index 1381bb27a..000000000
--- a/.idea/workspace.xml
+++ /dev/null
@@ -1,137 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 1615788661896
-
-
- 1615788661896
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- file://$PROJECT_DIR$/src/mesh/StreamAPI.cpp
- 20
-
-
-
- file://$PROJECT_DIR$/src/mesh/wifi/WiFiServerAPI.cpp
- 53
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index 0f0d7401d..27bdd05a2 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -2,6 +2,7 @@
// See http://go.microsoft.com/fwlink/?LinkId=827846
// for the documentation about the extensions.json format
"recommendations": [
- "platformio.platformio-ide"
+ "platformio.platformio-ide",
+ "xaver.clang-format"
]
}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index b89870c5b..455d58ffb 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -77,5 +77,5 @@
"--java_out=/tmp",
"-I=/home/kevinh/development/meshtastic/meshtastic-esp32/proto"
]
- }
+ }
}
\ No newline at end of file
diff --git a/README.md b/README.md
index 5c33d0f45..d87c83ab9 100644
--- a/README.md
+++ b/README.md
@@ -195,11 +195,11 @@ We offer a [python API](https://github.com/meshtastic/Meshtastic-python) that ma
# Development
-We'd love to have you join us on this merry little project. Please see our [development documents](./docs/software/sw-design.md) and [join us in our discussion forum](https://meshtastic.discourse.group/).
+We'd love to have you join us on this merry little project. Please see our [development documents](https://meshtastic.org/docs/software/other/sw-design) and [join us in our discussion forum](https://meshtastic.discourse.group/).
# Credits
-This project is run by volunteers. Past contributors include:
+This project is run by volunteers. We are a friendly group and welcome any contribution (code fixes, documentation, features, bug reports etc...). We try to be good about listing contributor names in release notes, but it has become unwieldy for the main-devs to keep updating the list below and we've neglected it too long. If you'd like your name included in this list please send a pull request to edit this README and simply add your line yourself. Thank you very much for your help!
- @astro-arphid: Added support for 433MHz radios in europe.
- @claesg: Various documentation fixes and 3D print enclosures
diff --git a/bin/build-all.sh b/bin/build-all.sh
index 1e2f159bb..096488f22 100755
--- a/bin/build-all.sh
+++ b/bin/build-all.sh
@@ -2,13 +2,14 @@
set -e
-VERSION=`bin/buildinfo.py`
+VERSION=`bin/buildinfo.py long`
+SHORT_VERSION=`bin/buildinfo.py short`
-BOARDS_ESP32="tlora-v2 tlora-v1 tlora-v2-1-1.6 tbeam heltec tbeam0.7"
+BOARDS_ESP32="tlora-v2 tlora-v1 tlora_v1_3 tlora-v2-1-1.6 tbeam heltec-v2.0 heltec-v2.1 tbeam0.7"
#BOARDS_ESP32=tbeam
# FIXME note nrf52840dk build is for some reason only generating a BIN file but not a HEX file nrf52840dk-geeksville is fine
-BOARDS_NRF52="lora-relay-v1"
+BOARDS_NRF52="rak4631 t-echo"
OUTDIR=release/latest
@@ -18,7 +19,7 @@ ARCHIVEDIR=release/archive
rm -f $OUTDIR/firmware*
mkdir -p $OUTDIR/bins $ARCHIVEDIR
-rm -r $OUTDIR/bins/*
+rm -r $OUTDIR/bins/* || true
mkdir -p $OUTDIR/bins/universal $OUTDIR/elfs/universal
# build the named environment and copy the bins to the release directory
@@ -91,6 +92,7 @@ Generated by bin/buildall.sh -->
$VERSION
+ $SHORT_VERSION
XML
diff --git a/bin/build-nightly.sh b/bin/build-nightly.sh
new file mode 100755
index 000000000..de31c6ed1
--- /dev/null
+++ b/bin/build-nightly.sh
@@ -0,0 +1,38 @@
+#!/bin/bash
+source ~/.bashrc
+
+# Meshtastic Nightly Build Script.
+# McHamster (jm@casler.org)
+#
+# This is the script that is used for the nightly build server.
+#
+# It's probably not useful for most people, but you may want to run your own
+# nightly builds.
+#
+# The last line of ~/.bashrc contains an inclusion of platformio in the path.
+# Without this, the build script won't run from the crontab:
+#
+# export PATH="$HOME/.platformio/penv/bin:$PATH"
+#
+# The crontab contains:
+# 0 2 * * * cd ~/meshtastic/github/meshtastic && source "~/.bashrc"; ./build-nightly.sh > ~/cronout.txt 2> ~/cronout.txt
+
+cd Meshtastic-device
+
+git pull
+
+bin/build-all.sh
+
+date_stamp=$(date +'%Y-%m-%d')
+
+cd ..
+
+# TODO: Archive the same binaries used by the build-all script.
+#zip -r meshtastic_device_nightly_${date_stamp} Meshtastic-device/release/latest/bins
+cp Meshtastic-device/release/archive/`ls -t ./Meshtastic-device/release/archive/| head -1` meshtastic_device_nightly_${date_stamp}.zip
+
+# Copy the file to the webserver
+scp meshtastic_device_nightly_${date_stamp}.zip jm@10.11.12.20:/volume1/web/meshtastic/nightly_builds/
+
+# Delete the local copy
+rm meshtastic_device_nightly_${date_stamp}.zip
diff --git a/bin/buildinfo.py b/bin/buildinfo.py
index 803b5bc7e..6b123c9cf 100755
--- a/bin/buildinfo.py
+++ b/bin/buildinfo.py
@@ -1,11 +1,9 @@
#!/usr/bin/env python3
import configparser
+import sys
+from readprops import readProps
-config = configparser.RawConfigParser()
-config.read('version.properties')
-version = dict(config.items('VERSION'))
-
-verStr = "{}.{}.{}".format(version["major"], version["minor"], version["build"])
-
-print(f"{verStr}")
+verObj = readProps('version.properties')
+propName = sys.argv[1]
+print(f"{verObj[propName]}")
diff --git a/bin/device-install.bat b/bin/device-install.bat
new file mode 100644
index 000000000..4837d61b1
--- /dev/null
+++ b/bin/device-install.bat
@@ -0,0 +1,42 @@
+@ECHO OFF
+
+set PYTHON=python
+
+goto GETOPTS
+:HELP
+echo Usage: %~nx0 [-h] [-p ESPTOOL_PORT] [-P PYTHON] [-f FILENAME^|FILENAME]
+echo Flash image file to device, but first erasing and writing system information
+echo.
+echo -h Display this help and exit
+echo -p ESPTOOL_PORT Set the environment variable for ESPTOOL_PORT. If not set, ESPTOOL iterates all ports (Dangerrous).
+echo -P PYTHON Specify alternate python interpreter to use to invoke esptool. (Default: %PYTHON%)
+echo -f FILENAME The .bin file to flash. Custom to your device type and region.
+goto EOF
+
+:GETOPTS
+if /I "%1"=="-h" goto HELP
+if /I "%1"=="--help" goto HELP
+if /I "%1"=="-F" set "FILENAME=%2" & SHIFT
+if /I "%1"=="-p" set ESPTOOL_PORT=%2 & SHIFT
+if /I "%1"=="-P" set PYTHON=%2 & SHIFT
+SHIFT
+IF NOT "__%1__"=="____" goto GETOPTS
+
+IF "__%FILENAME%__" == "____" (
+ echo "Missing FILENAME"
+ goto HELP
+)
+IF EXIST %FILENAME% (
+ echo Trying to flash update %FILENAME%, but first erasing and writing system information"
+ %PYTHON% -m esptool --baud 921600 erase_flash
+ %PYTHON% -m esptool --baud 921600 write_flash 0x1000 system-info.bin
+ for %%f in (spiffs-*.bin) do (
+ %PYTHON% -m esptool --baud 921600 write_flash 0x00390000 %%f
+ )
+ %PYTHON% -m esptool --baud 921600 write_flash 0x10000 %FILENAME%
+) else (
+ echo "Invalid file: %FILENAME%"
+ goto HELP
+)
+
+:EOF
\ No newline at end of file
diff --git a/bin/device-install.sh b/bin/device-install.sh
index 3d5f27af8..85e39892e 100755
--- a/bin/device-install.sh
+++ b/bin/device-install.sh
@@ -1,21 +1,24 @@
#!/bin/sh
+PYTHON=${PYTHON:-$(which python3 python|head -n 1)}
+
set -e
# Usage info
show_help() {
cat << EOF
-Usage: ${0##*/} [-h] [-p ESPTOOL_PORT] [-f FILENAME]
+Usage: $(basename $0) [-h] [-p ESPTOOL_PORT] [-P PYTHON] [-f FILENAME|FILENAME]
Flash image file to device, but first erasing and writing system information"
-h Display this help and exit
-p ESPTOOL_PORT Set the environment variable for ESPTOOL_PORT. If not set, ESPTOOL iterates all ports (Dangerrous).
- -f FILENAME The .bin file to flash. Custom to your device type and region.
+ -P PYTHON Specify alternate python interpreter to use to invoke esptool. (Default: "$PYTHON")
+ -f FILENAME The .bin file to flash. Custom to your device type and region.
EOF
}
-while getopts ":h:p:f:" opt; do
+while getopts ":hp:P:f:" opt; do
case "${opt}" in
h)
show_help
@@ -23,6 +26,8 @@ while getopts ":h:p:f:" opt; do
;;
p) export ESPTOOL_PORT=${OPTARG}
;;
+ P) PYTHON=${OPTARG}
+ ;;
f) FILENAME=${OPTARG}
;;
*)
@@ -34,12 +39,17 @@ while getopts ":h:p:f:" opt; do
done
shift "$((OPTIND-1))"
+[ -z "$FILENAME" -a -n "$1" ] && {
+ FILENAME=$1
+ shift
+}
+
if [ -f "${FILENAME}" ]; then
echo "Trying to flash ${FILENAME}, but first erasing and writing system information"
- esptool.py --baud 921600 erase_flash
- esptool.py --baud 921600 write_flash 0x1000 system-info.bin
- esptool.py --baud 921600 write_flash 0x00390000 spiffs-*.bin
- esptool.py --baud 921600 write_flash 0x10000 ${FILENAME}
+ $PYTHON -m esptool --baud 921600 erase_flash
+ $PYTHON -m esptool --baud 921600 write_flash 0x1000 system-info.bin
+ $PYTHON -m esptool --baud 921600 write_flash 0x00390000 spiffs-*.bin
+ $PYTHON -m esptool --baud 921600 write_flash 0x10000 ${FILENAME}
else
echo "Invalid file: ${FILENAME}"
show_help
diff --git a/bin/device-update.bat b/bin/device-update.bat
new file mode 100644
index 000000000..4cede3db9
--- /dev/null
+++ b/bin/device-update.bat
@@ -0,0 +1,39 @@
+@ECHO OFF
+
+set PYTHON=python
+
+goto GETOPTS
+:HELP
+echo Usage: %~nx0 [-h] [-p ESPTOOL_PORT] [-P PYTHON] [-f FILENAME^|FILENAME]
+echo Flash image file to device, leave existing system intact.
+echo.
+echo -h Display this help and exit
+echo -p ESPTOOL_PORT Set the environment variable for ESPTOOL_PORT. If not set, ESPTOOL iterates all ports (Dangerrous).
+echo -P PYTHON Specify alternate python interpreter to use to invoke esptool. (Default: %PYTHON%)
+echo -f FILENAME The .bin file to flash. Custom to your device type and region.
+goto EOF
+
+:GETOPTS
+if /I "%1"=="-h" goto HELP
+if /I "%1"=="--help" goto HELP
+if /I "%1"=="-F" set "FILENAME=%2" & SHIFT
+if /I "%1"=="-p" set ESPTOOL_PORT=%2 & SHIFT
+if /I "%1"=="-P" set PYTHON=%2 & SHIFT
+SHIFT
+IF NOT "__%1__"=="____" goto GETOPTS
+
+IF "__%FILENAME%__" == "____" (
+ echo "Missing FILENAME"
+ goto HELP
+)
+IF EXIST %FILENAME% (
+ echo Trying to flash update %FILENAME%
+ %PYTHON% -m esptool --baud 921600 write_flash 0x10000 %FILENAME%
+ echo Erasing the otadata partition, which will turn off flash flippy-flop and force the first image to be used
+ %PYTHON% -m esptool --baud 921600 erase_region 0xe000 0x2000
+) else (
+ echo "Invalid file: %FILENAME%"
+ goto HELP
+)
+
+:EOF
\ No newline at end of file
diff --git a/bin/device-update.sh b/bin/device-update.sh
index 894230364..dda05f005 100755
--- a/bin/device-update.sh
+++ b/bin/device-update.sh
@@ -1,19 +1,22 @@
#!/bin/sh
+PYTHON=${PYTHON:-$(which python3 python|head -n 1)}
+
# Usage info
show_help() {
cat << EOF
-Usage: ${0##*/} [-h] [-p ESPTOOL_PORT] -f FILENAME
+Usage: $(basename $0) [-h] [-p ESPTOOL_PORT] [-P PYTHON] [-f FILENAME|FILENAME]
Flash image file to device, leave existing system intact."
-h Display this help and exit
-p ESPTOOL_PORT Set the environment variable for ESPTOOL_PORT. If not set, ESPTOOL iterates all ports (Dangerrous).
- -f FILENAME The .bin file to flash. Custom to your device type and region.
+ -P PYTHON Specify alternate python interpreter to use to invoke esptool. (Default: "$PYTHON")
+ -f FILENAME The .bin file to flash. Custom to your device type and region.
EOF
}
-while getopts ":h:p:f:" opt; do
+while getopts ":hp:P:f:" opt; do
case "${opt}" in
h)
show_help
@@ -21,6 +24,8 @@ while getopts ":h:p:f:" opt; do
;;
p) export ESPTOOL_PORT=${OPTARG}
;;
+ P) PYTHON=${OPTARG}
+ ;;
f) FILENAME=${OPTARG}
;;
*)
@@ -32,11 +37,16 @@ while getopts ":h:p:f:" opt; do
done
shift "$((OPTIND-1))"
+[ -z "$FILENAME" -a -n "$1" ] && {
+ FILENAME=$1
+ shift
+}
+
if [ -f "${FILENAME}" ]; then
echo "Trying to flash update ${FILENAME}."
- esptool.py --baud 921600 write_flash 0x10000 ${FILENAME}
+ $PYTHON -m esptool --baud 921600 write_flash 0x10000 ${FILENAME}
echo "Erasing the otadata partition, which will turn off flash flippy-flop and force the first image to be used"
- esptool.py --baud 921600 erase_region 0xe000 0x2000
+ $PYTHON -m esptool --baud 921600 erase_region 0xe000 0x2000
else
echo "Invalid file: ${FILENAME}"
show_help
diff --git a/bin/mqtt-listen.sh b/bin/mqtt-listen.sh
new file mode 100755
index 000000000..73ccb50a3
--- /dev/null
+++ b/bin/mqtt-listen.sh
@@ -0,0 +1,3 @@
+
+mosquitto_sub -h mqtt.meshtastic.org -v -t \$SYS/\# -t msh/+/stat/\# -t msh/+/json/\#
+# mosquitto_sub -h test.mosquitto.org -v -t mesh/\# -F "%j"
diff --git a/bin/mqtt-send-status.sh b/bin/mqtt-send-status.sh
new file mode 100755
index 000000000..4df8a895e
--- /dev/null
+++ b/bin/mqtt-send-status.sh
@@ -0,0 +1 @@
+mosquitto_pub -h mqtt.meshtastic.org -u meshdev -P large4cats -t msh/1/stat/FakeNode -m online -d
diff --git a/bin/native-gdbserver.sh b/bin/native-gdbserver.sh
index 535260b6f..cbcbae4f9 100755
--- a/bin/native-gdbserver.sh
+++ b/bin/native-gdbserver.sh
@@ -1,3 +1,3 @@
set -e
pio run --environment native
-gdbserver --once localhost:2345 .pio/build/native/program
+gdbserver --once localhost:2345 .pio/build/native/program "$@"
diff --git a/bin/native-run.sh b/bin/native-run.sh
index 2a3677b07..64d44df52 100755
--- a/bin/native-run.sh
+++ b/bin/native-run.sh
@@ -1,3 +1,3 @@
set -e
pio run --environment native
-.pio/build/native/program
+.pio/build/native/program "$@"
diff --git a/bin/platformio-custom.py b/bin/platformio-custom.py
index 265158f75..d299f954f 100644
--- a/bin/platformio-custom.py
+++ b/bin/platformio-custom.py
@@ -1,16 +1,20 @@
+
+import subprocess
+import configparser
+import traceback
+import sys
+from readprops import readProps
+
Import("projenv")
-import configparser
prefsLoc = projenv["PROJECT_DIR"] + "/version.properties"
-config = configparser.RawConfigParser()
-config.read(prefsLoc)
-version = dict(config.items('VERSION'))
-verStr = "{}.{}.{}".format(version["major"], version["minor"], version["build"])
-
-print("Using meshtastic platform-custom.py, firmare version " + verStr)
+verObj = readProps(prefsLoc)
+print("Using meshtastic platform-custom.py, firmare version " + verObj['long'])
+# print("path is" + ','.join(sys.path))
# General options that are passed to the C and C++ compilers
projenv.Append(CCFLAGS=[
- "-DAPP_VERSION=" + verStr
- ])
+ "-DAPP_VERSION=" + verObj['long'],
+ "-DAPP_VERSION_SHORT=" + verObj['short']
+])
diff --git a/bin/program-1.0-tbeam.sh b/bin/program-1.0-tbeam.sh
new file mode 100755
index 000000000..b2b37756b
--- /dev/null
+++ b/bin/program-1.0-tbeam.sh
@@ -0,0 +1,3 @@
+esptool.py --baud 921600 write_flash 0x10000 release/archive/old/firmware-tbeam-EU865-1.0.0.bin
+echo "Erasing the otadata partition, which will turn off flash flippy-flop and force the first image to be used"
+esptool.py --baud 921600 erase_region 0xe000 0x2000
diff --git a/bin/program-1.1-tbeam.sh b/bin/program-1.1-tbeam.sh
index 9b95c3380..98ba5c682 100755
--- a/bin/program-1.1-tbeam.sh
+++ b/bin/program-1.1-tbeam.sh
@@ -1 +1 @@
-esptool.py --baud 921600 write_flash 0x10000 release/archive/firmware-tbeam-1.1.50.bin
+esptool.py --baud 921600 write_flash 0x10000 release/archive/old/firmware-tbeam-1.1.50.bin
diff --git a/bin/promote-release.sh b/bin/promote-release.sh
new file mode 100755
index 000000000..b4828dd68
--- /dev/null
+++ b/bin/promote-release.sh
@@ -0,0 +1,11 @@
+set -e
+
+echo "This script is only for developers who are publishing new builds on github. Most users don't need it"
+
+VERSION=`bin/buildinfo.py long`
+
+# Must have a V prefix to trigger github
+git tag "v${VERSION}"
+git push root "v${VERSION}" # push the tag
+
+echo "Tag ${VERSION} pushed to github, github actions should now be building the draft release. If it seems good, click to publish it"
diff --git a/bin/readprops.py b/bin/readprops.py
new file mode 100644
index 000000000..25eba4852
--- /dev/null
+++ b/bin/readprops.py
@@ -0,0 +1,37 @@
+
+
+import subprocess
+import configparser
+import traceback
+import sys
+
+
+def readProps(prefsLoc):
+ """Read the version of our project as a string"""
+
+ config = configparser.RawConfigParser()
+ config.read(prefsLoc)
+ version = dict(config.items('VERSION'))
+ verObj = dict(short = "{}.{}.{}".format(version["major"], version["minor"], version["build"]),
+ long = "unset")
+
+ # Try to find current build SHA if if the workspace is clean. This could fail if git is not installed
+ try:
+ sha = subprocess.check_output(
+ ['git', 'rev-parse', '--short', 'HEAD']).decode("utf-8").strip()
+ isDirty = subprocess.check_output(
+ ['git', 'diff', 'HEAD']).decode("utf-8").strip()
+ suffix = sha
+ if isDirty:
+ # short for 'dirty', we want to keep our verstrings source for protobuf reasons
+ suffix = sha + "-d"
+ verObj['long'] = "{}.{}.{}.{}".format(
+ version["major"], version["minor"], version["build"], suffix)
+ except:
+ # print("Unexpected error:", sys.exc_info()[0])
+ # traceback.print_exc()
+ verObj['long'] = verObj['short']
+
+ # print("firmare version " + verStr)
+ return verObj
+# print("path is" + ','.join(sys.path))
diff --git a/bin/regen-protos.sh b/bin/regen-protos.sh
index a3335e535..2d96f2b7b 100755
--- a/bin/regen-protos.sh
+++ b/bin/regen-protos.sh
@@ -10,6 +10,6 @@ echo "prebuilt binaries for your computer into nanopb-0.4.4"
cd proto
../nanopb-0.4.4/generator-bin/protoc --nanopb_out=-v:../src/mesh/generated -I=../proto *.proto
-echo "Regenerating protobuf documentation - if you see an error message"
-echo "you can ignore it unless doing a new protobuf release to github."
-bin/regen-docs.sh
\ No newline at end of file
+#echo "Regenerating protobuf documentation - if you see an error message"
+#echo "you can ignore it unless doing a new protobuf release to github."
+#bin/regen-docs.sh
\ No newline at end of file
diff --git a/bin/run-both.sh b/bin/run-both.sh
index e5a66b329..1d8c8fdb2 100755
--- a/bin/run-both.sh
+++ b/bin/run-both.sh
@@ -1,11 +1,13 @@
set -e
-pio run
+TARG=tbeam
+
+pio run -e $TARG
echo uploading to usb1
-pio run --upload-port /dev/ttyUSB1 -t upload &
+pio run --upload-port /dev/ttyUSB1 -t upload -e $TARG &
echo uploading to usb0
-pio run --upload-port /dev/ttyUSB0 -t upload &
+pio run --upload-port /dev/ttyUSB0 -t upload -e $TARG &
-wait
\ No newline at end of file
+wait
diff --git a/bin/test-simulator.sh b/bin/test-simulator.sh
new file mode 100755
index 000000000..46158dc56
--- /dev/null
+++ b/bin/test-simulator.sh
@@ -0,0 +1,9 @@
+set -e
+
+echo "Starting simulator"
+.pio/build/native/program &
+sleep 20 # 5 seconds was not enough
+
+echo "Simulator started, launching python test..."
+python3 -c 'from meshtastic.test import testSimulator; testSimulator()'
+
diff --git a/bin/upload-to-bootloader.sh b/bin/upload-to-bootloader.sh
index ba4b7b48c..0dd87ef1d 100755
--- a/bin/upload-to-bootloader.sh
+++ b/bin/upload-to-bootloader.sh
@@ -1,4 +1,5 @@
+set -e
echo "Converting to uf2 for NRF52 Adafruit bootloader"
-bin/uf2conv.py .pio/build/lora-relay-v2/firmware.hex -f 0xADA52840
-# cp flash.uf2 /media/kevinh/FTH*BOOT/
+bin/uf2conv.py .pio/build/t-echo/firmware.hex -f 0xADA52840
+cp flash.uf2 /media/kevinh/FTH*BOOT/
diff --git a/bin/upload-to-rak4631.sh b/bin/upload-to-rak4631.sh
new file mode 100755
index 000000000..95ade3e37
--- /dev/null
+++ b/bin/upload-to-rak4631.sh
@@ -0,0 +1,5 @@
+set -e
+
+echo "Converting to uf2 for NRF52 Adafruit bootloader"
+bin/uf2conv.py .pio/build/rak4631/firmware.hex -f 0xADA52840
+cp flash.uf2 /media/kevinh/FTH*BOOT/
diff --git a/boards/lora_isp4520.json b/boards/lora_isp4520.json
new file mode 100644
index 000000000..180cd2fe7
--- /dev/null
+++ b/boards/lora_isp4520.json
@@ -0,0 +1,48 @@
+{
+ "build": {
+ "arduino": {
+ "ldscript": "nrf52832_s132_v6.ld"
+ },
+ "core": "nRF5",
+ "cpu": "cortex-m4",
+ "extra_flags": "-DNRF52832_XXAA -DNRF52",
+ "f_cpu": "64000000L",
+ "mcu": "nrf52832",
+ "variant": "lora_isp4520",
+ "bsp": {
+ "name": "adafruit"
+ },
+ "softdevice": {
+ "sd_flags": "-DS132",
+ "sd_name": "s132",
+ "sd_version": "6.1.1",
+ "sd_fwid": "0x00B7"
+ }
+ },
+ "connectivity": [
+ "bluetooth"
+ ],
+ "debug": {
+ "jlink_device": "nRF52832_xxAA",
+ "svd_path": "nrf52.svd"
+ },
+ "frameworks": [
+ "arduino"
+ ],
+ "name": "lora ISP4520",
+ "upload": {
+ "maximum_ram_size": 65536,
+ "maximum_size": 524288,
+ "require_upload_port": true,
+ "speed": 115200,
+ "protocol": "nrfutil",
+ "protocols": [
+ "jlink",
+ "nrfjprog",
+ "nrfutil",
+ "stlink"
+ ]
+ },
+ "url": "",
+ "vendor": "PsiSoft"
+}
\ No newline at end of file
diff --git a/boards/eink.json b/boards/t-echo.json
similarity index 71%
rename from boards/eink.json
rename to boards/t-echo.json
index e2414b23f..da67ef05e 100644
--- a/boards/eink.json
+++ b/boards/t-echo.json
@@ -15,7 +15,7 @@
],
"usb_product": "TTGO_eink",
"mcu": "nrf52840",
- "variant": "eink",
+ "variant": "t-echo",
"variants_dir": "variants",
"bsp": {
"name": "adafruit"
@@ -44,17 +44,20 @@
"arduino"
],
"name": "TTGO eink (Adafruit BSP)",
- "upload": {
- "maximum_ram_size": 248832,
- "maximum_size": 815104,
- "require_upload_port": true,
- "speed": 115200,
- "protocol": "jlink",
- "protocols": [
- "jlink",
- "nrfjprog",
- "stlink"
- ]
+ "upload": {
+ "maximum_ram_size": 248832,
+ "maximum_size": 815104,
+ "speed": 115200,
+ "protocol": "nrfutil",
+ "protocols": [
+ "jlink",
+ "nrfjprog",
+ "nrfutil",
+ "stlink"
+ ],
+ "use_1200bps_touch": true,
+ "require_upload_port": true,
+ "wait_for_upload_port": true
},
"url": "FIXME",
"vendor": "TTGO"
diff --git a/boards/wiscore_rak4600.json b/boards/wiscore_rak4600.json
new file mode 100644
index 000000000..56f73f4b5
--- /dev/null
+++ b/boards/wiscore_rak4600.json
@@ -0,0 +1,71 @@
+{
+ "build": {
+ "arduino": {
+ "ldscript": "nrf52832_s132_v6.ld"
+ },
+ "core": "nRF5",
+ "cpu": "cortex-m4",
+ "extra_flags": "-DNRF52832_XXAA -DNRF52",
+ "f_cpu": "64000000L",
+ "hwids": [
+ [
+ "0x239A",
+ "0x8029"
+ ],
+ [
+ "0x239A",
+ "0x0029"
+ ],
+ [
+ "0x239A",
+ "0x002A"
+ ],
+ [
+ "0x239A",
+ "0x802A"
+ ]
+ ],
+ "usb_product": "Feather nRF52832 Express",
+ "mcu": "nrf52832",
+ "variant": "WisCore_RAK4600_Board",
+ "bsp": {
+ "name": "adafruit"
+ },
+ "softdevice": {
+ "sd_flags": "-DS132",
+ "sd_name": "s132",
+ "sd_version": "6.1.1",
+ "sd_fwid": "0x00B7"
+ },
+ "zephyr": {
+ "variant": "nrf52_adafruit_feather"
+ }
+ },
+ "connectivity": [
+ "bluetooth"
+ ],
+ "debug": {
+ "jlink_device": "nRF52832_xxAA",
+ "svd_path": "nrf52.svd"
+ },
+ "frameworks": [
+ "arduino",
+ "zephyr"
+ ],
+ "name": "Adafruit Bluefruit nRF52832 Feather",
+ "upload": {
+ "maximum_ram_size": 65536,
+ "maximum_size": 524288,
+ "require_upload_port": true,
+ "speed": 115200,
+ "protocol": "nrfutil",
+ "protocols": [
+ "jlink",
+ "nrfjprog",
+ "nrfutil",
+ "stlink"
+ ]
+ },
+ "url": "https://www.adafruit.com/product/3406",
+ "vendor": "Adafruit"
+}
\ No newline at end of file
diff --git a/boards/wiscore_rak4631.json b/boards/wiscore_rak4631.json
new file mode 100644
index 000000000..40c93ff04
--- /dev/null
+++ b/boards/wiscore_rak4631.json
@@ -0,0 +1,72 @@
+{
+ "build": {
+ "arduino": {
+ "ldscript": "nrf52840_s140_v6.ld"
+ },
+ "core": "nRF5",
+ "cpu": "cortex-m4",
+ "extra_flags": "-DARDUINO_NRF52840_FEATHER -DNRF52840_XXAA",
+ "f_cpu": "64000000L",
+ "hwids": [
+ [
+ "0x239A",
+ "0x8029"
+ ],
+ [
+ "0x239A",
+ "0x0029"
+ ],
+ [
+ "0x239A",
+ "0x002A"
+ ],
+ [
+ "0x239A",
+ "0x802A"
+ ]
+ ],
+ "usb_product": "WisCore RAK4631 Board",
+ "mcu": "nrf52840",
+ "variant": "WisCore_RAK4631_Board",
+ "bsp": {
+ "name": "adafruit"
+ },
+ "softdevice": {
+ "sd_flags": "-DS140",
+ "sd_name": "s140",
+ "sd_version": "6.1.1",
+ "sd_fwid": "0x00B6"
+ },
+ "bootloader": {
+ "settings_addr": "0xFF000"
+ }
+ },
+ "connectivity": [
+ "bluetooth"
+ ],
+ "debug": {
+ "jlink_device": "nRF52840_xxAA",
+ "svd_path": "nrf52840.svd"
+ },
+ "frameworks": [
+ "arduino"
+ ],
+ "name": "WisCore RAK4631 Board",
+ "upload": {
+ "maximum_ram_size": 248832,
+ "maximum_size": 815104,
+ "speed": 115200,
+ "protocol": "nrfutil",
+ "protocols": [
+ "jlink",
+ "nrfjprog",
+ "nrfutil",
+ "stlink"
+ ],
+ "use_1200bps_touch": true,
+ "require_upload_port": true,
+ "wait_for_upload_port": true
+ },
+ "url": "https://www.rakwireless.com",
+ "vendor": "RAKwireless"
+}
\ No newline at end of file
diff --git a/data/static/basic.js b/data/static/basic.js
deleted file mode 100644
index 5cbb8d72b..000000000
--- a/data/static/basic.js
+++ /dev/null
@@ -1,43 +0,0 @@
-var meshtasticClient;
-var connectionOne;
-
-
-// Important: the connect action must be called from a user interaction (e.g. button press), otherwise the browsers won't allow the connect
-function connect() {
-
- // Create new connection
- var httpconn = new meshtasticjs.IHTTPConnection();
-
- // Set connection params
- let sslActive;
- if (window.location.protocol === 'https:') {
- sslActive = true;
- } else {
- sslActive = false;
- }
- let deviceIp = window.location.hostname; // Your devices IP here
-
-
- // Add event listeners that get called when a new packet is received / state of device changes
- httpconn.addEventListener('fromRadio', function (packet) { console.log(packet) });
-
- // Connect to the device async, then send a text message
- httpconn.connect(deviceIp, sslActive)
- .then(result => {
-
- alert('device has been configured')
- // This gets called when the connection has been established
- // -> send a message over the mesh network. If no recipient node is provided, it gets sent as a broadcast
- return httpconn.sendText('meshtastic is awesome');
-
- })
- .then(result => {
-
- // This gets called when the message has been sucessfully sent
- console.log('Message sent!');
- })
-
- .catch(error => { console.log(error); });
-
-}
-
diff --git a/data/static/index.html b/data/static/index.html
index 663203013..9297288c7 100644
--- a/data/static/index.html
+++ b/data/static/index.html
@@ -1,18 +1 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
\ No newline at end of file
+not yet supported - soon will be included in build
diff --git a/data/static/meshtastic.js.gz b/data/static/meshtastic.js.gz
deleted file mode 100644
index 3f02faf02..000000000
Binary files a/data/static/meshtastic.js.gz and /dev/null differ
diff --git a/docs/.well-known/assetlinks.json b/docs/.well-known/assetlinks.json
deleted file mode 100644
index 85d22f4a6..000000000
--- a/docs/.well-known/assetlinks.json
+++ /dev/null
@@ -1,9 +0,0 @@
-[{
- "relation": ["delegate_permission/common.handle_all_urls"],
- "target": {
- "namespace": "android_app",
- "package_name": "com.geeksville.mesh",
- "sha256_cert_fingerprints":
- ["D0:05:E7:8B:D2:1B:FA:94:56:1D:6B:90:EB:53:07:1A:74:4F:D9:C2:6F:13:87:6A:D9:17:4F:C2:59:48:02:9D", "42:17:52:DC:57:40:38:B5:6B:86:61:1C:2F:47:DB:2B:0F:A2:EA:59:E1:18:9C:AA:90:8D:37:D6:CD:40:0E:BB", "A9:3B:45:65:68:C1:75:DB:08:00:A0:9F:06:77:7F:89:2D:81:24:32:AD:B8:A3:DF:73:BC:3E:7F:06:C8:0C:6D"]
- }
-}]
diff --git a/docs/CNAME b/docs/CNAME
deleted file mode 100644
index 42401b5e8..000000000
--- a/docs/CNAME
+++ /dev/null
@@ -1 +0,0 @@
-www.meshtastic.org
\ No newline at end of file
diff --git a/docs/README.md b/docs/README.md
deleted file mode 100644
index 4a124156f..000000000
--- a/docs/README.md
+++ /dev/null
@@ -1,97 +0,0 @@
-# What is Meshtastic?
-
-Meshtastic® is a project that lets you use
-inexpensive (\$30 ish) GPS radios as an extensible, long battery life, secure, mesh GPS communicator. These radios are great for hiking, skiing, paragliding - essentially any hobby where you don't have reliable internet access. Each member of your private mesh can always see the location and distance of all other members and any text messages sent to your group chat.
-
-The radios automatically create a mesh to forward packets as needed, so everyone in the group can receive messages from even the furthest member. The radios will optionally work with your phone, but no phone is required.
-
-Note: Questions after reading this? See our new [forum](https://meshtastic.discourse.group/).
-
-## Uses
-
-- Outdoor sports where cellular coverage is limited. (Hiking, Skiing, Boating, Paragliding, Gliders etc..)
-- Applications where closed source GPS communicators just won't cut it (it is easy to add features for glider pilots etc...)
-- Secure long-range communication within groups without depending on cellular providers
-- Finding your lost kids ;-)
-- Through our [python API](https://pypi.org/project/meshtastic/) use these inexpensive radios to easily add mesh networking to your own projects.
-
-[](https://www.youtube.com/watch?v=WlNbMbVZlHI "Meshtastic early demo")
-
-## Features
-
-Not all of these features are fully implemented yet - see **important** disclaimers below. But they should be in by the time we decide to call this project beta (three months?)
-
-- Very long battery life (should be about eight days with the beta software)
-- Built in GPS and [LoRa](https://en.wikipedia.org/wiki/LoRa) radio, but we manage the radio automatically for you
-- Long range - a few miles per node but each node will forward packets as needed
-- Secure - channels are encrypted by AES256 (But see important disclaimers below wrt this feature)
-- Shows direction and distance to all members of your channel
-- Directed or broadcast text messages for channel members
-- Open and extensible codebase supporting multiple hardware vendors - no lock in to one vendor
-- Communication API for bluetooth devices (such as our Android app) to use the mesh. An iOS application is in the works. And [Meshtastic-python](https://pypi.org/project/meshtastic/) provides access from desktop computers.
-- Very easy sharing of private secured channels. Just share a special link or QR code with friends and they can join your encrypted mesh
-
-This project is currently in beta testing but it is fairly stable and feature complete - if you have questions please [join our discussion forum](https://meshtastic.discourse.group/).
-
-This software is 100% open source and developed by a group of hobbyist experimenters. No warranty is provided, if you'd like to improve it - we'd love your help. Please post in the [forum](https://meshtastic.discourse.group/).
-
-### Beginner's Guide
-
-For an detailed walk-through aimed at beginners, we recommend [meshtastic.letstalkthis.com](https://meshtastic.letstalkthis.com/).
-
-### Related Groups
-
-Telegram group for **Italy**-based users [t.me/meshtastic_italia](http://t.me/meshtastic_italia) (Italian language, unofficial).
-Telegram group for **Russian**-based users [t.me/meshtastic_russia](https://t.me/meshtastic_russia) (Russian language, unofficial).
-
-# Updates
-
-Note: Updates are happening almost daily, only major updates are listed below. For more details see our forum.
-
-- 09/14/2020 - 1.0.0 Now with over 1700 android users, over 2000 nodes and translated into 15 languages. This project will always be a "beta" experiment, but now quite usable. We are currently selecting 1.1 features in our discussion forum.
-- 06/24/2020 - 0.7.x Now with over 1000 android users, over 600 people using the radios and translated into 22 languages. Fairly stable and we are working through bugs to get to 1.0.
-- 06/04/2020 - 0.6.7 Beta releases of both the application and the device code are released. Features are fairly solid now with a sizable number of users.
-- 04/28/2020 - 0.6.0 [Python API](https://pypi.org/project/meshtastic/) released. Makes it easy to use meshtastic devices as "zero config / just works" mesh transport adapters for other projects.
-- 04/20/2020 - 0.4.3 Pretty solid now both for the android app and the device code. Many people have donated translations and code. Probably going to call it a beta soon.
-- 03/03/2020 - 0.0.9 of the Android app and device code is released. Still an alpha but fairly functional.
-- 02/25/2020 - 0.0.4 of the Android app is released. This is a very early alpha, see below to join the alpha-testers group.
-- 02/23/2020 - 0.0.4 release. Still very bleeding edge but much closer to the final power management, a charged T-BEAM should run for many days with this load. If you'd like to try it, we'd love your feedback. Click [here](https://github.com/meshtastic/Meshtastic-esp32/blob/master/README.md) for instructions.
-- 02/20/2020 - Our first alpha release (0.0.3) of the radio software is ready brave early people.
-
-## Meshtastic Android app
-
-Our Android application is available here:
-
-[](https://play.google.com/store/apps/details?id=com.geeksville.mesh&referrer=utm_source%3Dgithub-homepage)
-
-The link above will return older more stable releases. We would prefer if you join our alpha-test group, because the application is rapidly improving. Three steps to opt-in to the alpha- test:
-
-1. Join [this Google group](https://groups.google.com/forum/#!forum/meshtastic-alpha-testers) with the account you use in Google Play.
-2. Go to this [URL](https://play.google.com/apps/testing/com.geeksville.mesh) to opt-in to the alpha test.
-3. If you encounter any problems or have questions, post in our [forum](https://meshtastic.discourse.group/) and we'll help.
-
-If you'd like to help with development, the source code is [on github](https://github.com/meshtastic/Meshtastic-Android).
-
-The app is also distributed for Amazon Fire devices via the Amazon appstore: [](https://www.amazon.com/Geeksville-Industries-Meshtastic/dp/B08CY9394Q)
-
-## Supported hardware
-
-We currently support two brands of radios. The [TTGO T-Beam](https://www.aliexpress.com/item/4001178678568.html) and the [Heltec LoRa 32](https://heltec.org/project/wifi-lora-32/). Most people should buy the T-Beam and a 18650 battery (total cost less than \$35). Also, the version of the T-Beam we link to is shipped with Meshtastic **preinstalled** by TTGO, so you don't have to install it yourself.
-
-Make sure to buy the frequency range which is legal for your country. For the USA, you should buy the 915MHz version. Getting a version that include a screen is optional, but highly recommended.
-
-Instructions for installing prebuilt firmware can be found [here](https://github.com/meshtastic/Meshtastic-esp32/blob/master/README.md).
-
-For a nice looking cases:
-
-- 3D printable cases
- 1. TTGO T-Beam V0 see this [design](https://www.thingiverse.com/thing:3773717) by [bsiege](https://www.thingiverse.com/bsiege).
- 2. TTGO T_Beam V1 (SMA) see this [design](https://www.thingiverse.com/thing:3830711) by [rwanrooy](https://www.thingiverse.com/rwanrooy) or this [remix](https://www.thingiverse.com/thing:3949330) by [8ung](https://www.thingiverse.com/8ung)
- 3. TTGO T_Beam V1 (IPEX) see this [design](https://www.thingiverse.com/thing:4587297) by [drewsed](https://www.thingiverse.com/drewsed)
- 4. Heltec Lora32 see this [design](https://www.thingiverse.com/thing:3125854) by [ornotermes](https://www.thingiverse.com/ornotermes).
-- Laser-cut cases
- 1. TTGO T_Beam V1 (SMA) see this [design](https://www.thingiverse.com/thing:4552771) by [jefish](https://www.thingiverse.com/jefish)
-
-# IMPORTANT DISCLAIMERS AND FAQ
-
-For a listing of currently missing features and a FAQ click [here](faq.md).
diff --git a/docs/SupportedHardware.md b/docs/SupportedHardware.md
deleted file mode 100644
index 5cbc46616..000000000
--- a/docs/SupportedHardware.md
+++ /dev/null
@@ -1,8 +0,0 @@
-| Vendor | Product line | Version | Board labels | Notes | URL |
-|---|---|---|---|---|---|
-| TTGO | T-Beam | 0.7 | T22_V07 20180711 | LoRa 433/470MHz *OR* LoRa 868/915MHz ,
GPS ublox NEO-6M ,
battery holder for Li-Ion 18650 | [buy](https://www.aliexpress.com/item/4000574335430.html) |
-| TTGO | T-Beam | 1.0 | | | [buy](https://www.aliexpress.com/item/4001178678568.html) |
-| TTGO | T-Beam | 1.1 | T22_V11 20191212 | LoRa 433/470MHz *OR* LoRa 868/915MHz *OR* LoRa 923MHz ,
GPS ublox NEO-M8N ,
battery holder for Li-Ion 18650 | [buy](https://www.aliexpress.com/item/4001178678568.html) |
-| TTGO | Lora32 | 2.0 | *missing* | LoRa 433/470MHz *OR* LoRa 868/915MHz ,
OLED SSD1306 ,
SD card holder | [buy](https://www.aliexpress.com/item/4000211331316.html) |
-| TTGO | Lora32 | 2.1 | T3_V1.6 20180606 | LoRa 32 (V2) ,
SD card holder | [buy](https://www.aliexpress.com/item/4000119208093.html) |
-| Heltec | Lora 32 | V2 | V2 | LoRa 433/470MHz *OR* LoRa 868/915MHz | [buy](https://heltec.org/project/wifi-lora-32/) |
diff --git a/docs/_config.yml b/docs/_config.yml
deleted file mode 100644
index 1cb1a55ba..000000000
--- a/docs/_config.yml
+++ /dev/null
@@ -1,8 +0,0 @@
-theme: jekyll-theme-cayman
-
-title: Meshtastic
-description: An opensource hiking, pilot, skiing, secure GPS mesh communicator
-google_analytics: G-DRZ5H5EXHV
-
-include: [".well-known"]
-
diff --git a/docs/desk-video-screenshot.png b/docs/desk-video-screenshot.png
deleted file mode 100644
index 01aa6e19e..000000000
Binary files a/docs/desk-video-screenshot.png and /dev/null differ
diff --git a/docs/editing-this-site.md b/docs/editing-this-site.md
deleted file mode 100644
index c26e654b9..000000000
--- a/docs/editing-this-site.md
+++ /dev/null
@@ -1,10 +0,0 @@
-If you'd like to edit this website and test it locally:
-
-Not yet implemented:
-Per https://help.github.com/en/github/working-with-github-pages/testing-your-github-pages-site-locally-with-jekyll
-
-* follow instructions here: https://jekyllrb.com/docs/installation/ubuntu/
-* run "run-locally.sh"
-* view webpages at localhost:4000
-
-The template seems to come from here: https://github.com/pages-themes/cayman
diff --git a/docs/faq.md b/docs/faq.md
deleted file mode 100644
index b17a693fd..000000000
--- a/docs/faq.md
+++ /dev/null
@@ -1,34 +0,0 @@
-# Disclaimers
-
-This project is still pretty young but moving at a pretty good pace. Not all features are fully implemented in the current alpha builds.
-Most of these problems should be solved by the beta release (within three months):
-
-- We don't make these devices and they haven't been tested by UL or the FCC. If you use them you are experimenting and we can't promise they won't burn your house down ;-)
-- The encryption implementation is good but see this list of [caveats](software/crypto.md#summary-of-strengthsweaknesses-of-our-current-implementation) to determine risks you might face.
-- A number of (straightforward) software work items have to be completed before battery life matches our measurements, currently battery life is about three days. Join us on chat if you want the spreadsheet of power measurements/calculations.
-- The Android API needs to be documented better
-- No one has written an iOS app yet. But some good souls [are talking about it](https://github.com/meshtastic/Meshtastic-esp32/issues/14) ;-)
-
-For more details see the [device software TODO](https://github.com/meshtastic/Meshtastic-esp32/blob/master/docs/software/TODO.md) or the [Android app TODO](https://github.com/meshtastic/Meshtastic-Android/blob/master/TODO.md).
-
-# FAQ
-
-If you have a question missing from this faq, please [ask in our discussion forum](https://meshtastic.discourse.group/). And if you are feeling extra generous send in a pull-request for this faq.md with whatever we answered ;-).
-
-## Q: Which of the various supported radios should I buy?
-
-Basically you just need the radio + (optional but recommended) battery. The TBEAM is usually better because it has gps and huge battery socket. The Heltec is basically the same hardware but without the GPS (the phone provides position data to the radio in that case, so the behavior is similar - but it does burn some battery in the phone). Also the battery for the Heltec can be smaller.
-
-In addition to Aliexpress, (banggood.com) usually has stock and faster shipping, or Amazon. If buying a TBEAM, make sure to buy a version that includes the OLED screen - this project doesn't absolutely require the screen, but we use it if is installed.
-
-@claesg has added links to various 3D printable cases, you can see them at (www.meshtastic.org).
-
-## Q: Do you have plans to commercialize this project
-
-Nope. though if some other person/group wanted to use this software and a more customized device we think that would be awesome (as long as they obey the GPL license).
-
-## Q: Does this project use patented algorithms?
-
-(Kindly borrowed from the geeks at [ffmpeg](http://ffmpeg.org/legal.html))
-
-We do not know, we are not lawyers so we are not qualified to answer this. Also we have never read patents to implement any part of this, so even if we were qualified we could not answer it as we do not know what is patented. Furthermore the sheer number of software patents makes it impossible to read them all so no one (lawyer or not) could answer such a question with a definite no. We are merely geeks experimenting on a fun and free project.
diff --git a/docs/hardware/AN1200_22_Semtech_LoRa_Basics_v2_STD.pdf b/docs/hardware/AN1200_22_Semtech_LoRa_Basics_v2_STD.pdf
deleted file mode 100644
index 751a6c8d1..000000000
Binary files a/docs/hardware/AN1200_22_Semtech_LoRa_Basics_v2_STD.pdf and /dev/null differ
diff --git a/docs/hardware/AXP192 Datasheet_v1.1_en_draft_2211.pdf b/docs/hardware/AXP192 Datasheet_v1.1_en_draft_2211.pdf
deleted file mode 100644
index fe79b1075..000000000
Binary files a/docs/hardware/AXP192 Datasheet_v1.1_en_draft_2211.pdf and /dev/null differ
diff --git a/docs/hardware/DS_SX1261-2_V1.2.pdf b/docs/hardware/DS_SX1261-2_V1.2.pdf
deleted file mode 100644
index 2d6c51cb5..000000000
Binary files a/docs/hardware/DS_SX1261-2_V1.2.pdf and /dev/null differ
diff --git a/docs/hardware/DS_SX1276-7-8-9_W_APP_V6.pdf b/docs/hardware/DS_SX1276-7-8-9_W_APP_V6.pdf
deleted file mode 100644
index 2a9298797..000000000
Binary files a/docs/hardware/DS_SX1276-7-8-9_W_APP_V6.pdf and /dev/null differ
diff --git a/docs/hardware/LoRa Design Guide.pdf b/docs/hardware/LoRa Design Guide.pdf
deleted file mode 100644
index af4abade0..000000000
Binary files a/docs/hardware/LoRa Design Guide.pdf and /dev/null differ
diff --git a/docs/hardware/NEO-6_DataSheet_(GPS.G6-HW-09005).pdf b/docs/hardware/NEO-6_DataSheet_(GPS.G6-HW-09005).pdf
deleted file mode 100644
index edce4d08a..000000000
Binary files a/docs/hardware/NEO-6_DataSheet_(GPS.G6-HW-09005).pdf and /dev/null differ
diff --git a/docs/hardware/RFM95_96_97_98W.pdf b/docs/hardware/RFM95_96_97_98W.pdf
deleted file mode 100644
index f8d184883..000000000
Binary files a/docs/hardware/RFM95_96_97_98W.pdf and /dev/null differ
diff --git a/docs/hardware/T-SX1262.pdf b/docs/hardware/T-SX1262.pdf
deleted file mode 100644
index 0e9fbfc11..000000000
Binary files a/docs/hardware/T-SX1262.pdf and /dev/null differ
diff --git a/docs/hardware/T_BeamV1.0.pdf b/docs/hardware/T_BeamV1.0.pdf
deleted file mode 100644
index 6e87b33f1..000000000
Binary files a/docs/hardware/T_BeamV1.0.pdf and /dev/null differ
diff --git a/docs/hardware/WIFI_LoRa_32_V2(868-915).PDF b/docs/hardware/WIFI_LoRa_32_V2(868-915).PDF
deleted file mode 100644
index 11d499e7d..000000000
Binary files a/docs/hardware/WIFI_LoRa_32_V2(868-915).PDF and /dev/null differ
diff --git a/docs/hardware/air530/Air530 GPS Manual Text English.pdf b/docs/hardware/air530/Air530 GPS Manual Text English.pdf
deleted file mode 100644
index 99c52ba3e..000000000
Binary files a/docs/hardware/air530/Air530 GPS Manual Text English.pdf and /dev/null differ
diff --git a/docs/hardware/air530/Air530_GPS_User_Booklet.V1.7.pdf b/docs/hardware/air530/Air530_GPS_User_Booklet.V1.7.pdf
deleted file mode 100644
index 5b0528ad6..000000000
Binary files a/docs/hardware/air530/Air530_GPS_User_Booklet.V1.7.pdf and /dev/null differ
diff --git a/docs/hardware/axp192-complete-datasheet-chinese.pdf b/docs/hardware/axp192-complete-datasheet-chinese.pdf
deleted file mode 100644
index b7e6e4042..000000000
Binary files a/docs/hardware/axp192-complete-datasheet-chinese.pdf and /dev/null differ
diff --git a/docs/hardware/corvus.md b/docs/hardware/corvus.md
deleted file mode 100644
index f1089f3ae..000000000
--- a/docs/hardware/corvus.md
+++ /dev/null
@@ -1,35 +0,0 @@
-# Notes on @BigCorvus boards
-
-## Board version 1.1
-
-variant name lora_relay_v1
-
-### Remaining TODOs
-
-- power hold for the ST7735
-- look at example sketch
-- turn on xmit boost
-
-## Recommendations for future boards
-
-@BigCorvus your board is **really** nice. Here's some ideas for the future:
-
-- make the SWDIO header more standard (the small ARM 2x5 micro footprint?) or at least througholes so it is easy to solder a header
-
-## How to program bootloader
-
-Download from here: https://github.com/adafruit/Adafruit_nRF52_Bootloader/releases
-
-```
-nrfjprog -f nrf52 --eraseall
-Erasing user available code and UICR flash areas.
-Applying system reset.
-
-nrfjprog -f nrf52 --program feather_nrf52840_express_bootloader-0.3.2_s140_6.1.1.hex
-Parsing hex file.
-Reading flash area to program to guarantee it is erased.
-Checking that the area to write is not protected.
-Programming device.
-```
-
-Then reboot the board, if all went well it now shows up as a mountable filesystem on your USB bus.
diff --git a/docs/hardware/cubecell-TODO.md b/docs/hardware/cubecell-TODO.md
deleted file mode 100644
index b96acbb36..000000000
--- a/docs/hardware/cubecell-TODO.md
+++ /dev/null
@@ -1,6 +0,0 @@
-
-https://heltec-automation-docs.readthedocs.io/en/latest/cubecell/index.html
-
-https://github.com/HelTecAutomation/ASR650x-Arduino?utm_source=platformio.org&utm_medium=docs
-
-* Either portfreertos or make not theaded versions of Lock, WorkerThread, Queue (probably the latter).
diff --git a/docs/hardware/esp32_datasheet_en.pdf b/docs/hardware/esp32_datasheet_en.pdf
deleted file mode 100644
index fe70244fd..000000000
Binary files a/docs/hardware/esp32_datasheet_en.pdf and /dev/null differ
diff --git a/docs/hardware/heltec-wifi-lora-32-v2-915.pdf b/docs/hardware/heltec-wifi-lora-32-v2-915.pdf
deleted file mode 100644
index 11d499e7d..000000000
Binary files a/docs/hardware/heltec-wifi-lora-32-v2-915.pdf and /dev/null differ
diff --git a/docs/hardware/lora-fcc-requirements.pdf b/docs/hardware/lora-fcc-requirements.pdf
deleted file mode 100644
index d1c2beb4f..000000000
Binary files a/docs/hardware/lora-fcc-requirements.pdf and /dev/null differ
diff --git a/docs/hardware/nrf52/nrf52-programming.png b/docs/hardware/nrf52/nrf52-programming.png
deleted file mode 100644
index b99a2691c..000000000
Binary files a/docs/hardware/nrf52/nrf52-programming.png and /dev/null differ
diff --git a/docs/hardware/pe4259ds-rf-switch.pdf b/docs/hardware/pe4259ds-rf-switch.pdf
deleted file mode 100644
index fc6448008..000000000
Binary files a/docs/hardware/pe4259ds-rf-switch.pdf and /dev/null differ
diff --git a/docs/hardware/pinetab/PineTab LoRa schematic.pdf b/docs/hardware/pinetab/PineTab LoRa schematic.pdf
deleted file mode 100644
index 9529a30c8..000000000
Binary files a/docs/hardware/pinetab/PineTab LoRa schematic.pdf and /dev/null differ
diff --git a/docs/hardware/pinetab/SX1302/DS_SX1302_V1.0.pdf b/docs/hardware/pinetab/SX1302/DS_SX1302_V1.0.pdf
deleted file mode 100644
index 875008792..000000000
Binary files a/docs/hardware/pinetab/SX1302/DS_SX1302_V1.0.pdf and /dev/null differ
diff --git a/docs/hardware/pinetab/SX1302/M-GW1302S 用户手册(2)(1)(1).pdf b/docs/hardware/pinetab/SX1302/M-GW1302S 用户手册(2)(1)(1).pdf
deleted file mode 100644
index 9ad7bbb79..000000000
Binary files a/docs/hardware/pinetab/SX1302/M-GW1302S 用户手册(2)(1)(1).pdf and /dev/null differ
diff --git a/docs/hardware/pinetab/SX1302/M-GW1302S(射频版)硬件设计手册_V1.1.pdf b/docs/hardware/pinetab/SX1302/M-GW1302S(射频版)硬件设计手册_V1.1.pdf
deleted file mode 100644
index bdc8bb250..000000000
Binary files a/docs/hardware/pinetab/SX1302/M-GW1302S(射频版)硬件设计手册_V1.1.pdf and /dev/null differ
diff --git a/docs/hardware/pinetab/SX1302/M-GW1302(é€ä¼ 版)_硬件设计手册.pdf b/docs/hardware/pinetab/SX1302/M-GW1302(é€ä¼ 版)_硬件设计手册.pdf
deleted file mode 100644
index 40c23e36c..000000000
Binary files a/docs/hardware/pinetab/SX1302/M-GW1302(é€ä¼ 版)_硬件设计手册.pdf and /dev/null differ
diff --git a/docs/hardware/pinetab/ch341h_datasheet.pdf b/docs/hardware/pinetab/ch341h_datasheet.pdf
deleted file mode 100644
index 4e3bea23e..000000000
--- a/docs/hardware/pinetab/ch341h_datasheet.pdf
+++ /dev/null
@@ -1,990 +0,0 @@
-%PDF-1.6
%âãÏÓ
-2 0 obj
<>
endobj
196 0 obj
<>stream
-
-
-
-
- application/pdf
-
-
- Provided By ALLDATASHEET.COM(FREE DATASHEET DOWNLOAD SITE)
-
-
-
-
- DATASHEET SEARCH SITE | WWW.ALLDATASHEET.COM
-
-
-
-
- DATASHEET SEARCH, DATABOOK, COMPONENT, FREE DOWNLOAD SITE
-
-
-
-
- PDF
- DATASHEET
- PDF DATASHEET
- IC
- CHIP
- SEMICONDUCTOR
- TRANSISTOR
- ELECTRONIC COMPONENT
- ISO COMPONENT
- ALLDATASHEET
- DATABOOK
- CATALOG
- ARCHIVE
-
-
-
-
- D:20091209171130+08'00'
- pdfFactory Pro www.fineprint.cn
- pdfFactory Pro 3.16 (Windows XP Professional Chinese)
-
-
- PDF, DATASHEET, PDF DATASHEET, IC, CHIP, SEMICONDUCTOR, TRANSISTOR, ELECTRONIC COMPONENT, ISO COMPONENT, ALLDATASHEET, DATABOOK, CATALOG, ARCHIVE
-
-
- 2019-04-08T11:26:17+09:00
- 2019-04-08T11:26:17+09:00
- 2019-04-08T11:26:17+09:00
-
-
- uuid:04c8c137-1a4e-4765-9839-dd92a8631224
- uuid:c1ff7b8c-1d00-40d0-bd2f-1e0f374798cd
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-endstream
endobj
123 0 obj
<>
endobj
3 0 obj
<>
endobj
124 0 obj
<>
endobj
6 0 obj
<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
14 0 obj
<>/ProcSet[/PDF/Text/ImageC/ImageI]/XObject<>>>/Type/Page>>
endobj
21 0 obj
<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
24 0 obj
<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
27 0 obj
<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
30 0 obj
<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
33 0 obj
<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
36 0 obj
<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
39 0 obj
<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
43 0 obj
<>/ProcSet[/PDF/Text]>>/Type/Page>>
endobj
46 0 obj
<>/ProcSet[/PDF/Text/ImageC/ImageI]/XObject<>>>/Type/Page>>
endobj
54 0 obj
<>/ProcSet[/PDF/Text/ImageC/ImageI]/XObject<>>>/Type/Page>>
endobj
65 0 obj
<>/ProcSet[/PDF/Text/ImageC/ImageI]/XObject<>>>/Type/Page>>
endobj
80 0 obj
<>/ProcSet[/PDF/Text/ImageC/ImageI]/XObject<>>>/Type/Page>>
endobj
78 0 obj
<>stream
-H‰íWMoÜ6½ûWÈ%²´H}¬tµ =¤hë
й$ëõGc¯·±7nòëKIErf(J»NÜ¢ðÁ+‰gÞ¼ys´88|-XÅ…d‹óƒ¢ä¢`óJpY²Å ›%<Éeª¾-ÙóŶøó i~_¶¿y’&óöëJ¿í#kÕþ4ËŠ¬yuö|è‰4O‹æÕ=½¨u
-Vf%W h—Wíò£¶ŽERoQ…¬æ=`Pò¦ößn/ðõTxïâ= ¬*ƒ7»B05~mOÌJ··C﬚YéxHQóøLä¼èT„_oê
-~Žë‡”m?#‘LàчòšŽV‡i‘Æä-Š1¯^í]%¸nãn¦59›¯ «Q…9 ÔW·ÒÙÔé©LÌÆ*Ë8ÖÒ%Þ󲤄Òmwï¥yáí~\yâ]–ªùôÑ[ÚÉ9)¤(\Hê_wd‰ÑÊoXDö•/áÒ|ßs-ƒR/ÅÚ!ýñƒž»m0Ót5* ƒsÀp‹¨1$7±%ÆjßÎm²Ñ+hàI
-T"S ûÁ ¬Ãg*lÑÕ…‰Ð+Ð<¶<}69£»³àß÷P ß“(AÄñVwF¥lp‚«u¨3P ûƒK˜fÂ
-‹c¤
-ÿŒ.AdüDc5Faf÷\Qø]Â’A
¨Jô¾HÌ øÈ<‘Rïû•òJWr×ûù y¿Õ¡ð°þì—7ÂøœÑÓÜ—ØD@m;¸gØÇ=ª8Š‚HlÿÏJ`Vz¼¼±3…šr#ÓGƒ>G£¢Ž®¹@%‡PQ… ¸yÚÙ»ŸbË,^*RíÄ–Jà°äAQ¨&’%õ3Ðwú%¸ƒÇQ¬¶ï÷¯¯ôõæ×0G1äÃo‘ ù΃Ô5ˆJÃÚÂ~Rl@VTpi¯U–¨xeM›údÁá»ä?ñæðµdB%ãü`&…
-•ZPð:;jż‹i›,nEkÎõîTïe-í³‚gYûIaA·ÉSý¢OLYZpª sz¾~ì IÃáÚu•Û»ó:–hv¹ÙÍÝní^ê妥;çÛ@}YάÁéKÔ?pŸÖÜZG\0¡zIÑ=-ê_vFlªyÿ|
-„ʯï}¹“¨—Ð%T'Ù÷8 pð5vQ8âù$eEã‚èã>A~¸qÑé
EQ-ÂJîíH3®Êi&š
- Ž,ø
È‚“?¬È<Ç,Líîœà=?ˆÒ³Hshû9‹q/z\C×Ça $G˨]Ôû#æÝ+ìÖÿ͆,j(6‘¡0V…F$|Ð@g ¶ëslðTþ𨄑¸è7˜¶ukÈóhPŸ‡M¢×CºJˆe?£uæÈʰl¿‡‹´N‡i¡–¸
6 ʯbÆÑ!4Gh< r"NÏV©oÒÀä°;µ¹Õ++—A=Lçi·ãfTâ#j28ÛèJºqžØþñ‚¤¡¬àÌ %¿O 9Öú0ï,j! ó7ÆùÊÃUKHå“úr4¯0ßH>Mà ¢€VÞ&›"^î‰Á`à «O;ÈJ›Ö1íô)†ýo:¦áLî_Qѳ˜7$——ÞŠŽÐpB¼]û`ÝÆ„žòþÁüChºH‡jXêÝa(Ø]À†è°ßO0ñ¡òdz>œA÷R¹¯¦1,™wk(ŠÇöGm¡¦0J7RÕqIB¯¸¸[è!,Ï£2F‡-|§Á;Û'h%qóiÄ$9œ^\⣚=qÐ,`Èaş棈–ên;Àäº>Ñ&•°6RVàEkRø¶3`ÀwÝ|lØÁY
-
-D}.©T
ˆ}fçíÑkCš‰Å$ÛÇŽRKÒTóû¥_Û1
-b¨ø*óД_RqfFŽ,Ct ŽdîBWEX‡Lä”t1X¨Q
– Ö†è™ÓT$nGdòùSŸ©xó[rÖú+*^Ik¸dÝ{î¼mÞ½ZüÀÁ•
-endstream
endobj
81 0 obj
<>stream
-H‰íWšó*]ƒÌ
-´+È×ýïíÖ>QÁÄ4óÏ¥ÓLÛäÈÃRÿËÃÅ0E/¯ öe>+›¸L¸.œC«•¶ÿ¾."´æ"&‘x´OÀ*Žv/‘ì@kÜ–»½mþ~´Jë«Ñ‚í³Ì(¸#Cëvs í¥ukœ?Æ¡¹Ó×u°ðb+oX ®îÉ.{A[£²Í Í^9Ú´›Pµ¹(“=NãÞyO‡6žÙÂûâÑZ`ôUh?Æ À½O·[Ðjÿï².e1‚m.Ú~:I®åQ¾'_¶®ÛU¹˜5º