Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 5d9d018653 |
@@ -1,9 +0,0 @@
|
|||||||
[tool.commitizen]
|
|
||||||
name = "cz_conventional_commits"
|
|
||||||
|
|
||||||
# enforce sign-off below as well
|
|
||||||
extra_arguments = ["-S", "--signoff"]
|
|
||||||
|
|
||||||
# harmless redundancy
|
|
||||||
[tool.commitizen.customize]
|
|
||||||
schema_pattern = '^(feat|add|fix|bugfix|revert|security|perf|refactor|change|chore|ci|docs|style|test|build)(\(.+\))?(!)?: .{1,72}(\n.*)*\nSigned-off-by: .+ <.+@.+>'
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
name: 🗑️ DEPRECATED — Build & Sign & Release (combined)
|
|
||||||
|
|
||||||
# DEPRECATED — replaced by build.yml, sign.yml, and release.yml
|
|
||||||
# This workflow is disabled. It is kept only as a reference until the
|
|
||||||
# split workflows have been confirmed stable in production.
|
|
||||||
# Do not trigger this workflow.
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
_disabled:
|
|
||||||
description: 'This workflow is deprecated. Use build.yml → sign.yml → release.yml instead.'
|
|
||||||
required: false
|
|
||||||
type: string
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
noop:
|
|
||||||
name: Deprecated — no-op
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: ❌ Workflow is deprecated
|
|
||||||
run: |
|
|
||||||
echo "This workflow is deprecated."
|
|
||||||
echo "Use build.yml → sign.yml → release.yml instead."
|
|
||||||
exit 1
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
# 1. Push to main → build.yml runs automatically → note the run ID
|
|
||||||
# 2. Manually trigger sign.yml with that build run ID → note the sign run ID
|
|
||||||
# 3. Manually trigger release.yml with: version=v1.2.5, sign_run_id=<id>
|
|
||||||
# 4. Manually trigger changelog.yml with: version=v1.2.5
|
|
||||||
|
|
||||||
name: 📖 Build PDFs
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
build_mode:
|
|
||||||
description: 'PDF build mode'
|
|
||||||
required: true
|
|
||||||
default: 'both'
|
|
||||||
type: choice
|
|
||||||
options:
|
|
||||||
- light
|
|
||||||
- dark
|
|
||||||
- both
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
paths:
|
|
||||||
- "docs/**"
|
|
||||||
- "mkdocs.yml"
|
|
||||||
- "scripts/**"
|
|
||||||
- ".github/workflows/build.yml"
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
name: Build PDFs
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
build_mode: ${{ steps.mode.outputs.build_mode }}
|
|
||||||
run_id: ${{ github.run_id }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 🛠️ Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: 🐍 Set up Python
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: "3.13"
|
|
||||||
|
|
||||||
- name: 📦 Install Python dependencies
|
|
||||||
run: pip install "mkdocs-material[imaging]" pillow numpy
|
|
||||||
|
|
||||||
- name: 🖼️ Install poppler and qpdf
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -qq
|
|
||||||
sudo apt-get install -y poppler-utils qpdf
|
|
||||||
|
|
||||||
- name: Setup Chrome
|
|
||||||
uses: browser-actions/setup-chrome@v2
|
|
||||||
with:
|
|
||||||
chrome-version: 120
|
|
||||||
install-dependencies: true
|
|
||||||
install-chromedriver: true
|
|
||||||
|
|
||||||
- name: 🖨️ Resolve build mode
|
|
||||||
id: mode
|
|
||||||
run: |
|
|
||||||
MODE="${{ inputs.build_mode || 'both' }}"
|
|
||||||
echo "build_mode=$MODE" >> $GITHUB_OUTPUT
|
|
||||||
echo "Building in mode: $MODE"
|
|
||||||
|
|
||||||
- name: 🖨️ Build PDFs
|
|
||||||
env:
|
|
||||||
CI: true
|
|
||||||
run: python scripts/build_guide_pdf.py --${{ steps.mode.outputs.build_mode }}
|
|
||||||
|
|
||||||
- name: 📤 Upload PDF artifacts
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: pdfs
|
|
||||||
path: |
|
|
||||||
export/thgtoa.pdf
|
|
||||||
export/thgtoa-dark.pdf
|
|
||||||
if-no-files-found: warn
|
|
||||||
retention-days: 90
|
|
||||||
compression-level: 0
|
|
||||||
@@ -1,58 +0,0 @@
|
|||||||
name: 📝 Update Changelog
|
|
||||||
|
|
||||||
# Manual only — run after a release is published. Provide the exact version
|
|
||||||
# string (e.g. v1.2.4) to prepend to the changelog. Version is required to
|
|
||||||
# prevent silent auto-increment drift from release tags.
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
version:
|
|
||||||
description: 'Version string to record (e.g. v1.2.4) — required'
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
dry_run:
|
|
||||||
description: 'Dry run — print entry without committing'
|
|
||||||
required: false
|
|
||||||
default: false
|
|
||||||
type: boolean
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write # commit changelog back to main
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
changelog:
|
|
||||||
name: Prepend changelog entry
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 🛠️ Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
# Use a PAT so the commit triggers downstream workflows (GITHUB_TOKEN won't)
|
|
||||||
token: ${{ secrets.CHANGELOG_PAT || secrets.GITHUB_TOKEN }}
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: 🐍 Set up Python
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: "3.13"
|
|
||||||
|
|
||||||
- name: 📝 Generate and prepend changelog entry
|
|
||||||
env:
|
|
||||||
DRY_RUN: ${{ inputs.dry_run || 'false' }}
|
|
||||||
MANUAL_VERSION: ${{ inputs.version }}
|
|
||||||
GH_SHA: ${{ github.sha }}
|
|
||||||
GH_REF: ${{ github.ref_name }}
|
|
||||||
TRIGGERING_SHA: ${{ github.event.workflow_run.head_sha || github.sha }}
|
|
||||||
run: python scripts/update_changelog.py
|
|
||||||
|
|
||||||
- name: 📤 Commit changelog
|
|
||||||
if: ${{ inputs.dry_run != 'true' }}
|
|
||||||
run: |
|
|
||||||
git config user.name "github-actions[bot]"
|
|
||||||
git config user.email "github-actions[bot]@users.noreply.github.com"
|
|
||||||
git add docs/changelog/index.md
|
|
||||||
# Only commit if there's actually a change
|
|
||||||
git diff --cached --quiet && echo "No changelog change to commit." || \
|
|
||||||
git commit -m "docs: update changelog [skip ci]"
|
|
||||||
git push
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
name: 🚀 Publish docs via GitHub Pages
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
name: Publish the Hitchhiker's Guide
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout main
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Deploy docs
|
|
||||||
uses: mhausenblas/mkdocs-deploy-gh-pages@master
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
CUSTOM_DOMAIN: anonymousplanet.org
|
|
||||||
@@ -1,188 +0,0 @@
|
|||||||
name: 🚀 Release
|
|
||||||
|
|
||||||
# Manual only — run this deliberately after build and sign are confirmed good.
|
|
||||||
# Provide the sign.yml run ID to pull artifacts from. The release tag is
|
|
||||||
# generated automatically as release-YYYYMMDD-<short-sha> — no version input
|
|
||||||
# needed, no semver drift possible.
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
sign_run_id:
|
|
||||||
description: 'sign.yml run ID to pull signatures and PDFs from'
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
prerelease:
|
|
||||||
description: 'Mark as pre-release?'
|
|
||||||
required: false
|
|
||||||
default: false
|
|
||||||
type: boolean
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write # create releases and tags
|
|
||||||
actions: read # download artifacts from other runs
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
release:
|
|
||||||
name: Publish GitHub Release
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 🛠️ Checkout (for pgp/)
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
sparse-checkout: pgp
|
|
||||||
|
|
||||||
# Download artifacts from the specified sign run
|
|
||||||
- name: 📥 Download signatures artifact
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: signatures
|
|
||||||
path: release/
|
|
||||||
run-id: ${{ inputs.sign_run_id }}
|
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: 📥 Download signed PDFs artifact
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: pdfs-signed
|
|
||||||
path: release/
|
|
||||||
run-id: ${{ inputs.sign_run_id }}
|
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: 📋 List release assets
|
|
||||||
run: ls -lh release/
|
|
||||||
|
|
||||||
# Read hashes for the release body
|
|
||||||
- name: "#️⃣ Read hashes"
|
|
||||||
id: hashes
|
|
||||||
run: |
|
|
||||||
read_hash() { cat "release/$1" 2>/dev/null || echo "(not built)"; }
|
|
||||||
echo "light_sha256=$(read_hash thgtoa.pdf.sha256)" >> $GITHUB_OUTPUT
|
|
||||||
echo "dark_sha256=$(read_hash thgtoa-dark.pdf.sha256)" >> $GITHUB_OUTPUT
|
|
||||||
echo "light_b2=$(read_hash thgtoa.pdf.b2sum)" >> $GITHUB_OUTPUT
|
|
||||||
echo "dark_b2=$(read_hash thgtoa-dark.pdf.b2sum)" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
# VirusTotal
|
|
||||||
- name: 🦠 Upload PDFs to VirusTotal
|
|
||||||
id: vt
|
|
||||||
uses: crazy-max/ghaction-virustotal@v5
|
|
||||||
with:
|
|
||||||
vt_api_key: ${{ secrets.VT_API_KEY }}
|
|
||||||
files: |
|
|
||||||
release/thgtoa.pdf
|
|
||||||
release/thgtoa-dark.pdf
|
|
||||||
|
|
||||||
- name: 🔗 Build VT report URLs
|
|
||||||
id: vt_urls
|
|
||||||
run: |
|
|
||||||
light_hash=$(cat release/thgtoa.pdf.sha256 2>/dev/null || echo "")
|
|
||||||
dark_hash=$(cat release/thgtoa-dark.pdf.sha256 2>/dev/null || echo "")
|
|
||||||
if [ -n "$light_hash" ]; then
|
|
||||||
echo "light_vt=https://www.virustotal.com/gui/file/${light_hash}" >> $GITHUB_OUTPUT
|
|
||||||
else
|
|
||||||
echo "light_vt=(not built)" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
if [ -n "$dark_hash" ]; then
|
|
||||||
echo "dark_vt=https://www.virustotal.com/gui/file/${dark_hash}" >> $GITHUB_OUTPUT
|
|
||||||
else
|
|
||||||
echo "dark_vt=(not built)" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Generate release tag — timestamp + short SHA, always unique
|
|
||||||
- name: 🏷️ Generate release tag
|
|
||||||
id: tag
|
|
||||||
run: |
|
|
||||||
SHORT_SHA=$(echo "${{ github.sha }}" | cut -c1-7)
|
|
||||||
DATE=$(date -u +'%Y%m%d')
|
|
||||||
TAG="release-${DATE}-${SHORT_SHA}"
|
|
||||||
NAME="Release ${DATE} (${SHORT_SHA})"
|
|
||||||
echo "tag=$TAG" >> $GITHUB_OUTPUT
|
|
||||||
echo "name=$NAME" >> $GITHUB_OUTPUT
|
|
||||||
echo "Tag: $TAG"
|
|
||||||
|
|
||||||
# Create GitHub Release
|
|
||||||
- name: 🚀 Create GitHub Release
|
|
||||||
uses: softprops/action-gh-release@v2
|
|
||||||
with:
|
|
||||||
tag_name: ${{ steps.tag.outputs.tag }}
|
|
||||||
name: ${{ steps.tag.outputs.name }}
|
|
||||||
prerelease: ${{ inputs.prerelease || false }}
|
|
||||||
draft: false
|
|
||||||
fail_on_unmatched_files: false
|
|
||||||
body: |
|
|
||||||
## 📖 The Hitchhiker's Guide to Online Anonymity
|
|
||||||
|
|
||||||
Built from [`${{ github.sha }}`](${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}) on `${{ github.ref_name }}`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 📄 Release assets
|
|
||||||
|
|
||||||
| File | Description |
|
|
||||||
|------|-------------|
|
|
||||||
| `thgtoa.pdf` | Light mode PDF |
|
|
||||||
| `thgtoa-dark.pdf` | Dark mode PDF (hacker theme) |
|
|
||||||
| `sha256sums.txt` | SHA-256 checksums (both files) |
|
|
||||||
| `b2sums.txt` | BLAKE2b checksums (both files) |
|
|
||||||
| `thgtoa.pdf.sha256` | SHA-256 — light PDF |
|
|
||||||
| `thgtoa-dark.pdf.sha256` | SHA-256 — dark PDF |
|
|
||||||
| `thgtoa.pdf.b2sum` | BLAKE2b — light PDF |
|
|
||||||
| `thgtoa-dark.pdf.b2sum` | BLAKE2b — dark PDF |
|
|
||||||
| `*.asc` | GPG detached signatures (ASCII armor) |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### #️⃣ Hashes
|
|
||||||
|
|
||||||
**thgtoa.pdf** (light)
|
|
||||||
```text
|
|
||||||
SHA-256 ${{ steps.hashes.outputs.light_sha256 }}
|
|
||||||
BLAKE2b ${{ steps.hashes.outputs.light_b2 }}
|
|
||||||
```
|
|
||||||
|
|
||||||
**thgtoa-dark.pdf** (dark)
|
|
||||||
```text
|
|
||||||
SHA-256 ${{ steps.hashes.outputs.dark_sha256 }}
|
|
||||||
BLAKE2b ${{ steps.hashes.outputs.dark_b2 }}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 🔏 Verifying GPG signatures
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Import the release signing key
|
|
||||||
gpg --import pgp/anonymousplanet-release.asc
|
|
||||||
|
|
||||||
# Verify PDFs
|
|
||||||
gpg --verify thgtoa.pdf.asc thgtoa.pdf
|
|
||||||
gpg --verify thgtoa-dark.pdf.asc thgtoa-dark.pdf
|
|
||||||
|
|
||||||
# Verify hash files
|
|
||||||
gpg --verify sha256sums.txt.asc sha256sums.txt
|
|
||||||
gpg --verify b2sums.txt.asc b2sums.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 🦠 VirusTotal scans
|
|
||||||
|
|
||||||
| File | Report |
|
|
||||||
|------|--------|
|
|
||||||
| `thgtoa.pdf` | ${{ steps.vt_urls.outputs.light_vt }} |
|
|
||||||
| `thgtoa-dark.pdf` | ${{ steps.vt_urls.outputs.dark_vt }} |
|
|
||||||
|
|
||||||
files: |
|
|
||||||
release/thgtoa.pdf
|
|
||||||
release/thgtoa-dark.pdf
|
|
||||||
release/sha256sums.txt
|
|
||||||
release/b2sums.txt
|
|
||||||
release/thgtoa.pdf.sha256
|
|
||||||
release/thgtoa-dark.pdf.sha256
|
|
||||||
release/thgtoa.pdf.b2sum
|
|
||||||
release/thgtoa-dark.pdf.b2sum
|
|
||||||
release/thgtoa.pdf.asc
|
|
||||||
release/thgtoa-dark.pdf.asc
|
|
||||||
release/sha256sums.txt.asc
|
|
||||||
release/b2sums.txt.asc
|
|
||||||
@@ -1,256 +0,0 @@
|
|||||||
name: 🔏 Sign PDFs
|
|
||||||
|
|
||||||
# Can be triggered:
|
|
||||||
# 1. Automatically after build.yml completes on main
|
|
||||||
# 2. Manually, pointing at a specific build run to pull PDFs from
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
build_run_id:
|
|
||||||
description: 'build.yml run ID to download PDFs from'
|
|
||||||
required: true
|
|
||||||
type: string
|
|
||||||
|
|
||||||
# Download artifacts from other runs + commit export/ files back to the repo
|
|
||||||
permissions:
|
|
||||||
actions: read
|
|
||||||
contents: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
sign:
|
|
||||||
name: Hash & Sign PDFs
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
light_sha256: ${{ steps.hashes.outputs.light_sha256 }}
|
|
||||||
dark_sha256: ${{ steps.hashes.outputs.dark_sha256 }}
|
|
||||||
light_b2: ${{ steps.hashes.outputs.light_b2 }}
|
|
||||||
dark_b2: ${{ steps.hashes.outputs.dark_b2 }}
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 🛠️ Checkout (for pgp/ key reference only)
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
sparse-checkout: pgp
|
|
||||||
|
|
||||||
- name: 📥 Download PDF artifacts
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: pdfs
|
|
||||||
path: export/
|
|
||||||
run-id: ${{ inputs.build_run_id }}
|
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: 📋 List downloaded files
|
|
||||||
run: ls -lh export/
|
|
||||||
|
|
||||||
# Hash - extensions match export/ conventions: .sha256, .b2sum
|
|
||||||
- name: "#️⃣ Hash PDFs"
|
|
||||||
id: hashes
|
|
||||||
run: |
|
|
||||||
cd export
|
|
||||||
|
|
||||||
for f in thgtoa.pdf thgtoa-dark.pdf; do
|
|
||||||
[ -f "$f" ] || continue
|
|
||||||
sha256sum "$f" | awk '{print $1}' > "${f}.sha256"
|
|
||||||
b2sum "$f" | awk '{print $1}' > "${f}.b2sum"
|
|
||||||
done
|
|
||||||
|
|
||||||
# Combined summary files
|
|
||||||
sha256sum thgtoa.pdf thgtoa-dark.pdf 2>/dev/null > sha256sums.txt || \
|
|
||||||
sha256sum thgtoa.pdf 2>/dev/null > sha256sums.txt
|
|
||||||
b2sum thgtoa.pdf thgtoa-dark.pdf 2>/dev/null > b2sums.txt || \
|
|
||||||
b2sum thgtoa.pdf 2>/dev/null > b2sums.txt
|
|
||||||
|
|
||||||
light_sha256=$(cat thgtoa.pdf.sha256 2>/dev/null || echo "")
|
|
||||||
dark_sha256=$(cat thgtoa-dark.pdf.sha256 2>/dev/null || echo "")
|
|
||||||
light_b2=$(cat thgtoa.pdf.b2sum 2>/dev/null || echo "")
|
|
||||||
dark_b2=$(cat thgtoa-dark.pdf.b2sum 2>/dev/null || echo "")
|
|
||||||
|
|
||||||
echo "light_sha256=$light_sha256" >> $GITHUB_OUTPUT
|
|
||||||
echo "dark_sha256=$dark_sha256" >> $GITHUB_OUTPUT
|
|
||||||
echo "light_b2=$light_b2" >> $GITHUB_OUTPUT
|
|
||||||
echo "dark_b2=$dark_b2" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
echo "--- SHA-256 ---"
|
|
||||||
cat sha256sums.txt
|
|
||||||
echo "--- BLAKE2b ---"
|
|
||||||
cat b2sums.txt
|
|
||||||
|
|
||||||
# GPG sign — detached ASCII-armor signatures use .asc extension
|
|
||||||
- name: 🔑 Install GPG
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -qq
|
|
||||||
sudo apt-get install -y gnupg
|
|
||||||
|
|
||||||
- name: 🔏 Import GPG signing key
|
|
||||||
env:
|
|
||||||
GPG_PRIVATE_KEY: ${{ secrets.GPG_PRIVATE_KEY }}
|
|
||||||
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
|
|
||||||
run: |
|
|
||||||
echo "$GPG_PRIVATE_KEY" | gpg --batch --import
|
|
||||||
echo "$GPG_PASSPHRASE" | gpg --batch --yes --passphrase-fd 0 \
|
|
||||||
--pinentry-mode loopback --list-secret-keys
|
|
||||||
|
|
||||||
- name: 🔏 Sign PDFs and hash files
|
|
||||||
env:
|
|
||||||
GPG_PASSPHRASE: ${{ secrets.GPG_PASSPHRASE }}
|
|
||||||
run: |
|
|
||||||
sign() {
|
|
||||||
local file="$1"
|
|
||||||
[ -f "$file" ] || return 0
|
|
||||||
echo "$GPG_PASSPHRASE" | gpg --batch --yes --passphrase-fd 0 \
|
|
||||||
--pinentry-mode loopback \
|
|
||||||
--detach-sign --armor --output "${file}.asc" "$file"
|
|
||||||
echo "Signed: $file → ${file}.asc"
|
|
||||||
}
|
|
||||||
sign export/thgtoa.pdf
|
|
||||||
sign export/thgtoa-dark.pdf
|
|
||||||
sign export/sha256sums.txt
|
|
||||||
sign export/b2sums.txt
|
|
||||||
|
|
||||||
# Commit export/ back to main
|
|
||||||
- name: 📦 Checkout full repo for commit
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
ref: main
|
|
||||||
fetch-depth: 0
|
|
||||||
path: repo
|
|
||||||
|
|
||||||
- name: 📂 Copy export files into repo
|
|
||||||
run: cp -v export/* repo/export/
|
|
||||||
|
|
||||||
- name: 🔏 Configure SSH commit signing
|
|
||||||
run: |
|
|
||||||
mkdir -p ~/.ssh
|
|
||||||
echo "${{ secrets.ACTIONS_SSH_SIGNING_KEY }}" > ~/.ssh/signing_key
|
|
||||||
chmod 600 ~/.ssh/signing_key
|
|
||||||
git config --global gpg.format ssh
|
|
||||||
git config --global user.signingKey ~/.ssh/signing_key
|
|
||||||
git config --global commit.gpgSign true
|
|
||||||
git config --global user.name "github-actions[bot]"
|
|
||||||
git config --global user.email "github-actions[bot]@users.noreply.github.com"
|
|
||||||
|
|
||||||
# If no change in git diff, do nothing
|
|
||||||
- name: 📤 Commit and push export/ to main
|
|
||||||
working-directory: repo
|
|
||||||
run: |
|
|
||||||
git add export/
|
|
||||||
if git diff --cached --quiet; then
|
|
||||||
echo "Nothing to commit — export/ is already up to date."
|
|
||||||
else
|
|
||||||
git commit -S -m "chore(export): update PDFs, hashes and signatures [skip ci]"
|
|
||||||
git push origin main
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Upload artifacts for release.yml and verify job to consume
|
|
||||||
- name: 📤 Upload signatures artifact
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: signatures
|
|
||||||
path: |
|
|
||||||
export/sha256sums.txt
|
|
||||||
export/b2sums.txt
|
|
||||||
export/thgtoa.pdf.sha256
|
|
||||||
export/thgtoa-dark.pdf.sha256
|
|
||||||
export/thgtoa.pdf.b2sum
|
|
||||||
export/thgtoa-dark.pdf.b2sum
|
|
||||||
export/thgtoa.pdf.asc
|
|
||||||
export/thgtoa-dark.pdf.asc
|
|
||||||
export/sha256sums.txt.asc
|
|
||||||
export/b2sums.txt.asc
|
|
||||||
if-no-files-found: error
|
|
||||||
retention-days: 90
|
|
||||||
compression-level: 0
|
|
||||||
|
|
||||||
- name: 📤 Upload signed PDFs artifact
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: pdfs-signed
|
|
||||||
path: |
|
|
||||||
export/thgtoa.pdf
|
|
||||||
export/thgtoa-dark.pdf
|
|
||||||
if-no-files-found: warn
|
|
||||||
retention-days: 90
|
|
||||||
compression-level: 0
|
|
||||||
|
|
||||||
# Verify — runs after sign, surfaces results as a job summary
|
|
||||||
verify:
|
|
||||||
name: Verify hashes & signatures
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: sign
|
|
||||||
# Always run so the summary is visible even if sign partially failed
|
|
||||||
if: always()
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 🛠️ Checkout scripts and public key
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
sparse-checkout: |
|
|
||||||
scripts/verify_pdf.py
|
|
||||||
pgp
|
|
||||||
|
|
||||||
- name: 📥 Download signatures artifact
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: signatures
|
|
||||||
path: export/
|
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: 📥 Download signed PDFs artifact
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: pdfs-signed
|
|
||||||
path: export/
|
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: 🔑 Install GPG and import public key
|
|
||||||
run: |
|
|
||||||
sudo apt-get update -qq
|
|
||||||
sudo apt-get install -y gnupg
|
|
||||||
gpg --import pgp/anonymousplanet-release.asc
|
|
||||||
|
|
||||||
- name: 🐍 Set up Python
|
|
||||||
uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: "3.13"
|
|
||||||
|
|
||||||
- name: 🔍 Run verify_pdf.py
|
|
||||||
id: verify
|
|
||||||
run: |
|
|
||||||
# Capture output and exit code separately so we can write the
|
|
||||||
# summary regardless of whether verification passed or failed.
|
|
||||||
set +e
|
|
||||||
output=$(python scripts/verify_pdf.py --hashes --signatures --export-dir export 2>&1)
|
|
||||||
exit_code=$?
|
|
||||||
set -e
|
|
||||||
|
|
||||||
echo "exit_code=$exit_code" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
# ── Job summary ──────────────────────────────────────────────
|
|
||||||
{
|
|
||||||
if [ "$exit_code" -eq 0 ]; then
|
|
||||||
echo "## ✅ Verification passed"
|
|
||||||
else
|
|
||||||
echo "## ❌ Verification failed"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "**Run:** [\`${{ github.run_id }}\`](${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }}) · **Commit:** [\`${GITHUB_SHA::7}\`](${{ github.server_url }}/${{ github.repository }}/commit/${{ github.sha }}) · **By:** \`${{ github.actor }}\`"
|
|
||||||
echo ""
|
|
||||||
echo "### Script output"
|
|
||||||
echo '```'
|
|
||||||
echo "$output"
|
|
||||||
echo '```'
|
|
||||||
echo ""
|
|
||||||
echo "### Hashes"
|
|
||||||
echo '```'
|
|
||||||
echo "── SHA-256 ──────────────────────────────────────────────────────"
|
|
||||||
cat export/sha256sums.txt 2>/dev/null || echo "(not found)"
|
|
||||||
echo ""
|
|
||||||
echo "── BLAKE2b ──────────────────────────────────────────────────────"
|
|
||||||
cat export/b2sums.txt 2>/dev/null || echo "(not found)"
|
|
||||||
echo '```'
|
|
||||||
} >> $GITHUB_STEP_SUMMARY
|
|
||||||
|
|
||||||
# Propagate failure so the job is marked red if verification fails
|
|
||||||
exit $exit_code
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
# Visual Studio (Windows) solution metadata
|
|
||||||
.vs/
|
|
||||||
.vscode/
|
|
||||||
|
|
||||||
# Python (MkDocs, scripts/build_guide_pdf.py)
|
|
||||||
__pycache__/
|
|
||||||
*.py[cod]
|
|
||||||
*$py.class
|
|
||||||
.venv/
|
|
||||||
venv/
|
|
||||||
env/
|
|
||||||
ENV/
|
|
||||||
.env
|
|
||||||
|
|
||||||
# Cache
|
|
||||||
.cache/
|
|
||||||
|
|
||||||
# MkDocs build output and local PDF export
|
|
||||||
site/
|
|
||||||
_site/
|
|
||||||
_site_test/
|
|
||||||
build/
|
|
||||||
|
|
||||||
# Export directory — track only hashes and signatures, not the PDFs themselves
|
|
||||||
export/thgtoa.pdf.sha256
|
|
||||||
export/thgtoa-dark.pdf.sha256
|
|
||||||
export/thgtoa.pdf.b2sum
|
|
||||||
export/thgtoa-dark.pdf.b2sum
|
|
||||||
export/*.asc
|
|
||||||
@@ -1,182 +0,0 @@
|
|||||||
---
|
|
||||||
# Documentation:
|
|
||||||
# https://github.com/DavidAnson/markdownlint/blob/main/doc/Rules.md
|
|
||||||
|
|
||||||
# Default state for all rules
|
|
||||||
default: false
|
|
||||||
|
|
||||||
# MD001/heading-increment/header-increment - Heading levels should only increment by one level at a time
|
|
||||||
MD001: true
|
|
||||||
|
|
||||||
# MD002/first-heading-h1/first-header-h1 - First heading should be a top-level heading
|
|
||||||
MD002:
|
|
||||||
# Heading level
|
|
||||||
level: 1
|
|
||||||
|
|
||||||
# MD003/heading-style/header-style - Heading style
|
|
||||||
|
|
||||||
MD003:
|
|
||||||
# Heading style
|
|
||||||
# # ATX style H1
|
|
||||||
style: "atx"
|
|
||||||
|
|
||||||
# MD004/ul-style - Unordered list style
|
|
||||||
MD004:
|
|
||||||
# List style
|
|
||||||
style: "sublist"
|
|
||||||
|
|
||||||
# MD005/list-indent - Inconsistent indentation for list items at the same level
|
|
||||||
MD005: true
|
|
||||||
|
|
||||||
# MD006/ul-start-left - Consider starting bulleted lists at the beginning of the line
|
|
||||||
MD006: true
|
|
||||||
|
|
||||||
# MD007/ul-indent - Unordered list indentation
|
|
||||||
MD007:
|
|
||||||
# Spaces for indent
|
|
||||||
indent: 4
|
|
||||||
# Whether to indent the first level of the list
|
|
||||||
start_indented: false
|
|
||||||
|
|
||||||
# MD009/no-trailing-spaces - Trailing spaces
|
|
||||||
MD009:
|
|
||||||
# Spaces for line break
|
|
||||||
br_spaces: 2
|
|
||||||
# Allow spaces for empty lines in list items
|
|
||||||
list_item_empty_lines: false
|
|
||||||
# Include unnecessary breaks
|
|
||||||
strict: false
|
|
||||||
|
|
||||||
# MD010/no-hard-tabs - Hard tabs
|
|
||||||
MD010:
|
|
||||||
# Include code blocks
|
|
||||||
code_blocks: false
|
|
||||||
# Number of spaces for each hard tab
|
|
||||||
spaces_per_tab: 1
|
|
||||||
|
|
||||||
# MD011/no-reversed-links - Reversed link syntax
|
|
||||||
MD011: true
|
|
||||||
|
|
||||||
# MD012/no-multiple-blanks - Multiple consecutive blank lines
|
|
||||||
MD012:
|
|
||||||
# Consecutive blank lines
|
|
||||||
maximum: 1
|
|
||||||
# MD013/line-length - Line length
|
|
||||||
MD013: false
|
|
||||||
|
|
||||||
# MD014/commands-show-output - Dollar signs used before commands without showing output
|
|
||||||
# TODO: set false for now but we should consider enabling it
|
|
||||||
# https://cirosantilli.com/markdown-style-guide#dollar-signs-in-shell-code
|
|
||||||
MD014: false
|
|
||||||
|
|
||||||
# MD018/no-missing-space-atx - No space after hash on atx style heading
|
|
||||||
MD018: true
|
|
||||||
|
|
||||||
# MD019/no-multiple-space-atx - Multiple spaces after hash on atx style heading
|
|
||||||
MD019: true
|
|
||||||
|
|
||||||
# MD022/blanks-around-headings/blanks-around-headers - Headings should be surrounded by blank lines
|
|
||||||
MD022:
|
|
||||||
# Blank lines above heading
|
|
||||||
lines_above: 1
|
|
||||||
# Blank lines below heading
|
|
||||||
lines_below: 1
|
|
||||||
|
|
||||||
# MD023/heading-start-left/header-start-left - Headings must start at the beginning of the line
|
|
||||||
MD023: true
|
|
||||||
|
|
||||||
# MD025/single-title/single-h1 - Multiple top-level headings in the same document
|
|
||||||
# TODO: consider enabling it
|
|
||||||
|
|
||||||
# MD026/no-trailing-punctuation - Trailing punctuation in heading
|
|
||||||
MD026:
|
|
||||||
# Punctuation characters
|
|
||||||
punctuation: ".,;:!。,;:!"
|
|
||||||
|
|
||||||
# MD027/no-multiple-space-blockquote - Multiple spaces after blockquote symbol
|
|
||||||
MD027: true
|
|
||||||
|
|
||||||
# MD028/no-blanks-blockquote - Blank line inside blockquote
|
|
||||||
MD028: true
|
|
||||||
|
|
||||||
# MD029/ol-prefix - Ordered list item prefix
|
|
||||||
MD029:
|
|
||||||
# List style
|
|
||||||
style: "one_or_ordered"
|
|
||||||
|
|
||||||
# MD030/list-marker-space - Spaces after list markers
|
|
||||||
MD030:
|
|
||||||
# Spaces for single-line unordered list items
|
|
||||||
ul_single: 1
|
|
||||||
# Spaces for single-line ordered list items
|
|
||||||
ol_single: 1
|
|
||||||
# Spaces for multi-line unordered list items
|
|
||||||
ul_multi: 1
|
|
||||||
# Spaces for multi-line ordered list items
|
|
||||||
ol_multi: 1
|
|
||||||
|
|
||||||
# MD031/blanks-around-fences - Fenced code blocks should be surrounded by blank lines
|
|
||||||
MD031:
|
|
||||||
# Include list items
|
|
||||||
list_items: true
|
|
||||||
|
|
||||||
# MD033/no-inline-html - Inline HTML
|
|
||||||
# MD033:before uncomment, update docs/dasharo-tools-suite/documentation.md:18:1
|
|
||||||
# and docs/variants/msi_z690/initial-deployment.md:14:1
|
|
||||||
# Allowed elements
|
|
||||||
# allowed_elements: ["br", "center", "img", "script", "form", "input", "iframe"]
|
|
||||||
|
|
||||||
# MD034/no-bare-urls - Bare URL used
|
|
||||||
MD034: false
|
|
||||||
|
|
||||||
# MD035/hr-style - Horizontal rule style
|
|
||||||
MD035:
|
|
||||||
# Horizontal rule style
|
|
||||||
style: "---"
|
|
||||||
|
|
||||||
# MD037/no-space-in-emphasis - Spaces inside emphasis markers
|
|
||||||
MD037: true
|
|
||||||
|
|
||||||
# MD038/no-space-in-code - Spaces inside code span elements
|
|
||||||
# MD038: true - Rule temporarily disabled, it prevents new tabs from being
|
|
||||||
# formatted correctly - eg. docs/unified/novacustom/building-manual.md:46
|
|
||||||
|
|
||||||
# MD039/no-space-in-links - Spaces inside link text
|
|
||||||
MD039: true
|
|
||||||
|
|
||||||
# MD040/fenced-code-language - Fenced code blocks should have a language specified
|
|
||||||
MD040: true
|
|
||||||
|
|
||||||
# MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading
|
|
||||||
MD041:
|
|
||||||
# Heading level
|
|
||||||
level: 1
|
|
||||||
# RegExp for matching title in front matter
|
|
||||||
front_matter_title: "^\\s*title\\s*[:=]"
|
|
||||||
|
|
||||||
# MD042/no-empty-links - No empty links
|
|
||||||
MD042: true
|
|
||||||
|
|
||||||
# MD046/code-block-style - Code block style
|
|
||||||
# MD046: Rule temporarily disabled, it prevents new tabs from being formatted
|
|
||||||
# correctly - eg. docs/unified/novacustom/overview.md:9
|
|
||||||
# Block style
|
|
||||||
# style: "fenced"
|
|
||||||
|
|
||||||
# MD047/single-trailing-newline - Files should end with a single newline character
|
|
||||||
MD047: true
|
|
||||||
|
|
||||||
# MD048/code-fence-style - Code fence style
|
|
||||||
MD048:
|
|
||||||
# Code fence style
|
|
||||||
style: "backtick"
|
|
||||||
|
|
||||||
# MD049/emphasis-style - Emphasis style should be consistent
|
|
||||||
MD049:
|
|
||||||
# Emphasis style should be consistent
|
|
||||||
style: "underscore"
|
|
||||||
|
|
||||||
# MD050/strong-style - Strong style should be consistent
|
|
||||||
MD050:
|
|
||||||
# Strong style should be consistent
|
|
||||||
style: "asterisk"
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
---
|
|
||||||
default_stages: [pre-commit]
|
|
||||||
|
|
||||||
default_install_hook_types: [pre-commit, commit-msg]
|
|
||||||
|
|
||||||
repos:
|
|
||||||
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
||||||
rev: v5.0.0
|
|
||||||
hooks:
|
|
||||||
- id: check-added-large-files
|
|
||||||
- id: check-merge-conflict
|
|
||||||
- id: check-symlinks
|
|
||||||
- id: end-of-file-fixer
|
|
||||||
- id: trailing-whitespace
|
|
||||||
- id: mixed-line-ending
|
|
||||||
args: [--fix=lf]
|
|
||||||
|
|
||||||
- repo: https://github.com/commitizen-tools/commitizen
|
|
||||||
rev: v4.8.3
|
|
||||||
hooks:
|
|
||||||
- id: commitizen
|
|
||||||
stages: [commit-msg]
|
|
||||||
|
|
||||||
- repo: local
|
|
||||||
hooks:
|
|
||||||
- id: require-commit-body
|
|
||||||
name: Avoid bad commits
|
|
||||||
language: script
|
|
||||||
entry: scripts/hooks/require-commit-body.sh
|
|
||||||
stages: [commit-msg]
|
|
||||||
@@ -0,0 +1,867 @@
|
|||||||
|
|
||||||
|
<!doctype html>
|
||||||
|
<html lang="en" class="no-js">
|
||||||
|
<head>
|
||||||
|
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta name="viewport" content="width=device-width,initial-scale=1">
|
||||||
|
|
||||||
|
<meta name="description" content="The comprehensive guide for online #anonymity and #opsec.">
|
||||||
|
|
||||||
|
|
||||||
|
<meta name="author" content="Anonymous Planet">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="icon" href="/media/profile.png">
|
||||||
|
<meta name="generator" content="mkdocs-1.5.3, mkdocs-material-9.5.17">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<title>The Hitchhiker's Guide</title>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="/assets/stylesheets/main.bcfcd587.min.css">
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="/assets/stylesheets/palette.06af60db.min.css">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||||
|
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Public+Sans:300,300i,400,400i,700,700i%7CLiberation+Mono:400,400i,700,700i&display=fallback">
|
||||||
|
<style>:root{--md-text-font:"Public Sans";--md-code-font:"Liberation Mono"}</style>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="/stylesheets/extra.css">
|
||||||
|
|
||||||
|
<script>__md_scope=new URL("/",location),__md_hash=e=>[...e].reduce((e,_)=>(e<<5)-e+_.charCodeAt(0),0),__md_get=(e,_=localStorage,t=__md_scope)=>JSON.parse(_.getItem(t.pathname+"."+e)),__md_set=(e,_,t=localStorage,a=__md_scope)=>{try{t.setItem(a.pathname+"."+e,JSON.stringify(_))}catch(e){}}</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</head>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<body dir="ltr" data-md-color-scheme="default" data-md-color-primary="green" data-md-color-accent="blue">
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-toggle" data-md-toggle="drawer" type="checkbox" id="__drawer" autocomplete="off">
|
||||||
|
<input class="md-toggle" data-md-toggle="search" type="checkbox" id="__search" autocomplete="off">
|
||||||
|
<label class="md-overlay" for="__drawer"></label>
|
||||||
|
<div data-md-component="skip">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div data-md-component="announce">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<header class="md-header" data-md-component="header">
|
||||||
|
<nav class="md-header__inner md-grid" aria-label="Header">
|
||||||
|
<a href="/." title="The Hitchhiker's Guide" class="md-header__button md-logo" aria-label="The Hitchhiker's Guide" data-md-component="logo">
|
||||||
|
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m23 11.5-3.05-1.13c-.26-1.15-.91-1.81-.91-1.81a4.189 4.189 0 0 0-5.93 0l-1.48 1.48L5 3c-1 4 0 8 2.45 11.22L2 19.5s8.89 2 14.07-2.05c2.76-2.16 3.38-3.42 3.77-4.75L23 11.5m-5.29.22c-.39.39-1.03.39-1.42 0a.996.996 0 0 1 0-1.41c.39-.39 1.03-.39 1.42 0 .39.39.39 1.02 0 1.41Z"/></svg>
|
||||||
|
|
||||||
|
</a>
|
||||||
|
<label class="md-header__button md-icon" for="__drawer">
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M3 6h18v2H3V6m0 5h18v2H3v-2m0 5h18v2H3v-2Z"/></svg>
|
||||||
|
</label>
|
||||||
|
<div class="md-header__title" data-md-component="header-title">
|
||||||
|
<div class="md-header__ellipsis">
|
||||||
|
<div class="md-header__topic">
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
The Hitchhiker's Guide
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
<div class="md-header__topic" data-md-component="header-topic">
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<form class="md-header__option" data-md-component="palette">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-option" data-md-color-media="" data-md-color-scheme="default" data-md-color-primary="green" data-md-color-accent="blue" aria-label="Switch to dark mode" type="radio" name="__palette" id="__palette_0">
|
||||||
|
|
||||||
|
<label class="md-header__button md-icon" title="Switch to dark mode" for="__palette_1" hidden>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 9a3 3 0 0 1 3 3 3 3 0 0 1-3 3 3 3 0 0 1-3-3 3 3 0 0 1 3-3m0-4.5c5 0 9.27 3.11 11 7.5-1.73 4.39-6 7.5-11 7.5S2.73 16.39 1 12c1.73-4.39 6-7.5 11-7.5M3.18 12a9.821 9.821 0 0 0 17.64 0 9.821 9.821 0 0 0-17.64 0Z"/></svg>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-option" data-md-color-media="" data-md-color-scheme="slate" data-md-color-primary="grey" data-md-color-accent="teal" aria-label="Switch to light mode" type="radio" name="__palette" id="__palette_1">
|
||||||
|
|
||||||
|
<label class="md-header__button md-icon" title="Switch to light mode" for="__palette_0" hidden>
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 9a3 3 0 0 0-3 3 3 3 0 0 0 3 3 3 3 0 0 0 3-3 3 3 0 0 0-3-3m0 8a5 5 0 0 1-5-5 5 5 0 0 1 5-5 5 5 0 0 1 5 5 5 5 0 0 1-5 5m0-12.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5Z"/></svg>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
|
||||||
|
</form>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script>var media,input,key,value,palette=__md_get("__palette");if(palette&&palette.color){"(prefers-color-scheme)"===palette.color.media&&(media=matchMedia("(prefers-color-scheme: light)"),input=document.querySelector(media.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']"),palette.color.media=input.getAttribute("data-md-color-media"),palette.color.scheme=input.getAttribute("data-md-color-scheme"),palette.color.primary=input.getAttribute("data-md-color-primary"),palette.color.accent=input.getAttribute("data-md-color-accent"));for([key,value]of Object.entries(palette.color))document.body.setAttribute("data-md-color-"+key,value)}</script>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-header__button md-icon" for="__search">
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
|
||||||
|
</label>
|
||||||
|
<div class="md-search" data-md-component="search" role="dialog">
|
||||||
|
<label class="md-search__overlay" for="__search"></label>
|
||||||
|
<div class="md-search__inner" role="search">
|
||||||
|
<form class="md-search__form" name="search">
|
||||||
|
<input type="text" class="md-search__input" name="query" aria-label="Search" placeholder="Search" autocapitalize="off" autocorrect="off" autocomplete="off" spellcheck="false" data-md-component="search-query" required>
|
||||||
|
<label class="md-search__icon md-icon" for="__search">
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M9.5 3A6.5 6.5 0 0 1 16 9.5c0 1.61-.59 3.09-1.56 4.23l.27.27h.79l5 5-1.5 1.5-5-5v-.79l-.27-.27A6.516 6.516 0 0 1 9.5 16 6.5 6.5 0 0 1 3 9.5 6.5 6.5 0 0 1 9.5 3m0 2C7 5 5 7 5 9.5S7 14 9.5 14 14 12 14 9.5 12 5 9.5 5Z"/></svg>
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M20 11v2H8l5.5 5.5-1.42 1.42L4.16 12l7.92-7.92L13.5 5.5 8 11h12Z"/></svg>
|
||||||
|
</label>
|
||||||
|
<nav class="md-search__options" aria-label="Search">
|
||||||
|
|
||||||
|
<button type="reset" class="md-search__icon md-icon" title="Clear" aria-label="Clear" tabindex="-1">
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M19 6.41 17.59 5 12 10.59 6.41 5 5 6.41 10.59 12 5 17.59 6.41 19 12 13.41 17.59 19 19 17.59 13.41 12 19 6.41Z"/></svg>
|
||||||
|
</button>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
<div class="md-search__suggest" data-md-component="search-suggest"></div>
|
||||||
|
|
||||||
|
</form>
|
||||||
|
<div class="md-search__output">
|
||||||
|
<div class="md-search__scrollwrap" data-md-scrollfix>
|
||||||
|
<div class="md-search-result" data-md-component="search-result">
|
||||||
|
<div class="md-search-result__meta">
|
||||||
|
Initializing search
|
||||||
|
</div>
|
||||||
|
<ol class="md-search-result__list" role="presentation"></ol>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-header__source">
|
||||||
|
<a href="https://github.com/Anon-Planet/thgtoa" title="Go to repository" class="md-source" data-md-component="source">
|
||||||
|
<div class="md-source__icon md-icon">
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>
|
||||||
|
</div>
|
||||||
|
<div class="md-source__repository">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</header>
|
||||||
|
|
||||||
|
<div class="md-container" data-md-component="container">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<nav class="md-tabs" aria-label="Tabs" data-md-component="tabs">
|
||||||
|
<div class="md-grid">
|
||||||
|
<ul class="md-tabs__list">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-tabs__item">
|
||||||
|
<a href="/." class="md-tabs__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Welcome
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-tabs__item">
|
||||||
|
<a href="/about/" class="md-tabs__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
About
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-tabs__item">
|
||||||
|
<a href="/verify/" class="md-tabs__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Verify
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-tabs__item">
|
||||||
|
<a href="/guide/" class="md-tabs__link">
|
||||||
|
|
||||||
|
|
||||||
|
Guide
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-tabs__item">
|
||||||
|
<a href="/code/" class="md-tabs__link">
|
||||||
|
|
||||||
|
|
||||||
|
Code
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-tabs__item">
|
||||||
|
<a href="/contribute/" class="md-tabs__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Contribute
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-tabs__item">
|
||||||
|
<a href="/constitution/" class="md-tabs__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Constitution
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-tabs__item">
|
||||||
|
<a href="/mirrors/" class="md-tabs__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Mirrors
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-tabs__item">
|
||||||
|
<a href="/twitter/" class="md-tabs__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Twitter
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-tabs__item">
|
||||||
|
<a href="/changelog/" class="md-tabs__link">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Releases
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<main class="md-main" data-md-component="main">
|
||||||
|
<div class="md-main__inner md-grid">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-sidebar md-sidebar--primary" data-md-component="sidebar" data-md-type="navigation" >
|
||||||
|
<div class="md-sidebar__scrollwrap">
|
||||||
|
<div class="md-sidebar__inner">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<nav class="md-nav md-nav--primary md-nav--lifted md-nav--integrated" aria-label="Navigation" data-md-level="0">
|
||||||
|
<label class="md-nav__title" for="__drawer">
|
||||||
|
<a href="/." title="The Hitchhiker's Guide" class="md-nav__button md-logo" aria-label="The Hitchhiker's Guide" data-md-component="logo">
|
||||||
|
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m23 11.5-3.05-1.13c-.26-1.15-.91-1.81-.91-1.81a4.189 4.189 0 0 0-5.93 0l-1.48 1.48L5 3c-1 4 0 8 2.45 11.22L2 19.5s8.89 2 14.07-2.05c2.76-2.16 3.38-3.42 3.77-4.75L23 11.5m-5.29.22c-.39.39-1.03.39-1.42 0a.996.996 0 0 1 0-1.41c.39-.39 1.03-.39 1.42 0 .39.39.39 1.02 0 1.41Z"/></svg>
|
||||||
|
|
||||||
|
</a>
|
||||||
|
The Hitchhiker's Guide
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<div class="md-nav__source">
|
||||||
|
<a href="https://github.com/Anon-Planet/thgtoa" title="Go to repository" class="md-source" data-md-component="source">
|
||||||
|
<div class="md-source__icon md-icon">
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>
|
||||||
|
</div>
|
||||||
|
<div class="md-source__repository">
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/." class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
Welcome
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/about/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
About
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/verify/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
Verify
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_4" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_4" id="__nav_4_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
Guide
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_4_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_4">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
Guide
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/guide/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
./
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item md-nav__item--nested">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<input class="md-nav__toggle md-toggle " type="checkbox" id="__nav_5" >
|
||||||
|
|
||||||
|
|
||||||
|
<label class="md-nav__link" for="__nav_5" id="__nav_5_label" tabindex="0">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
Code
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
</label>
|
||||||
|
|
||||||
|
<nav class="md-nav" data-md-level="1" aria-labelledby="__nav_5_label" aria-expanded="false">
|
||||||
|
<label class="md-nav__title" for="__nav_5">
|
||||||
|
<span class="md-nav__icon md-icon"></span>
|
||||||
|
Code
|
||||||
|
</label>
|
||||||
|
<ul class="md-nav__list" data-md-scrollfix>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/code/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
Content Contributions
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/code/develop/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
Develop
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/contribute/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
Contribute
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/constitution/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
Constitution
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/mirrors/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
Mirrors
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/twitter/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
Twitter
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<li class="md-nav__item">
|
||||||
|
<a href="/changelog/" class="md-nav__link">
|
||||||
|
|
||||||
|
|
||||||
|
<span class="md-ellipsis">
|
||||||
|
Releases
|
||||||
|
</span>
|
||||||
|
|
||||||
|
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
</ul>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="md-content" data-md-component="content">
|
||||||
|
<article class="md-content__inner md-typeset">
|
||||||
|
|
||||||
|
<h1>404 - Not found</h1>
|
||||||
|
|
||||||
|
</article>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script>var tabs=__md_get("__tabs");if(Array.isArray(tabs))e:for(var set of document.querySelectorAll(".tabbed-set")){var tab,labels=set.querySelector(".tabbed-labels");for(tab of tabs)for(var label of labels.getElementsByTagName("label"))if(label.innerText.trim()===tab){var input=document.getElementById(label.htmlFor);input.checked=!0;continue e}}</script>
|
||||||
|
|
||||||
|
<script>var target=document.getElementById(location.hash.slice(1));target&&target.name&&(target.checked=target.name.startsWith("__tabbed_"))</script>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<button type="button" class="md-top md-icon" data-md-component="top" hidden>
|
||||||
|
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M13 20h-2V8l-5.5 5.5-1.42-1.42L12 4.16l7.92 7.92-1.42 1.42L13 8v12Z"/></svg>
|
||||||
|
Back to top
|
||||||
|
</button>
|
||||||
|
|
||||||
|
</main>
|
||||||
|
|
||||||
|
<footer class="md-footer">
|
||||||
|
|
||||||
|
<div class="md-footer-meta md-typeset">
|
||||||
|
<div class="md-footer-meta__inner md-grid">
|
||||||
|
<div class="md-copyright">
|
||||||
|
|
||||||
|
<div class="md-copyright__highlight">
|
||||||
|
<a href="https://anonymousplanet.net/">The Hitchhiker's Guide</a> ©2023-2026 by <a href="https://psa.anonymousplanet.net/">Anonymous Planet</a> is licensed under <a href="https://creativecommons.org/licenses/by-nc/4.0/">CC BY-NC 4.0</a><img src="https://mirrors.creativecommons.org/presskit/icons/cc.svg" alt="" style="max-width: 1em;max-height:1em;margin-left: .2em;"><img src="https://mirrors.creativecommons.org/presskit/icons/by.svg" alt="" style="max-width: 1em;max-height:1em;margin-left: .2em;"><img src="https://mirrors.creativecommons.org/presskit/icons/nc.svg" alt="" style="max-width: 1em;max-height:1em;margin-left: .2em;"></a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
Made with
|
||||||
|
<a href="https://squidfunk.github.io/mkdocs-material/" target="_blank" rel="noopener">
|
||||||
|
Material for MkDocs
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="md-social">
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://mastodon.social/@anonymousplanet" target="_blank" rel="noopener me" title="Mastodon" class="md-social__link">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M23.268 5.313c-.35-2.578-2.617-4.61-5.304-5.004C17.51.242 15.792 0 11.813 0h-.03c-3.98 0-4.835.242-5.288.309C3.882.692 1.496 2.518.917 5.127.64 6.412.61 7.837.661 9.143c.074 1.874.088 3.745.26 5.611.118 1.24.325 2.47.62 3.68.55 2.237 2.777 4.098 4.96 4.857 2.336.792 4.849.923 7.256.38.265-.061.527-.132.786-.213.585-.184 1.27-.39 1.774-.753a.057.057 0 0 0 .023-.043v-1.809a.052.052 0 0 0-.02-.041.053.053 0 0 0-.046-.01 20.282 20.282 0 0 1-4.709.545c-2.73 0-3.463-1.284-3.674-1.818a5.593 5.593 0 0 1-.319-1.433.053.053 0 0 1 .066-.054c1.517.363 3.072.546 4.632.546.376 0 .75 0 1.125-.01 1.57-.044 3.224-.124 4.768-.422.038-.008.077-.015.11-.024 2.435-.464 4.753-1.92 4.989-5.604.008-.145.03-1.52.03-1.67.002-.512.167-3.63-.024-5.545zm-3.748 9.195h-2.561V8.29c0-1.309-.55-1.976-1.67-1.976-1.23 0-1.846.79-1.846 2.35v3.403h-2.546V8.663c0-1.56-.617-2.35-1.848-2.35-1.112 0-1.668.668-1.67 1.977v6.218H4.822V8.102c0-1.31.337-2.35 1.011-3.12.696-.77 1.608-1.164 2.74-1.164 1.311 0 2.302.5 2.962 1.498l.638 1.06.638-1.06c.66-.999 1.65-1.498 2.96-1.498 1.13 0 2.043.395 2.74 1.164.675.77 1.012 1.81 1.012 3.12z"/></svg>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="http://wmj5kiic7b6kjplpbvwadnht2nh2qnkbnqtcv3dyvpqtz7ssbssftxid.onion/" target="_blank" rel="noopener" title="0xacab" class="md-social__link">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m23.6 9.593-.033-.086L20.3.98a.851.851 0 0 0-.336-.405.875.875 0 0 0-1 .054.875.875 0 0 0-.29.44L16.47 7.818H7.537L5.332 1.07a.857.857 0 0 0-.29-.441.875.875 0 0 0-1-.054.859.859 0 0 0-.336.405L.433 9.502l-.032.086a6.066 6.066 0 0 0 2.012 7.01l.01.009.03.021 4.977 3.727 2.462 1.863 1.5 1.132a1.008 1.008 0 0 0 1.22 0l1.499-1.132 2.461-1.863 5.006-3.75.013-.01a6.068 6.068 0 0 0 2.01-7.002z"/></svg>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="http://it7otdanqu7ktntxzm427cba6i53w6wlanlh23v5i3siqmos47pzhvyd.onion/anonypla" target="_blank" rel="noopener" title="Darktea" class="md-social__link">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M4.209 4.603c-.247 0-.525.02-.84.088-.333.07-1.28.283-2.054 1.027C-.403 7.25.035 9.685.089 10.052c.065.446.263 1.687 1.21 2.768 1.749 2.141 5.513 2.092 5.513 2.092s.462 1.103 1.168 2.119c.955 1.263 1.936 2.248 2.89 2.367 2.406 0 7.212-.004 7.212-.004s.458.004 1.08-.394c.535-.324 1.013-.893 1.013-.893s.492-.527 1.18-1.73c.21-.37.385-.729.538-1.068 0 0 2.107-4.471 2.107-8.823-.042-1.318-.367-1.55-.443-1.627-.156-.156-.366-.153-.366-.153s-4.475.252-6.792.306c-.508.011-1.012.023-1.512.027v4.474l-.634-.301c0-1.39-.004-4.17-.004-4.17-1.107.016-3.405-.084-3.405-.084s-5.399-.27-5.987-.324c-.187-.011-.401-.032-.648-.032zm.354 1.832h.111s.271 2.269.6 3.597C5.549 11.147 6.22 13 6.22 13s-.996-.119-1.641-.348c-.99-.324-1.409-.714-1.409-.714s-.73-.511-1.096-1.52C1.444 8.73 2.021 7.7 2.021 7.7s.32-.859 1.47-1.145c.395-.106.863-.12 1.072-.12zm8.33 2.554c.26.003.509.127.509.127l.868.422-.529 1.075a.686.686 0 0 0-.614.359.685.685 0 0 0 .072.756l-.939 1.924a.69.69 0 0 0-.66.527.687.687 0 0 0 .347.763.686.686 0 0 0 .867-.206.688.688 0 0 0-.069-.882l.916-1.874a.667.667 0 0 0 .237-.02.657.657 0 0 0 .271-.137 8.826 8.826 0 0 1 1.016.512.761.761 0 0 1 .286.282c.073.21-.073.569-.073.569-.087.29-.702 1.55-.702 1.55a.692.692 0 0 0-.676.477.681.681 0 1 0 1.157-.252c.073-.141.141-.282.214-.431.19-.397.515-1.16.515-1.16.035-.066.218-.394.103-.814-.095-.435-.48-.638-.48-.638-.467-.301-1.116-.58-1.116-.58s0-.156-.042-.27a.688.688 0 0 0-.148-.241l.516-1.062 2.89 1.401s.48.218.583.619c.073.282-.019.534-.069.657-.24.587-2.1 4.317-2.1 4.317s-.232.554-.748.588a1.065 1.065 0 0 1-.393-.045l-.202-.08-4.31-2.1s-.417-.218-.49-.596c-.083-.31.104-.691.104-.691l2.073-4.272s.183-.37.466-.497a.855.855 0 0 1 .35-.077z"/></svg>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://github.com/anon-planet" target="_blank" rel="noopener" title="Github" class="md-social__link">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12"/></svg>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://gitlab.com/anonymousplanetorg" target="_blank" rel="noopener" title="Gitlab" class="md-social__link">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="m23.6 9.593-.033-.086L20.3.98a.851.851 0 0 0-.336-.405.875.875 0 0 0-1 .054.875.875 0 0 0-.29.44L16.47 7.818H7.537L5.332 1.07a.857.857 0 0 0-.29-.441.875.875 0 0 0-1-.054.859.859 0 0 0-.336.405L.433 9.502l-.032.086a6.066 6.066 0 0 0 2.012 7.01l.01.009.03.021 4.977 3.727 2.462 1.863 1.5 1.132a1.008 1.008 0 0 0 1.22 0l1.499-1.132 2.461-1.863 5.006-3.75.013-.01a6.068 6.068 0 0 0 2.01-7.002z"/></svg>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<a href="https://codeberg.org/anonymousplanet" target="_blank" rel="noopener" title="Codeberg" class="md-social__link">
|
||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"><path d="M11.955.49A12 12 0 0 0 0 12.49a12 12 0 0 0 1.832 6.373L11.838 5.928a.187.14 0 0 1 .324 0l10.006 12.935A12 12 0 0 0 24 12.49a12 12 0 0 0-12-12 12 12 0 0 0-.045 0zm.375 6.467 4.416 16.553a12 12 0 0 0 5.137-4.213z"/></svg>
|
||||||
|
</a>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</footer>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="md-dialog" data-md-component="dialog">
|
||||||
|
<div class="md-dialog__inner md-typeset"></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
<script id="__config" type="application/json">{"base": "/", "features": ["navigation.instant", "navigation.instant.prefetch", "navigation.tabs", "navigation.sections", "toc.integrate", "navigation.top", "search.suggest", "search.highlight", "content.tabs.link", "content.code.annotation", "content.code.copy"], "search": "/assets/javascripts/workers/search.b8dbb3d2.min.js", "translations": {"clipboard.copied": "Copied to clipboard", "clipboard.copy": "Copy to clipboard", "search.result.more.one": "1 more on this page", "search.result.more.other": "# more on this page", "search.result.none": "No matching documents", "search.result.one": "1 matching document", "search.result.other": "# matching documents", "search.result.placeholder": "Type to start searching", "search.result.term.missing": "Missing", "select.version": "Select version"}}</script>
|
||||||
|
|
||||||
|
|
||||||
|
<script src="/assets/javascripts/bundle.1e8ae164.min.js"></script>
|
||||||
|
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
Welcome.
|
|
||||||
|
|
||||||
## Star History
|
|
||||||
|
|
||||||
[](https://www.star-history.com/?repos=Anon-Planet%2Fthgtoa&type=date&logscale=&legend=bottom-right)
|
|
||||||
|
|
||||||
This is a guide with the aim of providing an introduction to various online tracking techniques, online ID verification techniques, and detailed guidance to creating and maintaining (truly) anonymous online identities. <span style="color: red">**It is written with hope for activists, journalists, scientists, lawyers, whistle-blowers, and good people being oppressed, censored, harassed anywhere!**</span> This guide has no affiliation with the [Anonymous](https://en.wikipedia.org/wiki/Anonymous_(hacker_group)) <sup>[[Wikiless]](https://wikiless.com/wiki/Anonymous_(hacker_group))</sup> <sup>[[Archive.org]](https://web.archive.org/web/https://en.wikipedia.org/wiki/Anonymous_(hacker_group))</sup> collective/movement.
|
|
||||||
|
|
||||||
This guide is an open-source non-profit initiative, [licensed](LICENSE.html) under **Creative Commons Attribution-NonCommercial 4.0 International** ([cc-by-nc-4.0](https://creativecommons.org/licenses/by-nc/4.0/) <sup>[[Archive.org]](https://web.archive.org/web/https://creativecommons.org/licenses/by-nc/4.0/)</sup>) and is **not sponsored/endorsed by any commercial/governmental entity**. This means that you are free to use our guide for pretty much any purpose **excluding commercially** as long as you do attribute it. There are no ads or any affiliate links.
|
|
||||||
|
|
||||||
**If you would like to make a donation to help this project, you can do so from [here](donations.html) where you will also find the project goals. All the donations will be strictly used within the context of this project. All donations and spendings are logged on the donations page.**
|
|
||||||
|
|
||||||
**Ways to read or export the guide**
|
|
||||||
|
|
||||||
- **In your browser:** [Hitchhiker's Guide](https://www.anonymousplanet.org/guide/) (hosted site). After a local build you can also open `site/guide/index.html` directly.
|
|
||||||
- **Local HTML preview:** from the repository root, with Python 3 and [MkDocs Material](https://squidfunk.github.io/mkdocs-material/getting-started/) installed (`pip install mkdocs-material`), run `mkdocs serve` and open the URL printed in the terminal (for example `http://127.0.0.1:8000`).
|
|
||||||
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 29 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 33 KiB |
|
After Width: | Height: | Size: 30 KiB |
|
After Width: | Height: | Size: 29 KiB |
@@ -0,0 +1,18 @@
|
|||||||
|
/*!
|
||||||
|
* Lunr languages, `Danish` language
|
||||||
|
* https://github.com/MihaiValentin/lunr-languages
|
||||||
|
*
|
||||||
|
* Copyright 2014, Mihai Valentin
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* based on
|
||||||
|
* Snowball JavaScript Library v0.3
|
||||||
|
* http://code.google.com/p/urim/
|
||||||
|
* http://snowball.tartarus.org/
|
||||||
|
*
|
||||||
|
* Copyright 2010, Oleg Mazko
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*/
|
||||||
|
|
||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){var e,r=f.cursor+3;if(d=f.limit,0<=r&&r<=f.limit){for(a=r;;){if(e=f.cursor,f.in_grouping(w,97,248)){f.cursor=e;break}if(f.cursor=e,e>=f.limit)return;f.cursor++}for(;!f.out_grouping(w,97,248);){if(f.cursor>=f.limit)return;f.cursor++}d=f.cursor,d<a&&(d=a)}}function n(){var e,r;if(f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(c,32),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del();break;case 2:f.in_grouping_b(p,97,229)&&f.slice_del()}}function t(){var e,r=f.limit-f.cursor;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.find_among_b(l,4)?(f.bra=f.cursor,f.limit_backward=e,f.cursor=f.limit-r,f.cursor>f.limit_backward&&(f.cursor--,f.bra=f.cursor,f.slice_del())):f.limit_backward=e)}function s(){var e,r,i,n=f.limit-f.cursor;if(f.ket=f.cursor,f.eq_s_b(2,"st")&&(f.bra=f.cursor,f.eq_s_b(2,"ig")&&f.slice_del()),f.cursor=f.limit-n,f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(m,5),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del(),i=f.limit-f.cursor,t(),f.cursor=f.limit-i;break;case 2:f.slice_from("løs")}}function o(){var e;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.out_grouping_b(w,97,248)?(f.bra=f.cursor,u=f.slice_to(u),f.limit_backward=e,f.eq_v_b(u)&&f.slice_del()):f.limit_backward=e)}var a,d,u,c=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],l=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],p=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],f=new i;this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var r=f.cursor;return e(),f.limit_backward=r,f.cursor=f.limit,n(),f.cursor=f.limit,t(),f.cursor=f.limit,s(),f.cursor=f.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hi=function(){this.pipeline.reset(),this.pipeline.add(e.hi.trimmer,e.hi.stopWordFilter,e.hi.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.hi.stemmer))},e.hi.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿa-zA-Za-zA-Z0-90-9",e.hi.trimmer=e.trimmerSupport.generateTrimmer(e.hi.wordCharacters),e.Pipeline.registerFunction(e.hi.trimmer,"trimmer-hi"),e.hi.stopWordFilter=e.generateStopWordFilter("अत अपना अपनी अपने अभी अंदर आदि आप इत्यादि इन इनका इन्हीं इन्हें इन्हों इस इसका इसकी इसके इसमें इसी इसे उन उनका उनकी उनके उनको उन्हीं उन्हें उन्हों उस उसके उसी उसे एक एवं एस ऐसे और कई कर करता करते करना करने करें कहते कहा का काफ़ी कि कितना किन्हें किन्हों किया किर किस किसी किसे की कुछ कुल के को कोई कौन कौनसा गया घर जब जहाँ जा जितना जिन जिन्हें जिन्हों जिस जिसे जीधर जैसा जैसे जो तक तब तरह तिन तिन्हें तिन्हों तिस तिसे तो था थी थे दबारा दिया दुसरा दूसरे दो द्वारा न नके नहीं ना निहायत नीचे ने पर पहले पूरा पे फिर बनी बही बहुत बाद बाला बिलकुल भी भीतर मगर मानो मे में यदि यह यहाँ यही या यिह ये रखें रहा रहे ऱ्वासा लिए लिये लेकिन व वग़ैरह वर्ग वह वहाँ वहीं वाले वुह वे वो सकता सकते सबसे सभी साथ साबुत साभ सारा से सो संग ही हुआ हुई हुए है हैं हो होता होती होते होना होने".split(" ")),e.hi.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.hi.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var t=i.toString().toLowerCase().replace(/^\s+/,"");return r.cut(t).split("|")},e.Pipeline.registerFunction(e.hi.stemmer,"stemmer-hi"),e.Pipeline.registerFunction(e.hi.stopWordFilter,"stopWordFilter-hi")}});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.hy=function(){this.pipeline.reset(),this.pipeline.add(e.hy.trimmer,e.hy.stopWordFilter)},e.hy.wordCharacters="[A-Za-z-֏ff-ﭏ]",e.hy.trimmer=e.trimmerSupport.generateTrimmer(e.hy.wordCharacters),e.Pipeline.registerFunction(e.hy.trimmer,"trimmer-hy"),e.hy.stopWordFilter=e.generateStopWordFilter("դու և եք էիր էիք հետո նաև նրանք որը վրա է որ պիտի են այս մեջ ն իր ու ի այդ որոնք այն կամ էր մի ես համար այլ իսկ էին ենք հետ ին թ էինք մենք նրա նա դուք եմ էի ըստ որպես ում".split(" ")),e.Pipeline.registerFunction(e.hy.stopWordFilter,"stopWordFilter-hy"),e.hy.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}(),e.Pipeline.registerFunction(e.hy.stemmer,"stemmer-hy")}});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.ja=function(){this.pipeline.reset(),this.pipeline.add(e.ja.trimmer,e.ja.stopWordFilter,e.ja.stemmer),r?this.tokenizer=e.ja.tokenizer:(e.tokenizer&&(e.tokenizer=e.ja.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.ja.tokenizer))};var t=new e.TinySegmenter;e.ja.tokenizer=function(i){var n,o,s,p,a,u,m,l,c,f;if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t.toLowerCase()):t.toLowerCase()});for(o=i.toString().toLowerCase().replace(/^\s+/,""),n=o.length-1;n>=0;n--)if(/\S/.test(o.charAt(n))){o=o.substring(0,n+1);break}for(a=[],s=o.length,c=0,l=0;c<=s;c++)if(u=o.charAt(c),m=c-l,u.match(/\s/)||c==s){if(m>0)for(p=t.segment(o.slice(l,c)).filter(function(e){return!!e}),f=l,n=0;n<p.length;n++)r?a.push(new e.Token(p[n],{position:[f,p[n].length],index:a.length})):a.push(p[n]),f+=p[n].length;l=c+1}return a},e.ja.stemmer=function(){return function(e){return e}}(),e.Pipeline.registerFunction(e.ja.stemmer,"stemmer-ja"),e.ja.wordCharacters="一二三四五六七八九十百千万億兆一-龠々〆ヵヶぁ-んァ-ヴーア-ン゙a-zA-Za-zA-Z0-90-9",e.ja.trimmer=e.trimmerSupport.generateTrimmer(e.ja.wordCharacters),e.Pipeline.registerFunction(e.ja.trimmer,"trimmer-ja"),e.ja.stopWordFilter=e.generateStopWordFilter("これ それ あれ この その あの ここ そこ あそこ こちら どこ だれ なに なん 何 私 貴方 貴方方 我々 私達 あの人 あのかた 彼女 彼 です あります おります います は が の に を で え から まで より も どの と し それで しかし".split(" ")),e.Pipeline.registerFunction(e.ja.stopWordFilter,"stopWordFilter-ja"),e.jp=e.ja,e.Pipeline.registerFunction(e.jp.stemmer,"stemmer-jp"),e.Pipeline.registerFunction(e.jp.trimmer,"trimmer-jp"),e.Pipeline.registerFunction(e.jp.stopWordFilter,"stopWordFilter-jp")}});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
module.exports=require("./lunr.ja");
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.kn=function(){this.pipeline.reset(),this.pipeline.add(e.kn.trimmer,e.kn.stopWordFilter,e.kn.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.kn.stemmer))},e.kn.wordCharacters="ಀ-಄ಅ-ಔಕ-ಹಾ-ೌ಼-ಽೕ-ೖೝ-ೞೠ-ೡೢ-ೣ೦-೯ೱ-ೳ",e.kn.trimmer=e.trimmerSupport.generateTrimmer(e.kn.wordCharacters),e.Pipeline.registerFunction(e.kn.trimmer,"trimmer-kn"),e.kn.stopWordFilter=e.generateStopWordFilter("ಮತ್ತು ಈ ಒಂದು ರಲ್ಲಿ ಹಾಗೂ ಎಂದು ಅಥವಾ ಇದು ರ ಅವರು ಎಂಬ ಮೇಲೆ ಅವರ ತನ್ನ ಆದರೆ ತಮ್ಮ ನಂತರ ಮೂಲಕ ಹೆಚ್ಚು ನ ಆ ಕೆಲವು ಅನೇಕ ಎರಡು ಹಾಗು ಪ್ರಮುಖ ಇದನ್ನು ಇದರ ಸುಮಾರು ಅದರ ಅದು ಮೊದಲ ಬಗ್ಗೆ ನಲ್ಲಿ ರಂದು ಇತರ ಅತ್ಯಂತ ಹೆಚ್ಚಿನ ಸಹ ಸಾಮಾನ್ಯವಾಗಿ ನೇ ಹಲವಾರು ಹೊಸ ದಿ ಕಡಿಮೆ ಯಾವುದೇ ಹೊಂದಿದೆ ದೊಡ್ಡ ಅನ್ನು ಇವರು ಪ್ರಕಾರ ಇದೆ ಮಾತ್ರ ಕೂಡ ಇಲ್ಲಿ ಎಲ್ಲಾ ವಿವಿಧ ಅದನ್ನು ಹಲವು ರಿಂದ ಕೇವಲ ದ ದಕ್ಷಿಣ ಗೆ ಅವನ ಅತಿ ನೆಯ ಬಹಳ ಕೆಲಸ ಎಲ್ಲ ಪ್ರತಿ ಇತ್ಯಾದಿ ಇವು ಬೇರೆ ಹೀಗೆ ನಡುವೆ ಇದಕ್ಕೆ ಎಸ್ ಇವರ ಮೊದಲು ಶ್ರೀ ಮಾಡುವ ಇದರಲ್ಲಿ ರೀತಿಯ ಮಾಡಿದ ಕಾಲ ಅಲ್ಲಿ ಮಾಡಲು ಅದೇ ಈಗ ಅವು ಗಳು ಎ ಎಂಬುದು ಅವನು ಅಂದರೆ ಅವರಿಗೆ ಇರುವ ವಿಶೇಷ ಮುಂದೆ ಅವುಗಳ ಮುಂತಾದ ಮೂಲ ಬಿ ಮೀ ಒಂದೇ ಇನ್ನೂ ಹೆಚ್ಚಾಗಿ ಮಾಡಿ ಅವರನ್ನು ಇದೇ ಯ ರೀತಿಯಲ್ಲಿ ಜೊತೆ ಅದರಲ್ಲಿ ಮಾಡಿದರು ನಡೆದ ಆಗ ಮತ್ತೆ ಪೂರ್ವ ಆತ ಬಂದ ಯಾವ ಒಟ್ಟು ಇತರೆ ಹಿಂದೆ ಪ್ರಮಾಣದ ಗಳನ್ನು ಕುರಿತು ಯು ಆದ್ದರಿಂದ ಅಲ್ಲದೆ ನಗರದ ಮೇಲಿನ ಏಕೆಂದರೆ ರಷ್ಟು ಎಂಬುದನ್ನು ಬಾರಿ ಎಂದರೆ ಹಿಂದಿನ ಆದರೂ ಆದ ಸಂಬಂಧಿಸಿದ ಮತ್ತೊಂದು ಸಿ ಆತನ ".split(" ")),e.kn.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.kn.tokenizer=function(t){if(!arguments.length||null==t||void 0==t)return[];if(Array.isArray(t))return t.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var n=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(n).split("|")},e.Pipeline.registerFunction(e.kn.stemmer,"stemmer-kn"),e.Pipeline.registerFunction(e.kn.stopWordFilter,"stopWordFilter-kn")}});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){e.multiLanguage=function(){for(var t=Array.prototype.slice.call(arguments),i=t.join("-"),r="",n=[],s=[],p=0;p<t.length;++p)"en"==t[p]?(r+="\\w",n.unshift(e.stopWordFilter),n.push(e.stemmer),s.push(e.stemmer)):(r+=e[t[p]].wordCharacters,e[t[p]].stopWordFilter&&n.unshift(e[t[p]].stopWordFilter),e[t[p]].stemmer&&(n.push(e[t[p]].stemmer),s.push(e[t[p]].stemmer)));var o=e.trimmerSupport.generateTrimmer(r);return e.Pipeline.registerFunction(o,"lunr-multi-trimmer-"+i),n.unshift(o),function(){this.pipeline.reset(),this.pipeline.add.apply(this.pipeline,n),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add.apply(this.searchPipeline,s))}}}});
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/*!
|
||||||
|
* Lunr languages, `Norwegian` language
|
||||||
|
* https://github.com/MihaiValentin/lunr-languages
|
||||||
|
*
|
||||||
|
* Copyright 2014, Mihai Valentin
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* based on
|
||||||
|
* Snowball JavaScript Library v0.3
|
||||||
|
* http://code.google.com/p/urim/
|
||||||
|
* http://snowball.tartarus.org/
|
||||||
|
*
|
||||||
|
* Copyright 2010, Oleg Mazko
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*/
|
||||||
|
|
||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.no=function(){this.pipeline.reset(),this.pipeline.add(e.no.trimmer,e.no.stopWordFilter,e.no.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.no.stemmer))},e.no.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.no.trimmer=e.trimmerSupport.generateTrimmer(e.no.wordCharacters),e.Pipeline.registerFunction(e.no.trimmer,"trimmer-no"),e.no.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,i=new function(){function e(){var e,r=w.cursor+3;if(a=w.limit,0<=r||r<=w.limit){for(s=r;;){if(e=w.cursor,w.in_grouping(d,97,248)){w.cursor=e;break}if(e>=w.limit)return;w.cursor=e+1}for(;!w.out_grouping(d,97,248);){if(w.cursor>=w.limit)return;w.cursor++}a=w.cursor,a<s&&(a=s)}}function i(){var e,r,n;if(w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(m,29),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:n=w.limit-w.cursor,w.in_grouping_b(c,98,122)?w.slice_del():(w.cursor=w.limit-n,w.eq_s_b(1,"k")&&w.out_grouping_b(d,97,248)&&w.slice_del());break;case 3:w.slice_from("er")}}function t(){var e,r=w.limit-w.cursor;w.cursor>=a&&(e=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,w.find_among_b(u,2)?(w.bra=w.cursor,w.limit_backward=e,w.cursor=w.limit-r,w.cursor>w.limit_backward&&(w.cursor--,w.bra=w.cursor,w.slice_del())):w.limit_backward=e)}function o(){var e,r;w.cursor>=a&&(r=w.limit_backward,w.limit_backward=a,w.ket=w.cursor,e=w.find_among_b(l,11),e?(w.bra=w.cursor,w.limit_backward=r,1==e&&w.slice_del()):w.limit_backward=r)}var s,a,m=[new r("a",-1,1),new r("e",-1,1),new r("ede",1,1),new r("ande",1,1),new r("ende",1,1),new r("ane",1,1),new r("ene",1,1),new r("hetene",6,1),new r("erte",1,3),new r("en",-1,1),new r("heten",9,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",12,1),new r("s",-1,2),new r("as",14,1),new r("es",14,1),new r("edes",16,1),new r("endes",16,1),new r("enes",16,1),new r("hetenes",19,1),new r("ens",14,1),new r("hetens",21,1),new r("ers",14,1),new r("ets",14,1),new r("et",-1,1),new r("het",25,1),new r("ert",-1,3),new r("ast",-1,1)],u=[new r("dt",-1,-1),new r("vt",-1,-1)],l=[new r("leg",-1,1),new r("eleg",0,1),new r("ig",-1,1),new r("eig",2,1),new r("lig",2,1),new r("elig",4,1),new r("els",-1,1),new r("lov",-1,1),new r("elov",7,1),new r("slov",7,1),new r("hetslov",9,1)],d=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],c=[119,125,149,1],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,i(),w.cursor=w.limit,t(),w.cursor=w.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return i.setCurrent(e),i.stem(),i.getCurrent()}):(i.setCurrent(e),i.stem(),i.getCurrent())}}(),e.Pipeline.registerFunction(e.no.stemmer,"stemmer-no"),e.no.stopWordFilter=e.generateStopWordFilter("alle at av bare begge ble blei bli blir blitt både båe da de deg dei deim deira deires dem den denne der dere deres det dette di din disse ditt du dykk dykkar då eg ein eit eitt eller elles en enn er et ett etter for fordi fra før ha hadde han hans har hennar henne hennes her hjå ho hoe honom hoss hossen hun hva hvem hver hvilke hvilken hvis hvor hvordan hvorfor i ikke ikkje ikkje ingen ingi inkje inn inni ja jeg kan kom korleis korso kun kunne kva kvar kvarhelst kven kvi kvifor man mange me med medan meg meget mellom men mi min mine mitt mot mykje ned no noe noen noka noko nokon nokor nokre nå når og også om opp oss over på samme seg selv si si sia sidan siden sin sine sitt sjøl skal skulle slik so som som somme somt så sånn til um upp ut uten var vart varte ved vere verte vi vil ville vore vors vort vår være være vært å".split(" ")),e.Pipeline.registerFunction(e.no.stopWordFilter,"stopWordFilter-no")}});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sa=function(){this.pipeline.reset(),this.pipeline.add(e.sa.trimmer,e.sa.stopWordFilter,e.sa.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sa.stemmer))},e.sa.wordCharacters="ऀ-ःऄ-एऐ-टठ-यर-िी-ॏॐ-य़ॠ-९॰-ॿ꣠-꣱ꣲ-ꣷ꣸-ꣻ꣼-ꣽꣾ-ꣿᆰ0-ᆰ9",e.sa.trimmer=e.trimmerSupport.generateTrimmer(e.sa.wordCharacters),e.Pipeline.registerFunction(e.sa.trimmer,"trimmer-sa"),e.sa.stopWordFilter=e.generateStopWordFilter('तथा अयम् एकम् इत्यस्मिन् तथा तत् वा अयम् इत्यस्य ते आहूत उपरि तेषाम् किन्तु तेषाम् तदा इत्यनेन अधिकः इत्यस्य तत् केचन बहवः द्वि तथा महत्वपूर्णः अयम् अस्य विषये अयं अस्ति तत् प्रथमः विषये इत्युपरि इत्युपरि इतर अधिकतमः अधिकः अपि सामान्यतया ठ इतरेतर नूतनम् द न्यूनम् कश्चित् वा विशालः द सः अस्ति तदनुसारम् तत्र अस्ति केवलम् अपि अत्र सर्वे विविधाः तत् बहवः यतः इदानीम् द दक्षिण इत्यस्मै तस्य उपरि नथ अतीव कार्यम् सर्वे एकैकम् इत्यादि। एते सन्ति उत इत्थम् मध्ये एतदर्थं . स कस्य प्रथमः श्री. करोति अस्मिन् प्रकारः निर्मिता कालः तत्र कर्तुं समान अधुना ते सन्ति स एकः अस्ति सः अर्थात् तेषां कृते . स्थितम् विशेषः अग्रिम तेषाम् समान स्रोतः ख म समान इदानीमपि अधिकतया करोतु ते समान इत्यस्य वीथी सह यस्मिन् कृतवान् धृतः तदा पुनः पूर्वं सः आगतः किम् कुल इतर पुरा मात्रा स विषये उ अतएव अपि नगरस्य उपरि यतः प्रतिशतं कतरः कालः साधनानि भूत तथापि जात सम्बन्धि अन्यत् ग अतः अस्माकं स्वकीयाः अस्माकं इदानीं अन्तः इत्यादयः भवन्तः इत्यादयः एते एताः तस्य अस्य इदम् एते तेषां तेषां तेषां तान् तेषां तेषां तेषां समानः सः एकः च तादृशाः बहवः अन्ये च वदन्ति यत् कियत् कस्मै कस्मै यस्मै यस्मै यस्मै यस्मै न अतिनीचः किन्तु प्रथमं सम्पूर्णतया ततः चिरकालानन्तरं पुस्तकं सम्पूर्णतया अन्तः किन्तु अत्र वा इह इव श्रद्धाय अवशिष्यते परन्तु अन्ये वर्गाः सन्ति ते सन्ति शक्नुवन्ति सर्वे मिलित्वा सर्वे एकत्र"'.split(" ")),e.sa.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var r=e.wordcut;r.init(),e.sa.tokenizer=function(t){if(!arguments.length||null==t||void 0==t)return[];if(Array.isArray(t))return t.map(function(r){return isLunr2?new e.Token(r.toLowerCase()):r.toLowerCase()});var i=t.toString().toLowerCase().replace(/^\s+/,"");return r.cut(i).split("|")},e.Pipeline.registerFunction(e.sa.stemmer,"stemmer-sa"),e.Pipeline.registerFunction(e.sa.stopWordFilter,"stopWordFilter-sa")}});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!function(r,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(r.lunr)}(this,function(){return function(r){r.stemmerSupport={Among:function(r,t,i,s){if(this.toCharArray=function(r){for(var t=r.length,i=new Array(t),s=0;s<t;s++)i[s]=r.charCodeAt(s);return i},!r&&""!=r||!t&&0!=t||!i)throw"Bad Among initialisation: s:"+r+", substring_i: "+t+", result: "+i;this.s_size=r.length,this.s=this.toCharArray(r),this.substring_i=t,this.result=i,this.method=s},SnowballProgram:function(){var r;return{bra:0,ket:0,limit:0,cursor:0,limit_backward:0,setCurrent:function(t){r=t,this.cursor=0,this.limit=t.length,this.limit_backward=0,this.bra=this.cursor,this.ket=this.limit},getCurrent:function(){var t=r;return r=null,t},in_grouping:function(t,i,s){if(this.cursor<this.limit){var e=r.charCodeAt(this.cursor);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},in_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e<=s&&e>=i&&(e-=i,t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},out_grouping:function(t,i,s){if(this.cursor<this.limit){var e=r.charCodeAt(this.cursor);if(e>s||e<i)return this.cursor++,!0;if(e-=i,!(t[e>>3]&1<<(7&e)))return this.cursor++,!0}return!1},out_grouping_b:function(t,i,s){if(this.cursor>this.limit_backward){var e=r.charCodeAt(this.cursor-1);if(e>s||e<i)return this.cursor--,!0;if(e-=i,!(t[e>>3]&1<<(7&e)))return this.cursor--,!0}return!1},eq_s:function(t,i){if(this.limit-this.cursor<t)return!1;for(var s=0;s<t;s++)if(r.charCodeAt(this.cursor+s)!=i.charCodeAt(s))return!1;return this.cursor+=t,!0},eq_s_b:function(t,i){if(this.cursor-this.limit_backward<t)return!1;for(var s=0;s<t;s++)if(r.charCodeAt(this.cursor-t+s)!=i.charCodeAt(s))return!1;return this.cursor-=t,!0},find_among:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o<h?o:h,_=t[a],m=l;m<_.s_size;m++){if(n+l==u){f=-1;break}if(f=r.charCodeAt(n+l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n+_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n+_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},find_among_b:function(t,i){for(var s=0,e=i,n=this.cursor,u=this.limit_backward,o=0,h=0,c=!1;;){for(var a=s+(e-s>>1),f=0,l=o<h?o:h,_=t[a],m=_.s_size-1-l;m>=0;m--){if(n-l==u){f=-1;break}if(f=r.charCodeAt(n-1-l)-_.s[m])break;l++}if(f<0?(e=a,h=l):(s=a,o=l),e-s<=1){if(s>0||e==s||c)break;c=!0}}for(;;){var _=t[s];if(o>=_.s_size){if(this.cursor=n-_.s_size,!_.method)return _.result;var b=_.method();if(this.cursor=n-_.s_size,b)return _.result}if((s=_.substring_i)<0)return 0}},replace_s:function(t,i,s){var e=s.length-(i-t),n=r.substring(0,t),u=r.substring(i);return r=n+s+u,this.limit+=e,this.cursor>=i?this.cursor+=e:this.cursor>t&&(this.cursor=t),e},slice_check:function(){if(this.bra<0||this.bra>this.ket||this.ket>this.limit||this.limit>r.length)throw"faulty slice operation"},slice_from:function(r){this.slice_check(),this.replace_s(this.bra,this.ket,r)},slice_del:function(){this.slice_from("")},insert:function(r,t,i){var s=this.replace_s(r,t,i);r<=this.bra&&(this.bra+=s),r<=this.ket&&(this.ket+=s)},slice_to:function(){return this.slice_check(),r.substring(this.bra,this.ket)},eq_v_b:function(r){return this.eq_s_b(r.length,r)}}}},r.trimmerSupport={generateTrimmer:function(r){var t=new RegExp("^[^"+r+"]+"),i=new RegExp("[^"+r+"]+$");return function(r){return"function"==typeof r.update?r.update(function(r){return r.replace(t,"").replace(i,"")}):r.replace(t,"").replace(i,"")}}}}});
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
/*!
|
||||||
|
* Lunr languages, `Swedish` language
|
||||||
|
* https://github.com/MihaiValentin/lunr-languages
|
||||||
|
*
|
||||||
|
* Copyright 2014, Mihai Valentin
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* based on
|
||||||
|
* Snowball JavaScript Library v0.3
|
||||||
|
* http://code.google.com/p/urim/
|
||||||
|
* http://snowball.tartarus.org/
|
||||||
|
*
|
||||||
|
* Copyright 2010, Oleg Mazko
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*/
|
||||||
|
|
||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.sv=function(){this.pipeline.reset(),this.pipeline.add(e.sv.trimmer,e.sv.stopWordFilter,e.sv.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.sv.stemmer))},e.sv.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.sv.trimmer=e.trimmerSupport.generateTrimmer(e.sv.wordCharacters),e.Pipeline.registerFunction(e.sv.trimmer,"trimmer-sv"),e.sv.stemmer=function(){var r=e.stemmerSupport.Among,n=e.stemmerSupport.SnowballProgram,t=new function(){function e(){var e,r=w.cursor+3;if(o=w.limit,0<=r||r<=w.limit){for(a=r;;){if(e=w.cursor,w.in_grouping(l,97,246)){w.cursor=e;break}if(w.cursor=e,w.cursor>=w.limit)return;w.cursor++}for(;!w.out_grouping(l,97,246);){if(w.cursor>=w.limit)return;w.cursor++}o=w.cursor,o<a&&(o=a)}}function t(){var e,r=w.limit_backward;if(w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(u,37),w.limit_backward=r,e))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.in_grouping_b(d,98,121)&&w.slice_del()}}function i(){var e=w.limit_backward;w.cursor>=o&&(w.limit_backward=o,w.cursor=w.limit,w.find_among_b(c,7)&&(w.cursor=w.limit,w.ket=w.cursor,w.cursor>w.limit_backward&&(w.bra=--w.cursor,w.slice_del())),w.limit_backward=e)}function s(){var e,r;if(w.cursor>=o){if(r=w.limit_backward,w.limit_backward=o,w.cursor=w.limit,w.ket=w.cursor,e=w.find_among_b(m,5))switch(w.bra=w.cursor,e){case 1:w.slice_del();break;case 2:w.slice_from("lös");break;case 3:w.slice_from("full")}w.limit_backward=r}}var a,o,u=[new r("a",-1,1),new r("arna",0,1),new r("erna",0,1),new r("heterna",2,1),new r("orna",0,1),new r("ad",-1,1),new r("e",-1,1),new r("ade",6,1),new r("ande",6,1),new r("arne",6,1),new r("are",6,1),new r("aste",6,1),new r("en",-1,1),new r("anden",12,1),new r("aren",12,1),new r("heten",12,1),new r("ern",-1,1),new r("ar",-1,1),new r("er",-1,1),new r("heter",18,1),new r("or",-1,1),new r("s",-1,2),new r("as",21,1),new r("arnas",22,1),new r("ernas",22,1),new r("ornas",22,1),new r("es",21,1),new r("ades",26,1),new r("andes",26,1),new r("ens",21,1),new r("arens",29,1),new r("hetens",29,1),new r("erns",21,1),new r("at",-1,1),new r("andet",-1,1),new r("het",-1,1),new r("ast",-1,1)],c=[new r("dd",-1,-1),new r("gd",-1,-1),new r("nn",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1),new r("tt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("els",-1,1),new r("fullt",-1,3),new r("löst",-1,2)],l=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,24,0,32],d=[119,127,149],w=new n;this.setCurrent=function(e){w.setCurrent(e)},this.getCurrent=function(){return w.getCurrent()},this.stem=function(){var r=w.cursor;return e(),w.limit_backward=r,w.cursor=w.limit,t(),w.cursor=w.limit,i(),w.cursor=w.limit,s(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return t.setCurrent(e),t.stem(),t.getCurrent()}):(t.setCurrent(e),t.stem(),t.getCurrent())}}(),e.Pipeline.registerFunction(e.sv.stemmer,"stemmer-sv"),e.sv.stopWordFilter=e.generateStopWordFilter("alla allt att av blev bli blir blivit de dem den denna deras dess dessa det detta dig din dina ditt du där då efter ej eller en er era ert ett från för ha hade han hans har henne hennes hon honom hur här i icke ingen inom inte jag ju kan kunde man med mellan men mig min mina mitt mot mycket ni nu när någon något några och om oss på samma sedan sig sin sina sitta själv skulle som så sådan sådana sådant till under upp ut utan vad var vara varför varit varje vars vart vem vi vid vilka vilkas vilken vilket vår våra vårt än är åt över".split(" ")),e.Pipeline.registerFunction(e.sv.stopWordFilter,"stopWordFilter-sv")}});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.ta=function(){this.pipeline.reset(),this.pipeline.add(e.ta.trimmer,e.ta.stopWordFilter,e.ta.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.ta.stemmer))},e.ta.wordCharacters="-உஊ-ஏஐ-ஙச-ட-னப-யர-ஹ-ிீ-ொ-ௐ---௩௪-௯௰-௹௺-a-zA-Za-zA-Z0-90-9",e.ta.trimmer=e.trimmerSupport.generateTrimmer(e.ta.wordCharacters),e.Pipeline.registerFunction(e.ta.trimmer,"trimmer-ta"),e.ta.stopWordFilter=e.generateStopWordFilter("அங்கு அங்கே அது அதை அந்த அவர் அவர்கள் அவள் அவன் அவை ஆக ஆகவே ஆகையால் ஆதலால் ஆதலினால் ஆனாலும் ஆனால் இங்கு இங்கே இது இதை இந்த இப்படி இவர் இவர்கள் இவள் இவன் இவை இவ்வளவு உனக்கு உனது உன் உன்னால் எங்கு எங்கே எது எதை எந்த எப்படி எவர் எவர்கள் எவள் எவன் எவை எவ்வளவு எனக்கு எனது எனவே என் என்ன என்னால் ஏது ஏன் தனது தன்னால் தானே தான் நாங்கள் நாம் நான் நீ நீங்கள்".split(" ")),e.ta.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.ta.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.ta.stemmer,"stemmer-ta"),e.Pipeline.registerFunction(e.ta.stopWordFilter,"stopWordFilter-ta")}});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!function(e,t){"function"==typeof define&&define.amd?define(t):"object"==typeof exports?module.exports=t():t()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.te=function(){this.pipeline.reset(),this.pipeline.add(e.te.trimmer,e.te.stopWordFilter,e.te.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.te.stemmer))},e.te.wordCharacters="ఀ-ఄఅ-ఔక-హా-ౌౕ-ౖౘ-ౚౠ-ౡౢ-ౣ౦-౯౸-౿఼ఽ్ౝ౷",e.te.trimmer=e.trimmerSupport.generateTrimmer(e.te.wordCharacters),e.Pipeline.registerFunction(e.te.trimmer,"trimmer-te"),e.te.stopWordFilter=e.generateStopWordFilter("అందరూ అందుబాటులో అడగండి అడగడం అడ్డంగా అనుగుణంగా అనుమతించు అనుమతిస్తుంది అయితే ఇప్పటికే ఉన్నారు ఎక్కడైనా ఎప్పుడు ఎవరైనా ఎవరో ఏ ఏదైనా ఏమైనప్పటికి ఒక ఒకరు కనిపిస్తాయి కాదు కూడా గా గురించి చుట్టూ చేయగలిగింది తగిన తర్వాత దాదాపు దూరంగా నిజంగా పై ప్రకారం ప్రక్కన మధ్య మరియు మరొక మళ్ళీ మాత్రమే మెచ్చుకో వద్ద వెంట వేరుగా వ్యతిరేకంగా సంబంధం".split(" ")),e.te.stemmer=function(){return function(e){return"function"==typeof e.update?e.update(function(e){return e}):e}}();var t=e.wordcut;t.init(),e.te.tokenizer=function(r){if(!arguments.length||null==r||void 0==r)return[];if(Array.isArray(r))return r.map(function(t){return isLunr2?new e.Token(t.toLowerCase()):t.toLowerCase()});var i=r.toString().toLowerCase().replace(/^\s+/,"");return t.cut(i).split("|")},e.Pipeline.registerFunction(e.te.stemmer,"stemmer-te"),e.Pipeline.registerFunction(e.te.stopWordFilter,"stopWordFilter-te")}});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var r="2"==e.version[0];e.th=function(){this.pipeline.reset(),this.pipeline.add(e.th.trimmer),r?this.tokenizer=e.th.tokenizer:(e.tokenizer&&(e.tokenizer=e.th.tokenizer),this.tokenizerFn&&(this.tokenizerFn=e.th.tokenizer))},e.th.wordCharacters="[-]",e.th.trimmer=e.trimmerSupport.generateTrimmer(e.th.wordCharacters),e.Pipeline.registerFunction(e.th.trimmer,"trimmer-th");var t=e.wordcut;t.init(),e.th.tokenizer=function(i){if(!arguments.length||null==i||void 0==i)return[];if(Array.isArray(i))return i.map(function(t){return r?new e.Token(t):t});var n=i.toString().replace(/^\s+/,"");return t.cut(n).split("|")}}});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.vi=function(){this.pipeline.reset(),this.pipeline.add(e.vi.stopWordFilter,e.vi.trimmer)},e.vi.wordCharacters="[A-Za-ẓ̀͐́͑̉̃̓ÂâÊêÔôĂ-ăĐ-đƠ-ơƯ-ư]",e.vi.trimmer=e.trimmerSupport.generateTrimmer(e.vi.wordCharacters),e.Pipeline.registerFunction(e.vi.trimmer,"trimmer-vi"),e.vi.stopWordFilter=e.generateStopWordFilter("là cái nhưng mà".split(" "))}});
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r(require("@node-rs/jieba")):r()(e.lunr)}(this,function(e){return function(r,t){if(void 0===r)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===r.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");var i="2"==r.version[0];r.zh=function(){this.pipeline.reset(),this.pipeline.add(r.zh.trimmer,r.zh.stopWordFilter,r.zh.stemmer),i?this.tokenizer=r.zh.tokenizer:(r.tokenizer&&(r.tokenizer=r.zh.tokenizer),this.tokenizerFn&&(this.tokenizerFn=r.zh.tokenizer))},r.zh.tokenizer=function(n){if(!arguments.length||null==n||void 0==n)return[];if(Array.isArray(n))return n.map(function(e){return i?new r.Token(e.toLowerCase()):e.toLowerCase()});t&&e.load(t);var o=n.toString().trim().toLowerCase(),s=[];e.cut(o,!0).forEach(function(e){s=s.concat(e.split(" "))}),s=s.filter(function(e){return!!e});var u=0;return s.map(function(e,t){if(i){var n=o.indexOf(e,u),s={};return s.position=[n,e.length],s.index=t,u=n,new r.Token(e,s)}return e})},r.zh.wordCharacters="\\w一-龥",r.zh.trimmer=r.trimmerSupport.generateTrimmer(r.zh.wordCharacters),r.Pipeline.registerFunction(r.zh.trimmer,"trimmer-zh"),r.zh.stemmer=function(){return function(e){return e}}(),r.Pipeline.registerFunction(r.zh.stemmer,"stemmer-zh"),r.zh.stopWordFilter=r.generateStopWordFilter("的 一 不 在 人 有 是 为 為 以 于 於 上 他 而 后 後 之 来 來 及 了 因 下 可 到 由 这 這 与 與 也 此 但 并 並 个 個 其 已 无 無 小 我 们 們 起 最 再 今 去 好 只 又 或 很 亦 某 把 那 你 乃 它 吧 被 比 别 趁 当 當 从 從 得 打 凡 儿 兒 尔 爾 该 該 各 给 給 跟 和 何 还 還 即 几 幾 既 看 据 據 距 靠 啦 另 么 麽 每 嘛 拿 哪 您 凭 憑 且 却 卻 让 讓 仍 啥 如 若 使 谁 誰 虽 雖 随 隨 同 所 她 哇 嗡 往 些 向 沿 哟 喲 用 咱 则 則 怎 曾 至 致 着 著 诸 諸 自".split(" ")),r.Pipeline.registerFunction(r.zh.stopWordFilter,"stopWordFilter-zh")}});
|
||||||
@@ -0,0 +1,206 @@
|
|||||||
|
/**
|
||||||
|
* export the module via AMD, CommonJS or as a browser global
|
||||||
|
* Export code from https://github.com/umdjs/umd/blob/master/returnExports.js
|
||||||
|
*/
|
||||||
|
;(function (root, factory) {
|
||||||
|
if (typeof define === 'function' && define.amd) {
|
||||||
|
// AMD. Register as an anonymous module.
|
||||||
|
define(factory)
|
||||||
|
} else if (typeof exports === 'object') {
|
||||||
|
/**
|
||||||
|
* Node. Does not work with strict CommonJS, but
|
||||||
|
* only CommonJS-like environments that support module.exports,
|
||||||
|
* like Node.
|
||||||
|
*/
|
||||||
|
module.exports = factory()
|
||||||
|
} else {
|
||||||
|
// Browser globals (root is window)
|
||||||
|
factory()(root.lunr);
|
||||||
|
}
|
||||||
|
}(this, function () {
|
||||||
|
/**
|
||||||
|
* Just return a value to define the module export.
|
||||||
|
* This example returns an object, but the module
|
||||||
|
* can return a function as the exported value.
|
||||||
|
*/
|
||||||
|
|
||||||
|
return function(lunr) {
|
||||||
|
// TinySegmenter 0.1 -- Super compact Japanese tokenizer in Javascript
|
||||||
|
// (c) 2008 Taku Kudo <taku@chasen.org>
|
||||||
|
// TinySegmenter is freely distributable under the terms of a new BSD licence.
|
||||||
|
// For details, see http://chasen.org/~taku/software/TinySegmenter/LICENCE.txt
|
||||||
|
|
||||||
|
function TinySegmenter() {
|
||||||
|
var patterns = {
|
||||||
|
"[一二三四五六七八九十百千万億兆]":"M",
|
||||||
|
"[一-龠々〆ヵヶ]":"H",
|
||||||
|
"[ぁ-ん]":"I",
|
||||||
|
"[ァ-ヴーア-ン゙ー]":"K",
|
||||||
|
"[a-zA-Za-zA-Z]":"A",
|
||||||
|
"[0-90-9]":"N"
|
||||||
|
}
|
||||||
|
this.chartype_ = [];
|
||||||
|
for (var i in patterns) {
|
||||||
|
var regexp = new RegExp(i);
|
||||||
|
this.chartype_.push([regexp, patterns[i]]);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.BIAS__ = -332
|
||||||
|
this.BC1__ = {"HH":6,"II":2461,"KH":406,"OH":-1378};
|
||||||
|
this.BC2__ = {"AA":-3267,"AI":2744,"AN":-878,"HH":-4070,"HM":-1711,"HN":4012,"HO":3761,"IA":1327,"IH":-1184,"II":-1332,"IK":1721,"IO":5492,"KI":3831,"KK":-8741,"MH":-3132,"MK":3334,"OO":-2920};
|
||||||
|
this.BC3__ = {"HH":996,"HI":626,"HK":-721,"HN":-1307,"HO":-836,"IH":-301,"KK":2762,"MK":1079,"MM":4034,"OA":-1652,"OH":266};
|
||||||
|
this.BP1__ = {"BB":295,"OB":304,"OO":-125,"UB":352};
|
||||||
|
this.BP2__ = {"BO":60,"OO":-1762};
|
||||||
|
this.BQ1__ = {"BHH":1150,"BHM":1521,"BII":-1158,"BIM":886,"BMH":1208,"BNH":449,"BOH":-91,"BOO":-2597,"OHI":451,"OIH":-296,"OKA":1851,"OKH":-1020,"OKK":904,"OOO":2965};
|
||||||
|
this.BQ2__ = {"BHH":118,"BHI":-1159,"BHM":466,"BIH":-919,"BKK":-1720,"BKO":864,"OHH":-1139,"OHM":-181,"OIH":153,"UHI":-1146};
|
||||||
|
this.BQ3__ = {"BHH":-792,"BHI":2664,"BII":-299,"BKI":419,"BMH":937,"BMM":8335,"BNN":998,"BOH":775,"OHH":2174,"OHM":439,"OII":280,"OKH":1798,"OKI":-793,"OKO":-2242,"OMH":-2402,"OOO":11699};
|
||||||
|
this.BQ4__ = {"BHH":-3895,"BIH":3761,"BII":-4654,"BIK":1348,"BKK":-1806,"BMI":-3385,"BOO":-12396,"OAH":926,"OHH":266,"OHK":-2036,"ONN":-973};
|
||||||
|
this.BW1__ = {",と":660,",同":727,"B1あ":1404,"B1同":542,"、と":660,"、同":727,"」と":1682,"あっ":1505,"いう":1743,"いっ":-2055,"いる":672,"うし":-4817,"うん":665,"から":3472,"がら":600,"こう":-790,"こと":2083,"こん":-1262,"さら":-4143,"さん":4573,"した":2641,"して":1104,"すで":-3399,"そこ":1977,"それ":-871,"たち":1122,"ため":601,"った":3463,"つい":-802,"てい":805,"てき":1249,"でき":1127,"です":3445,"では":844,"とい":-4915,"とみ":1922,"どこ":3887,"ない":5713,"なっ":3015,"など":7379,"なん":-1113,"にし":2468,"には":1498,"にも":1671,"に対":-912,"の一":-501,"の中":741,"ませ":2448,"まで":1711,"まま":2600,"まる":-2155,"やむ":-1947,"よっ":-2565,"れた":2369,"れで":-913,"をし":1860,"を見":731,"亡く":-1886,"京都":2558,"取り":-2784,"大き":-2604,"大阪":1497,"平方":-2314,"引き":-1336,"日本":-195,"本当":-2423,"毎日":-2113,"目指":-724,"B1あ":1404,"B1同":542,"」と":1682};
|
||||||
|
this.BW2__ = {"..":-11822,"11":-669,"――":-5730,"−−":-13175,"いう":-1609,"うか":2490,"かし":-1350,"かも":-602,"から":-7194,"かれ":4612,"がい":853,"がら":-3198,"きた":1941,"くな":-1597,"こと":-8392,"この":-4193,"させ":4533,"され":13168,"さん":-3977,"しい":-1819,"しか":-545,"した":5078,"して":972,"しな":939,"その":-3744,"たい":-1253,"たた":-662,"ただ":-3857,"たち":-786,"たと":1224,"たは":-939,"った":4589,"って":1647,"っと":-2094,"てい":6144,"てき":3640,"てく":2551,"ては":-3110,"ても":-3065,"でい":2666,"でき":-1528,"でし":-3828,"です":-4761,"でも":-4203,"とい":1890,"とこ":-1746,"とと":-2279,"との":720,"とみ":5168,"とも":-3941,"ない":-2488,"なが":-1313,"など":-6509,"なの":2614,"なん":3099,"にお":-1615,"にし":2748,"にな":2454,"によ":-7236,"に対":-14943,"に従":-4688,"に関":-11388,"のか":2093,"ので":-7059,"のに":-6041,"のの":-6125,"はい":1073,"はが":-1033,"はず":-2532,"ばれ":1813,"まし":-1316,"まで":-6621,"まれ":5409,"めて":-3153,"もい":2230,"もの":-10713,"らか":-944,"らし":-1611,"らに":-1897,"りし":651,"りま":1620,"れた":4270,"れて":849,"れば":4114,"ろう":6067,"われ":7901,"を通":-11877,"んだ":728,"んな":-4115,"一人":602,"一方":-1375,"一日":970,"一部":-1051,"上が":-4479,"会社":-1116,"出て":2163,"分の":-7758,"同党":970,"同日":-913,"大阪":-2471,"委員":-1250,"少な":-1050,"年度":-8669,"年間":-1626,"府県":-2363,"手権":-1982,"新聞":-4066,"日新":-722,"日本":-7068,"日米":3372,"曜日":-601,"朝鮮":-2355,"本人":-2697,"東京":-1543,"然と":-1384,"社会":-1276,"立て":-990,"第に":-1612,"米国":-4268,"11":-669};
|
||||||
|
this.BW3__ = {"あた":-2194,"あり":719,"ある":3846,"い.":-1185,"い。":-1185,"いい":5308,"いえ":2079,"いく":3029,"いた":2056,"いっ":1883,"いる":5600,"いわ":1527,"うち":1117,"うと":4798,"えと":1454,"か.":2857,"か。":2857,"かけ":-743,"かっ":-4098,"かに":-669,"から":6520,"かり":-2670,"が,":1816,"が、":1816,"がき":-4855,"がけ":-1127,"がっ":-913,"がら":-4977,"がり":-2064,"きた":1645,"けど":1374,"こと":7397,"この":1542,"ころ":-2757,"さい":-714,"さを":976,"し,":1557,"し、":1557,"しい":-3714,"した":3562,"して":1449,"しな":2608,"しま":1200,"す.":-1310,"す。":-1310,"する":6521,"ず,":3426,"ず、":3426,"ずに":841,"そう":428,"た.":8875,"た。":8875,"たい":-594,"たの":812,"たり":-1183,"たる":-853,"だ.":4098,"だ。":4098,"だっ":1004,"った":-4748,"って":300,"てい":6240,"てお":855,"ても":302,"です":1437,"でに":-1482,"では":2295,"とう":-1387,"とし":2266,"との":541,"とも":-3543,"どう":4664,"ない":1796,"なく":-903,"など":2135,"に,":-1021,"に、":-1021,"にし":1771,"にな":1906,"には":2644,"の,":-724,"の、":-724,"の子":-1000,"は,":1337,"は、":1337,"べき":2181,"まし":1113,"ます":6943,"まっ":-1549,"まで":6154,"まれ":-793,"らし":1479,"られ":6820,"るる":3818,"れ,":854,"れ、":854,"れた":1850,"れて":1375,"れば":-3246,"れる":1091,"われ":-605,"んだ":606,"んで":798,"カ月":990,"会議":860,"入り":1232,"大会":2217,"始め":1681,"市":965,"新聞":-5055,"日,":974,"日、":974,"社会":2024,"カ月":990};
|
||||||
|
this.TC1__ = {"AAA":1093,"HHH":1029,"HHM":580,"HII":998,"HOH":-390,"HOM":-331,"IHI":1169,"IOH":-142,"IOI":-1015,"IOM":467,"MMH":187,"OOI":-1832};
|
||||||
|
this.TC2__ = {"HHO":2088,"HII":-1023,"HMM":-1154,"IHI":-1965,"KKH":703,"OII":-2649};
|
||||||
|
this.TC3__ = {"AAA":-294,"HHH":346,"HHI":-341,"HII":-1088,"HIK":731,"HOH":-1486,"IHH":128,"IHI":-3041,"IHO":-1935,"IIH":-825,"IIM":-1035,"IOI":-542,"KHH":-1216,"KKA":491,"KKH":-1217,"KOK":-1009,"MHH":-2694,"MHM":-457,"MHO":123,"MMH":-471,"NNH":-1689,"NNO":662,"OHO":-3393};
|
||||||
|
this.TC4__ = {"HHH":-203,"HHI":1344,"HHK":365,"HHM":-122,"HHN":182,"HHO":669,"HIH":804,"HII":679,"HOH":446,"IHH":695,"IHO":-2324,"IIH":321,"III":1497,"IIO":656,"IOO":54,"KAK":4845,"KKA":3386,"KKK":3065,"MHH":-405,"MHI":201,"MMH":-241,"MMM":661,"MOM":841};
|
||||||
|
this.TQ1__ = {"BHHH":-227,"BHHI":316,"BHIH":-132,"BIHH":60,"BIII":1595,"BNHH":-744,"BOHH":225,"BOOO":-908,"OAKK":482,"OHHH":281,"OHIH":249,"OIHI":200,"OIIH":-68};
|
||||||
|
this.TQ2__ = {"BIHH":-1401,"BIII":-1033,"BKAK":-543,"BOOO":-5591};
|
||||||
|
this.TQ3__ = {"BHHH":478,"BHHM":-1073,"BHIH":222,"BHII":-504,"BIIH":-116,"BIII":-105,"BMHI":-863,"BMHM":-464,"BOMH":620,"OHHH":346,"OHHI":1729,"OHII":997,"OHMH":481,"OIHH":623,"OIIH":1344,"OKAK":2792,"OKHH":587,"OKKA":679,"OOHH":110,"OOII":-685};
|
||||||
|
this.TQ4__ = {"BHHH":-721,"BHHM":-3604,"BHII":-966,"BIIH":-607,"BIII":-2181,"OAAA":-2763,"OAKK":180,"OHHH":-294,"OHHI":2446,"OHHO":480,"OHIH":-1573,"OIHH":1935,"OIHI":-493,"OIIH":626,"OIII":-4007,"OKAK":-8156};
|
||||||
|
this.TW1__ = {"につい":-4681,"東京都":2026};
|
||||||
|
this.TW2__ = {"ある程":-2049,"いった":-1256,"ころが":-2434,"しょう":3873,"その後":-4430,"だって":-1049,"ていた":1833,"として":-4657,"ともに":-4517,"もので":1882,"一気に":-792,"初めて":-1512,"同時に":-8097,"大きな":-1255,"対して":-2721,"社会党":-3216};
|
||||||
|
this.TW3__ = {"いただ":-1734,"してい":1314,"として":-4314,"につい":-5483,"にとっ":-5989,"に当た":-6247,"ので,":-727,"ので、":-727,"のもの":-600,"れから":-3752,"十二月":-2287};
|
||||||
|
this.TW4__ = {"いう.":8576,"いう。":8576,"からな":-2348,"してい":2958,"たが,":1516,"たが、":1516,"ている":1538,"という":1349,"ました":5543,"ません":1097,"ようと":-4258,"よると":5865};
|
||||||
|
this.UC1__ = {"A":484,"K":93,"M":645,"O":-505};
|
||||||
|
this.UC2__ = {"A":819,"H":1059,"I":409,"M":3987,"N":5775,"O":646};
|
||||||
|
this.UC3__ = {"A":-1370,"I":2311};
|
||||||
|
this.UC4__ = {"A":-2643,"H":1809,"I":-1032,"K":-3450,"M":3565,"N":3876,"O":6646};
|
||||||
|
this.UC5__ = {"H":313,"I":-1238,"K":-799,"M":539,"O":-831};
|
||||||
|
this.UC6__ = {"H":-506,"I":-253,"K":87,"M":247,"O":-387};
|
||||||
|
this.UP1__ = {"O":-214};
|
||||||
|
this.UP2__ = {"B":69,"O":935};
|
||||||
|
this.UP3__ = {"B":189};
|
||||||
|
this.UQ1__ = {"BH":21,"BI":-12,"BK":-99,"BN":142,"BO":-56,"OH":-95,"OI":477,"OK":410,"OO":-2422};
|
||||||
|
this.UQ2__ = {"BH":216,"BI":113,"OK":1759};
|
||||||
|
this.UQ3__ = {"BA":-479,"BH":42,"BI":1913,"BK":-7198,"BM":3160,"BN":6427,"BO":14761,"OI":-827,"ON":-3212};
|
||||||
|
this.UW1__ = {",":156,"、":156,"「":-463,"あ":-941,"う":-127,"が":-553,"き":121,"こ":505,"で":-201,"と":-547,"ど":-123,"に":-789,"の":-185,"は":-847,"も":-466,"や":-470,"よ":182,"ら":-292,"り":208,"れ":169,"を":-446,"ん":-137,"・":-135,"主":-402,"京":-268,"区":-912,"午":871,"国":-460,"大":561,"委":729,"市":-411,"日":-141,"理":361,"生":-408,"県":-386,"都":-718,"「":-463,"・":-135};
|
||||||
|
this.UW2__ = {",":-829,"、":-829,"〇":892,"「":-645,"」":3145,"あ":-538,"い":505,"う":134,"お":-502,"か":1454,"が":-856,"く":-412,"こ":1141,"さ":878,"ざ":540,"し":1529,"す":-675,"せ":300,"そ":-1011,"た":188,"だ":1837,"つ":-949,"て":-291,"で":-268,"と":-981,"ど":1273,"な":1063,"に":-1764,"の":130,"は":-409,"ひ":-1273,"べ":1261,"ま":600,"も":-1263,"や":-402,"よ":1639,"り":-579,"る":-694,"れ":571,"を":-2516,"ん":2095,"ア":-587,"カ":306,"キ":568,"ッ":831,"三":-758,"不":-2150,"世":-302,"中":-968,"主":-861,"事":492,"人":-123,"会":978,"保":362,"入":548,"初":-3025,"副":-1566,"北":-3414,"区":-422,"大":-1769,"天":-865,"太":-483,"子":-1519,"学":760,"実":1023,"小":-2009,"市":-813,"年":-1060,"強":1067,"手":-1519,"揺":-1033,"政":1522,"文":-1355,"新":-1682,"日":-1815,"明":-1462,"最":-630,"朝":-1843,"本":-1650,"東":-931,"果":-665,"次":-2378,"民":-180,"気":-1740,"理":752,"発":529,"目":-1584,"相":-242,"県":-1165,"立":-763,"第":810,"米":509,"自":-1353,"行":838,"西":-744,"見":-3874,"調":1010,"議":1198,"込":3041,"開":1758,"間":-1257,"「":-645,"」":3145,"ッ":831,"ア":-587,"カ":306,"キ":568};
|
||||||
|
this.UW3__ = {",":4889,"1":-800,"−":-1723,"、":4889,"々":-2311,"〇":5827,"」":2670,"〓":-3573,"あ":-2696,"い":1006,"う":2342,"え":1983,"お":-4864,"か":-1163,"が":3271,"く":1004,"け":388,"げ":401,"こ":-3552,"ご":-3116,"さ":-1058,"し":-395,"す":584,"せ":3685,"そ":-5228,"た":842,"ち":-521,"っ":-1444,"つ":-1081,"て":6167,"で":2318,"と":1691,"ど":-899,"な":-2788,"に":2745,"の":4056,"は":4555,"ひ":-2171,"ふ":-1798,"へ":1199,"ほ":-5516,"ま":-4384,"み":-120,"め":1205,"も":2323,"や":-788,"よ":-202,"ら":727,"り":649,"る":5905,"れ":2773,"わ":-1207,"を":6620,"ん":-518,"ア":551,"グ":1319,"ス":874,"ッ":-1350,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278,"・":-3794,"一":-1619,"下":-1759,"世":-2087,"両":3815,"中":653,"主":-758,"予":-1193,"二":974,"人":2742,"今":792,"他":1889,"以":-1368,"低":811,"何":4265,"作":-361,"保":-2439,"元":4858,"党":3593,"全":1574,"公":-3030,"六":755,"共":-1880,"円":5807,"再":3095,"分":457,"初":2475,"別":1129,"前":2286,"副":4437,"力":365,"動":-949,"務":-1872,"化":1327,"北":-1038,"区":4646,"千":-2309,"午":-783,"協":-1006,"口":483,"右":1233,"各":3588,"合":-241,"同":3906,"和":-837,"員":4513,"国":642,"型":1389,"場":1219,"外":-241,"妻":2016,"学":-1356,"安":-423,"実":-1008,"家":1078,"小":-513,"少":-3102,"州":1155,"市":3197,"平":-1804,"年":2416,"広":-1030,"府":1605,"度":1452,"建":-2352,"当":-3885,"得":1905,"思":-1291,"性":1822,"戸":-488,"指":-3973,"政":-2013,"教":-1479,"数":3222,"文":-1489,"新":1764,"日":2099,"旧":5792,"昨":-661,"時":-1248,"曜":-951,"最":-937,"月":4125,"期":360,"李":3094,"村":364,"東":-805,"核":5156,"森":2438,"業":484,"氏":2613,"民":-1694,"決":-1073,"法":1868,"海":-495,"無":979,"物":461,"特":-3850,"生":-273,"用":914,"町":1215,"的":7313,"直":-1835,"省":792,"県":6293,"知":-1528,"私":4231,"税":401,"立":-960,"第":1201,"米":7767,"系":3066,"約":3663,"級":1384,"統":-4229,"総":1163,"線":1255,"者":6457,"能":725,"自":-2869,"英":785,"見":1044,"調":-562,"財":-733,"費":1777,"車":1835,"軍":1375,"込":-1504,"通":-1136,"選":-681,"郎":1026,"郡":4404,"部":1200,"金":2163,"長":421,"開":-1432,"間":1302,"関":-1282,"雨":2009,"電":-1045,"非":2066,"駅":1620,"1":-800,"」":2670,"・":-3794,"ッ":-1350,"ア":551,"グ":1319,"ス":874,"ト":521,"ム":1109,"ル":1591,"ロ":2201,"ン":278};
|
||||||
|
this.UW4__ = {",":3930,".":3508,"―":-4841,"、":3930,"。":3508,"〇":4999,"「":1895,"」":3798,"〓":-5156,"あ":4752,"い":-3435,"う":-640,"え":-2514,"お":2405,"か":530,"が":6006,"き":-4482,"ぎ":-3821,"く":-3788,"け":-4376,"げ":-4734,"こ":2255,"ご":1979,"さ":2864,"し":-843,"じ":-2506,"す":-731,"ず":1251,"せ":181,"そ":4091,"た":5034,"だ":5408,"ち":-3654,"っ":-5882,"つ":-1659,"て":3994,"で":7410,"と":4547,"な":5433,"に":6499,"ぬ":1853,"ね":1413,"の":7396,"は":8578,"ば":1940,"ひ":4249,"び":-4134,"ふ":1345,"へ":6665,"べ":-744,"ほ":1464,"ま":1051,"み":-2082,"む":-882,"め":-5046,"も":4169,"ゃ":-2666,"や":2795,"ょ":-1544,"よ":3351,"ら":-2922,"り":-9726,"る":-14896,"れ":-2613,"ろ":-4570,"わ":-1783,"を":13150,"ん":-2352,"カ":2145,"コ":1789,"セ":1287,"ッ":-724,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637,"・":-4371,"ー":-11870,"一":-2069,"中":2210,"予":782,"事":-190,"井":-1768,"人":1036,"以":544,"会":950,"体":-1286,"作":530,"側":4292,"先":601,"党":-2006,"共":-1212,"内":584,"円":788,"初":1347,"前":1623,"副":3879,"力":-302,"動":-740,"務":-2715,"化":776,"区":4517,"協":1013,"参":1555,"合":-1834,"和":-681,"員":-910,"器":-851,"回":1500,"国":-619,"園":-1200,"地":866,"場":-1410,"塁":-2094,"士":-1413,"多":1067,"大":571,"子":-4802,"学":-1397,"定":-1057,"寺":-809,"小":1910,"屋":-1328,"山":-1500,"島":-2056,"川":-2667,"市":2771,"年":374,"庁":-4556,"後":456,"性":553,"感":916,"所":-1566,"支":856,"改":787,"政":2182,"教":704,"文":522,"方":-856,"日":1798,"時":1829,"最":845,"月":-9066,"木":-485,"来":-442,"校":-360,"業":-1043,"氏":5388,"民":-2716,"気":-910,"沢":-939,"済":-543,"物":-735,"率":672,"球":-1267,"生":-1286,"産":-1101,"田":-2900,"町":1826,"的":2586,"目":922,"省":-3485,"県":2997,"空":-867,"立":-2112,"第":788,"米":2937,"系":786,"約":2171,"経":1146,"統":-1169,"総":940,"線":-994,"署":749,"者":2145,"能":-730,"般":-852,"行":-792,"規":792,"警":-1184,"議":-244,"谷":-1000,"賞":730,"車":-1481,"軍":1158,"輪":-1433,"込":-3370,"近":929,"道":-1291,"選":2596,"郎":-4866,"都":1192,"野":-1100,"銀":-2213,"長":357,"間":-2344,"院":-2297,"際":-2604,"電":-878,"領":-1659,"題":-792,"館":-1984,"首":1749,"高":2120,"「":1895,"」":3798,"・":-4371,"ッ":-724,"ー":-11870,"カ":2145,"コ":1789,"セ":1287,"ト":-403,"メ":-1635,"ラ":-881,"リ":-541,"ル":-856,"ン":-3637};
|
||||||
|
this.UW5__ = {",":465,".":-299,"1":-514,"E2":-32768,"]":-2762,"、":465,"。":-299,"「":363,"あ":1655,"い":331,"う":-503,"え":1199,"お":527,"か":647,"が":-421,"き":1624,"ぎ":1971,"く":312,"げ":-983,"さ":-1537,"し":-1371,"す":-852,"だ":-1186,"ち":1093,"っ":52,"つ":921,"て":-18,"で":-850,"と":-127,"ど":1682,"な":-787,"に":-1224,"の":-635,"は":-578,"べ":1001,"み":502,"め":865,"ゃ":3350,"ょ":854,"り":-208,"る":429,"れ":504,"わ":419,"を":-1264,"ん":327,"イ":241,"ル":451,"ン":-343,"中":-871,"京":722,"会":-1153,"党":-654,"務":3519,"区":-901,"告":848,"員":2104,"大":-1296,"学":-548,"定":1785,"嵐":-1304,"市":-2991,"席":921,"年":1763,"思":872,"所":-814,"挙":1618,"新":-1682,"日":218,"月":-4353,"査":932,"格":1356,"機":-1508,"氏":-1347,"田":240,"町":-3912,"的":-3149,"相":1319,"省":-1052,"県":-4003,"研":-997,"社":-278,"空":-813,"統":1955,"者":-2233,"表":663,"語":-1073,"議":1219,"選":-1018,"郎":-368,"長":786,"間":1191,"題":2368,"館":-689,"1":-514,"E2":-32768,"「":363,"イ":241,"ル":451,"ン":-343};
|
||||||
|
this.UW6__ = {",":227,".":808,"1":-270,"E1":306,"、":227,"。":808,"あ":-307,"う":189,"か":241,"が":-73,"く":-121,"こ":-200,"じ":1782,"す":383,"た":-428,"っ":573,"て":-1014,"で":101,"と":-105,"な":-253,"に":-149,"の":-417,"は":-236,"も":-206,"り":187,"る":-135,"を":195,"ル":-673,"ン":-496,"一":-277,"中":201,"件":-800,"会":624,"前":302,"区":1792,"員":-1212,"委":798,"学":-960,"市":887,"広":-695,"後":535,"業":-697,"相":753,"社":-507,"福":974,"空":-822,"者":1811,"連":463,"郎":1082,"1":-270,"E1":306,"ル":-673,"ン":-496};
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
TinySegmenter.prototype.ctype_ = function(str) {
|
||||||
|
for (var i in this.chartype_) {
|
||||||
|
if (str.match(this.chartype_[i][0])) {
|
||||||
|
return this.chartype_[i][1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "O";
|
||||||
|
}
|
||||||
|
|
||||||
|
TinySegmenter.prototype.ts_ = function(v) {
|
||||||
|
if (v) { return v; }
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
TinySegmenter.prototype.segment = function(input) {
|
||||||
|
if (input == null || input == undefined || input == "") {
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
var result = [];
|
||||||
|
var seg = ["B3","B2","B1"];
|
||||||
|
var ctype = ["O","O","O"];
|
||||||
|
var o = input.split("");
|
||||||
|
for (i = 0; i < o.length; ++i) {
|
||||||
|
seg.push(o[i]);
|
||||||
|
ctype.push(this.ctype_(o[i]))
|
||||||
|
}
|
||||||
|
seg.push("E1");
|
||||||
|
seg.push("E2");
|
||||||
|
seg.push("E3");
|
||||||
|
ctype.push("O");
|
||||||
|
ctype.push("O");
|
||||||
|
ctype.push("O");
|
||||||
|
var word = seg[3];
|
||||||
|
var p1 = "U";
|
||||||
|
var p2 = "U";
|
||||||
|
var p3 = "U";
|
||||||
|
for (var i = 4; i < seg.length - 3; ++i) {
|
||||||
|
var score = this.BIAS__;
|
||||||
|
var w1 = seg[i-3];
|
||||||
|
var w2 = seg[i-2];
|
||||||
|
var w3 = seg[i-1];
|
||||||
|
var w4 = seg[i];
|
||||||
|
var w5 = seg[i+1];
|
||||||
|
var w6 = seg[i+2];
|
||||||
|
var c1 = ctype[i-3];
|
||||||
|
var c2 = ctype[i-2];
|
||||||
|
var c3 = ctype[i-1];
|
||||||
|
var c4 = ctype[i];
|
||||||
|
var c5 = ctype[i+1];
|
||||||
|
var c6 = ctype[i+2];
|
||||||
|
score += this.ts_(this.UP1__[p1]);
|
||||||
|
score += this.ts_(this.UP2__[p2]);
|
||||||
|
score += this.ts_(this.UP3__[p3]);
|
||||||
|
score += this.ts_(this.BP1__[p1 + p2]);
|
||||||
|
score += this.ts_(this.BP2__[p2 + p3]);
|
||||||
|
score += this.ts_(this.UW1__[w1]);
|
||||||
|
score += this.ts_(this.UW2__[w2]);
|
||||||
|
score += this.ts_(this.UW3__[w3]);
|
||||||
|
score += this.ts_(this.UW4__[w4]);
|
||||||
|
score += this.ts_(this.UW5__[w5]);
|
||||||
|
score += this.ts_(this.UW6__[w6]);
|
||||||
|
score += this.ts_(this.BW1__[w2 + w3]);
|
||||||
|
score += this.ts_(this.BW2__[w3 + w4]);
|
||||||
|
score += this.ts_(this.BW3__[w4 + w5]);
|
||||||
|
score += this.ts_(this.TW1__[w1 + w2 + w3]);
|
||||||
|
score += this.ts_(this.TW2__[w2 + w3 + w4]);
|
||||||
|
score += this.ts_(this.TW3__[w3 + w4 + w5]);
|
||||||
|
score += this.ts_(this.TW4__[w4 + w5 + w6]);
|
||||||
|
score += this.ts_(this.UC1__[c1]);
|
||||||
|
score += this.ts_(this.UC2__[c2]);
|
||||||
|
score += this.ts_(this.UC3__[c3]);
|
||||||
|
score += this.ts_(this.UC4__[c4]);
|
||||||
|
score += this.ts_(this.UC5__[c5]);
|
||||||
|
score += this.ts_(this.UC6__[c6]);
|
||||||
|
score += this.ts_(this.BC1__[c2 + c3]);
|
||||||
|
score += this.ts_(this.BC2__[c3 + c4]);
|
||||||
|
score += this.ts_(this.BC3__[c4 + c5]);
|
||||||
|
score += this.ts_(this.TC1__[c1 + c2 + c3]);
|
||||||
|
score += this.ts_(this.TC2__[c2 + c3 + c4]);
|
||||||
|
score += this.ts_(this.TC3__[c3 + c4 + c5]);
|
||||||
|
score += this.ts_(this.TC4__[c4 + c5 + c6]);
|
||||||
|
// score += this.ts_(this.TC5__[c4 + c5 + c6]);
|
||||||
|
score += this.ts_(this.UQ1__[p1 + c1]);
|
||||||
|
score += this.ts_(this.UQ2__[p2 + c2]);
|
||||||
|
score += this.ts_(this.UQ3__[p3 + c3]);
|
||||||
|
score += this.ts_(this.BQ1__[p2 + c2 + c3]);
|
||||||
|
score += this.ts_(this.BQ2__[p2 + c3 + c4]);
|
||||||
|
score += this.ts_(this.BQ3__[p3 + c2 + c3]);
|
||||||
|
score += this.ts_(this.BQ4__[p3 + c3 + c4]);
|
||||||
|
score += this.ts_(this.TQ1__[p2 + c1 + c2 + c3]);
|
||||||
|
score += this.ts_(this.TQ2__[p2 + c2 + c3 + c4]);
|
||||||
|
score += this.ts_(this.TQ3__[p3 + c1 + c2 + c3]);
|
||||||
|
score += this.ts_(this.TQ4__[p3 + c2 + c3 + c4]);
|
||||||
|
var p = "O";
|
||||||
|
if (score > 0) {
|
||||||
|
result.push(word);
|
||||||
|
word = "";
|
||||||
|
p = "B";
|
||||||
|
}
|
||||||
|
p1 = p2;
|
||||||
|
p2 = p3;
|
||||||
|
p3 = p;
|
||||||
|
word += seg[i];
|
||||||
|
}
|
||||||
|
result.push(word);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
lunr.TinySegmenter = TinySegmenter;
|
||||||
|
};
|
||||||
|
|
||||||
|
}));
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
{"version":3,"sources":["src/templates/assets/stylesheets/palette/_scheme.scss","../../../../src/templates/assets/stylesheets/palette.scss","src/templates/assets/stylesheets/palette/_accent.scss","src/templates/assets/stylesheets/palette/_primary.scss","src/templates/assets/stylesheets/utilities/_break.scss"],"names":[],"mappings":"AA2BA,cAGE,6BAME,sDAAA,CACA,6DAAA,CACA,+DAAA,CACA,gEAAA,CACA,mDAAA,CACA,6DAAA,CACA,+DAAA,CACA,gEAAA,CAGA,mDAAA,CACA,gDAAA,CAGA,0BAAA,CACA,mCAAA,CAGA,iCAAA,CACA,kCAAA,CACA,mCAAA,CACA,mCAAA,CACA,kCAAA,CACA,iCAAA,CACA,+CAAA,CACA,6DAAA,CACA,gEAAA,CACA,4DAAA,CACA,4DAAA,CACA,6DAAA,CAGA,6CAAA,CAGA,+CAAA,CAGA,uDAAA,CACA,6DAAA,CACA,2DAAA,CAGA,iCAAA,CAGA,yDAAA,CACA,iEAAA,CAGA,mDAAA,CACA,mDAAA,CAGA,qDAAA,CACA,uDAAA,CAGA,8DAAA,CAKA,8DAAA,CAKA,0DAAA,CAvEA,iBCeF,CD6DE,kHAEE,YC3DJ,CDkFE,yDACE,4BChFJ,CD+EE,2DACE,4BC7EJ,CD4EE,gEACE,4BC1EJ,CDyEE,2DACE,4BCvEJ,CDsEE,yDACE,4BCpEJ,CDmEE,0DACE,4BCjEJ,CDgEE,gEACE,4BC9DJ,CD6DE,0DACE,4BC3DJ,CD0DE,2OACE,4BC/CJ,CDsDA,+FAGE,iCCpDF,CACF,CC/CE,2BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD2CN,CCrDE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDkDN,CC5DE,8BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDyDN,CCnEE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDgEN,CC1EE,8BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDuEN,CCjFE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD8EN,CCxFE,kCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDqFN,CC/FE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD4FN,CCtGE,4BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDmGN,CC7GE,6BACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCD0GN,CCpHE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDiHN,CC3HE,4BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCD2HN,CClIE,8BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCDkIN,CCzIE,6BACE,yBAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCDyIN,CChJE,8BACE,4BAAA,CACA,2CAAA,CAIE,8BAAA,CACA,qCDgJN,CCvJE,mCACE,4BAAA,CACA,2CAAA,CAOE,yBAAA,CACA,qCDoJN,CEzJE,4BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFsJN,CEjKE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCF8JN,CEzKE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFsKN,CEjLE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCF8KN,CEzLE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFsLN,CEjME,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCF8LN,CEzME,mCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFsMN,CEjNE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCF8MN,CEzNE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFsNN,CEjOE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCF8NN,CEzOE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFsON,CEjPE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCFiPN,CEzPE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCFyPN,CEjQE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCFiQN,CEzQE,+BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAIE,+BAAA,CACA,sCFyQN,CEjRE,oCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCF8QN,CEzRE,8BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCFsRN,CEjSE,6BACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCAAA,CAKA,4BF0RN,CE1SE,kCACE,6BAAA,CACA,oCAAA,CACA,mCAAA,CAOE,0BAAA,CACA,sCAAA,CAKA,4BFmSN,CEpRE,sEACE,4BFuRJ,CExRE,+DACE,4BF2RJ,CE5RE,iEACE,4BF+RJ,CEhSE,gEACE,4BFmSJ,CEpSE,iEACE,4BFuSJ,CE9RA,8BACE,mDAAA,CACA,4DAAA,CACA,0DAAA,CACA,oDAAA,CACA,2DAAA,CAGA,4BF+RF,CE5RE,yCACE,+BF8RJ,CE3RI,kDAEE,0CAAA,CACA,sCAAA,CAFA,mCF+RN,CG3MI,mCD1EA,+CACE,8CFwRJ,CErRI,qDACE,8CFuRN,CElRE,iEACE,mCFoRJ,CACF,CGtNI,sCDvDA,uCACE,oCFgRJ,CACF,CEvQA,8BACE,kDAAA,CACA,4DAAA,CACA,wDAAA,CACA,oDAAA,CACA,6DAAA,CAGA,4BFwQF,CErQE,yCACE,+BFuQJ,CEpQI,kDAEE,0CAAA,CACA,sCAAA,CAFA,mCFwQN,CEjQE,yCACE,6CFmQJ,CG5NI,0CDhCA,8CACE,gDF+PJ,CACF,CGjOI,0CDvBA,iFACE,6CF2PJ,CACF,CGzPI,sCDKA,uCACE,6CFuPJ,CACF","file":"palette.css"}
|
||||||
@@ -1 +0,0 @@
|
|||||||
anonymousplanet.org
|
|
||||||
@@ -1,113 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Anonymous Planet"
|
|
||||||
description: We are the maintainers of the Hitchhiker's Guide and the PSA Matrix space.
|
|
||||||
schema:
|
|
||||||
"@context": https://schema.org
|
|
||||||
"@type": Organization
|
|
||||||
"@id": https://www.anonymousplanet.org/
|
|
||||||
name: Anonymous Planet
|
|
||||||
url: https://www.anonymousplanet.org/about/
|
|
||||||
logo: ../media/profile.png
|
|
||||||
sameAs:
|
|
||||||
- https://github.com/Anon-Planet
|
|
||||||
- https://opencollective.com/anonymousplanetorg
|
|
||||||
- https://mastodon.social/@anonymousplanet
|
|
||||||
---
|
|
||||||
{ align=right }
|
|
||||||
|
|
||||||
**Anonymous Planet** are the maintainers of the [_Hitchhiker's Guide_](../guide/index.md) and the [_PSA Community_](https://psa.anonymousplanet.org). It is responsible for maintaining the projects and code repositories. This project is part of our ongoing efforts to provide open-source tools and resources for the community, with regular updates and improvements added to the changelog.
|
|
||||||
|
|
||||||
The purpose: providing an introduction to various online tracking techniques, online ID verification techniques, and detailed guidance to creating and maintaining (truly) anonymous online identities. It is written with the hopes that good people (e.g., activists, journalists, scientists, lawyers, whistle-blowers, etc.) will be able to fight oppression, censorship and harassment! The website and projects are free (as in freedom) and not affiliated with any donor or projects discussed.
|
|
||||||
|
|
||||||
??? Note "Where do I start?"
|
|
||||||
|
|
||||||
Start either by going to [the beginning](../guide/index.md) or using the search at top right of the page. It is also available at whatever point you are in your reading.
|
|
||||||
|
|
||||||
??? Note "Notes on the journey"
|
|
||||||
|
|
||||||
This guide is a work in progress. It will probably never be "finished". You may (will) find broken links when you click on some search results and during some navigation steps. Please report these. Otherwise, most of the search functionality is a great experience and can help you find linked topics. Try to search for something in one section of the reading. It will show up in many other places.
|
|
||||||
|
|
||||||
??? Note "Disclaimer"
|
|
||||||
|
|
||||||
There might be some wrong or outdated information in this guide because no one is perfect. Your experience may vary. Remember, check regularly for an updated version of this guide. Please do your own independent, well-thought research. There is no one resource online that can provide 100% security, anonymity, and/or privacy.
|
|
||||||
|
|
||||||
This guide is a non-profit open-source initiative, licensed under Creative Commons **Attribution-NonCommercial** 4.0 International ([cc-by-nc-4.0](https://creativecommons.org/licenses/by-nc/4.0/) <sup>[[Archive.org]](https://web.archive.org/web/https://creativecommons.org/licenses/by-nc/4.0/)</sup>).
|
|
||||||
|
|
||||||
- For mirrors see [Mirrors](../mirrors/index.md) and the links at the bottom right of the page. You should see these on every page.
|
|
||||||
|
|
||||||
- For help in comparing versions see [Comparing versions](../guide/index.md#appendix-a6-comparing-versions)
|
|
||||||
|
|
||||||
Feel free to submit issues **(please do report anything wrong)** using GitHub Issues at: <https://github.com/Anon-Planet/thgtoa/issues>. We also accept Merge Requests (MR) from our Gitlab and many other places. Do not hesitate to report issues and suggestions!
|
|
||||||
|
|
||||||
??? tip "Discuss ideas on Matrix for real-time chat"
|
|
||||||
|
|
||||||
We offer a Matrix.org hosted space of our own. Check it out!
|
|
||||||
|
|
||||||
- Read [the rules](https://psa.anonymousplanet.org/), please
|
|
||||||
- Matrix Room: https://matrix.to/#/#nth:anonymousplanet.net
|
|
||||||
- Matrix Space: https://matrix.to/#/#psa:anonymousplanet.net
|
|
||||||
- Admins: @daskolburn:thomcat.rocks and @thehidden:tchncs.de
|
|
||||||
|
|
||||||
???+ tip "Follow us on"
|
|
||||||
|
|
||||||
- Twitter at <https://twitter.com/AnonyPla>
|
|
||||||
- Mastodon at <https://mastodon.social/@anonymousplanet>
|
|
||||||
|
|
||||||
To contact me, see the updated information on the website or send an e-mail to <contact@anonymousplanet.org>
|
|
||||||
|
|
||||||
**Please consider [donating](../guide/index.md#donations) if you enjoy the project and want to support the hosting fees or support the funding of initiatives like the hosting of Tor Exit Nodes.**
|
|
||||||
|
|
||||||
???+ example "Recommended Reading"
|
|
||||||
|
|
||||||
Some of those resources may, in order to sustain their project, contain or propose:
|
|
||||||
|
|
||||||
- Sponsored commercial content
|
|
||||||
- Monetized content through third party platforms (such as YouTube)
|
|
||||||
- Affiliate links to commercial services
|
|
||||||
- Paid Services such as consultancy
|
|
||||||
- Premium content such as ad-free content or updated content
|
|
||||||
- Merchandising
|
|
||||||
|
|
||||||
_Note that these websites could contain affiliate/sponsored content and/or merchandising. This guide does not endorse and is not sponsored by any commercial entity in any way._
|
|
||||||
|
|
||||||
If you skipped those, you should really still consider viewing this YouTube playlist from the Techlore Go Incognito project (<https://github.com/techlore-official/go-incognito> <sup>[[Archive.org]](https://web.archive.org/web/https://github.com/techlore-official/go-incognito)</sup>) as an introduction before going further: <https://www.youtube.com/playlist?list=PL3KeV6Ui_4CayDGHw64OFXEPHgXLkrtJO> <sup>[[Invidious]](https://yewtu.be/playlist?list=PL3KeV6Ui_4CayDGHw64OFXEPHgXLkrtJO)</sup>. This guide will cover many of the topics in the videos of this playlist with more details and references as well as some added topics not covered within that series. This will just take you 2 or 3 hours to watch it all.
|
|
||||||
|
|
||||||
_Anonymous Planet_ **does not** participate in any sponsoring, endorsement, advertising, or other affiliate programs for any entity. We only rely on anonymous donations in a closed, transparent loop system.
|
|
||||||
|
|
||||||
??? tip "Privacy related"
|
|
||||||
|
|
||||||
- AnarSec: <https://www.anarsec.guide/>
|
|
||||||
- EFF Surveillance Self-Defense: <https://ssd.eff.org/>
|
|
||||||
- Prism-Break: <https://prism-break.org/>
|
|
||||||
- Privacy Guides: <https://privacyguides.org>
|
|
||||||
- Techlore: <https://techlore.tech>
|
|
||||||
- The New Oil: <https://thenewoil.org>
|
|
||||||
- PrivacyTools.io: <https://privacytools.io>
|
|
||||||
|
|
||||||
??? tip "Blogs and personal websites"
|
|
||||||
|
|
||||||
- CIA Officer's Blog: <https://officercia.mirror.xyz/>
|
|
||||||
- Continuing Ed: <https://edwardsnowden.substack.com/>
|
|
||||||
- Madaidan's Insecurities: <https://madaidans-insecurities.github.io/>
|
|
||||||
- Seirdy's Home: <https://seirdy.one/>
|
|
||||||
|
|
||||||
??? tip "Useful resources"
|
|
||||||
|
|
||||||
- KYC? Not me: <https://kycnot.me/>
|
|
||||||
- Library Genesis: <https://en.wikipedia.org/wiki/Library_Genesis> <sup>[[Wikiless]](https://wikiless.com/wiki/Library_Genesis)</sup> (see their latest known URL in the Wikipedia article)
|
|
||||||
- Real World Onion Sites: <https://github.com/alecmuffett/real-world-onion-sites>
|
|
||||||
- Sci-Hub <https://en.wikipedia.org/wiki/Sci-Hub> <sup>[[Wikiless]](https://wikiless.com/wiki/Sci-Hub)</sup> (see their latest known URL in the main Wikipedia article)
|
|
||||||
- Terms of Service, Didn't Read: <https://tosdr.org>
|
|
||||||
- Whonix Documentation: <https://www.whonix.org/wiki/Documentation>
|
|
||||||
|
|
||||||
??? note "We are not affiliated with Anonymous or Riseup"
|
|
||||||
|
|
||||||
One or two of our community members uses or has used the resources of Riseup. We are not affiliated with Riseup in any manner.
|
|
||||||
|
|
||||||
We also hold **no affiliation** with the [Anonymous](https://en.wikipedia.org/wiki/Anonymous_(hacker_group)) <sup>[[Wikiless]](https://wikiless.com/wiki/Anonymous_(hacker_group))</sup> <sup>[[Archive.org]](https://web.archive.org/web/https://en.wikipedia.org/wiki/Anonymous_(hacker_group))</sup> hacker collective.
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
!!! Danger ""
|
|
||||||
|
|
||||||
:fontawesome-brands-creative-commons: :fontawesome-brands-creative-commons-by: :fontawesome-brands-creative-commons-nd: This guide is an open-source non-profit initiative, licensed under [Creative Commons Attribution-NonCommercial 4.0 International](https://github.com/Anon-Planet/thgtoa/blob/master/LICENSE.md) and is not sponsored/endorsed by any commercial/governmental entity. This means that you are free to use our guide for pretty much any purpose excluding commercially as long as you do attribute it. There are no ads or any affiliate links.
|
|
||||||
@@ -1,83 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Release Notes"
|
|
||||||
description: "Release Notes"
|
|
||||||
schema:
|
|
||||||
"@context": https://schema.org
|
|
||||||
"@type": Organization
|
|
||||||
"@id": https://www.anonymousplanet.org/
|
|
||||||
name: Anonymous Planet
|
|
||||||
url: https://www.anonymousplanet.org/authors/
|
|
||||||
logo: ../media/profile.png
|
|
||||||
sameAs:
|
|
||||||
- https://github.com/Anon-Planet
|
|
||||||
- https://opencollective.com/anonymousplanetorg
|
|
||||||
- https://mastodon.social/@anonymousplanet
|
|
||||||
---
|
|
||||||
|
|
||||||
# Release Notes
|
|
||||||
|
|
||||||
Notable changes to the guide and its tooling. Follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/) and [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## [v1.2.3]
|
|
||||||
|
|
||||||
CI/CD pipeline split into independent stages, dark PDF quality improved, release signing automated, and the changelog now updates itself on every build. Skipping v1.2.2 which was a placeholder and contained broken Python unsuitable for a tag/release.
|
|
||||||
|
|
||||||
???+ tip "Added"
|
|
||||||
|
|
||||||
- **Dark mode PDF** (`scripts/convert.py`): pixel-level converter replaces the broken `--prefers-color-scheme=dark` Chromium flag. Produces a 200 DPI hacker-themed PDF (`#1f1f31` background, `#e0e0e0` text, `#5e8bde` links) with batched page processing to avoid OOM on large documents.
|
|
||||||
- **Three independent CI workflows** replacing the old monolithic `build-sign-release.yml`:
|
|
||||||
- `build.yml`: builds PDFs and uploads them as an artifact; no secrets required, can be re-run freely.
|
|
||||||
- `sign.yml`: downloads the PDF artifact, computes SHA-256 and BLAKE2b hashes, GPG-signs all outputs, and uploads a `signatures` artifact. Can be re-run against any historical build.
|
|
||||||
- `release.yml`: downloads both artifacts, uploads to VirusTotal, and publishes a tagged GitHub Release with all 12 assets attached. Can be triggered manually against any previous sign run.
|
|
||||||
- **`scripts/update_changelog.py`**: reads `git log` since the last version tag, categorises commits by conventional-commit prefix, and prepends a new entry to this file automatically after each successful build.
|
|
||||||
- **`changelog.yml`** workflow: commits the auto-generated changelog entry back to `main` after every build, with `dry_run` and `manual_version` dispatch inputs for safe local testing.
|
|
||||||
- **`scripts/tag_release.py`**: interactive guided helper for maintainers to create GPG-signed annotated tags. Checks clean tree and branch, auto-increments the version, pulls the message from the changelog, resolves the release signing key, creates and verifies the tag, then prints the push command.
|
|
||||||
- **`docs/code/develop.md`**: full developer reference covering prerequisites, local build instructions, the pipeline flow, all required GitHub Secrets, the release process, verification steps, and a troubleshooting section for every known CI failure mode.
|
|
||||||
|
|
||||||
!!! warning "Changed"
|
|
||||||
|
|
||||||
- `build-sign-release.yml` deprecated - push triggers removed, manual dispatch only. Will be deleted once in-flight runs complete.
|
|
||||||
- The full pipeline (build → sign → release → changelog) now chains automatically via `workflow_run` on every push to `main`.
|
|
||||||
- GPG signing uses `--pinentry-mode loopback` and `--passphrase-fd 0` to avoid interactive prompts on headless runners.
|
|
||||||
- VirusTotal scans moved to the release stage so they run once per release, not once per build.
|
|
||||||
- `.gitignore` updated to track `.b2` per-file hash files alongside existing `.sha256` and `.sig` entries.
|
|
||||||
- Stale information removed from the guide; deprecated ODT section in Appendix A6 commented out.
|
|
||||||
- Footer copyright information corrected.
|
|
||||||
|
|
||||||
!!! bug "Fixed"
|
|
||||||
|
|
||||||
- `_save_images_as_pdf` in `convert.py` was passing raw PNG files to `qpdf --pages`, which only accepts PDF inputs. Fixed by quantizing each page to palette mode (256 colours, FASTOCTREE) and saving as a single-page PDF before merging.
|
|
||||||
- `convert.py` now fails immediately with install instructions if `pdftoppm` or `qpdf` are missing, instead of crashing with an unhelpful `FileNotFoundError`.
|
|
||||||
- Pillow `KeyError: 'JPEG'` on CI resolved by installing `mkdocs-material[imaging]` and using palette-mode PDF encoding instead of RGB+JPEG.
|
|
||||||
- Orphaned footnote citations `[^536]` and `[^537]` (Australian privacy law and the Identify and Disrupt Act) restored at the key disclosure law paragraph in the guide.
|
|
||||||
- Broken internal links and mismatched cross-references throughout the guide corrected.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## [v1.2.1]
|
|
||||||
|
|
||||||
First automated PDF build and the start of the CI pipeline.
|
|
||||||
|
|
||||||
???+ tip "Added"
|
|
||||||
|
|
||||||
- `scripts/build_guide_pdf.py`: builds the MkDocs site and renders the full guide to a single PDF via headless Chromium (Chrome or Edge). Supports `--dark`, `--light`, and `--both` modes.
|
|
||||||
- GitHub Actions workflow that installs Chromium, runs the build script, and uploads `export/thgtoa.pdf` as an artifact on every push to `main` or manual dispatch.
|
|
||||||
- `docs/stylesheets/extra.css` for shared site styling.
|
|
||||||
- This changelog.
|
|
||||||
|
|
||||||
!!! warning "Changed"
|
|
||||||
|
|
||||||
- `README.md` updated with instructions for local PDF export and a note about the GitHub Actions artifact.
|
|
||||||
- `.gitignore` updated to exclude local build outputs (`export/`, `site/`, `_site_test/`).
|
|
||||||
|
|
||||||
!!! bug "Fixed"
|
|
||||||
|
|
||||||
- Broken reference-style internal links throughout `docs/guide/index.md` replaced with correct fragment links.
|
|
||||||
- Broken footnote marker on the "free (unallocated) space" list item in the guide.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
[v1.2.3]: https://github.com/Anon-Planet/thgtoa/releases/tag/v1.2.3
|
|
||||||
[v1.2.1]: https://github.com/Anon-Planet/thgtoa/releases/tag/v1.2.1
|
|
||||||
@@ -1,387 +0,0 @@
|
|||||||
# Developer Guide
|
|
||||||
|
|
||||||
This page covers everything you need to contribute to the project, run the build pipeline locally, configure GitHub Secrets, and publish a release.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
Install these before anything else.
|
|
||||||
|
|
||||||
=== "Linux / macOS"
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Python 3.11+
|
|
||||||
python3 --version
|
|
||||||
|
|
||||||
# poppler (pdftoppm) and qpdf
|
|
||||||
sudo apt install poppler-utils qpdf # Debian/Ubuntu
|
|
||||||
brew install poppler qpdf # macOS
|
|
||||||
|
|
||||||
# GPG
|
|
||||||
sudo apt install gnupg # Debian/Ubuntu
|
|
||||||
brew install gnupg # macOS
|
|
||||||
|
|
||||||
# Python dependencies
|
|
||||||
pip install "mkdocs-material[imaging]" pillow numpy
|
|
||||||
```
|
|
||||||
|
|
||||||
=== "Windows"
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
# Python 3.11+ from https://python.org
|
|
||||||
|
|
||||||
# poppler: download from https://github.com/oschwartz10612/poppler-windows/releases
|
|
||||||
# Extract and add the bin\ folder to PATH
|
|
||||||
|
|
||||||
# qpdf: download from https://github.com/qpdf/qpdf/releases
|
|
||||||
# Extract and add the bin\ folder to PATH
|
|
||||||
|
|
||||||
# GPG: download Gpg4win from https://gpg4win.org
|
|
||||||
|
|
||||||
# Python dependencies
|
|
||||||
pip install "mkdocs-material[imaging]" pillow numpy
|
|
||||||
```
|
|
||||||
|
|
||||||
You also need **Google Chrome** or **Microsoft Edge** installed for the light-mode PDF build (headless Chromium).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Repository layout
|
|
||||||
|
|
||||||
```
|
|
||||||
.github/
|
|
||||||
workflows/
|
|
||||||
build.yml # builds PDFs, uploads artifact
|
|
||||||
sign.yml # hashes + GPG signs, uploads signatures artifact
|
|
||||||
release.yml # publishes GitHub Release with all assets
|
|
||||||
changelog.yml # prepends a new entry to docs/changelog/index.md
|
|
||||||
publish.yml # deploys MkDocs site to GitHub Pages
|
|
||||||
build-sign-release.yml # DEPRECATED - fails on trigger, kept for reference
|
|
||||||
docs/
|
|
||||||
guide/index.md # the guide (single Markdown file)
|
|
||||||
changelog/ # release notes
|
|
||||||
code/ # this page
|
|
||||||
export/ # PDF output (PDFs gitignored; .sha256, .b2sum, .asc tracked)
|
|
||||||
pgp/ # public signing keys
|
|
||||||
scripts/
|
|
||||||
build_guide_pdf.py # MkDocs + Chromium PDF builder
|
|
||||||
convert.py # pixel-based dark mode PDF converter
|
|
||||||
update_changelog.py # auto-generates changelog entries from git log
|
|
||||||
setup_workflow.py # GitHub Secrets setup assistant
|
|
||||||
verify_pdf.py # signature verification helper
|
|
||||||
archived/
|
|
||||||
tag_release.py # ARCHIVED - GPG tag helper (not used in current flow)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Building locally
|
|
||||||
|
|
||||||
### Build both PDFs
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python scripts/build_guide_pdf.py --both
|
|
||||||
```
|
|
||||||
|
|
||||||
This builds the MkDocs site, renders it to `export/thgtoa.pdf` via headless Chromium, then calls `scripts/convert.py` to produce `export/thgtoa-dark.pdf`.
|
|
||||||
|
|
||||||
| Flag | Effect |
|
|
||||||
|------|--------|
|
|
||||||
| `--both` | Light PDF then dark PDF |
|
|
||||||
| (no flag) | Light PDF only |
|
|
||||||
| `--dark` | Dark PDF only (light PDF must already exist) |
|
|
||||||
|
|
||||||
### Build only the dark PDF from an existing light PDF
|
|
||||||
|
|
||||||
```bash
|
|
||||||
python scripts/convert.py export/thgtoa.pdf export/thgtoa-dark.pdf
|
|
||||||
```
|
|
||||||
|
|
||||||
Options:
|
|
||||||
|
|
||||||
| Flag | Default | Description |
|
|
||||||
|------|---------|-------------|
|
|
||||||
| `--dpi` | `200` | Rasterization DPI. 150 = smaller file, 300 = sharper but slow |
|
|
||||||
| `--batch-size` | `50` | Pages per batch. Reduce if you hit OOM |
|
|
||||||
| `--bg` | `1f1f31` | Background colour (hex) |
|
|
||||||
| `--text` | `e0e0e0` | Body text colour (hex) |
|
|
||||||
| `--link` | `5e8bde` | Link / blue element colour (hex) |
|
|
||||||
|
|
||||||
### Preview the MkDocs site
|
|
||||||
|
|
||||||
```bash
|
|
||||||
mkdocs serve
|
|
||||||
```
|
|
||||||
|
|
||||||
Opens at `http://127.0.0.1:8000`.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## CI/CD pipeline overview
|
|
||||||
|
|
||||||
The pipeline is fully manual after the initial build - no step automatically triggers the next. This prevents version mismatches between what was built, what was signed, and what gets released.
|
|
||||||
|
|
||||||
```
|
|
||||||
push to main (or manual trigger)
|
|
||||||
│
|
|
||||||
▼
|
|
||||||
build.yml
|
|
||||||
Builds thgtoa.pdf + thgtoa-dark.pdf.
|
|
||||||
Uploads artifact: pdfs
|
|
||||||
Note the run ID.
|
|
||||||
│
|
|
||||||
│ # manually trigger sign.yml with the build run ID
|
|
||||||
▼
|
|
||||||
sign.yml
|
|
||||||
Downloads pdfs artifact. Hashes (SHA-256 + BLAKE2b) and GPG-signs
|
|
||||||
all files. Commits export/ back to main. Uploads artifacts:
|
|
||||||
signatures, pdfs-signed
|
|
||||||
Note the run ID.
|
|
||||||
│
|
|
||||||
│ # manually trigger release.yml with the sign run ID
|
|
||||||
▼
|
|
||||||
release.yml
|
|
||||||
Downloads signatures + pdfs-signed artifacts. Runs VirusTotal.
|
|
||||||
Creates GitHub Release tagged release-YYYYMMDD-<short-sha>.
|
|
||||||
│
|
|
||||||
│ # manually trigger changelog.yml with the version string
|
|
||||||
▼
|
|
||||||
changelog.yml
|
|
||||||
Runs update_changelog.py, prepends a new ## [vX.Y.Z] entry,
|
|
||||||
commits back to main.
|
|
||||||
```
|
|
||||||
|
|
||||||
Each stage is independent. If signing fails (e.g. an expired key), re-run only `sign.yml` pointing at the existing build artifact - no need to rebuild the PDFs.
|
|
||||||
|
|
||||||
!!! warning "Before you push"
|
|
||||||
|
|
||||||
- Make sure the working tree is clean (`git status`)
|
|
||||||
- Run `mkdocs build` locally if you changed `docs/` to catch broken links before CI does
|
|
||||||
- If you added new footnotes, verify they have both a definition `[^N]:` and at least one inline citation `[^N]`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Release process (step by step)
|
|
||||||
|
|
||||||
### 1. Trigger a build
|
|
||||||
|
|
||||||
Push to `main` - `build.yml` runs automatically when `docs/`, `mkdocs.yml`, or `scripts/` change. You can also trigger it manually from **Actions → Build PDFs → Run workflow**.
|
|
||||||
|
|
||||||
Once it completes successfully, **note the run ID** from the URL or the Actions list.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 2. Sign the PDFs
|
|
||||||
|
|
||||||
Go to **Actions → Sign PDFs → Run workflow**.
|
|
||||||
|
|
||||||
| Input | Value |
|
|
||||||
|-------|-------|
|
|
||||||
| `build_run_id` | The run ID from step 1 |
|
|
||||||
|
|
||||||
`sign.yml` will:
|
|
||||||
|
|
||||||
- Download the PDFs artifact from the build run
|
|
||||||
- Compute SHA-256 and BLAKE2b hashes, writing `thgtoa.pdf.sha256`, `thgtoa.pdf.b2sum`, `sha256sums.txt`, `b2sums.txt`, and the dark equivalents
|
|
||||||
- GPG-sign all PDFs and hash files, writing `.asc` detached signature files
|
|
||||||
- Commit the updated `export/` directory back to `main`
|
|
||||||
- Upload two artifacts: `signatures` and `pdfs-signed`
|
|
||||||
|
|
||||||
Once it completes successfully, **note the run ID**.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 3. Publish the release
|
|
||||||
|
|
||||||
Go to **Actions → Release → Run workflow**.
|
|
||||||
|
|
||||||
| Input | Value |
|
|
||||||
|-------|-------|
|
|
||||||
| `sign_run_id` | The run ID from step 2 |
|
|
||||||
| `prerelease` | `false` for a normal release |
|
|
||||||
|
|
||||||
`release.yml` will:
|
|
||||||
|
|
||||||
- Download `signatures` and `pdfs-signed` artifacts from the sign run
|
|
||||||
- Upload both PDFs to VirusTotal
|
|
||||||
- Auto-generate a release tag in the format `release-YYYYMMDD-<short-sha>` (e.g. `release-20260527-abc1234`)
|
|
||||||
- Create a GitHub Release with all PDFs, hash files, and signatures attached, and the VirusTotal report URLs in the body
|
|
||||||
|
|
||||||
No version number needs to be chosen at this step - the tag is derived from the date and commit SHA, so it is always unique and always traceable.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 4. Update the changelog
|
|
||||||
|
|
||||||
Go to **Actions → Update Changelog → Run workflow**.
|
|
||||||
|
|
||||||
| Input | Value |
|
|
||||||
|-------|-------|
|
|
||||||
| `version` | The human-readable version string, e.g. `v1.2.4` |
|
|
||||||
| `dry_run` | `true` to preview without committing |
|
|
||||||
|
|
||||||
`changelog.yml` runs `scripts/update_changelog.py`, which:
|
|
||||||
|
|
||||||
- Reads git log since the last `## [vX.Y.Z]` heading in the changelog
|
|
||||||
- Categorises commits into Added / Changed / Fixed using conventional-commit prefixes
|
|
||||||
- Prepends a new `## [version]` admonition block to `docs/changelog/index.md`
|
|
||||||
- Commits the result back to `main`
|
|
||||||
|
|
||||||
The version string is the only human decision in the release process. It goes into the changelog only - it does not affect the release tag.
|
|
||||||
|
|
||||||
!!! tip "Previewing the changelog entry"
|
|
||||||
Run with `dry_run: true` first to review the generated entry before it is committed.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Release tag format
|
|
||||||
|
|
||||||
Release tags use the format `release-YYYYMMDD-<short-sha>`, for example:
|
|
||||||
|
|
||||||
```
|
|
||||||
release-20260527-abc1234
|
|
||||||
```
|
|
||||||
|
|
||||||
This format is always unique, requires no version decision at release time, and is directly traceable to the commit that was built. The version string (e.g. `v1.2.4`) is a separate, human-assigned label that lives only in the changelog.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Commit message format
|
|
||||||
|
|
||||||
All commits must follow the [Conventional Commits](https://www.conventionalcommits.org) format. This is enforced by the `commitizen` pre-commit hook.
|
|
||||||
|
|
||||||
```
|
|
||||||
<type>(<scope>): <description>
|
|
||||||
```
|
|
||||||
|
|
||||||
Accepted types and their changelog bucket:
|
|
||||||
|
|
||||||
| Type | Bucket |
|
|
||||||
|------|--------|
|
|
||||||
| `feat`, `feature`, `add` | Added |
|
|
||||||
| `fix`, `bugfix`, `revert`, `security` | Fixed |
|
|
||||||
| `perf`, `refactor`, `change`, `chore`, `ci`, `docs`, `style`, `test`, `build` | Changed |
|
|
||||||
|
|
||||||
Examples:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
feat: add dark-mode PDF export
|
|
||||||
fix(scripts): handle locked PDF on Windows
|
|
||||||
docs: update developer workflow guide
|
|
||||||
chore(ci): pin Chrome version to 120
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## GitHub Secrets
|
|
||||||
|
|
||||||
Configure these in **Settings → Secrets and variables → Actions** before the pipeline will fully work. The build step requires no secrets; signing and releasing require all of them.
|
|
||||||
|
|
||||||
### `GPG_PRIVATE_KEY`
|
|
||||||
|
|
||||||
The ASCII-armored private key used to sign PDFs and hash files.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
gpg --armor --export-secret-keys C3023DBEA3FB38C438BA1EEDCEC60AEDE8B992A2
|
|
||||||
```
|
|
||||||
|
|
||||||
Copy the entire output (including `-----BEGIN PGP PRIVATE KEY BLOCK-----` and the closing line) and paste it as the secret value.
|
|
||||||
|
|
||||||
!!! danger "Key security"
|
|
||||||
This is the release signing key. Only repository admins should have access to it. Never commit it to the repository or share it outside of GitHub Secrets.
|
|
||||||
|
|
||||||
### `GPG_PASSPHRASE`
|
|
||||||
|
|
||||||
The passphrase protecting the private key above. Must match exactly - no trailing newline.
|
|
||||||
|
|
||||||
### `ACTIONS_SSH_SIGNING_KEY`
|
|
||||||
|
|
||||||
An SSH private key used by `sign.yml` to sign the commit that pushes `export/` back to `main`. Generate a dedicated key for this:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
ssh-keygen -t ed25519 -C "github-actions signing key" -f actions_signing_key
|
|
||||||
```
|
|
||||||
|
|
||||||
Add the **private key** as the `ACTIONS_SSH_SIGNING_KEY` secret, and the **public key** to the repository's Deploy Keys (Settings → Deploy Keys) with write access.
|
|
||||||
|
|
||||||
### `VT_API_KEY`
|
|
||||||
|
|
||||||
A [VirusTotal](https://www.virustotal.com) API key with file upload permissions. Used by `release.yml` to scan both PDFs before publishing. Get one by creating a free account at `virustotal.com` → API key under your profile. The free tier (4 lookups/minute, 500/day) is sufficient.
|
|
||||||
|
|
||||||
### `CHANGELOG_PAT`
|
|
||||||
|
|
||||||
A GitHub Personal Access Token with `contents: write` scope on this repository. Needed because `changelog.yml` commits back to `main` - commits made with the default `GITHUB_TOKEN` do not trigger further workflow runs (GitHub loop-prevention). A PAT bypasses this. If absent, falls back to `GITHUB_TOKEN` - the commit still happens, it just won't trigger downstream workflows.
|
|
||||||
|
|
||||||
**Creating one:** GitHub → Settings → Developer settings → Personal access tokens → Fine-grained tokens → set Contents to Read and write for this repo only.
|
|
||||||
|
|
||||||
### Secrets summary
|
|
||||||
|
|
||||||
| Secret | Required by | What happens if missing |
|
|
||||||
|--------|------------|------------------------|
|
|
||||||
| `GPG_PRIVATE_KEY` | `sign.yml` | Signing step fails - no `.asc` files produced |
|
|
||||||
| `GPG_PASSPHRASE` | `sign.yml` | GPG import succeeds but signing fails |
|
|
||||||
| `ACTIONS_SSH_SIGNING_KEY` | `sign.yml` | Export commit is unsigned (may fail if branch protection requires signed commits) |
|
|
||||||
| `VT_API_KEY` | `release.yml` | VirusTotal step fails - release is not published |
|
|
||||||
| `CHANGELOG_PAT` | `changelog.yml` | Falls back to `GITHUB_TOKEN` - changelog updates but commit won't trigger downstream workflows |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Verifying a release
|
|
||||||
|
|
||||||
Anyone can verify the authenticity of a release download.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Import the release signing key
|
|
||||||
gpg --import pgp/anonymousplanet-release.asc
|
|
||||||
|
|
||||||
# Verify the PDFs
|
|
||||||
gpg --verify thgtoa.pdf.asc thgtoa.pdf
|
|
||||||
gpg --verify thgtoa-dark.pdf.asc thgtoa-dark.pdf
|
|
||||||
|
|
||||||
# Verify the hash files
|
|
||||||
gpg --verify sha256sums.txt.asc sha256sums.txt
|
|
||||||
gpg --verify b2sums.txt.asc b2sums.txt
|
|
||||||
|
|
||||||
# Check the PDF hashes match
|
|
||||||
sha256sum -c sha256sums.txt
|
|
||||||
b2sum -c b2sums.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
A successful verify looks like:
|
|
||||||
|
|
||||||
```
|
|
||||||
gpg: Signature made ...
|
|
||||||
gpg: Good signature from "Anonymous Planet (Release) ..."
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
**`cairosvg` missing during MkDocs build**
|
|
||||||
Install the imaging extras: `pip install "mkdocs-material[imaging]"`. Required by the `social` plugin.
|
|
||||||
|
|
||||||
**`KeyError: 'JPEG'` in convert.py**
|
|
||||||
Pillow needs libjpeg. Reinstall after installing the system lib: `sudo apt install libjpeg-dev && pip install --force-reinstall pillow`.
|
|
||||||
|
|
||||||
**`qpdf: can't find PDF header`**
|
|
||||||
Ensure you are on the current version of `convert.py` - qpdf only accepts PDF inputs, not PNG.
|
|
||||||
|
|
||||||
**GPG signing fails on CI with `No secret key`**
|
|
||||||
The `GPG_PRIVATE_KEY` secret is missing or malformed. Re-export with `gpg --armor --export-secret-keys <fingerprint>` and paste the full block including header and footer lines.
|
|
||||||
|
|
||||||
**GPG signing fails with `Bad passphrase`**
|
|
||||||
The `GPG_PASSPHRASE` secret has a trailing space or newline. Paste it again with no surrounding whitespace.
|
|
||||||
|
|
||||||
**`release.yml` fails on VirusTotal**
|
|
||||||
The `VT_API_KEY` is missing, invalid, or over the rate limit (500 requests/day on the free tier). Check the secret and re-run after a few minutes.
|
|
||||||
|
|
||||||
**`sign.yml` fails downloading PDF artifact**
|
|
||||||
The `build_run_id` is wrong, or the artifact has expired (90-day retention). Trigger a new build and use the fresh run ID.
|
|
||||||
|
|
||||||
**Changelog already contains version X**
|
|
||||||
`update_changelog.py` will error if `MANUAL_VERSION` is set to a version already in the changelog. Choose the next version string.
|
|
||||||
|
|
||||||
**Footnote warnings from MkDocs (`link '#fnref:N' has no anchor`)**
|
|
||||||
A footnote definition `[^N]:` exists without a matching inline citation. Add the citation or remove the orphaned definition.
|
|
||||||
@@ -1,69 +0,0 @@
|
|||||||
---
|
|
||||||
title: Content Contributions
|
|
||||||
---
|
|
||||||
You can [submit bugs and feature requests](https://github.com/Anon-Planet/thgtoa/issues/new) with detailed information about your issue or idea:
|
|
||||||
|
|
||||||
- If you'd like to propose an addition, please follow the standards outlined here.
|
|
||||||
- If you're reporting an issue, please be sure to include the expected behaviour, the observed behaviour, and steps to reproduce the problem.
|
|
||||||
- This can require technical knowledge, but you can also get involved in conversations about bug reports and feature requests. This is a great way to get involved without getting too overwhelmed!
|
|
||||||
- [Help fellow committers test recently submitted pull requests](https://github.com/Anon-Planet/thgtoa/pulls). Simply by pulling down a pull request and testing it, you can help ensure our new code contributions for stability and quality.
|
|
||||||
|
|
||||||
For those of you who are looking to add content to the guide, include the following:
|
|
||||||
|
|
||||||
##### <u>Pull Requests</u>
|
|
||||||
|
|
||||||
- **Do** create a [topic branch] to work on instead of working directly on `main`. This helps to:
|
|
||||||
+ Protect the process.
|
|
||||||
+ Ensures users are aware of commits on the branch being considered for merge.
|
|
||||||
+ Allows for a location for more commits to be offered without mingling with other contributor changes.
|
|
||||||
+ Allows contributors to make progress while a PR is still being reviewed.
|
|
||||||
- **Do** follow the [50/72 rule] for Git commit messages.
|
|
||||||
- **Do** write "WIP" on your PR and/or open a [draft PR] if submitting unfinished changes..
|
|
||||||
- **Do** make sure the title of a draft PR makes it immediately clear that it's a draft
|
|
||||||
- **Do** target your pull request to the **main branch**.
|
|
||||||
- **Do** specify a descriptive title to make searching for your pull request easier.
|
|
||||||
- **Don't** leave your pull request description blank.
|
|
||||||
- **Don't** abandon your pull request. Being responsive helps us land your changes faster.
|
|
||||||
- **Don't** post questions in older closed PRs.
|
|
||||||
- **Do** stick to the guide to find common style issues.
|
|
||||||
- **Don't** make mass changes (such as replacing "I" with "we") using automated serach/replace functionality.
|
|
||||||
+ Search/replace doesn't understand context, and as such, will inevitably cause inconsistencies and make the guide harder to read.
|
|
||||||
+ If it's part of a larger PR, it'll also make the reviewer's life harder, as they'll have to go through manually and undo everything by hand.
|
|
||||||
+ _If you're going to make mass changes, take the time to do it properly_. Otherwise we'll just have to undo it anyway.
|
|
||||||
+ If your change contains backslashes (`\`), either escape them with another backslash (`\\`) or put them in a ```code block```.
|
|
||||||
|
|
||||||
When reporting guide issues:
|
|
||||||
|
|
||||||
- **Do** write a detailed description of your issue and use a descriptive title.
|
|
||||||
- **Do** make it as detailed as possible and don't just submit 50 line changes without explaining.
|
|
||||||
- **Don't** file duplicate reports; search for your bug before filing a new report.
|
|
||||||
- **Don't** attempt to report issues on a closed PR.
|
|
||||||
|
|
||||||
### Large PRs
|
|
||||||
|
|
||||||
Please split large sets of changes into multiple PRs. For example, a PR that adds Windows 11 support, removes Windows AME references, and fixes typos can be split into 3 PRs. This makes PRs easier to review prior to merging.
|
|
||||||
|
|
||||||
For an example of what _not_ to do, see: <https://github.com/Anon-Planet/thgtoa/pull/51>. This PR contains enough changes to split into multiple smaller and individually reviewable PRs.
|
|
||||||
|
|
||||||
### Updating PRs
|
|
||||||
|
|
||||||
While a PR is being reviewed, modifications may be made to it by the reviewer prior to merging. If this is the case, a new branch will be created for the PR's review. If you would like to submit a change to a PR that is in the process of being reviewed, _do not update the PR directly_. This will only cause merge conflicts and delay the PR from being merged. Instead, submit your changes to the PR's review branch.
|
|
||||||
|
|
||||||
For an example of what _not_ to do, see: <https://github.com/Anon-Planet/thgtoa/pull/51>. Instead of submitting changes to the PR directly, they should have been submitted as changes to the PR's associated review branch.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Thank you** for taking the few moments to read this far! You're already way ahead of the
|
|
||||||
curve, so keep it up!
|
|
||||||
|
|
||||||
[discussions]: https://github.com/Anon-Planet/thgtoa/discussions
|
|
||||||
[issues]: https://github.com/Anon-Planet/thgtoa/issues
|
|
||||||
[help fellow users with open issues]: https://github.com/Anon-Planet/thgtoa/issues
|
|
||||||
[topic branch]: http://git-scm.com/book/en/Git-Branching-Branching-Workflows#Topic-Branches
|
|
||||||
[Qubes#7457]: https://github.com/QubesOS/qubes-issues/issues/7457
|
|
||||||
[50/72 rule]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html
|
|
||||||
[draft pr]: https://help.github.com/en/articles/about-pull-requests#draft-pull-requests
|
|
||||||
[console output]: https://docs.github.com/en/free-pro-team@latest/github/writing-on-github/creating-and-highlighting-code-blocks#fenced-code-blocks
|
|
||||||
[verification steps]: https://docs.github.com/en/free-pro-team@latest/github/writing-on-github/basic-writing-and-formatting-syntax#task-lists
|
|
||||||
[reference associated issues]: https://github.com/blog/1506-closing-issues-via-pull-requests
|
|
||||||
[help fellow committers test recently submitted pull requests]: https://github.com/Anon-Planet/thgtoa/pulls
|
|
||||||
@@ -1,87 +0,0 @@
|
|||||||
---
|
|
||||||
title: Impressum
|
|
||||||
---
|
|
||||||
# A Constitution for an Anonymous Planet.
|
|
||||||
|
|
||||||
To amend the rules and regulations of the network and of the PSA community, this constitution is hereby set forth. It is applicable to all the projects of the initiative, especially the Hitchhiker's Guide to Online Anonymity. All members/collaborators must abide by these lines when contributing within the context of the initiative.
|
|
||||||
|
|
||||||
## Requirements
|
|
||||||
|
|
||||||
> Content is licensed under **[Creative Commons Attribution NonCommercial](https://creativecommons.org/licenses/by-nc/3.0/)** to prevent commercial usage.
|
|
||||||
|
|
||||||
### Anonymity above everything.
|
|
||||||
Anonymity is necessary to maintain the balance of power, specifically to help journalists, whistleblowers, lawyers, scientists, and victims of oppression. Anonymity first, even if that means using non-free and/or proprietary means. Security and privacy are second, again, even if using non-free or non-open-source and/or proprietary means. In this sense, the ends may at times justify proprietary means.
|
|
||||||
|
|
||||||
### Independence.
|
|
||||||
The Anonymous Planet initiative has no affiliation with the "Anonymous" collective and does not endorse their activities.
|
|
||||||
Any overlap of their activities and our guide are purely coincidental.
|
|
||||||
|
|
||||||
### Accessibility.
|
|
||||||
We will strive to always keep available the following methods of reading the Hitchhiker's Guide:
|
|
||||||
|
|
||||||
- online;
|
|
||||||
- offline (e.g., PDF, ODT);
|
|
||||||
- via the Tor network
|
|
||||||
|
|
||||||
### Freedom.
|
|
||||||
Maintain free, open-source, and non-commercial nature of all our projects. This does not mean proprietary and/or closed-source tools won't be recommendeded. All scientific knowledge should be free for anyone and we support and encourage Sci-Hub and LibGen. Any attempt to erode the freedom of information and flow of knowledge of our projects, in any manner, is hostile.
|
|
||||||
|
|
||||||
### Verifiability, falsifiability and reproducibility.
|
|
||||||
We will make every effort to be transparent about any and all bias we have.
|
|
||||||
Anyone claiming to be unbiased is lying, therefore we will not falsely claim to be.
|
|
||||||
|
|
||||||
All our content shall be verifiable, reproducible and fact-checked:
|
|
||||||
|
|
||||||
- academic references (e.g., studies, papers, and peer reviewed publications);
|
|
||||||
- reputable media references (e.g., articles, videos, and documentaries);
|
|
||||||
- official documentation (e.g., manuals, field guides, and technical documents);
|
|
||||||
- renowned and reputable expert review;
|
|
||||||
- direct testing by our own collaborators for falsifiablity
|
|
||||||
|
|
||||||
### Innocence.
|
|
||||||
Suspected offenders are innocent until proven guilty, with zero tolerance for abuse of power or position.
|
|
||||||
|
|
||||||
Any accusing/moderating member is:
|
|
||||||
|
|
||||||
- Subject to the burden of proving the wrong-doing of the offender.
|
|
||||||
- Required to motivate any sanction.
|
|
||||||
|
|
||||||
Any offender has the right to:
|
|
||||||
|
|
||||||
- Face their accuser (know who is accusing them).
|
|
||||||
- Appeal sanctions to an uninvolved third party.
|
|
||||||
- Participate in their own incrimination (the burden of proof lies with the accuser).
|
|
||||||
- Due process of the above.
|
|
||||||
|
|
||||||
### Freedom of thought.
|
|
||||||
Open-minded and pragmatic - with no tolerance for gatekeeping.
|
|
||||||
|
|
||||||
Critical thinking and fact-checking are strongly encouraged; we welcome criticism including of a harsh nature (excluding ad-hominem and slurs).
|
|
||||||
|
|
||||||
### We do not tolerate intolerance.
|
|
||||||
See the [Paradox of Tolerance](https://en.wikipedia.org/wiki/Paradox_of_tolerance), which includes hate speech.
|
|
||||||
|
|
||||||
### No analytics.
|
|
||||||
Note that, while we will never use analytics, the (now free) platforms hosting our content might be gathering such analytics outside of our control, such as Github pages. As the initiative progresses, we will strive to avoid these as soon as possible.
|
|
||||||
|
|
||||||
### No profit.
|
|
||||||
Any excess donations will only be used to support our main projects first and possibly support other intitiatives (like hosting Tor exit nodes). In all cases, we abide by the following principles:
|
|
||||||
|
|
||||||
- Funding transparency (i.e., all donations, spendings, source code, and future goals will be public).
|
|
||||||
- Acceptance of donations from any entity anonymously or acknowledged (opt-in) will not have any influence on our content.
|
|
||||||
- No sponsored content.
|
|
||||||
- No affiliate links.
|
|
||||||
- No product placements.
|
|
||||||
- No advertising.
|
|
||||||
|
|
||||||
**Disclaimer: it is possible that, coincidentally, a donation could correlate with a recommendation. It will then be clearly stated that while the donation was welcome, the donating entity will not be gaining visibility/coverage/endorsement/recommendations due to such a donation.**
|
|
||||||
|
|
||||||
## Core Goals.
|
|
||||||
|
|
||||||
Help people in need of anonymity to maintain both their physical and digital safety.
|
|
||||||
|
|
||||||
## Non-Goals.
|
|
||||||
|
|
||||||
Help any people who are using this knowledge for bad purposes. Helping people takes precedence and we know our content can be used nefariously. Our initiative believes in having one good person given an anonymous voice, safely, is worth the risk of having several using our content for evil. As we do adhere to a fair "rule of law" system which, having 9 criminals and 1 innocent person free, is much better than having one innocent person in prison among 9 criminals.
|
|
||||||
|
|
||||||
**Yours faithfully, Anonymous Planet**
|
|
||||||
@@ -1,111 +0,0 @@
|
|||||||
---
|
|
||||||
title: How to Get Involved
|
|
||||||
---
|
|
||||||
There are multiple ways you can add to the guide. Donations to support this project are welcome but are entirely optional. Those donations are mainly used to pay for Tor onion hosting (VPS), mail hosting, domain name registration, and to maintain/run Tor exit nodes. **No profit is ever being made**. All donations and spendings are being logged here below for transparency. Some costs for load balancer servers have been omitted for privacy reasons, but are not paid for with existing Anonymous Planet finances.
|
|
||||||
|
|
||||||
<span style="color: red">**Current project donation goals:**</span>
|
|
||||||
|
|
||||||
- <del>Funding for a VPS for hosting our .onion website</del>: **done**
|
|
||||||
- <del>Funding for extending our domain name</del>: **Recovery of original domain secured until 2029**
|
|
||||||
- Funding for a decent mail hosting
|
|
||||||
- Funding for a VPS for hosting various services
|
|
||||||
|
|
||||||
## Donate using Monero (XMR)
|
|
||||||
|
|
||||||
Total Monero donations received: **7.101317184263 XMR**
|
|
||||||
Total Monero remaining: **2.059336719397 XMR**
|
|
||||||
|
|
||||||
Here is the address for the main project:
|
|
||||||
|
|
||||||
```46crzj54eL493BA68pPT4A1MZyKQxrpZu9tVNsfsoa5nT85QqCt8cDTfy1fcTH1oyjdtUbhmpZ4QcVtfEXB337Ng6PS21ML```
|
|
||||||
|
|
||||||
![][1]
|
|
||||||
|
|
||||||
## Donate using Bitcoin (BTC)
|
|
||||||
|
|
||||||
Total Bitcoin donations received: **1.89353 mBTC**
|
|
||||||
Total Bitcoin remaining: **0 mBTC**
|
|
||||||
|
|
||||||
Here are the addresses for the main project:
|
|
||||||
|
|
||||||
SegWit address: ```bc1qp9g2c6dquh5lnvft50esxsl97kupdpyqyd4kkv```
|
|
||||||
Legacy address: ```1BBgBSVe6w4DWq2BewUQhDEjsNovhfPswD```
|
|
||||||
|
|
||||||
![][2]_____________________![][3]
|
|
||||||
|
|
||||||
## Content Contributions
|
|
||||||
|
|
||||||
You can easily contribute code or information suggestions at our code repositories listed at the bottom of the website and on the [Mirrors](../mirrors/index.md) tab above. We have many options that are easily accessible. Please follow our [contributing guidelines](../code/index.md) and use good PR syntax.
|
|
||||||
|
|
||||||
**Thank you for any contribution. All donations will be mentioned on this page.**
|
|
||||||
|
|
||||||
### Donations log
|
|
||||||
|
|
||||||
- 2021-02-06 16:48: 0.1 XMR
|
|
||||||
- 2021-03-15 00:09: 1.24869 mBTC
|
|
||||||
- 2021-03-15 08:41: 0.07896 mBTC
|
|
||||||
- 2021-03-31 16:28: 1 XMR (Special thanks for this very generous donation)
|
|
||||||
- 2021-04-03 22:31: 0.5 XMR (Special thanks for this very generous donation)
|
|
||||||
- 2021-05-07 06:22: 0.010433355105 XMR
|
|
||||||
- 2021-06-16 03:05: 0.03 XMR
|
|
||||||
- 2021-06-27 18:39: 0.05 XMR
|
|
||||||
- 2021-07-12 07:24: 0.02 XMR
|
|
||||||
- 2021-07-16 14:31: 0.1 mBTC
|
|
||||||
- 2021-07-20 21:01: 0.058981 XMR
|
|
||||||
- 2021-07-24 15:16: 0.000000000001 XMR
|
|
||||||
- 2021-07-25 02:37: 0.000000000001 XMR
|
|
||||||
- 2021-08-03 00:17: 0.04119191113 XMR
|
|
||||||
- 2021-08-07 15:05: 0.206328241262 XMR
|
|
||||||
- 2021-08-10 11:42: 0.21 mBTC
|
|
||||||
- 2021-08-13 00:25: 0.25 XMR
|
|
||||||
- 2021-08-14 04:58: 0.25588 mBTC
|
|
||||||
- 2021-08-30 17:32: 0.000000000001 XMR
|
|
||||||
- 2021-09-17 14:34: 0.018 XMR
|
|
||||||
- 2021-10-01 06:23: 0.000000002137 XMR
|
|
||||||
- 2021-10-02 19:16: 1 XMR (Special thanks for this very generous donation)
|
|
||||||
- 2021-10-17 15:40: 0.02 XMR
|
|
||||||
- 2021-10-18 16:06: 0.1958 XMR
|
|
||||||
- 2021-11-12 20:42: 0.02 XMR
|
|
||||||
- 2021-11-14 18:28: 0.018 XMR
|
|
||||||
- 2021-12-03 21:38: 0.10134722595 XMR
|
|
||||||
- 2021-12-16 01:16: 1 XMR (Special thanks for this very generous donation)
|
|
||||||
- 2021-12-16 18:06: 0.017 XMR
|
|
||||||
- 2022-01-09 17:54: 0.045918219893 XMR
|
|
||||||
- 2022-01-15 17:35: 0.014 XMR
|
|
||||||
- 2022-01-24 21:08: 0.010786 XMR
|
|
||||||
- 2022-01-26 12:07: 0.010391 XMR
|
|
||||||
- 2022-02-03 19:59: 0.013013984 XMR
|
|
||||||
- 2022-02-18 17:27: 0.019 XMR
|
|
||||||
- 2022-03-14 10:25: 0.0139887 XMR
|
|
||||||
- 2022-07-30 03:51: 0.0222 XMR
|
|
||||||
- 2022-09-28 05:13: 2 XMR
|
|
||||||
- 2022-08-19: SimpleLogin.io Lifetime Premium
|
|
||||||
- 2022-09-19: 0.345024603905 XMR (Special thanks to a previous maintainer)
|
|
||||||
|
|
||||||
#### Spendings log
|
|
||||||
|
|
||||||
- 2021-03-12: 0.08181086 XMR (+fees) for domain anonymousplanet.org (1 year)
|
|
||||||
- 2021-03-16: 1.20179 mBTC (+fees) for domain anonymousplanet.org renewal (extension 3 years totalling 4 years)
|
|
||||||
- 2021-04-01: 0.8317 XMR (+fees) for basic VPS for Tor Mirror hosting
|
|
||||||
- <del>2021-04-05: 0.99367 mBTC (+fees +exchange from XMR to BTC) for Mail Hosting (1 year): <span style="color: red">**Lost**</span>
|
|
||||||
- <del>2021-04-13: 0.71895 mBTC (+fees +exchange from XMR to BTC) for Mail Hosting (extension to 2 years)</del>: <span style="color: red">**Lost**</span>
|
|
||||||
- 2021-04-25: 0.02892 mBTC (Wallet to Wallet transfer fee)
|
|
||||||
- 2021-07-13: 0.78463 mBTC (+fees +exchange from BTC to XMR) for consolidation
|
|
||||||
- <del>2021-07-13: 0.067261698061 XMR (+fees) for a Tor Exit Node (01) Hosting (3 months)</del>: <span style="color: red">**Lost**</span>
|
|
||||||
- <del>2021-07-15: 0.151959953047 XMR (+fees) for a Tor Exit Node (02) Hosting (6 months)</del>: <span style="color: red">**Lost**</span>
|
|
||||||
- <del>2021-08-16: 0.253331471239 XMR (+fees) for a Tor Exit Node (03) Hosting (12 months)</del>: <span style="color: red">**Lost**</span>
|
|
||||||
- 2021-08-18: AtomicSwap conversion from remaining mBTC (-0.56588) to XMR (+0.081904862179)
|
|
||||||
- <del>2021-08-19: 0.0644 XMR (+fees) for Mail Hosting extension</del>: <span style="color: red">**Lost**</span>
|
|
||||||
- <del>2021-09-18: 0.246971511836 XMR (+fees) for renewal 1 year of Tor Exit Node 01</del>: <span style="color: red">**Lost**</span>
|
|
||||||
- 2021-10-04: 0.26954 XMR (+fees) for domain anonymousplanet.org extension until 2029
|
|
||||||
- <del>2021-10-06: 0.236073464623 XMR (+fees) for a Tor Exit Node (04) Hosting (12 months)</del>: <span style="color: red">**Lost**</span>
|
|
||||||
- <del>2021-10-18: 0.01952 XMR (+fees) for testing a new VPS hosting provider (Privex.io) for one month</del>: <span style="color: red">**Ended**</span>
|
|
||||||
- <del>2021-10-30: 0.240787814495 XMR (+fees) for a Synapse Hosting VPS (12 months) with bots to help grow the community. This is a test program that will be converted into a Tor Exit Node in case of failure</del>: <span style="color: red">**Lost**</span>
|
|
||||||
- <del>2022-01-01: 0.28055816111 XMR (+fees) for renewal 1 year of Tor Exit Node 02</del>: <span style="color: red">**Lost**</span>
|
|
||||||
- <del>2022-02-02: 0.966793601024 XMR (+fees) to sponsor a special project (w/ Universal Declaration of Human Rights)</del>: <span style="color: red">**Lost**</span>
|
|
||||||
- <del>2022-07-11: 0.503232784687 XMR (+fees) for 1984.is VPS (12 months)</del>: <span style="color: red">**Ended**</span>
|
|
||||||
- <del>2022-09-19: 0.345024603905 XMR (+fees) for upgrading VPS RAM/Disk</del>: <span style="color: red">**Ended**</span>
|
|
||||||
|
|
||||||
[1]: ../media/monero.png
|
|
||||||
[2]: ../media/bitcoin-segwit.png
|
|
||||||
[3]: ../media/bitcoin-legacy.png
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
---
|
|
||||||
title: ""
|
|
||||||
description: We are the maintainers of the Hitchhiker's Guide and the PSA Matrix space.
|
|
||||||
schema:
|
|
||||||
"@context": https://schema.org
|
|
||||||
"@type": Organization
|
|
||||||
"@id": https://www.anonymousplanet.org/
|
|
||||||
name: Anonymous Planet
|
|
||||||
url: https://www.anonymousplanet.org/authors/
|
|
||||||
logo: ../media/profile.png
|
|
||||||
sameAs:
|
|
||||||
- https://github.com/Anon-Planet
|
|
||||||
- https://opencollective.com/anonymousplanetorg
|
|
||||||
- https://mastodon.social/@anonymousplanet
|
|
||||||
---
|
|
||||||
|
|
||||||
# **Hello, and welcome to the Hitchhiker's Guide.**
|
|
||||||
|
|
||||||
You'll use these keys to [**verify the checksum and GPG signature of all files for authenticity**](verify/index.md).
|
|
||||||
Please share this project if you enjoy it and you think it might be useful to others.
|
|
||||||
|
|
||||||
{ align=right }
|
|
||||||
|
|
||||||
??? tip "GPG Signing Keys for Verification"
|
|
||||||
|
|
||||||
<div style="padding: 1em; border-radius: 0.3em;">
|
|
||||||
<strong>Anonymous Planet Master Signing Key (MSK):</strong>
|
|
||||||
|
|
||||||
9FA5 436D 0EE3 6098 5157 3825 17EC A05F 768D EDF6
|
|
||||||
|
|
||||||
<strong>Anonymous Planet Release Signing Key (RSK):</strong>
|
|
||||||
|
|
||||||
C302 3DBE A3FB 38C4 38BA 1EED CEC6 0AED E8B9 92A2
|
|
||||||
</div>
|
|
||||||
|
|
||||||
Anonymous Planet is a collective of volunteers.
|
|
||||||
|
|
||||||
??? person "Das Kolburn"
|
|
||||||
|
|
||||||
- [:simple-github: GitHub](https://github.com/NobodySpecial256 "@NobodySpecial256")
|
|
||||||
- [:fontawesome-solid-envelope: E-mail](mailto:contact@anonymousplanet.org)
|
|
||||||
- [:simple-matrix: Personal Matrix](https://matrix.to/#/@daskolburn:thomcat.rocks "@daskolburn:thomcat.rocks"), [:simple-matrix: Org Matrix](https://matrix.to/#/@daskolburn:anonymousplanet.net "@daskolburn:anonymousplanet.net")
|
|
||||||
|
|
||||||
??? person "Nope"
|
|
||||||
|
|
||||||
- [:simple-github: GitHub](https://github.com/nopeitsnothing "@nopeitsnothing")
|
|
||||||
- [:simple-mastodon: Mastodon](https://ioc.exchange/@unknown "@unknown@ioc.exchange"){rel=me}
|
|
||||||
- [:fontawesome-solid-house: Homepage](https://www.itsnothing.net)
|
|
||||||
- [:fontawesome-solid-envelope: E-mail](mailto:contact@anonymousplanet.org)
|
|
||||||
- [:simple-matrix: Personal Matrix](https://matrix.to/#/@thehidden:tchncs.de "@thehidden:tchncs.de"), [:simple-matrix: Org Matrix](https://matrix.to/#/@nope:anonymousplanet.net "@nope:anonymousplanet.net")
|
|
||||||
@@ -1,39 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Our Mirrors"
|
|
||||||
description: Maintainers of the Hitchhiker's Guide and the PSA Community.
|
|
||||||
schema:
|
|
||||||
"@context": https://schema.org
|
|
||||||
"@type": Organization
|
|
||||||
"@id": https://www.anonymousplanet.org/
|
|
||||||
name: Anonymous Planet
|
|
||||||
url: https://www.anonymousplanet.org/mirrors/
|
|
||||||
logo: ../media/profile.png
|
|
||||||
sameAs:
|
|
||||||
- https://github.com/Anon-Planet
|
|
||||||
- https://opencollective.com/anonymousplanetorg
|
|
||||||
- https://mastodon.social/@anonymousplanet
|
|
||||||
---
|
|
||||||
{ align=right }
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
???+ tip "Where to find the Hitchhiker's Guide"
|
|
||||||
|
|
||||||
- [Original](https://anonymousplanet.org)
|
|
||||||
- [Tor v3](http://thgtoa3jzy3doku7hkna32htpghjijefscwvh4dyjgfydbbjkeiohgid.onion) **Down**
|
|
||||||
- [Archive.org](https://web.archive.org/web/https://anonymousplanet.org)
|
|
||||||
- [Archive.today](https://archive.fo/anonymousplanet.org)
|
|
||||||
- [Archive.today over Tor](http://archiveiya74codqgiixo33q62qlrqtkgmcitqx5u2oeqnmn5bpcbiyd.onion/anonymousplanet.org)
|
|
||||||
|
|
||||||
!!! Note "PDF export (single file)"
|
|
||||||
|
|
||||||
The guide is also available as a **PDF** (images and layout preserved). It is built automatically. See the [Releases](https://github.com/Anon-Planet/thgtoa/releases). More detail is in the [repository README](https://github.com/Anon-Planet/thgtoa#ways-to-read-or-export-the-guide).
|
|
||||||
|
|
||||||
!!! Note "Our official git mirrors"
|
|
||||||
|
|
||||||
- [Github](https://github.com/anon-planet)
|
|
||||||
- [Darktea](http://it7otdanqu7ktntxzm427cba6i53w6wlanlh23v5i3siqmos47pzhvyd.onion/anonymousplanetorg) (Tor Only)
|
|
||||||
- [Gitlab](https://gitlab.com/anonymousplanetorg)
|
|
||||||
- [0xacab](https://0xacab.org/anonypla) ([Tor Onion](http://wmj5kiic7b6kjplpbvwadnht2nh2qnkbnqtcv3dyvpqtz7ssbssftxid.onion/anonypla))
|
|
||||||
- [Codeberg](https://codeberg.org/anonymousplanet)
|
|
||||||
- [Disroot](https://git.disroot.org/anon-planet) ([Tor Onion](http://kgtz2pmmov5jfvn3z4mqryffjnnw6krzrgxxoyaqhqckjrr4pckyhsqd.onion/anon-planet))
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
---
|
|
||||||
title: Notice
|
|
||||||
---
|
|
||||||
# Anonymous Planet has left Twitter
|
|
||||||
|
|
||||||
Anonymous Planet has moved to Mastodon. This was largely due to Twitter being owned by Elon Musk, the $8 fees, and recent security issues that have come to light. We do not regret this decision, as it has only gotten worse for Twitter users since.
|
|
||||||
|
|
||||||
- [Twitter $8 Fee Exploited by Cybercriminals](https://heimdalsecurity.com/blog/twitter-8-fee-exploited-by-cybercriminals/)
|
|
||||||
|
|
||||||
Our mastodon can be found at [@anonymousplanet@mastodon.social](https://mastodon.social/@anonymousplanet)
|
|
||||||
@@ -1,135 +0,0 @@
|
|||||||
---
|
|
||||||
title: "Verify"
|
|
||||||
description: How to verify the authenticity of our files and check virus scans
|
|
||||||
---
|
|
||||||
|
|
||||||
# PDF Verification Guide
|
|
||||||
|
|
||||||
## Files Provided
|
|
||||||
|
|
||||||
For each PDF release, you'll receive:
|
|
||||||
|
|
||||||
- **PDF file** (`thgtoa.pdf` or `thgtoa-dark.pdf`) - The actual document
|
|
||||||
- **Signature file** (`.sig`) - GPG detached signature for authenticity verification
|
|
||||||
- **Hash file** (`.sha256`) - SHA256 checksum for integrity verification
|
|
||||||
|
|
||||||
## Quick Verification
|
|
||||||
|
|
||||||
### Using Python Script (Recommended)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Verify everything (hashes, signatures, and optionally VirusTotal)
|
|
||||||
python scripts/verify_pdf.py --all
|
|
||||||
|
|
||||||
# Only verify hashes
|
|
||||||
python scripts/verify_pdf.py --hashes
|
|
||||||
|
|
||||||
# Only verify GPG signatures
|
|
||||||
python scripts/verify_pdf.py --signatures
|
|
||||||
|
|
||||||
# Check VirusTotal scan status (requires VT_API_KEY environment variable)
|
|
||||||
python scripts/verify_pdf.py --vt
|
|
||||||
```
|
|
||||||
|
|
||||||
### Manual Verification
|
|
||||||
|
|
||||||
#### 1. Verify SHA256 Hash
|
|
||||||
|
|
||||||
**Linux/macOS:**
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /path/to/repo
|
|
||||||
sha256sum -c sha256sum-light.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
**Windows (PowerShell):**
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
Get-FileHash -Algorithm SHA256 export\thgtoa.pdf | Select-Object Hash
|
|
||||||
# Compare with the hash in thgtoa.pdf.sha256
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 2. Verify GPG Signature
|
|
||||||
|
|
||||||
First, import the public key:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
gpg --import pgp/anonymousplanet-master.asc
|
|
||||||
```
|
|
||||||
|
|
||||||
Then verify the signature:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
gpg --verify export/thgtoa.pdf.sig export/thgtoa.pdf
|
|
||||||
gpg --verify export/thgtoa-dark.pdf.sig export/thgtoa-dark.pdf
|
|
||||||
```
|
|
||||||
|
|
||||||
Expected output for successful verification:
|
|
||||||
|
|
||||||
```text
|
|
||||||
gpg: Signature made Mon 20 Apr 2026 01:46:40 AM EDT
|
|
||||||
gpg: using EDDSA key 9FA5436D0EE360985157382517ECA05F768DEDF6
|
|
||||||
gpg: Good signature from "Anonymous Planet Master Signing Key" [unknown]
|
|
||||||
gpg: WARNING: This key is not certified with a trusted signature!
|
|
||||||
gpg: There is no indication that the signature belongs to the owner.
|
|
||||||
Primary key fingerprint: 9FA5 436D 0EE3 6098 5157 3825 17EC A05F 768D EDF6
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 3. Check VirusTotal Status
|
|
||||||
|
|
||||||
Visit the VirusTotal report links (automatically generated in release notes):
|
|
||||||
- Light mode: `https://www.virustotal.com/gui/file/[hash]`
|
|
||||||
- Dark mode: `https://www.virustotal.com/gui/file/[hash]`
|
|
||||||
|
|
||||||
Or use the Python script with API key:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
export VT_API_KEY=your_vt_api_key
|
|
||||||
python scripts/verify_pdf.py --vt
|
|
||||||
```
|
|
||||||
|
|
||||||
## Automated Verification in CI/CD
|
|
||||||
|
|
||||||
The GitHub Actions workflows automatically:
|
|
||||||
|
|
||||||
1. **Build PDFs** from MkDocs source
|
|
||||||
2. **Generate SHA256 hashes** and save to root directory
|
|
||||||
3. **Sign files with GPG** using the repository's private key
|
|
||||||
4. **Scan with VirusTotal** and update release notes
|
|
||||||
5. **Create releases** with all verification artifacts
|
|
||||||
|
|
||||||
## Security Best Practices
|
|
||||||
|
|
||||||
1. **Always verify signatures** before opening PDFs from untrusted sources
|
|
||||||
2. **Check hashes** to ensure files weren't corrupted during download
|
|
||||||
3. **Review VirusTotal results** for any suspicious detections
|
|
||||||
4. **Import keys securely** - verify key fingerprints with the project maintainers
|
|
||||||
5. **Keep verification scripts updated** to match current security standards
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### "Good signature" but wrong owner?
|
|
||||||
|
|
||||||
- Ensure you imported the correct public key
|
|
||||||
- Check the key fingerprint matches the official one from the repository
|
|
||||||
|
|
||||||
### Hash mismatch?
|
|
||||||
|
|
||||||
- Re-download the file (corruption during transfer)
|
|
||||||
- Verify you're checking against the correct hash file
|
|
||||||
- Check for disk errors on your system
|
|
||||||
|
|
||||||
### GPG not found?
|
|
||||||
|
|
||||||
- Install GPG: `sudo apt install gnupg` (Debian/Ubuntu) or `brew install gnupg` (macOS)
|
|
||||||
- On Windows, use [Gpg4win](https://www.gpg4win.org/)
|
|
||||||
|
|
||||||
## Key Information
|
|
||||||
|
|
||||||
**Signing Key:** Anonymous Planet Master Signing Key ("MSK")
|
|
||||||
**Key ID:** See `pgp/anonymousplanet-master.asc` for details
|
|
||||||
**Fingerprint:** Verify from the repository's official documentation
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
_For questions or issues with verification, please open an issue on GitHub._
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
7b9549543555e0da64175a3de010f50720a1d39d63d85da325433b03897ff0a1212b6c10467fec7c5cbe91dc7cab4f3ce17421be1e3dda8853d42ab5f1c34070 thgtoa.pdf
|
|
||||||
f0125984a62fb3776086230375d546e35459208cdccf1978007f92752b61274d66ef66694842668894db72bc3a39fd746b0579f264319f0b68ffdcfbe9e1ae1f thgtoa-dark.pdf
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
54f44ad46d844bdfddb2579371059ef88cb56ff5eeba42644998e386a18d70ae thgtoa.pdf
|
|
||||||
c9a05d9fc09baa745099f029eab568dd1ed8fe36a9316a8919665629991a078c thgtoa-dark.pdf
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
-----BEGIN PGP SIGNATURE-----
|
|
||||||
|
|
||||||
iHUEABYKAB0WIQTDAj2+o/s4xDi6Hu3Oxgrt6LmSogUCahv3FQAKCRDOxgrt6LmS
|
|
||||||
orf3AP9xFUMGyki3135dZ9gm953aWNvRrLHjdcBz7pyh3e41awD/WFem/9WCLH1C
|
|
||||||
2Q91cqnL1ysnnf1y6wpp0XtewWMnBQA=
|
|
||||||
=TLm3
|
|
||||||
-----END PGP SIGNATURE-----
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
f0125984a62fb3776086230375d546e35459208cdccf1978007f92752b61274d66ef66694842668894db72bc3a39fd746b0579f264319f0b68ffdcfbe9e1ae1f
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
-----BEGIN PGP SIGNATURE-----
|
|
||||||
|
|
||||||
iJEEABYKADkWIQSfpUNtDuNgmFFXOCUX7KBfdo3t9gUCaeXaqxsUgAAAAAAEAA5t
|
|
||||||
YW51MiwyLjUrMS4xMiwyLDIACgkQF+ygX3aN7fbdDgEAoSslLR47ydW/3r1wJOPY
|
|
||||||
X/waLkVbkGZpHqwd4RjywwcA/3B7Ci+jUg+yP5TRsuChagEhwyO5vw2DxSlUGoB4
|
|
||||||
+ksH
|
|
||||||
=2ja9
|
|
||||||
-----END PGP SIGNATURE-----
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
-----BEGIN PGP SIGNATURE-----
|
|
||||||
|
|
||||||
iJEEABYKADkWIQSfpUNtDuNgmFFXOCUX7KBfdo3t9gUCaeXaqxsUgAAAAAAEAA5t
|
|
||||||
YW51MiwyLjUrMS4xMiwyLDIACgkQF+ygX3aN7faErgD/Svj1G+B7gmrZQ6AsLZ5J
|
|
||||||
HfeldxjmrXE99dig1iHtl5IBAMndZZb+95TO03IZ9eLGfYuyTz4GCUanmftsY9yv
|
|
||||||
LAIN
|
|
||||||
=MEd0
|
|
||||||
-----END PGP SIGNATURE-----
|
|
||||||
@@ -1,7 +0,0 @@
|
|||||||
-----BEGIN PGP SIGNATURE-----
|
|
||||||
|
|
||||||
iHUEABYKAB0WIQTDAj2+o/s4xDi6Hu3Oxgrt6LmSogUCahv3FAAKCRDOxgrt6LmS
|
|
||||||
otN3AQCAT+U5gzR11x2OiWq9xx0bCYYQc973rtabc/OB1RkwHgD+IUys8A9pAyf7
|
|
||||||
5Npq+4SiPjhduZ7w82tMRffxdKAhWAU=
|
|
||||||
=K+IA
|
|
||||||
-----END PGP SIGNATURE-----
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
7b9549543555e0da64175a3de010f50720a1d39d63d85da325433b03897ff0a1212b6c10467fec7c5cbe91dc7cab4f3ce17421be1e3dda8853d42ab5f1c34070
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
-----BEGIN PGP SIGNATURE-----
|
|
||||||
|
|
||||||
iJEEABYKADkWIQSfpUNtDuNgmFFXOCUX7KBfdo3t9gUCaeXaqxsUgAAAAAAEAA5t
|
|
||||||
YW51MiwyLjUrMS4xMiwyLDIACgkQF+ygX3aN7fatsgEAixDzH+zTnKYMEx3sikWp
|
|
||||||
dsNTiHTU6wJY/brVJIU879UBAJntBIq72vqwKtMb/ZlVvomdDvKVllZw8ZsYBz1n
|
|
||||||
aTkM
|
|
||||||
=vkgy
|
|
||||||
-----END PGP SIGNATURE-----
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
-----BEGIN PGP SIGNATURE-----
|
|
||||||
|
|
||||||
iJEEABYKADkWIQSfpUNtDuNgmFFXOCUX7KBfdo3t9gUCaeXaqxsUgAAAAAAEAA5t
|
|
||||||
YW51MiwyLjUrMS4xMiwyLDIACgkQF+ygX3aN7faAGQEAyEhVKrRoXIsV3E5f1FZg
|
|
||||||
8fcsmbxCnKBqxichCkf0dWYBAIvbI146mQLHaNqLDaTIqCUQbkq1aE/YMFDGykUG
|
|
||||||
ngsJ
|
|
||||||
=/0RY
|
|
||||||
-----END PGP SIGNATURE-----
|
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
## VirusTotal Scan Results
|
|
||||||
|
|
||||||
**Scan Date:** 2026-04-19 01:48 UTC
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### thgtoa.pdf
|
|
||||||
- **SHA256 Hash:** `f82f6f53319315568fc2524b4eaf01126fe52356a20363cd358ad5977388ba28`
|
|
||||||
- **VirusTotal Report:** VT_API_KEY not configured, scan skipped
|
|
||||||
|
|
||||||
### thgtoa-dark.pdf
|
|
||||||
- **SHA256 Hash:** `94a0c8e3b81b0aeeb921029a41713d81b836da893a9bc9f905ca7296e82bd70f`
|
|
||||||
- **VirusTotal Report:** VT_API_KEY not configured, scan skipped
|
|
||||||
|
|
||||||
---
|
|
||||||
*Scan performed automatically by GitHub Actions*
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
-----BEGIN PGP SIGNATURE-----
|
|
||||||
|
|
||||||
iJEEABYKADkWIQSfpUNtDuNgmFFXOCUX7KBfdo3t9gUCaeXaqxsUgAAAAAAEAA5t
|
|
||||||
YW51MiwyLjUrMS4xMiwyLDIACgkQF+ygX3aN7fYpCgEA209U3QewChp7mdrrFjH1
|
|
||||||
CaBMIk2sCHwRMCcmbMDkNTAA/RIchAKex13ZjZWC9xsJpZEktvBENFsQLsNPReqR
|
|
||||||
UZ8C
|
|
||||||
=TYsa
|
|
||||||
-----END PGP SIGNATURE-----
|
|
||||||